3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
18 /* This file contains system pp ("push/pop") functions that
19 * execute the opcodes that make up a perl program. A typical pp function
20 * expects to find its arguments on the stack, and usually pushes its
21 * results onto the stack, hence the 'pp' terminology. Each OP structure
22 * contains a pointer to the relevant pp_foo() function.
24 * By 'system', we mean ops which interact with the OS, such as pp_open().
28 #define PERL_IN_PP_SYS_C
32 /* Shadow password support for solaris - pdo@cs.umd.edu
33 * Not just Solaris: at least HP-UX, IRIX, Linux.
34 * The API is from SysV.
36 * There are at least two more shadow interfaces,
37 * see the comments in pp_gpwent().
41 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
42 * and another MAXINT from "perl.h" <- <sys/param.h>. */
49 # include <sys/wait.h>
53 # include <sys/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* AIX 5.2 and below use mktime for localtime, and defines the edge case
203 * for time 0x7fffffff to be valid only in UTC. AIX 5.3 provides localtime64
204 * available in the 32bit environment, which could warrant Configure
205 * checks in the future.
208 #define LOCALTIME_EDGECASE_BROKEN
211 /* F_OK unused: if stat() cannot find it... */
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
214 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
215 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
218 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
219 # ifdef I_SYS_SECURITY
220 # include <sys/security.h>
224 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
227 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
231 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
233 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
237 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
238 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
239 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
242 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
244 const Uid_t ruid = getuid();
245 const Uid_t euid = geteuid();
246 const Gid_t rgid = getgid();
247 const Gid_t egid = getegid();
251 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
252 Perl_croak(aTHX_ "switching effective uid is not implemented");
255 if (setreuid(euid, ruid))
258 if (setresuid(euid, ruid, (Uid_t)-1))
261 Perl_croak(aTHX_ "entering effective uid failed");
264 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
265 Perl_croak(aTHX_ "switching effective gid is not implemented");
268 if (setregid(egid, rgid))
271 if (setresgid(egid, rgid, (Gid_t)-1))
274 Perl_croak(aTHX_ "entering effective gid failed");
277 res = access(path, mode);
280 if (setreuid(ruid, euid))
283 if (setresuid(ruid, euid, (Uid_t)-1))
286 Perl_croak(aTHX_ "leaving effective uid failed");
289 if (setregid(rgid, egid))
292 if (setresgid(rgid, egid, (Gid_t)-1))
295 Perl_croak(aTHX_ "leaving effective gid failed");
300 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
307 const char * const tmps = POPpconstx;
308 const I32 gimme = GIMME_V;
309 const char *mode = "r";
312 if (PL_op->op_private & OPpOPEN_IN_RAW)
314 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
316 fp = PerlProc_popen(tmps, mode);
318 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
320 PerlIO_apply_layers(aTHX_ fp,mode,type);
322 if (gimme == G_VOID) {
324 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
327 else if (gimme == G_SCALAR) {
330 PL_rs = &PL_sv_undef;
331 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
332 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
340 SV * const sv = newSV(79);
341 if (sv_gets(sv, fp, 0) == NULL) {
346 if (SvLEN(sv) - SvCUR(sv) > 20) {
347 SvPV_shrink_to_cur(sv);
352 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
353 TAINT; /* "I believe that this is not gratuitous!" */
356 STATUS_NATIVE_CHILD_SET(-1);
357 if (gimme == G_SCALAR)
368 tryAMAGICunTARGET(iter, -1);
370 /* Note that we only ever get here if File::Glob fails to load
371 * without at the same time croaking, for some reason, or if
372 * perl was built with PERL_EXTERNAL_GLOB */
379 * The external globbing program may use things we can't control,
380 * so for security reasons we must assume the worst.
383 taint_proper(PL_no_security, "glob");
387 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
388 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
390 SAVESPTR(PL_rs); /* This is not permanent, either. */
391 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
394 *SvPVX(PL_rs) = '\n';
398 result = do_readline();
406 PL_last_in_gv = cGVOP_gv;
407 return do_readline();
418 do_join(TARG, &PL_sv_no, MARK, SP);
422 else if (SP == MARK) {
430 tmps = SvPV_const(tmpsv, len);
431 if ((!tmps || !len) && PL_errgv) {
432 SV * const error = ERRSV;
433 SvUPGRADE(error, SVt_PV);
434 if (SvPOK(error) && SvCUR(error))
435 sv_catpvs(error, "\t...caught");
437 tmps = SvPV_const(tmpsv, len);
440 tmpsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
442 Perl_warn(aTHX_ "%"SVf, SVfARG(tmpsv));
454 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
456 if (SP - MARK != 1) {
458 do_join(TARG, &PL_sv_no, MARK, SP);
460 tmps = SvPV_const(tmpsv, len);
466 tmps = SvROK(tmpsv) ? (const char *)NULL : SvPV_const(tmpsv, len);
469 SV * const error = ERRSV;
470 SvUPGRADE(error, SVt_PV);
471 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
473 SvSetSV(error,tmpsv);
474 else if (sv_isobject(error)) {
475 HV * const stash = SvSTASH(SvRV(error));
476 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
478 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
479 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
486 call_sv(MUTABLE_SV(GvCV(gv)),
487 G_SCALAR|G_EVAL|G_KEEPERR);
488 sv_setsv(error,*PL_stack_sp--);
494 if (SvPOK(error) && SvCUR(error))
495 sv_catpvs(error, "\t...propagated");
498 tmps = SvPV_const(tmpsv, len);
504 tmpsv = newSVpvs_flags("Died", SVs_TEMP);
506 DIE(aTHX_ "%"SVf, SVfARG(tmpsv));
522 GV * const gv = MUTABLE_GV(*++MARK);
525 DIE(aTHX_ PL_no_usym, "filehandle");
527 if ((io = GvIOp(gv))) {
529 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
531 if (IoDIRP(io) && ckWARN2(WARN_IO, WARN_DEPRECATED))
532 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
533 "Opening dirhandle %s also as a file", GvENAME(gv));
535 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
537 /* Method's args are same as ours ... */
538 /* ... except handle is replaced by the object */
539 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
543 call_method("OPEN", G_SCALAR);
557 tmps = SvPV_const(sv, len);
558 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
561 PUSHi( (I32)PL_forkprocess );
562 else if (PL_forkprocess == 0) /* we are a new child */
572 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
575 IO * const io = GvIO(gv);
577 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
580 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
583 call_method("CLOSE", G_SCALAR);
591 PUSHs(boolSV(do_close(gv, TRUE)));
604 GV * const wgv = MUTABLE_GV(POPs);
605 GV * const rgv = MUTABLE_GV(POPs);
610 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
611 DIE(aTHX_ PL_no_usym, "filehandle");
616 do_close(rgv, FALSE);
618 do_close(wgv, FALSE);
620 if (PerlProc_pipe(fd) < 0)
623 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
624 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
625 IoOFP(rstio) = IoIFP(rstio);
626 IoIFP(wstio) = IoOFP(wstio);
627 IoTYPE(rstio) = IoTYPE_RDONLY;
628 IoTYPE(wstio) = IoTYPE_WRONLY;
630 if (!IoIFP(rstio) || !IoOFP(wstio)) {
632 PerlIO_close(IoIFP(rstio));
634 PerlLIO_close(fd[0]);
636 PerlIO_close(IoOFP(wstio));
638 PerlLIO_close(fd[1]);
641 #if defined(HAS_FCNTL) && defined(F_SETFD)
642 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
643 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
650 DIE(aTHX_ PL_no_func, "pipe");
664 gv = MUTABLE_GV(POPs);
666 if (gv && (io = GvIO(gv))
667 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
670 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
673 call_method("FILENO", G_SCALAR);
679 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
680 /* Can't do this because people seem to do things like
681 defined(fileno($foo)) to check whether $foo is a valid fh.
682 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
683 report_evil_fh(gv, io, PL_op->op_type);
688 PUSHi(PerlIO_fileno(fp));
701 anum = PerlLIO_umask(022);
702 /* setting it to 022 between the two calls to umask avoids
703 * to have a window where the umask is set to 0 -- meaning
704 * that another thread could create world-writeable files. */
706 (void)PerlLIO_umask(anum);
709 anum = PerlLIO_umask(POPi);
710 TAINT_PROPER("umask");
713 /* Only DIE if trying to restrict permissions on "user" (self).
714 * Otherwise it's harmless and more useful to just return undef
715 * since 'group' and 'other' concepts probably don't exist here. */
716 if (MAXARG >= 1 && (POPi & 0700))
717 DIE(aTHX_ "umask not implemented");
718 XPUSHs(&PL_sv_undef);
737 gv = MUTABLE_GV(POPs);
739 if (gv && (io = GvIO(gv))) {
740 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
743 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
748 call_method("BINMODE", G_SCALAR);
756 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
757 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
758 report_evil_fh(gv, io, PL_op->op_type);
759 SETERRNO(EBADF,RMS_IFI);
766 const char *d = NULL;
769 d = SvPV_const(discp, len);
770 mode = mode_from_discipline(d, len);
771 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
772 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
773 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
794 const I32 markoff = MARK - PL_stack_base;
795 const char *methname;
796 int how = PERL_MAGIC_tied;
800 switch(SvTYPE(varsv)) {
802 methname = "TIEHASH";
803 HvEITER_set(MUTABLE_HV(varsv), 0);
806 methname = "TIEARRAY";
809 if (isGV_with_GP(varsv)) {
810 #ifdef GV_UNIQUE_CHECK
811 if (GvUNIQUE((const GV *)varsv)) {
812 Perl_croak(aTHX_ "Attempt to tie unique GV");
815 methname = "TIEHANDLE";
816 how = PERL_MAGIC_tiedscalar;
817 /* For tied filehandles, we apply tiedscalar magic to the IO
818 slot of the GP rather than the GV itself. AMS 20010812 */
820 GvIOp(varsv) = newIO();
821 varsv = MUTABLE_SV(GvIOp(varsv));
826 methname = "TIESCALAR";
827 how = PERL_MAGIC_tiedscalar;
831 if (sv_isobject(*MARK)) { /* Calls GET magic. */
833 PUSHSTACKi(PERLSI_MAGIC);
835 EXTEND(SP,(I32)items);
839 call_method(methname, G_SCALAR);
842 /* Not clear why we don't call call_method here too.
843 * perhaps to get different error message ?
846 const char *name = SvPV_nomg_const(*MARK, len);
847 stash = gv_stashpvn(name, len, 0);
848 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
849 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
850 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
853 PUSHSTACKi(PERLSI_MAGIC);
855 EXTEND(SP,(I32)items);
859 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
865 if (sv_isobject(sv)) {
866 sv_unmagic(varsv, how);
867 /* Croak if a self-tie on an aggregate is attempted. */
868 if (varsv == SvRV(sv) &&
869 (SvTYPE(varsv) == SVt_PVAV ||
870 SvTYPE(varsv) == SVt_PVHV))
872 "Self-ties of arrays and hashes are not supported");
873 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
876 SP = PL_stack_base + markoff;
886 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
887 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
889 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
892 if ((mg = SvTIED_mg(sv, how))) {
893 SV * const obj = SvRV(SvTIED_obj(sv, mg));
895 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
897 if (gv && isGV(gv) && (cv = GvCV(gv))) {
899 XPUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
900 mXPUSHi(SvREFCNT(obj) - 1);
903 call_sv(MUTABLE_SV(cv), G_VOID);
907 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
908 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
909 "untie attempted while %"UVuf" inner references still exist",
910 (UV)SvREFCNT(obj) - 1 ) ;
914 sv_unmagic(sv, how) ;
924 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
925 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
927 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
930 if ((mg = SvTIED_mg(sv, how))) {
931 SV *osv = SvTIED_obj(sv, mg);
932 if (osv == mg->mg_obj)
933 osv = sv_mortalcopy(osv);
947 HV * const hv = MUTABLE_HV(POPs);
948 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
949 stash = gv_stashsv(sv, 0);
950 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
952 require_pv("AnyDBM_File.pm");
954 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
955 DIE(aTHX_ "No dbm on this machine");
965 mPUSHu(O_RDWR|O_CREAT);
970 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
973 if (!sv_isobject(TOPs)) {
981 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
985 if (sv_isobject(TOPs)) {
986 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
987 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1004 struct timeval timebuf;
1005 struct timeval *tbuf = &timebuf;
1008 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1013 # if BYTEORDER & 0xf0000
1014 # define ORDERBYTE (0x88888888 - BYTEORDER)
1016 # define ORDERBYTE (0x4444 - BYTEORDER)
1022 for (i = 1; i <= 3; i++) {
1023 SV * const sv = SP[i];
1026 if (SvREADONLY(sv)) {
1028 sv_force_normal_flags(sv, 0);
1029 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1030 DIE(aTHX_ "%s", PL_no_modify);
1033 if (ckWARN(WARN_MISC))
1034 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1035 SvPV_force_nolen(sv); /* force string conversion */
1042 /* little endians can use vecs directly */
1043 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1050 masksize = NFDBITS / NBBY;
1052 masksize = sizeof(long); /* documented int, everyone seems to use long */
1054 Zero(&fd_sets[0], 4, char*);
1057 # if SELECT_MIN_BITS == 1
1058 growsize = sizeof(fd_set);
1060 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1061 # undef SELECT_MIN_BITS
1062 # define SELECT_MIN_BITS __FD_SETSIZE
1064 /* If SELECT_MIN_BITS is greater than one we most probably will want
1065 * to align the sizes with SELECT_MIN_BITS/8 because for example
1066 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1067 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1068 * on (sets/tests/clears bits) is 32 bits. */
1069 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1077 timebuf.tv_sec = (long)value;
1078 value -= (NV)timebuf.tv_sec;
1079 timebuf.tv_usec = (long)(value * 1000000.0);
1084 for (i = 1; i <= 3; i++) {
1086 if (!SvOK(sv) || SvCUR(sv) == 0) {
1093 Sv_Grow(sv, growsize);
1097 while (++j <= growsize) {
1101 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1103 Newx(fd_sets[i], growsize, char);
1104 for (offset = 0; offset < growsize; offset += masksize) {
1105 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1106 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1109 fd_sets[i] = SvPVX(sv);
1113 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1114 /* Can't make just the (void*) conditional because that would be
1115 * cpp #if within cpp macro, and not all compilers like that. */
1116 nfound = PerlSock_select(
1118 (Select_fd_set_t) fd_sets[1],
1119 (Select_fd_set_t) fd_sets[2],
1120 (Select_fd_set_t) fd_sets[3],
1121 (void*) tbuf); /* Workaround for compiler bug. */
1123 nfound = PerlSock_select(
1125 (Select_fd_set_t) fd_sets[1],
1126 (Select_fd_set_t) fd_sets[2],
1127 (Select_fd_set_t) fd_sets[3],
1130 for (i = 1; i <= 3; i++) {
1133 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1135 for (offset = 0; offset < growsize; offset += masksize) {
1136 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1137 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1139 Safefree(fd_sets[i]);
1146 if (GIMME == G_ARRAY && tbuf) {
1147 value = (NV)(timebuf.tv_sec) +
1148 (NV)(timebuf.tv_usec) / 1000000.0;
1153 DIE(aTHX_ "select not implemented");
1158 Perl_setdefout(pTHX_ GV *gv)
1161 SvREFCNT_inc_simple_void(gv);
1163 SvREFCNT_dec(PL_defoutgv);
1171 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1172 GV * egv = GvEGV(PL_defoutgv);
1178 XPUSHs(&PL_sv_undef);
1180 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1181 if (gvp && *gvp == egv) {
1182 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1186 mXPUSHs(newRV(MUTABLE_SV(egv)));
1191 if (!GvIO(newdefout))
1192 gv_IOadd(newdefout);
1193 setdefout(newdefout);
1203 GV * const gv = (MAXARG==0) ? PL_stdingv : MUTABLE_GV(POPs);
1205 if (gv && (io = GvIO(gv))) {
1206 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1208 const I32 gimme = GIMME_V;
1210 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
1213 call_method("GETC", gimme);
1216 if (gimme == G_SCALAR)
1217 SvSetMagicSV_nosteal(TARG, TOPs);
1221 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1222 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1223 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1224 report_evil_fh(gv, io, PL_op->op_type);
1225 SETERRNO(EBADF,RMS_IFI);
1229 sv_setpvs(TARG, " ");
1230 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1231 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1232 /* Find out how many bytes the char needs */
1233 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1236 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1237 SvCUR_set(TARG,1+len);
1246 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1249 register PERL_CONTEXT *cx;
1250 const I32 gimme = GIMME_V;
1252 PERL_ARGS_ASSERT_DOFORM;
1257 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1258 PUSHFORMAT(cx, retop);
1260 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1262 setdefout(gv); /* locally select filehandle so $% et al work */
1279 gv = MUTABLE_GV(POPs);
1294 goto not_a_format_reference;
1299 tmpsv = sv_newmortal();
1300 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1301 name = SvPV_nolen_const(tmpsv);
1303 DIE(aTHX_ "Undefined format \"%s\" called", name);
1305 not_a_format_reference:
1306 DIE(aTHX_ "Not a format reference");
1309 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1311 IoFLAGS(io) &= ~IOf_DIDTOP;
1312 return doform(cv,gv,PL_op->op_next);
1318 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1319 register IO * const io = GvIOp(gv);
1324 register PERL_CONTEXT *cx;
1326 if (!io || !(ofp = IoOFP(io)))
1329 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1330 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1332 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1333 PL_formtarget != PL_toptarget)
1337 if (!IoTOP_GV(io)) {
1340 if (!IoTOP_NAME(io)) {
1342 if (!IoFMT_NAME(io))
1343 IoFMT_NAME(io) = savepv(GvNAME(gv));
1344 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1345 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1346 if ((topgv && GvFORM(topgv)) ||
1347 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1348 IoTOP_NAME(io) = savesvpv(topname);
1350 IoTOP_NAME(io) = savepvs("top");
1352 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1353 if (!topgv || !GvFORM(topgv)) {
1354 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1357 IoTOP_GV(io) = topgv;
1359 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1360 I32 lines = IoLINES_LEFT(io);
1361 const char *s = SvPVX_const(PL_formtarget);
1362 if (lines <= 0) /* Yow, header didn't even fit!!! */
1364 while (lines-- > 0) {
1365 s = strchr(s, '\n');
1371 const STRLEN save = SvCUR(PL_formtarget);
1372 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1373 do_print(PL_formtarget, ofp);
1374 SvCUR_set(PL_formtarget, save);
1375 sv_chop(PL_formtarget, s);
1376 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1379 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1380 do_print(PL_formfeed, ofp);
1381 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1383 PL_formtarget = PL_toptarget;
1384 IoFLAGS(io) |= IOf_DIDTOP;
1387 DIE(aTHX_ "bad top format reference");
1390 SV * const sv = sv_newmortal();
1392 gv_efullname4(sv, fgv, NULL, FALSE);
1393 name = SvPV_nolen_const(sv);
1395 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1397 DIE(aTHX_ "Undefined top format called");
1399 if (cv && CvCLONE(cv))
1400 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1401 return doform(cv, gv, PL_op);
1405 POPBLOCK(cx,PL_curpm);
1411 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1413 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1414 else if (ckWARN(WARN_CLOSED))
1415 report_evil_fh(gv, io, PL_op->op_type);
1420 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1421 if (ckWARN(WARN_IO))
1422 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1424 if (!do_print(PL_formtarget, fp))
1427 FmLINES(PL_formtarget) = 0;
1428 SvCUR_set(PL_formtarget, 0);
1429 *SvEND(PL_formtarget) = '\0';
1430 if (IoFLAGS(io) & IOf_FLUSH)
1431 (void)PerlIO_flush(fp);
1436 PL_formtarget = PL_bodytarget;
1438 PERL_UNUSED_VAR(newsp);
1439 PERL_UNUSED_VAR(gimme);
1440 return cx->blk_sub.retop;
1445 dVAR; dSP; dMARK; dORIGMARK;
1451 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1453 if (gv && (io = GvIO(gv))) {
1454 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1456 if (MARK == ORIGMARK) {
1459 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1463 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1466 call_method("PRINTF", G_SCALAR);
1469 MARK = ORIGMARK + 1;
1477 if (!(io = GvIO(gv))) {
1478 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1479 report_evil_fh(gv, io, PL_op->op_type);
1480 SETERRNO(EBADF,RMS_IFI);
1483 else if (!(fp = IoOFP(io))) {
1484 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1486 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1487 else if (ckWARN(WARN_CLOSED))
1488 report_evil_fh(gv, io, PL_op->op_type);
1490 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1494 if (SvTAINTED(MARK[1]))
1495 TAINT_PROPER("printf");
1496 do_sprintf(sv, SP - MARK, MARK + 1);
1497 if (!do_print(sv, fp))
1500 if (IoFLAGS(io) & IOf_FLUSH)
1501 if (PerlIO_flush(fp) == EOF)
1512 PUSHs(&PL_sv_undef);
1520 const int perm = (MAXARG > 3) ? POPi : 0666;
1521 const int mode = POPi;
1522 SV * const sv = POPs;
1523 GV * const gv = MUTABLE_GV(POPs);
1526 /* Need TIEHANDLE method ? */
1527 const char * const tmps = SvPV_const(sv, len);
1528 /* FIXME? do_open should do const */
1529 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1530 IoLINES(GvIOp(gv)) = 0;
1534 PUSHs(&PL_sv_undef);
1541 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1547 Sock_size_t bufsize;
1555 bool charstart = FALSE;
1556 STRLEN charskip = 0;
1559 GV * const gv = MUTABLE_GV(*++MARK);
1560 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1561 && gv && (io = GvIO(gv)) )
1563 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1567 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1569 call_method("READ", G_SCALAR);
1583 sv_setpvs(bufsv, "");
1584 length = SvIVx(*++MARK);
1587 offset = SvIVx(*++MARK);
1591 if (!io || !IoIFP(io)) {
1592 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1593 report_evil_fh(gv, io, PL_op->op_type);
1594 SETERRNO(EBADF,RMS_IFI);
1597 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1598 buffer = SvPVutf8_force(bufsv, blen);
1599 /* UTF-8 may not have been set if they are all low bytes */
1604 buffer = SvPV_force(bufsv, blen);
1605 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1608 DIE(aTHX_ "Negative length");
1616 if (PL_op->op_type == OP_RECV) {
1617 char namebuf[MAXPATHLEN];
1618 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1619 bufsize = sizeof (struct sockaddr_in);
1621 bufsize = sizeof namebuf;
1623 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1627 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1628 /* 'offset' means 'flags' here */
1629 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1630 (struct sockaddr *)namebuf, &bufsize);
1634 /* Bogus return without padding */
1635 bufsize = sizeof (struct sockaddr_in);
1637 SvCUR_set(bufsv, count);
1638 *SvEND(bufsv) = '\0';
1639 (void)SvPOK_only(bufsv);
1643 /* This should not be marked tainted if the fp is marked clean */
1644 if (!(IoFLAGS(io) & IOf_UNTAINT))
1645 SvTAINTED_on(bufsv);
1647 sv_setpvn(TARG, namebuf, bufsize);
1652 if (PL_op->op_type == OP_RECV)
1653 DIE(aTHX_ PL_no_sock_func, "recv");
1655 if (DO_UTF8(bufsv)) {
1656 /* offset adjust in characters not bytes */
1657 blen = sv_len_utf8(bufsv);
1660 if (-offset > (int)blen)
1661 DIE(aTHX_ "Offset outside string");
1664 if (DO_UTF8(bufsv)) {
1665 /* convert offset-as-chars to offset-as-bytes */
1666 if (offset >= (int)blen)
1667 offset += SvCUR(bufsv) - blen;
1669 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1672 bufsize = SvCUR(bufsv);
1673 /* Allocating length + offset + 1 isn't perfect in the case of reading
1674 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1676 (should be 2 * length + offset + 1, or possibly something longer if
1677 PL_encoding is true) */
1678 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1679 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1680 Zero(buffer+bufsize, offset-bufsize, char);
1682 buffer = buffer + offset;
1684 read_target = bufsv;
1686 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1687 concatenate it to the current buffer. */
1689 /* Truncate the existing buffer to the start of where we will be
1691 SvCUR_set(bufsv, offset);
1693 read_target = sv_newmortal();
1694 SvUPGRADE(read_target, SVt_PV);
1695 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1698 if (PL_op->op_type == OP_SYSREAD) {
1699 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1700 if (IoTYPE(io) == IoTYPE_SOCKET) {
1701 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1707 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1712 #ifdef HAS_SOCKET__bad_code_maybe
1713 if (IoTYPE(io) == IoTYPE_SOCKET) {
1714 char namebuf[MAXPATHLEN];
1715 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1716 bufsize = sizeof (struct sockaddr_in);
1718 bufsize = sizeof namebuf;
1720 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1721 (struct sockaddr *)namebuf, &bufsize);
1726 count = PerlIO_read(IoIFP(io), buffer, length);
1727 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1728 if (count == 0 && PerlIO_error(IoIFP(io)))
1732 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1733 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1736 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1737 *SvEND(read_target) = '\0';
1738 (void)SvPOK_only(read_target);
1739 if (fp_utf8 && !IN_BYTES) {
1740 /* Look at utf8 we got back and count the characters */
1741 const char *bend = buffer + count;
1742 while (buffer < bend) {
1744 skip = UTF8SKIP(buffer);
1747 if (buffer - charskip + skip > bend) {
1748 /* partial character - try for rest of it */
1749 length = skip - (bend-buffer);
1750 offset = bend - SvPVX_const(bufsv);
1762 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1763 provided amount read (count) was what was requested (length)
1765 if (got < wanted && count == length) {
1766 length = wanted - got;
1767 offset = bend - SvPVX_const(bufsv);
1770 /* return value is character count */
1774 else if (buffer_utf8) {
1775 /* Let svcatsv upgrade the bytes we read in to utf8.
1776 The buffer is a mortal so will be freed soon. */
1777 sv_catsv_nomg(bufsv, read_target);
1780 /* This should not be marked tainted if the fp is marked clean */
1781 if (!(IoFLAGS(io) & IOf_UNTAINT))
1782 SvTAINTED_on(bufsv);
1794 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1800 STRLEN orig_blen_bytes;
1801 const int op_type = PL_op->op_type;
1805 GV *const gv = MUTABLE_GV(*++MARK);
1806 if (PL_op->op_type == OP_SYSWRITE
1807 && gv && (io = GvIO(gv))) {
1808 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1812 if (MARK == SP - 1) {
1814 sv = sv_2mortal(newSViv(sv_len(*SP)));
1820 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1822 call_method("WRITE", G_SCALAR);
1838 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1840 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1841 if (io && IoIFP(io))
1842 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1844 report_evil_fh(gv, io, PL_op->op_type);
1846 SETERRNO(EBADF,RMS_IFI);
1850 /* Do this first to trigger any overloading. */
1851 buffer = SvPV_const(bufsv, blen);
1852 orig_blen_bytes = blen;
1853 doing_utf8 = DO_UTF8(bufsv);
1855 if (PerlIO_isutf8(IoIFP(io))) {
1856 if (!SvUTF8(bufsv)) {
1857 /* We don't modify the original scalar. */
1858 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1859 buffer = (char *) tmpbuf;
1863 else if (doing_utf8) {
1864 STRLEN tmplen = blen;
1865 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1868 buffer = (char *) tmpbuf;
1872 assert((char *)result == buffer);
1873 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1877 if (op_type == OP_SYSWRITE) {
1878 Size_t length = 0; /* This length is in characters. */
1884 /* The SV is bytes, and we've had to upgrade it. */
1885 blen_chars = orig_blen_bytes;
1887 /* The SV really is UTF-8. */
1888 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1889 /* Don't call sv_len_utf8 again because it will call magic
1890 or overloading a second time, and we might get back a
1891 different result. */
1892 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1894 /* It's safe, and it may well be cached. */
1895 blen_chars = sv_len_utf8(bufsv);
1903 length = blen_chars;
1905 #if Size_t_size > IVSIZE
1906 length = (Size_t)SvNVx(*++MARK);
1908 length = (Size_t)SvIVx(*++MARK);
1910 if ((SSize_t)length < 0) {
1912 DIE(aTHX_ "Negative length");
1917 offset = SvIVx(*++MARK);
1919 if (-offset > (IV)blen_chars) {
1921 DIE(aTHX_ "Offset outside string");
1923 offset += blen_chars;
1924 } else if (offset >= (IV)blen_chars && blen_chars > 0) {
1926 DIE(aTHX_ "Offset outside string");
1930 if (length > blen_chars - offset)
1931 length = blen_chars - offset;
1933 /* Here we convert length from characters to bytes. */
1934 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1935 /* Either we had to convert the SV, or the SV is magical, or
1936 the SV has overloading, in which case we can't or mustn't
1937 or mustn't call it again. */
1939 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1940 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1942 /* It's a real UTF-8 SV, and it's not going to change under
1943 us. Take advantage of any cache. */
1945 I32 len_I32 = length;
1947 /* Convert the start and end character positions to bytes.
1948 Remember that the second argument to sv_pos_u2b is relative
1950 sv_pos_u2b(bufsv, &start, &len_I32);
1957 buffer = buffer+offset;
1959 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1960 if (IoTYPE(io) == IoTYPE_SOCKET) {
1961 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1967 /* See the note at doio.c:do_print about filesize limits. --jhi */
1968 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1974 const int flags = SvIVx(*++MARK);
1977 char * const sockbuf = SvPVx(*++MARK, mlen);
1978 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1979 flags, (struct sockaddr *)sockbuf, mlen);
1983 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1988 DIE(aTHX_ PL_no_sock_func, "send");
1995 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1998 #if Size_t_size > IVSIZE
2017 if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */
2019 gv = PL_last_in_gv = GvEGV(PL_argvgv);
2021 if (io && !IoIFP(io)) {
2022 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2024 IoFLAGS(io) &= ~IOf_START;
2025 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2027 sv_setpvs(GvSV(gv), "-");
2030 GvSV(gv) = newSVpvs("-");
2032 SvSETMAGIC(GvSV(gv));
2034 else if (!nextargv(gv))
2039 gv = PL_last_in_gv; /* eof */
2042 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2045 IO * const io = GvIO(gv);
2047 if (io && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2049 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2052 call_method("EOF", G_SCALAR);
2059 PUSHs(boolSV(!gv || do_eof(gv)));
2070 PL_last_in_gv = MUTABLE_GV(POPs);
2073 if (gv && (io = GvIO(gv))) {
2074 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2077 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2080 call_method("TELL", G_SCALAR);
2087 #if LSEEKSIZE > IVSIZE
2088 PUSHn( do_tell(gv) );
2090 PUSHi( do_tell(gv) );
2098 const int whence = POPi;
2099 #if LSEEKSIZE > IVSIZE
2100 const Off_t offset = (Off_t)SvNVx(POPs);
2102 const Off_t offset = (Off_t)SvIVx(POPs);
2105 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2108 if (gv && (io = GvIO(gv))) {
2109 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2112 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2113 #if LSEEKSIZE > IVSIZE
2114 mXPUSHn((NV) offset);
2121 call_method("SEEK", G_SCALAR);
2128 if (PL_op->op_type == OP_SEEK)
2129 PUSHs(boolSV(do_seek(gv, offset, whence)));
2131 const Off_t sought = do_sysseek(gv, offset, whence);
2133 PUSHs(&PL_sv_undef);
2135 SV* const sv = sought ?
2136 #if LSEEKSIZE > IVSIZE
2141 : newSVpvn(zero_but_true, ZBTLEN);
2152 /* There seems to be no consensus on the length type of truncate()
2153 * and ftruncate(), both off_t and size_t have supporters. In
2154 * general one would think that when using large files, off_t is
2155 * at least as wide as size_t, so using an off_t should be okay. */
2156 /* XXX Configure probe for the length type of *truncate() needed XXX */
2159 #if Off_t_size > IVSIZE
2164 /* Checking for length < 0 is problematic as the type might or
2165 * might not be signed: if it is not, clever compilers will moan. */
2166 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2173 if (PL_op->op_flags & OPf_SPECIAL) {
2174 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2183 TAINT_PROPER("truncate");
2184 if (!(fp = IoIFP(io))) {
2190 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2192 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2199 SV * const sv = POPs;
2202 if (isGV_with_GP(sv)) {
2203 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2204 goto do_ftruncate_gv;
2206 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2207 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2208 goto do_ftruncate_gv;
2210 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2211 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2212 goto do_ftruncate_io;
2215 name = SvPV_nolen_const(sv);
2216 TAINT_PROPER("truncate");
2218 if (truncate(name, len) < 0)
2222 const int tmpfd = PerlLIO_open(name, O_RDWR);
2227 if (my_chsize(tmpfd, len) < 0)
2229 PerlLIO_close(tmpfd);
2238 SETERRNO(EBADF,RMS_IFI);
2246 SV * const argsv = POPs;
2247 const unsigned int func = POPu;
2248 const int optype = PL_op->op_type;
2249 GV * const gv = MUTABLE_GV(POPs);
2250 IO * const io = gv ? GvIOn(gv) : NULL;
2254 if (!io || !argsv || !IoIFP(io)) {
2255 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2256 report_evil_fh(gv, io, PL_op->op_type);
2257 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2261 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2264 s = SvPV_force(argsv, len);
2265 need = IOCPARM_LEN(func);
2267 s = Sv_Grow(argsv, need + 1);
2268 SvCUR_set(argsv, need);
2271 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2274 retval = SvIV(argsv);
2275 s = INT2PTR(char*,retval); /* ouch */
2278 TAINT_PROPER(PL_op_desc[optype]);
2280 if (optype == OP_IOCTL)
2282 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2284 DIE(aTHX_ "ioctl is not implemented");
2288 DIE(aTHX_ "fcntl is not implemented");
2290 #if defined(OS2) && defined(__EMX__)
2291 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2293 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2297 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2299 if (s[SvCUR(argsv)] != 17)
2300 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2302 s[SvCUR(argsv)] = 0; /* put our null back */
2303 SvSETMAGIC(argsv); /* Assume it has changed */
2312 PUSHp(zero_but_true, ZBTLEN);
2325 const int argtype = POPi;
2326 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2328 if (gv && (io = GvIO(gv)))
2334 /* XXX Looks to me like io is always NULL at this point */
2336 (void)PerlIO_flush(fp);
2337 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2340 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2341 report_evil_fh(gv, io, PL_op->op_type);
2343 SETERRNO(EBADF,RMS_IFI);
2348 DIE(aTHX_ PL_no_func, "flock()");
2358 const int protocol = POPi;
2359 const int type = POPi;
2360 const int domain = POPi;
2361 GV * const gv = MUTABLE_GV(POPs);
2362 register IO * const io = gv ? GvIOn(gv) : NULL;
2366 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2367 report_evil_fh(gv, io, PL_op->op_type);
2368 if (io && IoIFP(io))
2369 do_close(gv, FALSE);
2370 SETERRNO(EBADF,LIB_INVARG);
2375 do_close(gv, FALSE);
2377 TAINT_PROPER("socket");
2378 fd = PerlSock_socket(domain, type, protocol);
2381 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2382 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2383 IoTYPE(io) = IoTYPE_SOCKET;
2384 if (!IoIFP(io) || !IoOFP(io)) {
2385 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2386 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2387 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2390 #if defined(HAS_FCNTL) && defined(F_SETFD)
2391 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2395 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2400 DIE(aTHX_ PL_no_sock_func, "socket");
2406 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2408 const int protocol = POPi;
2409 const int type = POPi;
2410 const int domain = POPi;
2411 GV * const gv2 = MUTABLE_GV(POPs);
2412 GV * const gv1 = MUTABLE_GV(POPs);
2413 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2414 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2417 if (!gv1 || !gv2 || !io1 || !io2) {
2418 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2420 report_evil_fh(gv1, io1, PL_op->op_type);
2422 report_evil_fh(gv1, io2, PL_op->op_type);
2424 if (io1 && IoIFP(io1))
2425 do_close(gv1, FALSE);
2426 if (io2 && IoIFP(io2))
2427 do_close(gv2, FALSE);
2432 do_close(gv1, FALSE);
2434 do_close(gv2, FALSE);
2436 TAINT_PROPER("socketpair");
2437 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2439 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2440 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2441 IoTYPE(io1) = IoTYPE_SOCKET;
2442 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2443 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2444 IoTYPE(io2) = IoTYPE_SOCKET;
2445 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2446 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2447 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2448 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2449 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2450 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2451 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2454 #if defined(HAS_FCNTL) && defined(F_SETFD)
2455 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2456 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2461 DIE(aTHX_ PL_no_sock_func, "socketpair");
2469 SV * const addrsv = POPs;
2470 /* OK, so on what platform does bind modify addr? */
2472 GV * const gv = MUTABLE_GV(POPs);
2473 register IO * const io = GvIOn(gv);
2476 if (!io || !IoIFP(io))
2479 addr = SvPV_const(addrsv, len);
2480 TAINT_PROPER("bind");
2481 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2487 if (ckWARN(WARN_CLOSED))
2488 report_evil_fh(gv, io, PL_op->op_type);
2489 SETERRNO(EBADF,SS_IVCHAN);
2492 DIE(aTHX_ PL_no_sock_func, "bind");
2500 SV * const addrsv = POPs;
2501 GV * const gv = MUTABLE_GV(POPs);
2502 register IO * const io = GvIOn(gv);
2506 if (!io || !IoIFP(io))
2509 addr = SvPV_const(addrsv, len);
2510 TAINT_PROPER("connect");
2511 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2517 if (ckWARN(WARN_CLOSED))
2518 report_evil_fh(gv, io, PL_op->op_type);
2519 SETERRNO(EBADF,SS_IVCHAN);
2522 DIE(aTHX_ PL_no_sock_func, "connect");
2530 const int backlog = POPi;
2531 GV * const gv = MUTABLE_GV(POPs);
2532 register IO * const io = gv ? GvIOn(gv) : NULL;
2534 if (!gv || !io || !IoIFP(io))
2537 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2543 if (ckWARN(WARN_CLOSED))
2544 report_evil_fh(gv, io, PL_op->op_type);
2545 SETERRNO(EBADF,SS_IVCHAN);
2548 DIE(aTHX_ PL_no_sock_func, "listen");
2558 char namebuf[MAXPATHLEN];
2559 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2560 Sock_size_t len = sizeof (struct sockaddr_in);
2562 Sock_size_t len = sizeof namebuf;
2564 GV * const ggv = MUTABLE_GV(POPs);
2565 GV * const ngv = MUTABLE_GV(POPs);
2574 if (!gstio || !IoIFP(gstio))
2578 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2581 /* Some platforms indicate zero length when an AF_UNIX client is
2582 * not bound. Simulate a non-zero-length sockaddr structure in
2584 namebuf[0] = 0; /* sun_len */
2585 namebuf[1] = AF_UNIX; /* sun_family */
2593 do_close(ngv, FALSE);
2594 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2595 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2596 IoTYPE(nstio) = IoTYPE_SOCKET;
2597 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2598 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2599 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2600 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2603 #if defined(HAS_FCNTL) && defined(F_SETFD)
2604 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2608 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2609 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2611 #ifdef __SCO_VERSION__
2612 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2615 PUSHp(namebuf, len);
2619 if (ckWARN(WARN_CLOSED))
2620 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2621 SETERRNO(EBADF,SS_IVCHAN);
2627 DIE(aTHX_ PL_no_sock_func, "accept");
2635 const int how = POPi;
2636 GV * const gv = MUTABLE_GV(POPs);
2637 register IO * const io = GvIOn(gv);
2639 if (!io || !IoIFP(io))
2642 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2646 if (ckWARN(WARN_CLOSED))
2647 report_evil_fh(gv, io, PL_op->op_type);
2648 SETERRNO(EBADF,SS_IVCHAN);
2651 DIE(aTHX_ PL_no_sock_func, "shutdown");
2659 const int optype = PL_op->op_type;
2660 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2661 const unsigned int optname = (unsigned int) POPi;
2662 const unsigned int lvl = (unsigned int) POPi;
2663 GV * const gv = MUTABLE_GV(POPs);
2664 register IO * const io = GvIOn(gv);
2668 if (!io || !IoIFP(io))
2671 fd = PerlIO_fileno(IoIFP(io));
2675 (void)SvPOK_only(sv);
2679 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2686 #if defined(__SYMBIAN32__)
2687 # define SETSOCKOPT_OPTION_VALUE_T void *
2689 # define SETSOCKOPT_OPTION_VALUE_T const char *
2691 /* XXX TODO: We need to have a proper type (a Configure probe,
2692 * etc.) for what the C headers think of the third argument of
2693 * setsockopt(), the option_value read-only buffer: is it
2694 * a "char *", or a "void *", const or not. Some compilers
2695 * don't take kindly to e.g. assuming that "char *" implicitly
2696 * promotes to a "void *", or to explicitly promoting/demoting
2697 * consts to non/vice versa. The "const void *" is the SUS
2698 * definition, but that does not fly everywhere for the above
2700 SETSOCKOPT_OPTION_VALUE_T buf;
2704 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2708 aint = (int)SvIV(sv);
2709 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2712 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2721 if (ckWARN(WARN_CLOSED))
2722 report_evil_fh(gv, io, optype);
2723 SETERRNO(EBADF,SS_IVCHAN);
2728 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2736 const int optype = PL_op->op_type;
2737 GV * const gv = MUTABLE_GV(POPs);
2738 register IO * const io = GvIOn(gv);
2743 if (!io || !IoIFP(io))
2746 sv = sv_2mortal(newSV(257));
2747 (void)SvPOK_only(sv);
2751 fd = PerlIO_fileno(IoIFP(io));
2753 case OP_GETSOCKNAME:
2754 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2757 case OP_GETPEERNAME:
2758 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2760 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2762 static const char nowhere[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
2763 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2764 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2765 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2766 sizeof(u_short) + sizeof(struct in_addr))) {
2773 #ifdef BOGUS_GETNAME_RETURN
2774 /* Interactive Unix, getpeername() and getsockname()
2775 does not return valid namelen */
2776 if (len == BOGUS_GETNAME_RETURN)
2777 len = sizeof(struct sockaddr);
2785 if (ckWARN(WARN_CLOSED))
2786 report_evil_fh(gv, io, optype);
2787 SETERRNO(EBADF,SS_IVCHAN);
2792 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2807 if (PL_op->op_flags & OPf_REF) {
2809 if (PL_op->op_type == OP_LSTAT) {
2810 if (gv != PL_defgv) {
2811 do_fstat_warning_check:
2812 if (ckWARN(WARN_IO))
2813 Perl_warner(aTHX_ packWARN(WARN_IO),
2814 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2815 } else if (PL_laststype != OP_LSTAT)
2816 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2820 if (gv != PL_defgv) {
2821 PL_laststype = OP_STAT;
2823 sv_setpvs(PL_statname, "");
2830 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2831 } else if (IoDIRP(io)) {
2833 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2835 PL_laststatval = -1;
2841 if (PL_laststatval < 0) {
2842 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2843 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2848 SV* const sv = POPs;
2849 if (isGV_with_GP(sv)) {
2850 gv = MUTABLE_GV(sv);
2852 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2853 gv = MUTABLE_GV(SvRV(sv));
2854 if (PL_op->op_type == OP_LSTAT)
2855 goto do_fstat_warning_check;
2857 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2858 io = MUTABLE_IO(SvRV(sv));
2859 if (PL_op->op_type == OP_LSTAT)
2860 goto do_fstat_warning_check;
2861 goto do_fstat_have_io;
2864 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2866 PL_laststype = PL_op->op_type;
2867 if (PL_op->op_type == OP_LSTAT)
2868 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2870 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2871 if (PL_laststatval < 0) {
2872 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2873 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2879 if (gimme != G_ARRAY) {
2880 if (gimme != G_VOID)
2881 XPUSHs(boolSV(max));
2887 mPUSHi(PL_statcache.st_dev);
2888 mPUSHi(PL_statcache.st_ino);
2889 mPUSHu(PL_statcache.st_mode);
2890 mPUSHu(PL_statcache.st_nlink);
2891 #if Uid_t_size > IVSIZE
2892 mPUSHn(PL_statcache.st_uid);
2894 # if Uid_t_sign <= 0
2895 mPUSHi(PL_statcache.st_uid);
2897 mPUSHu(PL_statcache.st_uid);
2900 #if Gid_t_size > IVSIZE
2901 mPUSHn(PL_statcache.st_gid);
2903 # if Gid_t_sign <= 0
2904 mPUSHi(PL_statcache.st_gid);
2906 mPUSHu(PL_statcache.st_gid);
2909 #ifdef USE_STAT_RDEV
2910 mPUSHi(PL_statcache.st_rdev);
2912 PUSHs(newSVpvs_flags("", SVs_TEMP));
2914 #if Off_t_size > IVSIZE
2915 mPUSHn(PL_statcache.st_size);
2917 mPUSHi(PL_statcache.st_size);
2920 mPUSHn(PL_statcache.st_atime);
2921 mPUSHn(PL_statcache.st_mtime);
2922 mPUSHn(PL_statcache.st_ctime);
2924 mPUSHi(PL_statcache.st_atime);
2925 mPUSHi(PL_statcache.st_mtime);
2926 mPUSHi(PL_statcache.st_ctime);
2928 #ifdef USE_STAT_BLOCKS
2929 mPUSHu(PL_statcache.st_blksize);
2930 mPUSHu(PL_statcache.st_blocks);
2932 PUSHs(newSVpvs_flags("", SVs_TEMP));
2933 PUSHs(newSVpvs_flags("", SVs_TEMP));
2939 /* This macro is used by the stacked filetest operators :
2940 * if the previous filetest failed, short-circuit and pass its value.
2941 * Else, discard it from the stack and continue. --rgs
2943 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2944 if (!SvTRUE(TOPs)) { RETURN; } \
2945 else { (void)POPs; PUTBACK; } \
2952 /* Not const, because things tweak this below. Not bool, because there's
2953 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2954 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2955 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2956 /* Giving some sort of initial value silences compilers. */
2958 int access_mode = R_OK;
2960 int access_mode = 0;
2963 /* access_mode is never used, but leaving use_access in makes the
2964 conditional compiling below much clearer. */
2967 int stat_mode = S_IRUSR;
2969 bool effective = FALSE;
2972 STACKED_FTEST_CHECK;
2974 switch (PL_op->op_type) {
2976 #if !(defined(HAS_ACCESS) && defined(R_OK))
2982 #if defined(HAS_ACCESS) && defined(W_OK)
2987 stat_mode = S_IWUSR;
2991 #if defined(HAS_ACCESS) && defined(X_OK)
2996 stat_mode = S_IXUSR;
3000 #ifdef PERL_EFF_ACCESS
3003 stat_mode = S_IWUSR;
3007 #ifndef PERL_EFF_ACCESS
3014 #ifdef PERL_EFF_ACCESS
3019 stat_mode = S_IXUSR;
3025 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3026 const char *name = POPpx;
3028 # ifdef PERL_EFF_ACCESS
3029 result = PERL_EFF_ACCESS(name, access_mode);
3031 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3037 result = access(name, access_mode);
3039 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3054 if (cando(stat_mode, effective, &PL_statcache))
3063 const int op_type = PL_op->op_type;
3065 STACKED_FTEST_CHECK;
3070 if (op_type == OP_FTIS)
3073 /* You can't dTARGET inside OP_FTIS, because you'll get
3074 "panic: pad_sv po" - the op is not flagged to have a target. */
3078 #if Off_t_size > IVSIZE
3079 PUSHn(PL_statcache.st_size);
3081 PUSHi(PL_statcache.st_size);
3085 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3088 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3091 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3104 /* I believe that all these three are likely to be defined on most every
3105 system these days. */
3107 if(PL_op->op_type == OP_FTSUID)
3111 if(PL_op->op_type == OP_FTSGID)
3115 if(PL_op->op_type == OP_FTSVTX)
3119 STACKED_FTEST_CHECK;
3124 switch (PL_op->op_type) {
3126 if (PL_statcache.st_uid == PL_uid)
3130 if (PL_statcache.st_uid == PL_euid)
3134 if (PL_statcache.st_size == 0)
3138 if (S_ISSOCK(PL_statcache.st_mode))
3142 if (S_ISCHR(PL_statcache.st_mode))
3146 if (S_ISBLK(PL_statcache.st_mode))
3150 if (S_ISREG(PL_statcache.st_mode))
3154 if (S_ISDIR(PL_statcache.st_mode))
3158 if (S_ISFIFO(PL_statcache.st_mode))
3163 if (PL_statcache.st_mode & S_ISUID)
3169 if (PL_statcache.st_mode & S_ISGID)
3175 if (PL_statcache.st_mode & S_ISVTX)
3186 I32 result = my_lstat();
3190 if (S_ISLNK(PL_statcache.st_mode))
3203 STACKED_FTEST_CHECK;
3205 if (PL_op->op_flags & OPf_REF)
3207 else if (isGV(TOPs))
3208 gv = MUTABLE_GV(POPs);
3209 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3210 gv = MUTABLE_GV(SvRV(POPs));
3212 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3214 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3215 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3216 else if (tmpsv && SvOK(tmpsv)) {
3217 const char *tmps = SvPV_nolen_const(tmpsv);
3225 if (PerlLIO_isatty(fd))
3230 #if defined(atarist) /* this will work with atariST. Configure will
3231 make guesses for other systems. */
3232 # define FILE_base(f) ((f)->_base)
3233 # define FILE_ptr(f) ((f)->_ptr)
3234 # define FILE_cnt(f) ((f)->_cnt)
3235 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3246 register STDCHAR *s;
3252 STACKED_FTEST_CHECK;
3254 if (PL_op->op_flags & OPf_REF)
3256 else if (isGV(TOPs))
3257 gv = MUTABLE_GV(POPs);
3258 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3259 gv = MUTABLE_GV(SvRV(POPs));
3265 if (gv == PL_defgv) {
3267 io = GvIO(PL_statgv);
3270 goto really_filename;
3275 PL_laststatval = -1;
3276 sv_setpvs(PL_statname, "");
3277 io = GvIO(PL_statgv);
3279 if (io && IoIFP(io)) {
3280 if (! PerlIO_has_base(IoIFP(io)))
3281 DIE(aTHX_ "-T and -B not implemented on filehandles");
3282 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3283 if (PL_laststatval < 0)
3285 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3286 if (PL_op->op_type == OP_FTTEXT)
3291 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3292 i = PerlIO_getc(IoIFP(io));
3294 (void)PerlIO_ungetc(IoIFP(io),i);
3296 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3298 len = PerlIO_get_bufsiz(IoIFP(io));
3299 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3300 /* sfio can have large buffers - limit to 512 */
3305 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3307 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3309 SETERRNO(EBADF,RMS_IFI);
3317 PL_laststype = OP_STAT;
3318 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3319 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3320 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3322 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3325 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3326 if (PL_laststatval < 0) {
3327 (void)PerlIO_close(fp);
3330 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3331 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3332 (void)PerlIO_close(fp);
3334 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3335 RETPUSHNO; /* special case NFS directories */
3336 RETPUSHYES; /* null file is anything */
3341 /* now scan s to look for textiness */
3342 /* XXX ASCII dependent code */
3344 #if defined(DOSISH) || defined(USEMYBINMODE)
3345 /* ignore trailing ^Z on short files */
3346 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3350 for (i = 0; i < len; i++, s++) {
3351 if (!*s) { /* null never allowed in text */
3356 else if (!(isPRINT(*s) || isSPACE(*s)))
3359 else if (*s & 128) {
3361 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3364 /* utf8 characters don't count as odd */
3365 if (UTF8_IS_START(*s)) {
3366 int ulen = UTF8SKIP(s);
3367 if (ulen < len - i) {
3369 for (j = 1; j < ulen; j++) {
3370 if (!UTF8_IS_CONTINUATION(s[j]))
3373 --ulen; /* loop does extra increment */
3383 *s != '\n' && *s != '\r' && *s != '\b' &&
3384 *s != '\t' && *s != '\f' && *s != 27)
3389 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3400 const char *tmps = NULL;
3404 SV * const sv = POPs;
3405 if (PL_op->op_flags & OPf_SPECIAL) {
3406 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3408 else if (isGV_with_GP(sv)) {
3409 gv = MUTABLE_GV(sv);
3411 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3412 gv = MUTABLE_GV(SvRV(sv));
3415 tmps = SvPV_nolen_const(sv);
3419 if( !gv && (!tmps || !*tmps) ) {
3420 HV * const table = GvHVn(PL_envgv);
3423 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3424 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3426 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3431 deprecate("chdir('') or chdir(undef) as chdir()");
3432 tmps = SvPV_nolen_const(*svp);
3436 TAINT_PROPER("chdir");
3441 TAINT_PROPER("chdir");
3444 IO* const io = GvIO(gv);
3447 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3448 } else if (IoIFP(io)) {
3449 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3452 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3453 report_evil_fh(gv, io, PL_op->op_type);
3454 SETERRNO(EBADF, RMS_IFI);
3459 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3460 report_evil_fh(gv, io, PL_op->op_type);
3461 SETERRNO(EBADF,RMS_IFI);
3465 DIE(aTHX_ PL_no_func, "fchdir");
3469 PUSHi( PerlDir_chdir(tmps) >= 0 );
3471 /* Clear the DEFAULT element of ENV so we'll get the new value
3473 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3480 dVAR; dSP; dMARK; dTARGET;
3481 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3492 char * const tmps = POPpx;
3493 TAINT_PROPER("chroot");
3494 PUSHi( chroot(tmps) >= 0 );
3497 DIE(aTHX_ PL_no_func, "chroot");
3505 const char * const tmps2 = POPpconstx;
3506 const char * const tmps = SvPV_nolen_const(TOPs);
3507 TAINT_PROPER("rename");
3509 anum = PerlLIO_rename(tmps, tmps2);
3511 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3512 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3515 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3516 (void)UNLINK(tmps2);
3517 if (!(anum = link(tmps, tmps2)))
3518 anum = UNLINK(tmps);
3526 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3530 const int op_type = PL_op->op_type;
3534 if (op_type == OP_LINK)
3535 DIE(aTHX_ PL_no_func, "link");
3537 # ifndef HAS_SYMLINK
3538 if (op_type == OP_SYMLINK)
3539 DIE(aTHX_ PL_no_func, "symlink");
3543 const char * const tmps2 = POPpconstx;
3544 const char * const tmps = SvPV_nolen_const(TOPs);
3545 TAINT_PROPER(PL_op_desc[op_type]);
3547 # if defined(HAS_LINK)
3548 # if defined(HAS_SYMLINK)
3549 /* Both present - need to choose which. */
3550 (op_type == OP_LINK) ?
3551 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3553 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3554 PerlLIO_link(tmps, tmps2);
3557 # if defined(HAS_SYMLINK)
3558 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3559 symlink(tmps, tmps2);
3564 SETi( result >= 0 );
3571 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3582 char buf[MAXPATHLEN];
3585 #ifndef INCOMPLETE_TAINTS
3589 len = readlink(tmps, buf, sizeof(buf) - 1);
3597 RETSETUNDEF; /* just pretend it's a normal file */
3601 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3603 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3605 char * const save_filename = filename;
3610 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3612 PERL_ARGS_ASSERT_DOONELINER;
3614 Newx(cmdline, size, char);
3615 my_strlcpy(cmdline, cmd, size);
3616 my_strlcat(cmdline, " ", size);
3617 for (s = cmdline + strlen(cmdline); *filename; ) {
3621 if (s - cmdline < size)
3622 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3623 myfp = PerlProc_popen(cmdline, "r");
3627 SV * const tmpsv = sv_newmortal();
3628 /* Need to save/restore 'PL_rs' ?? */
3629 s = sv_gets(tmpsv, myfp, 0);
3630 (void)PerlProc_pclose(myfp);
3634 #ifdef HAS_SYS_ERRLIST
3639 /* you don't see this */
3640 const char * const errmsg =
3641 #ifdef HAS_SYS_ERRLIST
3649 if (instr(s, errmsg)) {
3656 #define EACCES EPERM
3658 if (instr(s, "cannot make"))
3659 SETERRNO(EEXIST,RMS_FEX);
3660 else if (instr(s, "existing file"))
3661 SETERRNO(EEXIST,RMS_FEX);
3662 else if (instr(s, "ile exists"))
3663 SETERRNO(EEXIST,RMS_FEX);
3664 else if (instr(s, "non-exist"))
3665 SETERRNO(ENOENT,RMS_FNF);
3666 else if (instr(s, "does not exist"))
3667 SETERRNO(ENOENT,RMS_FNF);
3668 else if (instr(s, "not empty"))
3669 SETERRNO(EBUSY,SS_DEVOFFLINE);
3670 else if (instr(s, "cannot access"))
3671 SETERRNO(EACCES,RMS_PRV);
3673 SETERRNO(EPERM,RMS_PRV);
3676 else { /* some mkdirs return no failure indication */
3677 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3678 if (PL_op->op_type == OP_RMDIR)
3683 SETERRNO(EACCES,RMS_PRV); /* a guess */
3692 /* This macro removes trailing slashes from a directory name.
3693 * Different operating and file systems take differently to
3694 * trailing slashes. According to POSIX 1003.1 1996 Edition
3695 * any number of trailing slashes should be allowed.
3696 * Thusly we snip them away so that even non-conforming
3697 * systems are happy.
3698 * We should probably do this "filtering" for all
3699 * the functions that expect (potentially) directory names:
3700 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3701 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3703 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3704 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3707 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3708 (tmps) = savepvn((tmps), (len)); \
3718 const int mode = (MAXARG > 1) ? POPi : 0777;
3720 TRIMSLASHES(tmps,len,copy);
3722 TAINT_PROPER("mkdir");
3724 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3728 SETi( dooneliner("mkdir", tmps) );
3729 oldumask = PerlLIO_umask(0);
3730 PerlLIO_umask(oldumask);
3731 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3746 TRIMSLASHES(tmps,len,copy);
3747 TAINT_PROPER("rmdir");
3749 SETi( PerlDir_rmdir(tmps) >= 0 );
3751 SETi( dooneliner("rmdir", tmps) );
3758 /* Directory calls. */
3762 #if defined(Direntry_t) && defined(HAS_READDIR)
3764 const char * const dirname = POPpconstx;
3765 GV * const gv = MUTABLE_GV(POPs);
3766 register IO * const io = GvIOn(gv);
3771 if ((IoIFP(io) || IoOFP(io)) && ckWARN2(WARN_IO, WARN_DEPRECATED))
3772 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3773 "Opening filehandle %s also as a directory", GvENAME(gv));
3775 PerlDir_close(IoDIRP(io));
3776 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3782 SETERRNO(EBADF,RMS_DIR);
3785 DIE(aTHX_ PL_no_dir_func, "opendir");
3791 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3792 DIE(aTHX_ PL_no_dir_func, "readdir");
3794 #if !defined(I_DIRENT) && !defined(VMS)
3795 Direntry_t *readdir (DIR *);
3801 const I32 gimme = GIMME;
3802 GV * const gv = MUTABLE_GV(POPs);
3803 register const Direntry_t *dp;
3804 register IO * const io = GvIOn(gv);
3806 if (!io || !IoDIRP(io)) {
3807 if(ckWARN(WARN_IO)) {
3808 Perl_warner(aTHX_ packWARN(WARN_IO),
3809 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3815 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3819 sv = newSVpvn(dp->d_name, dp->d_namlen);
3821 sv = newSVpv(dp->d_name, 0);
3823 #ifndef INCOMPLETE_TAINTS
3824 if (!(IoFLAGS(io) & IOf_UNTAINT))
3828 } while (gimme == G_ARRAY);
3830 if (!dp && gimme != G_ARRAY)
3837 SETERRNO(EBADF,RMS_ISI);
3838 if (GIMME == G_ARRAY)
3847 #if defined(HAS_TELLDIR) || defined(telldir)
3849 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3850 /* XXX netbsd still seemed to.
3851 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3852 --JHI 1999-Feb-02 */
3853 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3854 long telldir (DIR *);
3856 GV * const gv = MUTABLE_GV(POPs);
3857 register IO * const io = GvIOn(gv);
3859 if (!io || !IoDIRP(io)) {
3860 if(ckWARN(WARN_IO)) {
3861 Perl_warner(aTHX_ packWARN(WARN_IO),
3862 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3867 PUSHi( PerlDir_tell(IoDIRP(io)) );
3871 SETERRNO(EBADF,RMS_ISI);
3874 DIE(aTHX_ PL_no_dir_func, "telldir");
3880 #if defined(HAS_SEEKDIR) || defined(seekdir)
3882 const long along = POPl;
3883 GV * const gv = MUTABLE_GV(POPs);
3884 register IO * const io = GvIOn(gv);
3886 if (!io || !IoDIRP(io)) {
3887 if(ckWARN(WARN_IO)) {
3888 Perl_warner(aTHX_ packWARN(WARN_IO),
3889 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3893 (void)PerlDir_seek(IoDIRP(io), along);
3898 SETERRNO(EBADF,RMS_ISI);
3901 DIE(aTHX_ PL_no_dir_func, "seekdir");
3907 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3909 GV * const gv = MUTABLE_GV(POPs);
3910 register IO * const io = GvIOn(gv);
3912 if (!io || !IoDIRP(io)) {
3913 if(ckWARN(WARN_IO)) {
3914 Perl_warner(aTHX_ packWARN(WARN_IO),
3915 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3919 (void)PerlDir_rewind(IoDIRP(io));
3923 SETERRNO(EBADF,RMS_ISI);
3926 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3932 #if defined(Direntry_t) && defined(HAS_READDIR)
3934 GV * const gv = MUTABLE_GV(POPs);
3935 register IO * const io = GvIOn(gv);
3937 if (!io || !IoDIRP(io)) {
3938 if(ckWARN(WARN_IO)) {
3939 Perl_warner(aTHX_ packWARN(WARN_IO),
3940 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3944 #ifdef VOID_CLOSEDIR
3945 PerlDir_close(IoDIRP(io));
3947 if (PerlDir_close(IoDIRP(io)) < 0) {
3948 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3957 SETERRNO(EBADF,RMS_IFI);
3960 DIE(aTHX_ PL_no_dir_func, "closedir");
3964 /* Process control. */
3973 PERL_FLUSHALL_FOR_CHILD;
3974 childpid = PerlProc_fork();
3978 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
3980 SvREADONLY_off(GvSV(tmpgv));
3981 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3982 SvREADONLY_on(GvSV(tmpgv));
3984 #ifdef THREADS_HAVE_PIDS
3985 PL_ppid = (IV)getppid();
3987 #ifdef PERL_USES_PL_PIDSTATUS
3988 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
3994 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3999 PERL_FLUSHALL_FOR_CHILD;
4000 childpid = PerlProc_fork();
4006 DIE(aTHX_ PL_no_func, "fork");
4013 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4018 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4019 childpid = wait4pid(-1, &argflags, 0);
4021 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4026 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4027 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4028 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4030 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4035 DIE(aTHX_ PL_no_func, "wait");
4041 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4043 const int optype = POPi;
4044 const Pid_t pid = TOPi;
4048 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4049 result = wait4pid(pid, &argflags, optype);
4051 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4056 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4057 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4058 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4060 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4065 DIE(aTHX_ PL_no_func, "waitpid");
4071 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4072 #if defined(__LIBCATAMOUNT__)
4073 PL_statusvalue = -1;
4082 while (++MARK <= SP) {
4083 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4088 TAINT_PROPER("system");
4090 PERL_FLUSHALL_FOR_CHILD;
4091 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4097 if (PerlProc_pipe(pp) >= 0)
4099 while ((childpid = PerlProc_fork()) == -1) {
4100 if (errno != EAGAIN) {
4105 PerlLIO_close(pp[0]);
4106 PerlLIO_close(pp[1]);
4113 Sigsave_t ihand,qhand; /* place to save signals during system() */
4117 PerlLIO_close(pp[1]);
4119 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4120 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4123 result = wait4pid(childpid, &status, 0);
4124 } while (result == -1 && errno == EINTR);
4126 (void)rsignal_restore(SIGINT, &ihand);
4127 (void)rsignal_restore(SIGQUIT, &qhand);
4129 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4130 do_execfree(); /* free any memory child malloced on fork */
4137 while (n < sizeof(int)) {
4138 n1 = PerlLIO_read(pp[0],
4139 (void*)(((char*)&errkid)+n),
4145 PerlLIO_close(pp[0]);
4146 if (n) { /* Error */
4147 if (n != sizeof(int))
4148 DIE(aTHX_ "panic: kid popen errno read");
4149 errno = errkid; /* Propagate errno from kid */
4150 STATUS_NATIVE_CHILD_SET(-1);
4153 XPUSHi(STATUS_CURRENT);
4157 PerlLIO_close(pp[0]);
4158 #if defined(HAS_FCNTL) && defined(F_SETFD)
4159 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4162 if (PL_op->op_flags & OPf_STACKED) {
4163 SV * const really = *++MARK;
4164 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4166 else if (SP - MARK != 1)
4167 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4169 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4173 #else /* ! FORK or VMS or OS/2 */
4176 if (PL_op->op_flags & OPf_STACKED) {
4177 SV * const really = *++MARK;
4178 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4179 value = (I32)do_aspawn(really, MARK, SP);
4181 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4184 else if (SP - MARK != 1) {
4185 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4186 value = (I32)do_aspawn(NULL, MARK, SP);
4188 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4192 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4194 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4196 STATUS_NATIVE_CHILD_SET(value);
4199 XPUSHi(result ? value : STATUS_CURRENT);
4200 #endif /* !FORK or VMS or OS/2 */
4207 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4212 while (++MARK <= SP) {
4213 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4218 TAINT_PROPER("exec");
4220 PERL_FLUSHALL_FOR_CHILD;
4221 if (PL_op->op_flags & OPf_STACKED) {
4222 SV * const really = *++MARK;
4223 value = (I32)do_aexec(really, MARK, SP);
4225 else if (SP - MARK != 1)
4227 value = (I32)vms_do_aexec(NULL, MARK, SP);
4231 (void ) do_aspawn(NULL, MARK, SP);
4235 value = (I32)do_aexec(NULL, MARK, SP);
4240 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4243 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4246 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4260 # ifdef THREADS_HAVE_PIDS
4261 if (PL_ppid != 1 && getppid() == 1)
4262 /* maybe the parent process has died. Refresh ppid cache */
4266 XPUSHi( getppid() );
4270 DIE(aTHX_ PL_no_func, "getppid");
4279 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4282 pgrp = (I32)BSD_GETPGRP(pid);
4284 if (pid != 0 && pid != PerlProc_getpid())
4285 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4291 DIE(aTHX_ PL_no_func, "getpgrp()");
4310 TAINT_PROPER("setpgrp");
4312 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4314 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4315 || (pid != 0 && pid != PerlProc_getpid()))
4317 DIE(aTHX_ "setpgrp can't take arguments");
4319 SETi( setpgrp() >= 0 );
4320 #endif /* USE_BSDPGRP */
4323 DIE(aTHX_ PL_no_func, "setpgrp()");
4329 #ifdef HAS_GETPRIORITY
4331 const int who = POPi;
4332 const int which = TOPi;
4333 SETi( getpriority(which, who) );
4336 DIE(aTHX_ PL_no_func, "getpriority()");
4342 #ifdef HAS_SETPRIORITY
4344 const int niceval = POPi;
4345 const int who = POPi;
4346 const int which = TOPi;
4347 TAINT_PROPER("setpriority");
4348 SETi( setpriority(which, who, niceval) >= 0 );
4351 DIE(aTHX_ PL_no_func, "setpriority()");
4361 XPUSHn( time(NULL) );
4363 XPUSHi( time(NULL) );
4375 (void)PerlProc_times(&PL_timesbuf);
4377 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4378 /* struct tms, though same data */
4382 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4383 if (GIMME == G_ARRAY) {
4384 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4385 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4386 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4394 if (GIMME == G_ARRAY) {
4401 DIE(aTHX_ "times not implemented");
4403 #endif /* HAS_TIMES */
4406 #ifdef LOCALTIME_EDGECASE_BROKEN
4407 static struct tm *S_my_localtime (pTHX_ Time_t *tp)
4412 /* No workarounds in the valid range */
4413 if (!tp || *tp < 0x7fff573f || *tp >= 0x80000000)
4414 return (localtime (tp));
4416 /* This edge case is to workaround the undefined behaviour, where the
4417 * TIMEZONE makes the time go beyond the defined range.
4418 * gmtime (0x7fffffff) => 2038-01-19 03:14:07
4419 * If there is a negative offset in TZ, like MET-1METDST, some broken
4420 * implementations of localtime () (like AIX 5.2) barf with bogus
4422 * 0x7fffffff gmtime 2038-01-19 03:14:07
4423 * 0x7fffffff localtime 1901-12-13 21:45:51
4424 * 0x7fffffff mylocaltime 2038-01-19 04:14:07
4425 * 0x3c19137f gmtime 2001-12-13 20:45:51
4426 * 0x3c19137f localtime 2001-12-13 21:45:51
4427 * 0x3c19137f mylocaltime 2001-12-13 21:45:51
4428 * Given that legal timezones are typically between GMT-12 and GMT+12
4429 * we turn back the clock 23 hours before calling the localtime
4430 * function, and add those to the return value. This will never cause
4431 * day wrapping problems, since the edge case is Tue Jan *19*
4433 T = *tp - 82800; /* 23 hour. allows up to GMT-23 */
4436 if (P->tm_hour >= 24) {
4438 P->tm_mday++; /* 18 -> 19 */
4439 P->tm_wday++; /* Mon -> Tue */
4440 P->tm_yday++; /* 18 -> 19 */
4443 } /* S_my_localtime */
4451 const struct tm *tmbuf;
4452 static const char * const dayname[] =
4453 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4454 static const char * const monname[] =
4455 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4456 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4462 when = (Time_t)SvNVx(POPs);
4464 when = (Time_t)SvIVx(POPs);
4467 if (PL_op->op_type == OP_LOCALTIME)
4468 #ifdef LOCALTIME_EDGECASE_BROKEN
4469 tmbuf = S_my_localtime(aTHX_ &when);
4471 tmbuf = localtime(&when);
4474 tmbuf = gmtime(&when);
4476 if (GIMME != G_ARRAY) {
4482 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
4483 dayname[tmbuf->tm_wday],
4484 monname[tmbuf->tm_mon],
4489 tmbuf->tm_year + 1900);
4495 mPUSHi(tmbuf->tm_sec);
4496 mPUSHi(tmbuf->tm_min);
4497 mPUSHi(tmbuf->tm_hour);
4498 mPUSHi(tmbuf->tm_mday);
4499 mPUSHi(tmbuf->tm_mon);
4500 mPUSHi(tmbuf->tm_year);
4501 mPUSHi(tmbuf->tm_wday);
4502 mPUSHi(tmbuf->tm_yday);
4503 mPUSHi(tmbuf->tm_isdst);
4514 anum = alarm((unsigned int)anum);
4521 DIE(aTHX_ PL_no_func, "alarm");
4532 (void)time(&lasttime);
4537 PerlProc_sleep((unsigned int)duration);
4540 XPUSHi(when - lasttime);
4544 /* Shared memory. */
4545 /* Merged with some message passing. */
4549 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4550 dVAR; dSP; dMARK; dTARGET;
4551 const int op_type = PL_op->op_type;
4556 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4559 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4562 value = (I32)(do_semop(MARK, SP) >= 0);
4565 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4581 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4582 dVAR; dSP; dMARK; dTARGET;
4583 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4590 DIE(aTHX_ "System V IPC is not implemented on this machine");
4596 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4597 dVAR; dSP; dMARK; dTARGET;
4598 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4606 PUSHp(zero_but_true, ZBTLEN);
4614 /* I can't const this further without getting warnings about the types of
4615 various arrays passed in from structures. */
4617 S_space_join_names_mortal(pTHX_ char *const *array)
4621 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4623 if (array && *array) {
4624 target = newSVpvs_flags("", SVs_TEMP);
4626 sv_catpv(target, *array);
4629 sv_catpvs(target, " ");
4632 target = sv_mortalcopy(&PL_sv_no);
4637 /* Get system info. */
4641 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4643 I32 which = PL_op->op_type;
4644 register char **elem;
4646 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4647 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4648 struct hostent *gethostbyname(Netdb_name_t);
4649 struct hostent *gethostent(void);
4651 struct hostent *hent;
4655 if (which == OP_GHBYNAME) {
4656 #ifdef HAS_GETHOSTBYNAME
4657 const char* const name = POPpbytex;
4658 hent = PerlSock_gethostbyname(name);
4660 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4663 else if (which == OP_GHBYADDR) {
4664 #ifdef HAS_GETHOSTBYADDR
4665 const int addrtype = POPi;
4666 SV * const addrsv = POPs;
4668 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4670 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4672 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4676 #ifdef HAS_GETHOSTENT
4677 hent = PerlSock_gethostent();
4679 DIE(aTHX_ PL_no_sock_func, "gethostent");
4682 #ifdef HOST_NOT_FOUND
4684 #ifdef USE_REENTRANT_API
4685 # ifdef USE_GETHOSTENT_ERRNO
4686 h_errno = PL_reentrant_buffer->_gethostent_errno;
4689 STATUS_UNIX_SET(h_errno);
4693 if (GIMME != G_ARRAY) {
4694 PUSHs(sv = sv_newmortal());
4696 if (which == OP_GHBYNAME) {
4698 sv_setpvn(sv, hent->h_addr, hent->h_length);
4701 sv_setpv(sv, (char*)hent->h_name);
4707 mPUSHs(newSVpv((char*)hent->h_name, 0));
4708 PUSHs(space_join_names_mortal(hent->h_aliases));
4709 mPUSHi(hent->h_addrtype);
4710 len = hent->h_length;
4713 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4714 mXPUSHp(*elem, len);
4718 mPUSHp(hent->h_addr, len);
4720 PUSHs(sv_mortalcopy(&PL_sv_no));
4725 DIE(aTHX_ PL_no_sock_func, "gethostent");
4731 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4733 I32 which = PL_op->op_type;
4735 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4736 struct netent *getnetbyaddr(Netdb_net_t, int);
4737 struct netent *getnetbyname(Netdb_name_t);
4738 struct netent *getnetent(void);
4740 struct netent *nent;
4742 if (which == OP_GNBYNAME){
4743 #ifdef HAS_GETNETBYNAME
4744 const char * const name = POPpbytex;
4745 nent = PerlSock_getnetbyname(name);
4747 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4750 else if (which == OP_GNBYADDR) {
4751 #ifdef HAS_GETNETBYADDR
4752 const int addrtype = POPi;
4753 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4754 nent = PerlSock_getnetbyaddr(addr, addrtype);
4756 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4760 #ifdef HAS_GETNETENT
4761 nent = PerlSock_getnetent();
4763 DIE(aTHX_ PL_no_sock_func, "getnetent");
4766 #ifdef HOST_NOT_FOUND
4768 #ifdef USE_REENTRANT_API
4769 # ifdef USE_GETNETENT_ERRNO
4770 h_errno = PL_reentrant_buffer->_getnetent_errno;
4773 STATUS_UNIX_SET(h_errno);
4778 if (GIMME != G_ARRAY) {
4779 PUSHs(sv = sv_newmortal());
4781 if (which == OP_GNBYNAME)
4782 sv_setiv(sv, (IV)nent->n_net);
4784 sv_setpv(sv, nent->n_name);
4790 mPUSHs(newSVpv(nent->n_name, 0));
4791 PUSHs(space_join_names_mortal(nent->n_aliases));
4792 mPUSHi(nent->n_addrtype);
4793 mPUSHi(nent->n_net);
4798 DIE(aTHX_ PL_no_sock_func, "getnetent");
4804 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4806 I32 which = PL_op->op_type;
4808 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4809 struct protoent *getprotobyname(Netdb_name_t);
4810 struct protoent *getprotobynumber(int);
4811 struct protoent *getprotoent(void);
4813 struct protoent *pent;
4815 if (which == OP_GPBYNAME) {
4816 #ifdef HAS_GETPROTOBYNAME
4817 const char* const name = POPpbytex;
4818 pent = PerlSock_getprotobyname(name);
4820 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4823 else if (which == OP_GPBYNUMBER) {
4824 #ifdef HAS_GETPROTOBYNUMBER
4825 const int number = POPi;
4826 pent = PerlSock_getprotobynumber(number);
4828 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4832 #ifdef HAS_GETPROTOENT
4833 pent = PerlSock_getprotoent();
4835 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4839 if (GIMME != G_ARRAY) {
4840 PUSHs(sv = sv_newmortal());
4842 if (which == OP_GPBYNAME)
4843 sv_setiv(sv, (IV)pent->p_proto);
4845 sv_setpv(sv, pent->p_name);
4851 mPUSHs(newSVpv(pent->p_name, 0));
4852 PUSHs(space_join_names_mortal(pent->p_aliases));
4853 mPUSHi(pent->p_proto);
4858 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4864 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4866 I32 which = PL_op->op_type;
4868 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4869 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4870 struct servent *getservbyport(int, Netdb_name_t);
4871 struct servent *getservent(void);
4873 struct servent *sent;
4875 if (which == OP_GSBYNAME) {
4876 #ifdef HAS_GETSERVBYNAME
4877 const char * const proto = POPpbytex;
4878 const char * const name = POPpbytex;
4879 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4881 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4884 else if (which == OP_GSBYPORT) {
4885 #ifdef HAS_GETSERVBYPORT
4886 const char * const proto = POPpbytex;
4887 unsigned short port = (unsigned short)POPu;
4889 port = PerlSock_htons(port);
4891 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4893 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4897 #ifdef HAS_GETSERVENT
4898 sent = PerlSock_getservent();
4900 DIE(aTHX_ PL_no_sock_func, "getservent");
4904 if (GIMME != G_ARRAY) {
4905 PUSHs(sv = sv_newmortal());
4907 if (which == OP_GSBYNAME) {
4909 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4911 sv_setiv(sv, (IV)(sent->s_port));
4915 sv_setpv(sv, sent->s_name);
4921 mPUSHs(newSVpv(sent->s_name, 0));
4922 PUSHs(space_join_names_mortal(sent->s_aliases));
4924 mPUSHi(PerlSock_ntohs(sent->s_port));
4926 mPUSHi(sent->s_port);
4928 mPUSHs(newSVpv(sent->s_proto, 0));
4933 DIE(aTHX_ PL_no_sock_func, "getservent");
4939 #ifdef HAS_SETHOSTENT
4941 PerlSock_sethostent(TOPi);
4944 DIE(aTHX_ PL_no_sock_func, "sethostent");
4950 #ifdef HAS_SETNETENT
4952 (void)PerlSock_setnetent(TOPi);
4955 DIE(aTHX_ PL_no_sock_func, "setnetent");
4961 #ifdef HAS_SETPROTOENT
4963 (void)PerlSock_setprotoent(TOPi);
4966 DIE(aTHX_ PL_no_sock_func, "setprotoent");
4972 #ifdef HAS_SETSERVENT
4974 (void)PerlSock_setservent(TOPi);
4977 DIE(aTHX_ PL_no_sock_func, "setservent");
4983 #ifdef HAS_ENDHOSTENT
4985 PerlSock_endhostent();
4989 DIE(aTHX_ PL_no_sock_func, "endhostent");
4995 #ifdef HAS_ENDNETENT
4997 PerlSock_endnetent();
5001 DIE(aTHX_ PL_no_sock_func, "endnetent");
5007 #ifdef HAS_ENDPROTOENT
5009 PerlSock_endprotoent();
5013 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5019 #ifdef HAS_ENDSERVENT
5021 PerlSock_endservent();
5025 DIE(aTHX_ PL_no_sock_func, "endservent");
5033 I32 which = PL_op->op_type;
5035 struct passwd *pwent = NULL;
5037 * We currently support only the SysV getsp* shadow password interface.
5038 * The interface is declared in <shadow.h> and often one needs to link
5039 * with -lsecurity or some such.
5040 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5043 * AIX getpwnam() is clever enough to return the encrypted password
5044 * only if the caller (euid?) is root.
5046 * There are at least three other shadow password APIs. Many platforms
5047 * seem to contain more than one interface for accessing the shadow
5048 * password databases, possibly for compatibility reasons.
5049 * The getsp*() is by far he simplest one, the other two interfaces
5050 * are much more complicated, but also very similar to each other.
5055 * struct pr_passwd *getprpw*();
5056 * The password is in
5057 * char getprpw*(...).ufld.fd_encrypt[]
5058 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5063 * struct es_passwd *getespw*();
5064 * The password is in
5065 * char *(getespw*(...).ufld.fd_encrypt)
5066 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5069 * struct userpw *getuserpw();
5070 * The password is in
5071 * char *(getuserpw(...)).spw_upw_passwd
5072 * (but the de facto standard getpwnam() should work okay)
5074 * Mention I_PROT here so that Configure probes for it.
5076 * In HP-UX for getprpw*() the manual page claims that one should include
5077 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5078 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5079 * and pp_sys.c already includes <shadow.h> if there is such.
5081 * Note that <sys/security.h> is already probed for, but currently
5082 * it is only included in special cases.
5084 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5085 * be preferred interface, even though also the getprpw*() interface
5086 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5087 * One also needs to call set_auth_parameters() in main() before
5088 * doing anything else, whether one is using getespw*() or getprpw*().
5090 * Note that accessing the shadow databases can be magnitudes
5091 * slower than accessing the standard databases.
5096 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5097 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5098 * the pw_comment is left uninitialized. */
5099 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5105 const char* const name = POPpbytex;
5106 pwent = getpwnam(name);
5112 pwent = getpwuid(uid);
5116 # ifdef HAS_GETPWENT
5118 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5119 if (pwent) pwent = getpwnam(pwent->pw_name);
5122 DIE(aTHX_ PL_no_func, "getpwent");
5128 if (GIMME != G_ARRAY) {
5129 PUSHs(sv = sv_newmortal());
5131 if (which == OP_GPWNAM)
5132 # if Uid_t_sign <= 0
5133 sv_setiv(sv, (IV)pwent->pw_uid);
5135 sv_setuv(sv, (UV)pwent->pw_uid);
5138 sv_setpv(sv, pwent->pw_name);
5144 mPUSHs(newSVpv(pwent->pw_name, 0));
5148 /* If we have getspnam(), we try to dig up the shadow
5149 * password. If we are underprivileged, the shadow
5150 * interface will set the errno to EACCES or similar,
5151 * and return a null pointer. If this happens, we will
5152 * use the dummy password (usually "*" or "x") from the
5153 * standard password database.
5155 * In theory we could skip the shadow call completely
5156 * if euid != 0 but in practice we cannot know which
5157 * security measures are guarding the shadow databases
5158 * on a random platform.
5160 * Resist the urge to use additional shadow interfaces.
5161 * Divert the urge to writing an extension instead.
5164 /* Some AIX setups falsely(?) detect some getspnam(), which
5165 * has a different API than the Solaris/IRIX one. */
5166 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5168 const int saverrno = errno;
5169 const struct spwd * const spwent = getspnam(pwent->pw_name);
5170 /* Save and restore errno so that
5171 * underprivileged attempts seem
5172 * to have never made the unsccessful
5173 * attempt to retrieve the shadow password. */
5175 if (spwent && spwent->sp_pwdp)
5176 sv_setpv(sv, spwent->sp_pwdp);
5180 if (!SvPOK(sv)) /* Use the standard password, then. */
5181 sv_setpv(sv, pwent->pw_passwd);
5184 # ifndef INCOMPLETE_TAINTS
5185 /* passwd is tainted because user himself can diddle with it.
5186 * admittedly not much and in a very limited way, but nevertheless. */
5190 # if Uid_t_sign <= 0
5191 mPUSHi(pwent->pw_uid);
5193 mPUSHu(pwent->pw_uid);
5196 # if Uid_t_sign <= 0
5197 mPUSHi(pwent->pw_gid);
5199 mPUSHu(pwent->pw_gid);
5201 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5202 * because of the poor interface of the Perl getpw*(),
5203 * not because there's some standard/convention saying so.
5204 * A better interface would have been to return a hash,
5205 * but we are accursed by our history, alas. --jhi. */
5207 mPUSHi(pwent->pw_change);
5210 mPUSHi(pwent->pw_quota);
5213 mPUSHs(newSVpv(pwent->pw_age, 0));
5215 /* I think that you can never get this compiled, but just in case. */
5216 PUSHs(sv_mortalcopy(&PL_sv_no));
5221 /* pw_class and pw_comment are mutually exclusive--.
5222 * see the above note for pw_change, pw_quota, and pw_age. */
5224 mPUSHs(newSVpv(pwent->pw_class, 0));
5227 mPUSHs(newSVpv(pwent->pw_comment, 0));
5229 /* I think that you can never get this compiled, but just in case. */
5230 PUSHs(sv_mortalcopy(&PL_sv_no));
5235 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5237 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5239 # ifndef INCOMPLETE_TAINTS
5240 /* pw_gecos is tainted because user himself can diddle with it. */
5244 mPUSHs(newSVpv(pwent->pw_dir, 0));
5246 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5247 # ifndef INCOMPLETE_TAINTS
5248 /* pw_shell is tainted because user himself can diddle with it. */
5253 mPUSHi(pwent->pw_expire);
5258 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5264 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5269 DIE(aTHX_ PL_no_func, "setpwent");
5275 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5280 DIE(aTHX_ PL_no_func, "endpwent");
5288 const I32 which = PL_op->op_type;
5289 const struct group *grent;
5291 if (which == OP_GGRNAM) {
5292 const char* const name = POPpbytex;
5293 grent = (const struct group *)getgrnam(name);
5295 else if (which == OP_GGRGID) {
5296 const Gid_t gid = POPi;
5297 grent = (const struct group *)getgrgid(gid);
5301 grent = (struct group *)getgrent();
5303 DIE(aTHX_ PL_no_func, "getgrent");
5307 if (GIMME != G_ARRAY) {
5308 SV * const sv = sv_newmortal();
5312 if (which == OP_GGRNAM)
5313 sv_setiv(sv, (IV)grent->gr_gid);
5315 sv_setpv(sv, grent->gr_name);
5321 mPUSHs(newSVpv(grent->gr_name, 0));
5324 mPUSHs(newSVpv(grent->gr_passwd, 0));
5326 PUSHs(sv_mortalcopy(&PL_sv_no));
5329 mPUSHi(grent->gr_gid);
5331 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5332 /* In UNICOS/mk (_CRAYMPP) the multithreading
5333 * versions (getgrnam_r, getgrgid_r)
5334 * seem to return an illegal pointer
5335 * as the group members list, gr_mem.
5336 * getgrent() doesn't even have a _r version
5337 * but the gr_mem is poisonous anyway.
5338 * So yes, you cannot get the list of group
5339 * members if building multithreaded in UNICOS/mk. */
5340 PUSHs(space_join_names_mortal(grent->gr_mem));
5346 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5352 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5357 DIE(aTHX_ PL_no_func, "setgrent");
5363 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5368 DIE(aTHX_ PL_no_func, "endgrent");
5378 if (!(tmps = PerlProc_getlogin()))
5380 PUSHp(tmps, strlen(tmps));
5383 DIE(aTHX_ PL_no_func, "getlogin");
5387 /* Miscellaneous. */
5392 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5393 register I32 items = SP - MARK;
5394 unsigned long a[20];
5399 while (++MARK <= SP) {
5400 if (SvTAINTED(*MARK)) {
5406 TAINT_PROPER("syscall");
5409 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5410 * or where sizeof(long) != sizeof(char*). But such machines will
5411 * not likely have syscall implemented either, so who cares?
5413 while (++MARK <= SP) {
5414 if (SvNIOK(*MARK) || !i)
5415 a[i++] = SvIV(*MARK);
5416 else if (*MARK == &PL_sv_undef)
5419 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5425 DIE(aTHX_ "Too many args to syscall");
5427 DIE(aTHX_ "Too few args to syscall");
5429 retval = syscall(a[0]);
5432 retval = syscall(a[0],a[1]);
5435 retval = syscall(a[0],a[1],a[2]);
5438 retval = syscall(a[0],a[1],a[2],a[3]);
5441 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5444 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5447 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5450 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5454 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5457 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5460 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5464 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5468 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5472 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5473 a[10],a[11],a[12],a[13]);
5475 #endif /* atarist */
5481 DIE(aTHX_ PL_no_func, "syscall");
5485 #ifdef FCNTL_EMULATE_FLOCK
5487 /* XXX Emulate flock() with fcntl().
5488 What's really needed is a good file locking module.
5492 fcntl_emulate_flock(int fd, int operation)
5496 switch (operation & ~LOCK_NB) {
5498 flock.l_type = F_RDLCK;
5501 flock.l_type = F_WRLCK;
5504 flock.l_type = F_UNLCK;
5510 flock.l_whence = SEEK_SET;
5511 flock.l_start = flock.l_len = (Off_t)0;
5513 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5516 #endif /* FCNTL_EMULATE_FLOCK */
5518 #ifdef LOCKF_EMULATE_FLOCK
5520 /* XXX Emulate flock() with lockf(). This is just to increase
5521 portability of scripts. The calls are not completely
5522 interchangeable. What's really needed is a good file
5526 /* The lockf() constants might have been defined in <unistd.h>.
5527 Unfortunately, <unistd.h> causes troubles on some mixed
5528 (BSD/POSIX) systems, such as SunOS 4.1.3.
5530 Further, the lockf() constants aren't POSIX, so they might not be
5531 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5532 just stick in the SVID values and be done with it. Sigh.
5536 # define F_ULOCK 0 /* Unlock a previously locked region */
5539 # define F_LOCK 1 /* Lock a region for exclusive use */
5542 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5545 # define F_TEST 3 /* Test a region for other processes locks */
5549 lockf_emulate_flock(int fd, int operation)
5552 const int save_errno = errno;
5555 /* flock locks entire file so for lockf we need to do the same */
5556 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5557 if (pos > 0) /* is seekable and needs to be repositioned */
5558 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5559 pos = -1; /* seek failed, so don't seek back afterwards */
5562 switch (operation) {
5564 /* LOCK_SH - get a shared lock */
5566 /* LOCK_EX - get an exclusive lock */
5568 i = lockf (fd, F_LOCK, 0);
5571 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5572 case LOCK_SH|LOCK_NB:
5573 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5574 case LOCK_EX|LOCK_NB:
5575 i = lockf (fd, F_TLOCK, 0);
5577 if ((errno == EAGAIN) || (errno == EACCES))
5578 errno = EWOULDBLOCK;
5581 /* LOCK_UN - unlock (non-blocking is a no-op) */
5583 case LOCK_UN|LOCK_NB:
5584 i = lockf (fd, F_ULOCK, 0);
5587 /* Default - can't decipher operation */
5594 if (pos > 0) /* need to restore position of the handle */
5595 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5600 #endif /* LOCKF_EMULATE_FLOCK */
5604 * c-indentation-style: bsd
5606 * indent-tabs-mode: t
5609 * ex: set ts=8 sts=4 sw=4 noet: