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.
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
20 /* This file contains system pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
30 #define PERL_IN_PP_SYS_C
36 /* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
45 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
53 # include <sys/wait.h>
57 # include <sys/resource.h>
66 # include <sys/select.h>
70 /* XXX Configure test needed.
71 h_errno might not be a simple 'int', especially for multi-threaded
72 applications, see "extern int errno in perl.h". Creating such
73 a test requires taking into account the differences between
74 compiling multithreaded and singlethreaded ($ccflags et al).
75 HOST_NOT_FOUND is typically defined in <netdb.h>.
77 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
86 struct passwd *getpwnam (char *);
87 struct passwd *getpwuid (Uid_t);
92 struct passwd *getpwent (void);
93 #elif defined (VMS) && defined (my_getpwent)
94 struct passwd *Perl_my_getpwent (pTHX);
103 struct group *getgrnam (char *);
104 struct group *getgrgid (Gid_t);
108 struct group *getgrent (void);
114 # if defined(_MSC_VER) || defined(__MINGW32__)
115 # include <sys/utime.h>
122 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
125 # define my_chsize PerlLIO_chsize
128 # define my_chsize PerlLIO_chsize
130 I32 my_chsize(int fd, Off_t length);
136 #else /* no flock() */
138 /* fcntl.h might not have been included, even if it exists, because
139 the current Configure only sets I_FCNTL if it's needed to pick up
140 the *_OK constants. Make sure it has been included before testing
141 the fcntl() locking constants. */
142 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
146 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
147 # define FLOCK fcntl_emulate_flock
148 # define FCNTL_EMULATE_FLOCK
149 # else /* no flock() or fcntl(F_SETLK,...) */
151 # define FLOCK lockf_emulate_flock
152 # define LOCKF_EMULATE_FLOCK
154 # endif /* no flock() or fcntl(F_SETLK,...) */
157 static int FLOCK (int, int);
160 * These are the flock() constants. Since this sytems doesn't have
161 * flock(), the values of the constants are probably not available.
175 # endif /* emulating flock() */
177 #endif /* no flock() */
180 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
182 #if defined(I_SYS_ACCESS) && !defined(R_OK)
183 # include <sys/access.h>
186 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
187 # define FD_CLOEXEC 1 /* NeXT needs this */
193 /* Missing protos on LynxOS */
194 void sethostent(int);
195 void endhostent(void);
197 void endnetent(void);
198 void setprotoent(int);
199 void endprotoent(void);
200 void setservent(int);
201 void endservent(void);
204 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
206 /* F_OK unused: if stat() cannot find it... */
208 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
209 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
210 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
214 # ifdef I_SYS_SECURITY
215 # include <sys/security.h>
219 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
222 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
226 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
228 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
232 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
233 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
234 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
237 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
239 const Uid_t ruid = getuid();
240 const Uid_t euid = geteuid();
241 const Gid_t rgid = getgid();
242 const Gid_t egid = getegid();
245 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
246 Perl_croak(aTHX_ "switching effective uid is not implemented");
249 if (setreuid(euid, ruid))
252 if (setresuid(euid, ruid, (Uid_t)-1))
255 Perl_croak(aTHX_ "entering effective uid failed");
258 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
259 Perl_croak(aTHX_ "switching effective gid is not implemented");
262 if (setregid(egid, rgid))
265 if (setresgid(egid, rgid, (Gid_t)-1))
268 Perl_croak(aTHX_ "entering effective gid failed");
271 res = access(path, mode);
274 if (setreuid(ruid, euid))
277 if (setresuid(ruid, euid, (Uid_t)-1))
280 Perl_croak(aTHX_ "leaving effective uid failed");
283 if (setregid(rgid, egid))
286 if (setresgid(rgid, egid, (Gid_t)-1))
289 Perl_croak(aTHX_ "leaving effective gid failed");
293 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
300 const char * const tmps = POPpconstx;
301 const I32 gimme = GIMME_V;
302 const char *mode = "r";
305 if (PL_op->op_private & OPpOPEN_IN_RAW)
307 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
309 fp = PerlProc_popen(tmps, mode);
311 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
313 PerlIO_apply_layers(aTHX_ fp,mode,type);
315 if (gimme == G_VOID) {
317 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
320 else if (gimme == G_SCALAR) {
323 PL_rs = &PL_sv_undef;
324 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
325 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
333 SV * const sv = newSV(79);
334 if (sv_gets(sv, fp, 0) == NULL) {
339 if (SvLEN(sv) - SvCUR(sv) > 20) {
340 SvPV_shrink_to_cur(sv);
345 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
346 TAINT; /* "I believe that this is not gratuitous!" */
349 STATUS_NATIVE_CHILD_SET(-1);
350 if (gimme == G_SCALAR)
361 tryAMAGICunTARGET(iter, -1);
363 /* Note that we only ever get here if File::Glob fails to load
364 * without at the same time croaking, for some reason, or if
365 * perl was built with PERL_EXTERNAL_GLOB */
372 * The external globbing program may use things we can't control,
373 * so for security reasons we must assume the worst.
376 taint_proper(PL_no_security, "glob");
380 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
381 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
383 SAVESPTR(PL_rs); /* This is not permanent, either. */
384 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
387 *SvPVX(PL_rs) = '\n';
391 result = do_readline();
399 PL_last_in_gv = cGVOP_gv;
400 return do_readline();
411 do_join(TARG, &PL_sv_no, MARK, SP);
415 else if (SP == MARK) {
423 tmps = SvPV_const(tmpsv, len);
424 if ((!tmps || !len) && PL_errgv) {
425 SV * const error = ERRSV;
426 SvUPGRADE(error, SVt_PV);
427 if (SvPOK(error) && SvCUR(error))
428 sv_catpvs(error, "\t...caught");
430 tmps = SvPV_const(tmpsv, len);
433 tmpsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
435 Perl_warn(aTHX_ "%"SVf, SVfARG(tmpsv));
447 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
449 if (SP - MARK != 1) {
451 do_join(TARG, &PL_sv_no, MARK, SP);
453 tmps = SvPV_const(tmpsv, len);
459 tmps = SvROK(tmpsv) ? (const char *)NULL : SvPV_const(tmpsv, len);
462 SV * const error = ERRSV;
463 SvUPGRADE(error, SVt_PV);
464 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
466 SvSetSV(error,tmpsv);
467 else if (sv_isobject(error)) {
468 HV * const stash = SvSTASH(SvRV(error));
469 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
471 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
472 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
479 call_sv(MUTABLE_SV(GvCV(gv)),
480 G_SCALAR|G_EVAL|G_KEEPERR);
481 sv_setsv(error,*PL_stack_sp--);
487 if (SvPOK(error) && SvCUR(error))
488 sv_catpvs(error, "\t...propagated");
491 tmps = SvPV_const(tmpsv, len);
497 tmpsv = newSVpvs_flags("Died", SVs_TEMP);
499 DIE(aTHX_ "%"SVf, SVfARG(tmpsv));
515 GV * const gv = MUTABLE_GV(*++MARK);
518 DIE(aTHX_ PL_no_usym, "filehandle");
520 if ((io = GvIOp(gv))) {
522 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
525 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
526 "Opening dirhandle %s also as a file",
529 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
531 /* Method's args are same as ours ... */
532 /* ... except handle is replaced by the object */
533 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
537 call_method("OPEN", G_SCALAR);
551 tmps = SvPV_const(sv, len);
552 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
555 PUSHi( (I32)PL_forkprocess );
556 else if (PL_forkprocess == 0) /* we are a new child */
566 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
569 IO * const io = GvIO(gv);
571 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
574 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
577 call_method("CLOSE", G_SCALAR);
585 PUSHs(boolSV(do_close(gv, TRUE)));
598 GV * const wgv = MUTABLE_GV(POPs);
599 GV * const rgv = MUTABLE_GV(POPs);
604 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
605 DIE(aTHX_ PL_no_usym, "filehandle");
610 do_close(rgv, FALSE);
612 do_close(wgv, FALSE);
614 if (PerlProc_pipe(fd) < 0)
617 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
618 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
619 IoOFP(rstio) = IoIFP(rstio);
620 IoIFP(wstio) = IoOFP(wstio);
621 IoTYPE(rstio) = IoTYPE_RDONLY;
622 IoTYPE(wstio) = IoTYPE_WRONLY;
624 if (!IoIFP(rstio) || !IoOFP(wstio)) {
626 PerlIO_close(IoIFP(rstio));
628 PerlLIO_close(fd[0]);
630 PerlIO_close(IoOFP(wstio));
632 PerlLIO_close(fd[1]);
635 #if defined(HAS_FCNTL) && defined(F_SETFD)
636 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
637 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
644 DIE(aTHX_ PL_no_func, "pipe");
658 gv = MUTABLE_GV(POPs);
660 if (gv && (io = GvIO(gv))
661 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
664 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
667 call_method("FILENO", G_SCALAR);
673 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
674 /* Can't do this because people seem to do things like
675 defined(fileno($foo)) to check whether $foo is a valid fh.
676 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
677 report_evil_fh(gv, io, PL_op->op_type);
682 PUSHi(PerlIO_fileno(fp));
695 anum = PerlLIO_umask(022);
696 /* setting it to 022 between the two calls to umask avoids
697 * to have a window where the umask is set to 0 -- meaning
698 * that another thread could create world-writeable files. */
700 (void)PerlLIO_umask(anum);
703 anum = PerlLIO_umask(POPi);
704 TAINT_PROPER("umask");
707 /* Only DIE if trying to restrict permissions on "user" (self).
708 * Otherwise it's harmless and more useful to just return undef
709 * since 'group' and 'other' concepts probably don't exist here. */
710 if (MAXARG >= 1 && (POPi & 0700))
711 DIE(aTHX_ "umask not implemented");
712 XPUSHs(&PL_sv_undef);
731 gv = MUTABLE_GV(POPs);
733 if (gv && (io = GvIO(gv))) {
734 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
737 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
742 call_method("BINMODE", G_SCALAR);
750 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
751 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
752 report_evil_fh(gv, io, PL_op->op_type);
753 SETERRNO(EBADF,RMS_IFI);
760 const char *d = NULL;
763 d = SvPV_const(discp, len);
764 mode = mode_from_discipline(d, len);
765 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
766 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
767 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
788 const I32 markoff = MARK - PL_stack_base;
789 const char *methname;
790 int how = PERL_MAGIC_tied;
794 switch(SvTYPE(varsv)) {
796 methname = "TIEHASH";
797 HvEITER_set(MUTABLE_HV(varsv), 0);
800 methname = "TIEARRAY";
803 if (isGV_with_GP(varsv)) {
804 methname = "TIEHANDLE";
805 how = PERL_MAGIC_tiedscalar;
806 /* For tied filehandles, we apply tiedscalar magic to the IO
807 slot of the GP rather than the GV itself. AMS 20010812 */
809 GvIOp(varsv) = newIO();
810 varsv = MUTABLE_SV(GvIOp(varsv));
815 methname = "TIESCALAR";
816 how = PERL_MAGIC_tiedscalar;
820 if (sv_isobject(*MARK)) { /* Calls GET magic. */
822 PUSHSTACKi(PERLSI_MAGIC);
824 EXTEND(SP,(I32)items);
828 call_method(methname, G_SCALAR);
831 /* Not clear why we don't call call_method here too.
832 * perhaps to get different error message ?
835 const char *name = SvPV_nomg_const(*MARK, len);
836 stash = gv_stashpvn(name, len, 0);
837 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
838 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
839 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
842 PUSHSTACKi(PERLSI_MAGIC);
844 EXTEND(SP,(I32)items);
848 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
854 if (sv_isobject(sv)) {
855 sv_unmagic(varsv, how);
856 /* Croak if a self-tie on an aggregate is attempted. */
857 if (varsv == SvRV(sv) &&
858 (SvTYPE(varsv) == SVt_PVAV ||
859 SvTYPE(varsv) == SVt_PVHV))
861 "Self-ties of arrays and hashes are not supported");
862 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
865 SP = PL_stack_base + markoff;
875 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
876 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
878 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
881 if ((mg = SvTIED_mg(sv, how))) {
882 SV * const obj = SvRV(SvTIED_obj(sv, mg));
884 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
886 if (gv && isGV(gv) && (cv = GvCV(gv))) {
888 XPUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
889 mXPUSHi(SvREFCNT(obj) - 1);
892 call_sv(MUTABLE_SV(cv), G_VOID);
896 else if (mg && SvREFCNT(obj) > 1) {
897 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
898 "untie attempted while %"UVuf" inner references still exist",
899 (UV)SvREFCNT(obj) - 1 ) ;
903 sv_unmagic(sv, how) ;
913 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
914 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
916 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
919 if ((mg = SvTIED_mg(sv, how))) {
920 SV *osv = SvTIED_obj(sv, mg);
921 if (osv == mg->mg_obj)
922 osv = sv_mortalcopy(osv);
936 HV * const hv = MUTABLE_HV(POPs);
937 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
938 stash = gv_stashsv(sv, 0);
939 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
941 require_pv("AnyDBM_File.pm");
943 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
944 DIE(aTHX_ "No dbm on this machine");
954 mPUSHu(O_RDWR|O_CREAT);
959 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
962 if (!sv_isobject(TOPs)) {
970 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
974 if (sv_isobject(TOPs)) {
975 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
976 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
993 struct timeval timebuf;
994 struct timeval *tbuf = &timebuf;
997 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1002 # if BYTEORDER & 0xf0000
1003 # define ORDERBYTE (0x88888888 - BYTEORDER)
1005 # define ORDERBYTE (0x4444 - BYTEORDER)
1011 for (i = 1; i <= 3; i++) {
1012 SV * const sv = SP[i];
1015 if (SvREADONLY(sv)) {
1017 sv_force_normal_flags(sv, 0);
1018 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1019 DIE(aTHX_ "%s", PL_no_modify);
1022 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1023 SvPV_force_nolen(sv); /* force string conversion */
1030 /* little endians can use vecs directly */
1031 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1038 masksize = NFDBITS / NBBY;
1040 masksize = sizeof(long); /* documented int, everyone seems to use long */
1042 Zero(&fd_sets[0], 4, char*);
1045 # if SELECT_MIN_BITS == 1
1046 growsize = sizeof(fd_set);
1048 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1049 # undef SELECT_MIN_BITS
1050 # define SELECT_MIN_BITS __FD_SETSIZE
1052 /* If SELECT_MIN_BITS is greater than one we most probably will want
1053 * to align the sizes with SELECT_MIN_BITS/8 because for example
1054 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1055 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1056 * on (sets/tests/clears bits) is 32 bits. */
1057 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1065 timebuf.tv_sec = (long)value;
1066 value -= (NV)timebuf.tv_sec;
1067 timebuf.tv_usec = (long)(value * 1000000.0);
1072 for (i = 1; i <= 3; i++) {
1074 if (!SvOK(sv) || SvCUR(sv) == 0) {
1081 Sv_Grow(sv, growsize);
1085 while (++j <= growsize) {
1089 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1091 Newx(fd_sets[i], growsize, char);
1092 for (offset = 0; offset < growsize; offset += masksize) {
1093 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1094 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1097 fd_sets[i] = SvPVX(sv);
1101 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1102 /* Can't make just the (void*) conditional because that would be
1103 * cpp #if within cpp macro, and not all compilers like that. */
1104 nfound = PerlSock_select(
1106 (Select_fd_set_t) fd_sets[1],
1107 (Select_fd_set_t) fd_sets[2],
1108 (Select_fd_set_t) fd_sets[3],
1109 (void*) tbuf); /* Workaround for compiler bug. */
1111 nfound = PerlSock_select(
1113 (Select_fd_set_t) fd_sets[1],
1114 (Select_fd_set_t) fd_sets[2],
1115 (Select_fd_set_t) fd_sets[3],
1118 for (i = 1; i <= 3; i++) {
1121 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1123 for (offset = 0; offset < growsize; offset += masksize) {
1124 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1125 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1127 Safefree(fd_sets[i]);
1134 if (GIMME == G_ARRAY && tbuf) {
1135 value = (NV)(timebuf.tv_sec) +
1136 (NV)(timebuf.tv_usec) / 1000000.0;
1141 DIE(aTHX_ "select not implemented");
1146 =for apidoc setdefout
1148 Sets PL_defoutgv, the default file handle for output, to the passed in
1149 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1150 count of the passed in typeglob is increased by one, and the reference count
1151 of the typeglob that PL_defoutgv points to is decreased by one.
1157 Perl_setdefout(pTHX_ GV *gv)
1160 SvREFCNT_inc_simple_void(gv);
1162 SvREFCNT_dec(PL_defoutgv);
1170 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1171 GV * egv = GvEGV(PL_defoutgv);
1177 XPUSHs(&PL_sv_undef);
1179 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1180 if (gvp && *gvp == egv) {
1181 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1185 mXPUSHs(newRV(MUTABLE_SV(egv)));
1190 if (!GvIO(newdefout))
1191 gv_IOadd(newdefout);
1192 setdefout(newdefout);
1202 GV * const gv = (MAXARG==0) ? PL_stdingv : MUTABLE_GV(POPs);
1204 if (gv && (io = GvIO(gv))) {
1205 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1207 const I32 gimme = GIMME_V;
1209 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
1212 call_method("GETC", gimme);
1215 if (gimme == G_SCALAR)
1216 SvSetMagicSV_nosteal(TARG, TOPs);
1220 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1221 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1222 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1223 report_evil_fh(gv, io, PL_op->op_type);
1224 SETERRNO(EBADF,RMS_IFI);
1228 sv_setpvs(TARG, " ");
1229 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1230 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1231 /* Find out how many bytes the char needs */
1232 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1235 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1236 SvCUR_set(TARG,1+len);
1245 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1248 register PERL_CONTEXT *cx;
1249 const I32 gimme = GIMME_V;
1251 PERL_ARGS_ASSERT_DOFORM;
1256 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1257 PUSHFORMAT(cx, retop);
1259 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1261 setdefout(gv); /* locally select filehandle so $% et al work */
1278 gv = MUTABLE_GV(POPs);
1293 goto not_a_format_reference;
1298 tmpsv = sv_newmortal();
1299 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1300 name = SvPV_nolen_const(tmpsv);
1302 DIE(aTHX_ "Undefined format \"%s\" called", name);
1304 not_a_format_reference:
1305 DIE(aTHX_ "Not a format reference");
1308 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1310 IoFLAGS(io) &= ~IOf_DIDTOP;
1311 return doform(cv,gv,PL_op->op_next);
1317 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1318 register IO * const io = GvIOp(gv);
1323 register PERL_CONTEXT *cx;
1325 if (!io || !(ofp = IoOFP(io)))
1328 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1329 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1331 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1332 PL_formtarget != PL_toptarget)
1336 if (!IoTOP_GV(io)) {
1339 if (!IoTOP_NAME(io)) {
1341 if (!IoFMT_NAME(io))
1342 IoFMT_NAME(io) = savepv(GvNAME(gv));
1343 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1344 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1345 if ((topgv && GvFORM(topgv)) ||
1346 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1347 IoTOP_NAME(io) = savesvpv(topname);
1349 IoTOP_NAME(io) = savepvs("top");
1351 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1352 if (!topgv || !GvFORM(topgv)) {
1353 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1356 IoTOP_GV(io) = topgv;
1358 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1359 I32 lines = IoLINES_LEFT(io);
1360 const char *s = SvPVX_const(PL_formtarget);
1361 if (lines <= 0) /* Yow, header didn't even fit!!! */
1363 while (lines-- > 0) {
1364 s = strchr(s, '\n');
1370 const STRLEN save = SvCUR(PL_formtarget);
1371 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1372 do_print(PL_formtarget, ofp);
1373 SvCUR_set(PL_formtarget, save);
1374 sv_chop(PL_formtarget, s);
1375 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1378 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1379 do_print(PL_formfeed, ofp);
1380 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1382 PL_formtarget = PL_toptarget;
1383 IoFLAGS(io) |= IOf_DIDTOP;
1386 DIE(aTHX_ "bad top format reference");
1389 SV * const sv = sv_newmortal();
1391 gv_efullname4(sv, fgv, NULL, FALSE);
1392 name = SvPV_nolen_const(sv);
1394 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1396 DIE(aTHX_ "Undefined top format called");
1398 if (cv && CvCLONE(cv))
1399 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1400 return doform(cv, gv, PL_op);
1404 POPBLOCK(cx,PL_curpm);
1410 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1412 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1413 else if (ckWARN(WARN_CLOSED))
1414 report_evil_fh(gv, io, PL_op->op_type);
1419 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1420 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1422 if (!do_print(PL_formtarget, fp))
1425 FmLINES(PL_formtarget) = 0;
1426 SvCUR_set(PL_formtarget, 0);
1427 *SvEND(PL_formtarget) = '\0';
1428 if (IoFLAGS(io) & IOf_FLUSH)
1429 (void)PerlIO_flush(fp);
1434 PL_formtarget = PL_bodytarget;
1436 PERL_UNUSED_VAR(newsp);
1437 PERL_UNUSED_VAR(gimme);
1438 return cx->blk_sub.retop;
1443 dVAR; dSP; dMARK; dORIGMARK;
1449 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1451 if (gv && (io = GvIO(gv))) {
1452 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1454 if (MARK == ORIGMARK) {
1457 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1461 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1464 call_method("PRINTF", G_SCALAR);
1467 MARK = ORIGMARK + 1;
1475 if (!(io = GvIO(gv))) {
1476 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1477 report_evil_fh(gv, io, PL_op->op_type);
1478 SETERRNO(EBADF,RMS_IFI);
1481 else if (!(fp = IoOFP(io))) {
1482 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1484 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1485 else if (ckWARN(WARN_CLOSED))
1486 report_evil_fh(gv, io, PL_op->op_type);
1488 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1492 if (SvTAINTED(MARK[1]))
1493 TAINT_PROPER("printf");
1494 do_sprintf(sv, SP - MARK, MARK + 1);
1495 if (!do_print(sv, fp))
1498 if (IoFLAGS(io) & IOf_FLUSH)
1499 if (PerlIO_flush(fp) == EOF)
1510 PUSHs(&PL_sv_undef);
1518 const int perm = (MAXARG > 3) ? POPi : 0666;
1519 const int mode = POPi;
1520 SV * const sv = POPs;
1521 GV * const gv = MUTABLE_GV(POPs);
1524 /* Need TIEHANDLE method ? */
1525 const char * const tmps = SvPV_const(sv, len);
1526 /* FIXME? do_open should do const */
1527 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1528 IoLINES(GvIOp(gv)) = 0;
1532 PUSHs(&PL_sv_undef);
1539 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1545 Sock_size_t bufsize;
1553 bool charstart = FALSE;
1554 STRLEN charskip = 0;
1557 GV * const gv = MUTABLE_GV(*++MARK);
1558 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1559 && gv && (io = GvIO(gv)) )
1561 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1565 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1567 call_method("READ", G_SCALAR);
1581 sv_setpvs(bufsv, "");
1582 length = SvIVx(*++MARK);
1585 offset = SvIVx(*++MARK);
1589 if (!io || !IoIFP(io)) {
1590 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1591 report_evil_fh(gv, io, PL_op->op_type);
1592 SETERRNO(EBADF,RMS_IFI);
1595 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1596 buffer = SvPVutf8_force(bufsv, blen);
1597 /* UTF-8 may not have been set if they are all low bytes */
1602 buffer = SvPV_force(bufsv, blen);
1603 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1606 DIE(aTHX_ "Negative length");
1614 if (PL_op->op_type == OP_RECV) {
1615 char namebuf[MAXPATHLEN];
1616 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1617 bufsize = sizeof (struct sockaddr_in);
1619 bufsize = sizeof namebuf;
1621 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1625 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1626 /* 'offset' means 'flags' here */
1627 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1628 (struct sockaddr *)namebuf, &bufsize);
1632 /* Bogus return without padding */
1633 bufsize = sizeof (struct sockaddr_in);
1635 SvCUR_set(bufsv, count);
1636 *SvEND(bufsv) = '\0';
1637 (void)SvPOK_only(bufsv);
1641 /* This should not be marked tainted if the fp is marked clean */
1642 if (!(IoFLAGS(io) & IOf_UNTAINT))
1643 SvTAINTED_on(bufsv);
1645 sv_setpvn(TARG, namebuf, bufsize);
1650 if (PL_op->op_type == OP_RECV)
1651 DIE(aTHX_ PL_no_sock_func, "recv");
1653 if (DO_UTF8(bufsv)) {
1654 /* offset adjust in characters not bytes */
1655 blen = sv_len_utf8(bufsv);
1658 if (-offset > (int)blen)
1659 DIE(aTHX_ "Offset outside string");
1662 if (DO_UTF8(bufsv)) {
1663 /* convert offset-as-chars to offset-as-bytes */
1664 if (offset >= (int)blen)
1665 offset += SvCUR(bufsv) - blen;
1667 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1670 bufsize = SvCUR(bufsv);
1671 /* Allocating length + offset + 1 isn't perfect in the case of reading
1672 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1674 (should be 2 * length + offset + 1, or possibly something longer if
1675 PL_encoding is true) */
1676 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1677 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1678 Zero(buffer+bufsize, offset-bufsize, char);
1680 buffer = buffer + offset;
1682 read_target = bufsv;
1684 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1685 concatenate it to the current buffer. */
1687 /* Truncate the existing buffer to the start of where we will be
1689 SvCUR_set(bufsv, offset);
1691 read_target = sv_newmortal();
1692 SvUPGRADE(read_target, SVt_PV);
1693 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1696 if (PL_op->op_type == OP_SYSREAD) {
1697 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1698 if (IoTYPE(io) == IoTYPE_SOCKET) {
1699 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1705 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1710 #ifdef HAS_SOCKET__bad_code_maybe
1711 if (IoTYPE(io) == IoTYPE_SOCKET) {
1712 char namebuf[MAXPATHLEN];
1713 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1714 bufsize = sizeof (struct sockaddr_in);
1716 bufsize = sizeof namebuf;
1718 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1719 (struct sockaddr *)namebuf, &bufsize);
1724 count = PerlIO_read(IoIFP(io), buffer, length);
1725 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1726 if (count == 0 && PerlIO_error(IoIFP(io)))
1730 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1731 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1734 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1735 *SvEND(read_target) = '\0';
1736 (void)SvPOK_only(read_target);
1737 if (fp_utf8 && !IN_BYTES) {
1738 /* Look at utf8 we got back and count the characters */
1739 const char *bend = buffer + count;
1740 while (buffer < bend) {
1742 skip = UTF8SKIP(buffer);
1745 if (buffer - charskip + skip > bend) {
1746 /* partial character - try for rest of it */
1747 length = skip - (bend-buffer);
1748 offset = bend - SvPVX_const(bufsv);
1760 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1761 provided amount read (count) was what was requested (length)
1763 if (got < wanted && count == length) {
1764 length = wanted - got;
1765 offset = bend - SvPVX_const(bufsv);
1768 /* return value is character count */
1772 else if (buffer_utf8) {
1773 /* Let svcatsv upgrade the bytes we read in to utf8.
1774 The buffer is a mortal so will be freed soon. */
1775 sv_catsv_nomg(bufsv, read_target);
1778 /* This should not be marked tainted if the fp is marked clean */
1779 if (!(IoFLAGS(io) & IOf_UNTAINT))
1780 SvTAINTED_on(bufsv);
1792 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1798 STRLEN orig_blen_bytes;
1799 const int op_type = PL_op->op_type;
1803 GV *const gv = MUTABLE_GV(*++MARK);
1804 if (PL_op->op_type == OP_SYSWRITE
1805 && gv && (io = GvIO(gv))) {
1806 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1810 if (MARK == SP - 1) {
1812 mXPUSHi(sv_len(sv));
1817 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1819 call_method("WRITE", G_SCALAR);
1835 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1837 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1838 if (io && IoIFP(io))
1839 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1841 report_evil_fh(gv, io, PL_op->op_type);
1843 SETERRNO(EBADF,RMS_IFI);
1847 /* Do this first to trigger any overloading. */
1848 buffer = SvPV_const(bufsv, blen);
1849 orig_blen_bytes = blen;
1850 doing_utf8 = DO_UTF8(bufsv);
1852 if (PerlIO_isutf8(IoIFP(io))) {
1853 if (!SvUTF8(bufsv)) {
1854 /* We don't modify the original scalar. */
1855 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1856 buffer = (char *) tmpbuf;
1860 else if (doing_utf8) {
1861 STRLEN tmplen = blen;
1862 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1865 buffer = (char *) tmpbuf;
1869 assert((char *)result == buffer);
1870 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1874 if (op_type == OP_SYSWRITE) {
1875 Size_t length = 0; /* This length is in characters. */
1881 /* The SV is bytes, and we've had to upgrade it. */
1882 blen_chars = orig_blen_bytes;
1884 /* The SV really is UTF-8. */
1885 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1886 /* Don't call sv_len_utf8 again because it will call magic
1887 or overloading a second time, and we might get back a
1888 different result. */
1889 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1891 /* It's safe, and it may well be cached. */
1892 blen_chars = sv_len_utf8(bufsv);
1900 length = blen_chars;
1902 #if Size_t_size > IVSIZE
1903 length = (Size_t)SvNVx(*++MARK);
1905 length = (Size_t)SvIVx(*++MARK);
1907 if ((SSize_t)length < 0) {
1909 DIE(aTHX_ "Negative length");
1914 offset = SvIVx(*++MARK);
1916 if (-offset > (IV)blen_chars) {
1918 DIE(aTHX_ "Offset outside string");
1920 offset += blen_chars;
1921 } else if (offset > (IV)blen_chars) {
1923 DIE(aTHX_ "Offset outside string");
1927 if (length > blen_chars - offset)
1928 length = blen_chars - offset;
1930 /* Here we convert length from characters to bytes. */
1931 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1932 /* Either we had to convert the SV, or the SV is magical, or
1933 the SV has overloading, in which case we can't or mustn't
1934 or mustn't call it again. */
1936 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1937 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1939 /* It's a real UTF-8 SV, and it's not going to change under
1940 us. Take advantage of any cache. */
1942 I32 len_I32 = length;
1944 /* Convert the start and end character positions to bytes.
1945 Remember that the second argument to sv_pos_u2b is relative
1947 sv_pos_u2b(bufsv, &start, &len_I32);
1954 buffer = buffer+offset;
1956 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1957 if (IoTYPE(io) == IoTYPE_SOCKET) {
1958 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1964 /* See the note at doio.c:do_print about filesize limits. --jhi */
1965 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1971 const int flags = SvIVx(*++MARK);
1974 char * const sockbuf = SvPVx(*++MARK, mlen);
1975 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1976 flags, (struct sockaddr *)sockbuf, mlen);
1980 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1985 DIE(aTHX_ PL_no_sock_func, "send");
1992 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1995 #if Size_t_size > IVSIZE
2016 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2017 else if (PL_op->op_flags & OPf_SPECIAL)
2018 gv = PL_last_in_gv = GvEGV(PL_argvgv); /* eof() - ARGV magic */
2020 gv = PL_last_in_gv; /* eof */
2025 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2027 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2029 * in Perl 5.12 and later, the additional paramter is a bitmask:
2032 * 2 = eof() <- ARGV magic
2035 mPUSHi(1); /* 1 = eof(FH) - simple, explicit FH */
2036 else if (PL_op->op_flags & OPf_SPECIAL)
2037 mPUSHi(2); /* 2 = eof() - ARGV magic */
2039 mPUSHi(0); /* 0 = eof - simple, implicit FH */
2042 call_method("EOF", G_SCALAR);
2048 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2049 if (io && !IoIFP(io)) {
2050 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2052 IoFLAGS(io) &= ~IOf_START;
2053 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2055 sv_setpvs(GvSV(gv), "-");
2057 GvSV(gv) = newSVpvs("-");
2058 SvSETMAGIC(GvSV(gv));
2060 else if (!nextargv(gv))
2065 PUSHs(boolSV(do_eof(gv)));
2076 PL_last_in_gv = MUTABLE_GV(POPs);
2079 if (gv && (io = GvIO(gv))) {
2080 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2083 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2086 call_method("TELL", G_SCALAR);
2094 SETERRNO(EBADF,RMS_IFI);
2099 #if LSEEKSIZE > IVSIZE
2100 PUSHn( do_tell(gv) );
2102 PUSHi( do_tell(gv) );
2110 const int whence = POPi;
2111 #if LSEEKSIZE > IVSIZE
2112 const Off_t offset = (Off_t)SvNVx(POPs);
2114 const Off_t offset = (Off_t)SvIVx(POPs);
2117 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2120 if (gv && (io = GvIO(gv))) {
2121 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2124 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2125 #if LSEEKSIZE > IVSIZE
2126 mXPUSHn((NV) offset);
2133 call_method("SEEK", G_SCALAR);
2140 if (PL_op->op_type == OP_SEEK)
2141 PUSHs(boolSV(do_seek(gv, offset, whence)));
2143 const Off_t sought = do_sysseek(gv, offset, whence);
2145 PUSHs(&PL_sv_undef);
2147 SV* const sv = sought ?
2148 #if LSEEKSIZE > IVSIZE
2153 : newSVpvn(zero_but_true, ZBTLEN);
2164 /* There seems to be no consensus on the length type of truncate()
2165 * and ftruncate(), both off_t and size_t have supporters. In
2166 * general one would think that when using large files, off_t is
2167 * at least as wide as size_t, so using an off_t should be okay. */
2168 /* XXX Configure probe for the length type of *truncate() needed XXX */
2171 #if Off_t_size > IVSIZE
2176 /* Checking for length < 0 is problematic as the type might or
2177 * might not be signed: if it is not, clever compilers will moan. */
2178 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2185 if (PL_op->op_flags & OPf_SPECIAL) {
2186 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2195 TAINT_PROPER("truncate");
2196 if (!(fp = IoIFP(io))) {
2202 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2204 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2211 SV * const sv = POPs;
2214 if (isGV_with_GP(sv)) {
2215 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2216 goto do_ftruncate_gv;
2218 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2219 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2220 goto do_ftruncate_gv;
2222 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2223 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2224 goto do_ftruncate_io;
2227 name = SvPV_nolen_const(sv);
2228 TAINT_PROPER("truncate");
2230 if (truncate(name, len) < 0)
2234 const int tmpfd = PerlLIO_open(name, O_RDWR);
2239 if (my_chsize(tmpfd, len) < 0)
2241 PerlLIO_close(tmpfd);
2250 SETERRNO(EBADF,RMS_IFI);
2258 SV * const argsv = POPs;
2259 const unsigned int func = POPu;
2260 const int optype = PL_op->op_type;
2261 GV * const gv = MUTABLE_GV(POPs);
2262 IO * const io = gv ? GvIOn(gv) : NULL;
2266 if (!io || !argsv || !IoIFP(io)) {
2267 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2268 report_evil_fh(gv, io, PL_op->op_type);
2269 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2273 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2276 s = SvPV_force(argsv, len);
2277 need = IOCPARM_LEN(func);
2279 s = Sv_Grow(argsv, need + 1);
2280 SvCUR_set(argsv, need);
2283 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2286 retval = SvIV(argsv);
2287 s = INT2PTR(char*,retval); /* ouch */
2290 TAINT_PROPER(PL_op_desc[optype]);
2292 if (optype == OP_IOCTL)
2294 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2296 DIE(aTHX_ "ioctl is not implemented");
2300 DIE(aTHX_ "fcntl is not implemented");
2302 #if defined(OS2) && defined(__EMX__)
2303 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2305 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2309 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2311 if (s[SvCUR(argsv)] != 17)
2312 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2314 s[SvCUR(argsv)] = 0; /* put our null back */
2315 SvSETMAGIC(argsv); /* Assume it has changed */
2324 PUSHp(zero_but_true, ZBTLEN);
2337 const int argtype = POPi;
2338 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2340 if (gv && (io = GvIO(gv)))
2346 /* XXX Looks to me like io is always NULL at this point */
2348 (void)PerlIO_flush(fp);
2349 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2352 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2353 report_evil_fh(gv, io, PL_op->op_type);
2355 SETERRNO(EBADF,RMS_IFI);
2360 DIE(aTHX_ PL_no_func, "flock()");
2370 const int protocol = POPi;
2371 const int type = POPi;
2372 const int domain = POPi;
2373 GV * const gv = MUTABLE_GV(POPs);
2374 register IO * const io = gv ? GvIOn(gv) : NULL;
2378 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2379 report_evil_fh(gv, io, PL_op->op_type);
2380 if (io && IoIFP(io))
2381 do_close(gv, FALSE);
2382 SETERRNO(EBADF,LIB_INVARG);
2387 do_close(gv, FALSE);
2389 TAINT_PROPER("socket");
2390 fd = PerlSock_socket(domain, type, protocol);
2393 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2394 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2395 IoTYPE(io) = IoTYPE_SOCKET;
2396 if (!IoIFP(io) || !IoOFP(io)) {
2397 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2398 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2399 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2402 #if defined(HAS_FCNTL) && defined(F_SETFD)
2403 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2407 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2412 DIE(aTHX_ PL_no_sock_func, "socket");
2418 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2420 const int protocol = POPi;
2421 const int type = POPi;
2422 const int domain = POPi;
2423 GV * const gv2 = MUTABLE_GV(POPs);
2424 GV * const gv1 = MUTABLE_GV(POPs);
2425 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2426 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2429 if (!gv1 || !gv2 || !io1 || !io2) {
2430 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2432 report_evil_fh(gv1, io1, PL_op->op_type);
2434 report_evil_fh(gv1, io2, PL_op->op_type);
2436 if (io1 && IoIFP(io1))
2437 do_close(gv1, FALSE);
2438 if (io2 && IoIFP(io2))
2439 do_close(gv2, FALSE);
2444 do_close(gv1, FALSE);
2446 do_close(gv2, FALSE);
2448 TAINT_PROPER("socketpair");
2449 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2451 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2452 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2453 IoTYPE(io1) = IoTYPE_SOCKET;
2454 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2455 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2456 IoTYPE(io2) = IoTYPE_SOCKET;
2457 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2458 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2459 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2460 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2461 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2462 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2463 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2466 #if defined(HAS_FCNTL) && defined(F_SETFD)
2467 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2468 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2473 DIE(aTHX_ PL_no_sock_func, "socketpair");
2481 SV * const addrsv = POPs;
2482 /* OK, so on what platform does bind modify addr? */
2484 GV * const gv = MUTABLE_GV(POPs);
2485 register IO * const io = GvIOn(gv);
2488 if (!io || !IoIFP(io))
2491 addr = SvPV_const(addrsv, len);
2492 TAINT_PROPER("bind");
2493 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2499 if (ckWARN(WARN_CLOSED))
2500 report_evil_fh(gv, io, PL_op->op_type);
2501 SETERRNO(EBADF,SS_IVCHAN);
2504 DIE(aTHX_ PL_no_sock_func, "bind");
2512 SV * const addrsv = POPs;
2513 GV * const gv = MUTABLE_GV(POPs);
2514 register IO * const io = GvIOn(gv);
2518 if (!io || !IoIFP(io))
2521 addr = SvPV_const(addrsv, len);
2522 TAINT_PROPER("connect");
2523 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2529 if (ckWARN(WARN_CLOSED))
2530 report_evil_fh(gv, io, PL_op->op_type);
2531 SETERRNO(EBADF,SS_IVCHAN);
2534 DIE(aTHX_ PL_no_sock_func, "connect");
2542 const int backlog = POPi;
2543 GV * const gv = MUTABLE_GV(POPs);
2544 register IO * const io = gv ? GvIOn(gv) : NULL;
2546 if (!gv || !io || !IoIFP(io))
2549 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2555 if (ckWARN(WARN_CLOSED))
2556 report_evil_fh(gv, io, PL_op->op_type);
2557 SETERRNO(EBADF,SS_IVCHAN);
2560 DIE(aTHX_ PL_no_sock_func, "listen");
2570 char namebuf[MAXPATHLEN];
2571 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2572 Sock_size_t len = sizeof (struct sockaddr_in);
2574 Sock_size_t len = sizeof namebuf;
2576 GV * const ggv = MUTABLE_GV(POPs);
2577 GV * const ngv = MUTABLE_GV(POPs);
2586 if (!gstio || !IoIFP(gstio))
2590 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2593 /* Some platforms indicate zero length when an AF_UNIX client is
2594 * not bound. Simulate a non-zero-length sockaddr structure in
2596 namebuf[0] = 0; /* sun_len */
2597 namebuf[1] = AF_UNIX; /* sun_family */
2605 do_close(ngv, FALSE);
2606 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2607 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2608 IoTYPE(nstio) = IoTYPE_SOCKET;
2609 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2610 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2611 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2612 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2615 #if defined(HAS_FCNTL) && defined(F_SETFD)
2616 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2620 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2621 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2623 #ifdef __SCO_VERSION__
2624 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2627 PUSHp(namebuf, len);
2631 if (ckWARN(WARN_CLOSED))
2632 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2633 SETERRNO(EBADF,SS_IVCHAN);
2639 DIE(aTHX_ PL_no_sock_func, "accept");
2647 const int how = POPi;
2648 GV * const gv = MUTABLE_GV(POPs);
2649 register IO * const io = GvIOn(gv);
2651 if (!io || !IoIFP(io))
2654 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2658 if (ckWARN(WARN_CLOSED))
2659 report_evil_fh(gv, io, PL_op->op_type);
2660 SETERRNO(EBADF,SS_IVCHAN);
2663 DIE(aTHX_ PL_no_sock_func, "shutdown");
2671 const int optype = PL_op->op_type;
2672 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2673 const unsigned int optname = (unsigned int) POPi;
2674 const unsigned int lvl = (unsigned int) POPi;
2675 GV * const gv = MUTABLE_GV(POPs);
2676 register IO * const io = GvIOn(gv);
2680 if (!io || !IoIFP(io))
2683 fd = PerlIO_fileno(IoIFP(io));
2687 (void)SvPOK_only(sv);
2691 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2698 #if defined(__SYMBIAN32__)
2699 # define SETSOCKOPT_OPTION_VALUE_T void *
2701 # define SETSOCKOPT_OPTION_VALUE_T const char *
2703 /* XXX TODO: We need to have a proper type (a Configure probe,
2704 * etc.) for what the C headers think of the third argument of
2705 * setsockopt(), the option_value read-only buffer: is it
2706 * a "char *", or a "void *", const or not. Some compilers
2707 * don't take kindly to e.g. assuming that "char *" implicitly
2708 * promotes to a "void *", or to explicitly promoting/demoting
2709 * consts to non/vice versa. The "const void *" is the SUS
2710 * definition, but that does not fly everywhere for the above
2712 SETSOCKOPT_OPTION_VALUE_T buf;
2716 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2720 aint = (int)SvIV(sv);
2721 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2724 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2733 if (ckWARN(WARN_CLOSED))
2734 report_evil_fh(gv, io, optype);
2735 SETERRNO(EBADF,SS_IVCHAN);
2740 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2748 const int optype = PL_op->op_type;
2749 GV * const gv = MUTABLE_GV(POPs);
2750 register IO * const io = GvIOn(gv);
2755 if (!io || !IoIFP(io))
2758 sv = sv_2mortal(newSV(257));
2759 (void)SvPOK_only(sv);
2763 fd = PerlIO_fileno(IoIFP(io));
2765 case OP_GETSOCKNAME:
2766 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2769 case OP_GETPEERNAME:
2770 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2772 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2774 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";
2775 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2776 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2777 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2778 sizeof(u_short) + sizeof(struct in_addr))) {
2785 #ifdef BOGUS_GETNAME_RETURN
2786 /* Interactive Unix, getpeername() and getsockname()
2787 does not return valid namelen */
2788 if (len == BOGUS_GETNAME_RETURN)
2789 len = sizeof(struct sockaddr);
2797 if (ckWARN(WARN_CLOSED))
2798 report_evil_fh(gv, io, optype);
2799 SETERRNO(EBADF,SS_IVCHAN);
2804 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2819 if (PL_op->op_flags & OPf_REF) {
2821 if (PL_op->op_type == OP_LSTAT) {
2822 if (gv != PL_defgv) {
2823 do_fstat_warning_check:
2824 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2825 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2826 } else if (PL_laststype != OP_LSTAT)
2827 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2831 if (gv != PL_defgv) {
2832 PL_laststype = OP_STAT;
2834 sv_setpvs(PL_statname, "");
2841 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2842 } else if (IoDIRP(io)) {
2844 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2846 PL_laststatval = -1;
2852 if (PL_laststatval < 0) {
2853 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2854 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2859 SV* const sv = POPs;
2860 if (isGV_with_GP(sv)) {
2861 gv = MUTABLE_GV(sv);
2863 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2864 gv = MUTABLE_GV(SvRV(sv));
2865 if (PL_op->op_type == OP_LSTAT)
2866 goto do_fstat_warning_check;
2868 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2869 io = MUTABLE_IO(SvRV(sv));
2870 if (PL_op->op_type == OP_LSTAT)
2871 goto do_fstat_warning_check;
2872 goto do_fstat_have_io;
2875 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2877 PL_laststype = PL_op->op_type;
2878 if (PL_op->op_type == OP_LSTAT)
2879 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2881 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2882 if (PL_laststatval < 0) {
2883 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2884 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2890 if (gimme != G_ARRAY) {
2891 if (gimme != G_VOID)
2892 XPUSHs(boolSV(max));
2898 mPUSHi(PL_statcache.st_dev);
2899 mPUSHi(PL_statcache.st_ino);
2900 mPUSHu(PL_statcache.st_mode);
2901 mPUSHu(PL_statcache.st_nlink);
2902 #if Uid_t_size > IVSIZE
2903 mPUSHn(PL_statcache.st_uid);
2905 # if Uid_t_sign <= 0
2906 mPUSHi(PL_statcache.st_uid);
2908 mPUSHu(PL_statcache.st_uid);
2911 #if Gid_t_size > IVSIZE
2912 mPUSHn(PL_statcache.st_gid);
2914 # if Gid_t_sign <= 0
2915 mPUSHi(PL_statcache.st_gid);
2917 mPUSHu(PL_statcache.st_gid);
2920 #ifdef USE_STAT_RDEV
2921 mPUSHi(PL_statcache.st_rdev);
2923 PUSHs(newSVpvs_flags("", SVs_TEMP));
2925 #if Off_t_size > IVSIZE
2926 mPUSHn(PL_statcache.st_size);
2928 mPUSHi(PL_statcache.st_size);
2931 mPUSHn(PL_statcache.st_atime);
2932 mPUSHn(PL_statcache.st_mtime);
2933 mPUSHn(PL_statcache.st_ctime);
2935 mPUSHi(PL_statcache.st_atime);
2936 mPUSHi(PL_statcache.st_mtime);
2937 mPUSHi(PL_statcache.st_ctime);
2939 #ifdef USE_STAT_BLOCKS
2940 mPUSHu(PL_statcache.st_blksize);
2941 mPUSHu(PL_statcache.st_blocks);
2943 PUSHs(newSVpvs_flags("", SVs_TEMP));
2944 PUSHs(newSVpvs_flags("", SVs_TEMP));
2950 /* This macro is used by the stacked filetest operators :
2951 * if the previous filetest failed, short-circuit and pass its value.
2952 * Else, discard it from the stack and continue. --rgs
2954 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2955 if (!SvTRUE(TOPs)) { RETURN; } \
2956 else { (void)POPs; PUTBACK; } \
2963 /* Not const, because things tweak this below. Not bool, because there's
2964 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2965 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2966 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2967 /* Giving some sort of initial value silences compilers. */
2969 int access_mode = R_OK;
2971 int access_mode = 0;
2974 /* access_mode is never used, but leaving use_access in makes the
2975 conditional compiling below much clearer. */
2978 int stat_mode = S_IRUSR;
2980 bool effective = FALSE;
2984 switch (PL_op->op_type) {
2985 case OP_FTRREAD: opchar = 'R'; break;
2986 case OP_FTRWRITE: opchar = 'W'; break;
2987 case OP_FTREXEC: opchar = 'X'; break;
2988 case OP_FTEREAD: opchar = 'r'; break;
2989 case OP_FTEWRITE: opchar = 'w'; break;
2990 case OP_FTEEXEC: opchar = 'x'; break;
2992 tryAMAGICftest(opchar);
2994 STACKED_FTEST_CHECK;
2996 switch (PL_op->op_type) {
2998 #if !(defined(HAS_ACCESS) && defined(R_OK))
3004 #if defined(HAS_ACCESS) && defined(W_OK)
3009 stat_mode = S_IWUSR;
3013 #if defined(HAS_ACCESS) && defined(X_OK)
3018 stat_mode = S_IXUSR;
3022 #ifdef PERL_EFF_ACCESS
3025 stat_mode = S_IWUSR;
3029 #ifndef PERL_EFF_ACCESS
3036 #ifdef PERL_EFF_ACCESS
3041 stat_mode = S_IXUSR;
3047 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3048 const char *name = POPpx;
3050 # ifdef PERL_EFF_ACCESS
3051 result = PERL_EFF_ACCESS(name, access_mode);
3053 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3059 result = access(name, access_mode);
3061 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3076 if (cando(stat_mode, effective, &PL_statcache))
3085 const int op_type = PL_op->op_type;
3090 case OP_FTIS: opchar = 'e'; break;
3091 case OP_FTSIZE: opchar = 's'; break;
3092 case OP_FTMTIME: opchar = 'M'; break;
3093 case OP_FTCTIME: opchar = 'C'; break;
3094 case OP_FTATIME: opchar = 'A'; break;
3096 tryAMAGICftest(opchar);
3098 STACKED_FTEST_CHECK;
3104 if (op_type == OP_FTIS)
3107 /* You can't dTARGET inside OP_FTIS, because you'll get
3108 "panic: pad_sv po" - the op is not flagged to have a target. */
3112 #if Off_t_size > IVSIZE
3113 PUSHn(PL_statcache.st_size);
3115 PUSHi(PL_statcache.st_size);
3119 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3122 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3125 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3139 switch (PL_op->op_type) {
3140 case OP_FTROWNED: opchar = 'O'; break;
3141 case OP_FTEOWNED: opchar = 'o'; break;
3142 case OP_FTZERO: opchar = 'z'; break;
3143 case OP_FTSOCK: opchar = 'S'; break;
3144 case OP_FTCHR: opchar = 'c'; break;
3145 case OP_FTBLK: opchar = 'b'; break;
3146 case OP_FTFILE: opchar = 'f'; break;
3147 case OP_FTDIR: opchar = 'd'; break;
3148 case OP_FTPIPE: opchar = 'p'; break;
3149 case OP_FTSUID: opchar = 'u'; break;
3150 case OP_FTSGID: opchar = 'g'; break;
3151 case OP_FTSVTX: opchar = 'k'; break;
3153 tryAMAGICftest(opchar);
3155 /* I believe that all these three are likely to be defined on most every
3156 system these days. */
3158 if(PL_op->op_type == OP_FTSUID)
3162 if(PL_op->op_type == OP_FTSGID)
3166 if(PL_op->op_type == OP_FTSVTX)
3170 STACKED_FTEST_CHECK;
3176 switch (PL_op->op_type) {
3178 if (PL_statcache.st_uid == PL_uid)
3182 if (PL_statcache.st_uid == PL_euid)
3186 if (PL_statcache.st_size == 0)
3190 if (S_ISSOCK(PL_statcache.st_mode))
3194 if (S_ISCHR(PL_statcache.st_mode))
3198 if (S_ISBLK(PL_statcache.st_mode))
3202 if (S_ISREG(PL_statcache.st_mode))
3206 if (S_ISDIR(PL_statcache.st_mode))
3210 if (S_ISFIFO(PL_statcache.st_mode))
3215 if (PL_statcache.st_mode & S_ISUID)
3221 if (PL_statcache.st_mode & S_ISGID)
3227 if (PL_statcache.st_mode & S_ISVTX)
3241 tryAMAGICftest('l');
3242 result = my_lstat();
3247 if (S_ISLNK(PL_statcache.st_mode))
3260 tryAMAGICftest('t');
3262 STACKED_FTEST_CHECK;
3264 if (PL_op->op_flags & OPf_REF)
3266 else if (isGV(TOPs))
3267 gv = MUTABLE_GV(POPs);
3268 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3269 gv = MUTABLE_GV(SvRV(POPs));
3271 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3273 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3274 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3275 else if (tmpsv && SvOK(tmpsv)) {
3276 const char *tmps = SvPV_nolen_const(tmpsv);
3284 if (PerlLIO_isatty(fd))
3289 #if defined(atarist) /* this will work with atariST. Configure will
3290 make guesses for other systems. */
3291 # define FILE_base(f) ((f)->_base)
3292 # define FILE_ptr(f) ((f)->_ptr)
3293 # define FILE_cnt(f) ((f)->_cnt)
3294 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3305 register STDCHAR *s;
3311 tryAMAGICftest(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3313 STACKED_FTEST_CHECK;
3315 if (PL_op->op_flags & OPf_REF)
3317 else if (isGV(TOPs))
3318 gv = MUTABLE_GV(POPs);
3319 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3320 gv = MUTABLE_GV(SvRV(POPs));
3326 if (gv == PL_defgv) {
3328 io = GvIO(PL_statgv);
3331 goto really_filename;
3336 PL_laststatval = -1;
3337 sv_setpvs(PL_statname, "");
3338 io = GvIO(PL_statgv);
3340 if (io && IoIFP(io)) {
3341 if (! PerlIO_has_base(IoIFP(io)))
3342 DIE(aTHX_ "-T and -B not implemented on filehandles");
3343 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3344 if (PL_laststatval < 0)
3346 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3347 if (PL_op->op_type == OP_FTTEXT)
3352 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3353 i = PerlIO_getc(IoIFP(io));
3355 (void)PerlIO_ungetc(IoIFP(io),i);
3357 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3359 len = PerlIO_get_bufsiz(IoIFP(io));
3360 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3361 /* sfio can have large buffers - limit to 512 */
3366 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3368 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3370 SETERRNO(EBADF,RMS_IFI);
3378 PL_laststype = OP_STAT;
3379 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3380 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3381 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3383 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3386 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3387 if (PL_laststatval < 0) {
3388 (void)PerlIO_close(fp);
3391 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3392 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3393 (void)PerlIO_close(fp);
3395 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3396 RETPUSHNO; /* special case NFS directories */
3397 RETPUSHYES; /* null file is anything */
3402 /* now scan s to look for textiness */
3403 /* XXX ASCII dependent code */
3405 #if defined(DOSISH) || defined(USEMYBINMODE)
3406 /* ignore trailing ^Z on short files */
3407 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3411 for (i = 0; i < len; i++, s++) {
3412 if (!*s) { /* null never allowed in text */
3417 else if (!(isPRINT(*s) || isSPACE(*s)))
3420 else if (*s & 128) {
3422 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3425 /* utf8 characters don't count as odd */
3426 if (UTF8_IS_START(*s)) {
3427 int ulen = UTF8SKIP(s);
3428 if (ulen < len - i) {
3430 for (j = 1; j < ulen; j++) {
3431 if (!UTF8_IS_CONTINUATION(s[j]))
3434 --ulen; /* loop does extra increment */
3444 *s != '\n' && *s != '\r' && *s != '\b' &&
3445 *s != '\t' && *s != '\f' && *s != 27)
3450 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3461 const char *tmps = NULL;
3465 SV * const sv = POPs;
3466 if (PL_op->op_flags & OPf_SPECIAL) {
3467 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3469 else if (isGV_with_GP(sv)) {
3470 gv = MUTABLE_GV(sv);
3472 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3473 gv = MUTABLE_GV(SvRV(sv));
3476 tmps = SvPV_nolen_const(sv);
3480 if( !gv && (!tmps || !*tmps) ) {
3481 HV * const table = GvHVn(PL_envgv);
3484 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3485 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3487 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3492 deprecate("chdir('') or chdir(undef) as chdir()");
3493 tmps = SvPV_nolen_const(*svp);
3497 TAINT_PROPER("chdir");
3502 TAINT_PROPER("chdir");
3505 IO* const io = GvIO(gv);
3508 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3509 } else if (IoIFP(io)) {
3510 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3513 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3514 report_evil_fh(gv, io, PL_op->op_type);
3515 SETERRNO(EBADF, RMS_IFI);
3520 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3521 report_evil_fh(gv, io, PL_op->op_type);
3522 SETERRNO(EBADF,RMS_IFI);
3526 DIE(aTHX_ PL_no_func, "fchdir");
3530 PUSHi( PerlDir_chdir(tmps) >= 0 );
3532 /* Clear the DEFAULT element of ENV so we'll get the new value
3534 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3541 dVAR; dSP; dMARK; dTARGET;
3542 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3553 char * const tmps = POPpx;
3554 TAINT_PROPER("chroot");
3555 PUSHi( chroot(tmps) >= 0 );
3558 DIE(aTHX_ PL_no_func, "chroot");
3566 const char * const tmps2 = POPpconstx;
3567 const char * const tmps = SvPV_nolen_const(TOPs);
3568 TAINT_PROPER("rename");
3570 anum = PerlLIO_rename(tmps, tmps2);
3572 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3573 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3576 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3577 (void)UNLINK(tmps2);
3578 if (!(anum = link(tmps, tmps2)))
3579 anum = UNLINK(tmps);
3587 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3591 const int op_type = PL_op->op_type;
3595 if (op_type == OP_LINK)
3596 DIE(aTHX_ PL_no_func, "link");
3598 # ifndef HAS_SYMLINK
3599 if (op_type == OP_SYMLINK)
3600 DIE(aTHX_ PL_no_func, "symlink");
3604 const char * const tmps2 = POPpconstx;
3605 const char * const tmps = SvPV_nolen_const(TOPs);
3606 TAINT_PROPER(PL_op_desc[op_type]);
3608 # if defined(HAS_LINK)
3609 # if defined(HAS_SYMLINK)
3610 /* Both present - need to choose which. */
3611 (op_type == OP_LINK) ?
3612 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3614 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3615 PerlLIO_link(tmps, tmps2);
3618 # if defined(HAS_SYMLINK)
3619 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3620 symlink(tmps, tmps2);
3625 SETi( result >= 0 );
3632 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3643 char buf[MAXPATHLEN];
3646 #ifndef INCOMPLETE_TAINTS
3650 len = readlink(tmps, buf, sizeof(buf) - 1);
3658 RETSETUNDEF; /* just pretend it's a normal file */
3662 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3664 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3666 char * const save_filename = filename;
3671 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3673 PERL_ARGS_ASSERT_DOONELINER;
3675 Newx(cmdline, size, char);
3676 my_strlcpy(cmdline, cmd, size);
3677 my_strlcat(cmdline, " ", size);
3678 for (s = cmdline + strlen(cmdline); *filename; ) {
3682 if (s - cmdline < size)
3683 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3684 myfp = PerlProc_popen(cmdline, "r");
3688 SV * const tmpsv = sv_newmortal();
3689 /* Need to save/restore 'PL_rs' ?? */
3690 s = sv_gets(tmpsv, myfp, 0);
3691 (void)PerlProc_pclose(myfp);
3695 #ifdef HAS_SYS_ERRLIST
3700 /* you don't see this */
3701 const char * const errmsg =
3702 #ifdef HAS_SYS_ERRLIST
3710 if (instr(s, errmsg)) {
3717 #define EACCES EPERM
3719 if (instr(s, "cannot make"))
3720 SETERRNO(EEXIST,RMS_FEX);
3721 else if (instr(s, "existing file"))
3722 SETERRNO(EEXIST,RMS_FEX);
3723 else if (instr(s, "ile exists"))
3724 SETERRNO(EEXIST,RMS_FEX);
3725 else if (instr(s, "non-exist"))
3726 SETERRNO(ENOENT,RMS_FNF);
3727 else if (instr(s, "does not exist"))
3728 SETERRNO(ENOENT,RMS_FNF);
3729 else if (instr(s, "not empty"))
3730 SETERRNO(EBUSY,SS_DEVOFFLINE);
3731 else if (instr(s, "cannot access"))
3732 SETERRNO(EACCES,RMS_PRV);
3734 SETERRNO(EPERM,RMS_PRV);
3737 else { /* some mkdirs return no failure indication */
3738 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3739 if (PL_op->op_type == OP_RMDIR)
3744 SETERRNO(EACCES,RMS_PRV); /* a guess */
3753 /* This macro removes trailing slashes from a directory name.
3754 * Different operating and file systems take differently to
3755 * trailing slashes. According to POSIX 1003.1 1996 Edition
3756 * any number of trailing slashes should be allowed.
3757 * Thusly we snip them away so that even non-conforming
3758 * systems are happy.
3759 * We should probably do this "filtering" for all
3760 * the functions that expect (potentially) directory names:
3761 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3762 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3764 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3765 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3768 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3769 (tmps) = savepvn((tmps), (len)); \
3779 const int mode = (MAXARG > 1) ? POPi : 0777;
3781 TRIMSLASHES(tmps,len,copy);
3783 TAINT_PROPER("mkdir");
3785 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3789 SETi( dooneliner("mkdir", tmps) );
3790 oldumask = PerlLIO_umask(0);
3791 PerlLIO_umask(oldumask);
3792 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3807 TRIMSLASHES(tmps,len,copy);
3808 TAINT_PROPER("rmdir");
3810 SETi( PerlDir_rmdir(tmps) >= 0 );
3812 SETi( dooneliner("rmdir", tmps) );
3819 /* Directory calls. */
3823 #if defined(Direntry_t) && defined(HAS_READDIR)
3825 const char * const dirname = POPpconstx;
3826 GV * const gv = MUTABLE_GV(POPs);
3827 register IO * const io = GvIOn(gv);
3832 if ((IoIFP(io) || IoOFP(io)))
3833 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3834 "Opening filehandle %s also as a directory",
3837 PerlDir_close(IoDIRP(io));
3838 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3844 SETERRNO(EBADF,RMS_DIR);
3847 DIE(aTHX_ PL_no_dir_func, "opendir");
3853 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3854 DIE(aTHX_ PL_no_dir_func, "readdir");
3856 #if !defined(I_DIRENT) && !defined(VMS)
3857 Direntry_t *readdir (DIR *);
3863 const I32 gimme = GIMME;
3864 GV * const gv = MUTABLE_GV(POPs);
3865 register const Direntry_t *dp;
3866 register IO * const io = GvIOn(gv);
3868 if (!io || !IoDIRP(io)) {
3869 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3870 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3875 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3879 sv = newSVpvn(dp->d_name, dp->d_namlen);
3881 sv = newSVpv(dp->d_name, 0);
3883 #ifndef INCOMPLETE_TAINTS
3884 if (!(IoFLAGS(io) & IOf_UNTAINT))
3888 } while (gimme == G_ARRAY);
3890 if (!dp && gimme != G_ARRAY)
3897 SETERRNO(EBADF,RMS_ISI);
3898 if (GIMME == G_ARRAY)
3907 #if defined(HAS_TELLDIR) || defined(telldir)
3909 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3910 /* XXX netbsd still seemed to.
3911 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3912 --JHI 1999-Feb-02 */
3913 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3914 long telldir (DIR *);
3916 GV * const gv = MUTABLE_GV(POPs);
3917 register IO * const io = GvIOn(gv);
3919 if (!io || !IoDIRP(io)) {
3920 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3921 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3925 PUSHi( PerlDir_tell(IoDIRP(io)) );
3929 SETERRNO(EBADF,RMS_ISI);
3932 DIE(aTHX_ PL_no_dir_func, "telldir");
3938 #if defined(HAS_SEEKDIR) || defined(seekdir)
3940 const long along = POPl;
3941 GV * const gv = MUTABLE_GV(POPs);
3942 register IO * const io = GvIOn(gv);
3944 if (!io || !IoDIRP(io)) {
3945 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3946 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3949 (void)PerlDir_seek(IoDIRP(io), along);
3954 SETERRNO(EBADF,RMS_ISI);
3957 DIE(aTHX_ PL_no_dir_func, "seekdir");
3963 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3965 GV * const gv = MUTABLE_GV(POPs);
3966 register IO * const io = GvIOn(gv);
3968 if (!io || !IoDIRP(io)) {
3969 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3970 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3973 (void)PerlDir_rewind(IoDIRP(io));
3977 SETERRNO(EBADF,RMS_ISI);
3980 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3986 #if defined(Direntry_t) && defined(HAS_READDIR)
3988 GV * const gv = MUTABLE_GV(POPs);
3989 register IO * const io = GvIOn(gv);
3991 if (!io || !IoDIRP(io)) {
3992 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3993 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3996 #ifdef VOID_CLOSEDIR
3997 PerlDir_close(IoDIRP(io));
3999 if (PerlDir_close(IoDIRP(io)) < 0) {
4000 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4009 SETERRNO(EBADF,RMS_IFI);
4012 DIE(aTHX_ PL_no_dir_func, "closedir");
4016 /* Process control. */
4025 PERL_FLUSHALL_FOR_CHILD;
4026 childpid = PerlProc_fork();
4030 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
4032 SvREADONLY_off(GvSV(tmpgv));
4033 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4034 SvREADONLY_on(GvSV(tmpgv));
4036 #ifdef THREADS_HAVE_PIDS
4037 PL_ppid = (IV)getppid();
4039 #ifdef PERL_USES_PL_PIDSTATUS
4040 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4046 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4051 PERL_FLUSHALL_FOR_CHILD;
4052 childpid = PerlProc_fork();
4058 DIE(aTHX_ PL_no_func, "fork");
4065 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4070 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4071 childpid = wait4pid(-1, &argflags, 0);
4073 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4078 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4079 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4080 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4082 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4087 DIE(aTHX_ PL_no_func, "wait");
4093 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4095 const int optype = POPi;
4096 const Pid_t pid = TOPi;
4100 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4101 result = wait4pid(pid, &argflags, optype);
4103 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4108 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4109 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4110 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4112 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4117 DIE(aTHX_ PL_no_func, "waitpid");
4123 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4124 #if defined(__LIBCATAMOUNT__)
4125 PL_statusvalue = -1;
4134 while (++MARK <= SP) {
4135 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4140 TAINT_PROPER("system");
4142 PERL_FLUSHALL_FOR_CHILD;
4143 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4149 if (PerlProc_pipe(pp) >= 0)
4151 while ((childpid = PerlProc_fork()) == -1) {
4152 if (errno != EAGAIN) {
4157 PerlLIO_close(pp[0]);
4158 PerlLIO_close(pp[1]);
4165 Sigsave_t ihand,qhand; /* place to save signals during system() */
4169 PerlLIO_close(pp[1]);
4171 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4172 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4175 result = wait4pid(childpid, &status, 0);
4176 } while (result == -1 && errno == EINTR);
4178 (void)rsignal_restore(SIGINT, &ihand);
4179 (void)rsignal_restore(SIGQUIT, &qhand);
4181 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4182 do_execfree(); /* free any memory child malloced on fork */
4189 while (n < sizeof(int)) {
4190 n1 = PerlLIO_read(pp[0],
4191 (void*)(((char*)&errkid)+n),
4197 PerlLIO_close(pp[0]);
4198 if (n) { /* Error */
4199 if (n != sizeof(int))
4200 DIE(aTHX_ "panic: kid popen errno read");
4201 errno = errkid; /* Propagate errno from kid */
4202 STATUS_NATIVE_CHILD_SET(-1);
4205 XPUSHi(STATUS_CURRENT);
4209 PerlLIO_close(pp[0]);
4210 #if defined(HAS_FCNTL) && defined(F_SETFD)
4211 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4214 if (PL_op->op_flags & OPf_STACKED) {
4215 SV * const really = *++MARK;
4216 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4218 else if (SP - MARK != 1)
4219 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4221 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4225 #else /* ! FORK or VMS or OS/2 */
4228 if (PL_op->op_flags & OPf_STACKED) {
4229 SV * const really = *++MARK;
4230 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4231 value = (I32)do_aspawn(really, MARK, SP);
4233 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4236 else if (SP - MARK != 1) {
4237 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4238 value = (I32)do_aspawn(NULL, MARK, SP);
4240 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4244 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4246 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4248 STATUS_NATIVE_CHILD_SET(value);
4251 XPUSHi(result ? value : STATUS_CURRENT);
4252 #endif /* !FORK or VMS or OS/2 */
4259 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4264 while (++MARK <= SP) {
4265 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4270 TAINT_PROPER("exec");
4272 PERL_FLUSHALL_FOR_CHILD;
4273 if (PL_op->op_flags & OPf_STACKED) {
4274 SV * const really = *++MARK;
4275 value = (I32)do_aexec(really, MARK, SP);
4277 else if (SP - MARK != 1)
4279 value = (I32)vms_do_aexec(NULL, MARK, SP);
4283 (void ) do_aspawn(NULL, MARK, SP);
4287 value = (I32)do_aexec(NULL, MARK, SP);
4292 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4295 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4298 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4312 # ifdef THREADS_HAVE_PIDS
4313 if (PL_ppid != 1 && getppid() == 1)
4314 /* maybe the parent process has died. Refresh ppid cache */
4318 XPUSHi( getppid() );
4322 DIE(aTHX_ PL_no_func, "getppid");
4331 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4334 pgrp = (I32)BSD_GETPGRP(pid);
4336 if (pid != 0 && pid != PerlProc_getpid())
4337 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4343 DIE(aTHX_ PL_no_func, "getpgrp()");
4363 TAINT_PROPER("setpgrp");
4365 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4367 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4368 || (pid != 0 && pid != PerlProc_getpid()))
4370 DIE(aTHX_ "setpgrp can't take arguments");
4372 SETi( setpgrp() >= 0 );
4373 #endif /* USE_BSDPGRP */
4376 DIE(aTHX_ PL_no_func, "setpgrp()");
4382 #ifdef HAS_GETPRIORITY
4384 const int who = POPi;
4385 const int which = TOPi;
4386 SETi( getpriority(which, who) );
4389 DIE(aTHX_ PL_no_func, "getpriority()");
4395 #ifdef HAS_SETPRIORITY
4397 const int niceval = POPi;
4398 const int who = POPi;
4399 const int which = TOPi;
4400 TAINT_PROPER("setpriority");
4401 SETi( setpriority(which, who, niceval) >= 0 );
4404 DIE(aTHX_ PL_no_func, "setpriority()");
4414 XPUSHn( time(NULL) );
4416 XPUSHi( time(NULL) );
4428 (void)PerlProc_times(&PL_timesbuf);
4430 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4431 /* struct tms, though same data */
4435 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4436 if (GIMME == G_ARRAY) {
4437 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4438 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4439 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4447 if (GIMME == G_ARRAY) {
4454 DIE(aTHX_ "times not implemented");
4456 #endif /* HAS_TIMES */
4466 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4467 static const char * const dayname[] =
4468 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4469 static const char * const monname[] =
4470 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4471 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4476 when = (Time64_T)now;
4479 double input = Perl_floor(POPn);
4480 when = (Time64_T)input;
4481 if (when != input) {
4482 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4483 "%s(%.0f) too large", opname, input);
4487 if (PL_op->op_type == OP_LOCALTIME)
4488 err = S_localtime64_r(&when, &tmbuf);
4490 err = S_gmtime64_r(&when, &tmbuf);
4493 /* XXX %lld broken for quads */
4494 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4495 "%s(%.0f) failed", opname, (double)when);
4498 if (GIMME != G_ARRAY) { /* scalar context */
4500 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4501 double year = (double)tmbuf.tm_year + 1900;
4508 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4509 dayname[tmbuf.tm_wday],
4510 monname[tmbuf.tm_mon],
4518 else { /* list context */
4524 mPUSHi(tmbuf.tm_sec);
4525 mPUSHi(tmbuf.tm_min);
4526 mPUSHi(tmbuf.tm_hour);
4527 mPUSHi(tmbuf.tm_mday);
4528 mPUSHi(tmbuf.tm_mon);
4529 mPUSHn(tmbuf.tm_year);
4530 mPUSHi(tmbuf.tm_wday);
4531 mPUSHi(tmbuf.tm_yday);
4532 mPUSHi(tmbuf.tm_isdst);
4543 anum = alarm((unsigned int)anum);
4550 DIE(aTHX_ PL_no_func, "alarm");
4561 (void)time(&lasttime);
4566 PerlProc_sleep((unsigned int)duration);
4569 XPUSHi(when - lasttime);
4573 /* Shared memory. */
4574 /* Merged with some message passing. */
4578 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4579 dVAR; dSP; dMARK; dTARGET;
4580 const int op_type = PL_op->op_type;
4585 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4588 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4591 value = (I32)(do_semop(MARK, SP) >= 0);
4594 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4610 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4611 dVAR; dSP; dMARK; dTARGET;
4612 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4619 DIE(aTHX_ "System V IPC is not implemented on this machine");
4625 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4626 dVAR; dSP; dMARK; dTARGET;
4627 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4635 PUSHp(zero_but_true, ZBTLEN);
4643 /* I can't const this further without getting warnings about the types of
4644 various arrays passed in from structures. */
4646 S_space_join_names_mortal(pTHX_ char *const *array)
4650 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4652 if (array && *array) {
4653 target = newSVpvs_flags("", SVs_TEMP);
4655 sv_catpv(target, *array);
4658 sv_catpvs(target, " ");
4661 target = sv_mortalcopy(&PL_sv_no);
4666 /* Get system info. */
4670 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4672 I32 which = PL_op->op_type;
4673 register char **elem;
4675 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4676 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4677 struct hostent *gethostbyname(Netdb_name_t);
4678 struct hostent *gethostent(void);
4680 struct hostent *hent;
4684 if (which == OP_GHBYNAME) {
4685 #ifdef HAS_GETHOSTBYNAME
4686 const char* const name = POPpbytex;
4687 hent = PerlSock_gethostbyname(name);
4689 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4692 else if (which == OP_GHBYADDR) {
4693 #ifdef HAS_GETHOSTBYADDR
4694 const int addrtype = POPi;
4695 SV * const addrsv = POPs;
4697 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4699 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4701 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4705 #ifdef HAS_GETHOSTENT
4706 hent = PerlSock_gethostent();
4708 DIE(aTHX_ PL_no_sock_func, "gethostent");
4711 #ifdef HOST_NOT_FOUND
4713 #ifdef USE_REENTRANT_API
4714 # ifdef USE_GETHOSTENT_ERRNO
4715 h_errno = PL_reentrant_buffer->_gethostent_errno;
4718 STATUS_UNIX_SET(h_errno);
4722 if (GIMME != G_ARRAY) {
4723 PUSHs(sv = sv_newmortal());
4725 if (which == OP_GHBYNAME) {
4727 sv_setpvn(sv, hent->h_addr, hent->h_length);
4730 sv_setpv(sv, (char*)hent->h_name);
4736 mPUSHs(newSVpv((char*)hent->h_name, 0));
4737 PUSHs(space_join_names_mortal(hent->h_aliases));
4738 mPUSHi(hent->h_addrtype);
4739 len = hent->h_length;
4742 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4743 mXPUSHp(*elem, len);
4747 mPUSHp(hent->h_addr, len);
4749 PUSHs(sv_mortalcopy(&PL_sv_no));
4754 DIE(aTHX_ PL_no_sock_func, "gethostent");
4760 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4762 I32 which = PL_op->op_type;
4764 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4765 struct netent *getnetbyaddr(Netdb_net_t, int);
4766 struct netent *getnetbyname(Netdb_name_t);
4767 struct netent *getnetent(void);
4769 struct netent *nent;
4771 if (which == OP_GNBYNAME){
4772 #ifdef HAS_GETNETBYNAME
4773 const char * const name = POPpbytex;
4774 nent = PerlSock_getnetbyname(name);
4776 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4779 else if (which == OP_GNBYADDR) {
4780 #ifdef HAS_GETNETBYADDR
4781 const int addrtype = POPi;
4782 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4783 nent = PerlSock_getnetbyaddr(addr, addrtype);
4785 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4789 #ifdef HAS_GETNETENT
4790 nent = PerlSock_getnetent();
4792 DIE(aTHX_ PL_no_sock_func, "getnetent");
4795 #ifdef HOST_NOT_FOUND
4797 #ifdef USE_REENTRANT_API
4798 # ifdef USE_GETNETENT_ERRNO
4799 h_errno = PL_reentrant_buffer->_getnetent_errno;
4802 STATUS_UNIX_SET(h_errno);
4807 if (GIMME != G_ARRAY) {
4808 PUSHs(sv = sv_newmortal());
4810 if (which == OP_GNBYNAME)
4811 sv_setiv(sv, (IV)nent->n_net);
4813 sv_setpv(sv, nent->n_name);
4819 mPUSHs(newSVpv(nent->n_name, 0));
4820 PUSHs(space_join_names_mortal(nent->n_aliases));
4821 mPUSHi(nent->n_addrtype);
4822 mPUSHi(nent->n_net);
4827 DIE(aTHX_ PL_no_sock_func, "getnetent");
4833 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4835 I32 which = PL_op->op_type;
4837 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4838 struct protoent *getprotobyname(Netdb_name_t);
4839 struct protoent *getprotobynumber(int);
4840 struct protoent *getprotoent(void);
4842 struct protoent *pent;
4844 if (which == OP_GPBYNAME) {
4845 #ifdef HAS_GETPROTOBYNAME
4846 const char* const name = POPpbytex;
4847 pent = PerlSock_getprotobyname(name);
4849 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4852 else if (which == OP_GPBYNUMBER) {
4853 #ifdef HAS_GETPROTOBYNUMBER
4854 const int number = POPi;
4855 pent = PerlSock_getprotobynumber(number);
4857 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4861 #ifdef HAS_GETPROTOENT
4862 pent = PerlSock_getprotoent();
4864 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4868 if (GIMME != G_ARRAY) {
4869 PUSHs(sv = sv_newmortal());
4871 if (which == OP_GPBYNAME)
4872 sv_setiv(sv, (IV)pent->p_proto);
4874 sv_setpv(sv, pent->p_name);
4880 mPUSHs(newSVpv(pent->p_name, 0));
4881 PUSHs(space_join_names_mortal(pent->p_aliases));
4882 mPUSHi(pent->p_proto);
4887 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4893 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4895 I32 which = PL_op->op_type;
4897 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4898 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4899 struct servent *getservbyport(int, Netdb_name_t);
4900 struct servent *getservent(void);
4902 struct servent *sent;
4904 if (which == OP_GSBYNAME) {
4905 #ifdef HAS_GETSERVBYNAME
4906 const char * const proto = POPpbytex;
4907 const char * const name = POPpbytex;
4908 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4910 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4913 else if (which == OP_GSBYPORT) {
4914 #ifdef HAS_GETSERVBYPORT
4915 const char * const proto = POPpbytex;
4916 unsigned short port = (unsigned short)POPu;
4918 port = PerlSock_htons(port);
4920 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4922 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4926 #ifdef HAS_GETSERVENT
4927 sent = PerlSock_getservent();
4929 DIE(aTHX_ PL_no_sock_func, "getservent");
4933 if (GIMME != G_ARRAY) {
4934 PUSHs(sv = sv_newmortal());
4936 if (which == OP_GSBYNAME) {
4938 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4940 sv_setiv(sv, (IV)(sent->s_port));
4944 sv_setpv(sv, sent->s_name);
4950 mPUSHs(newSVpv(sent->s_name, 0));
4951 PUSHs(space_join_names_mortal(sent->s_aliases));
4953 mPUSHi(PerlSock_ntohs(sent->s_port));
4955 mPUSHi(sent->s_port);
4957 mPUSHs(newSVpv(sent->s_proto, 0));
4962 DIE(aTHX_ PL_no_sock_func, "getservent");
4968 #ifdef HAS_SETHOSTENT
4970 PerlSock_sethostent(TOPi);
4973 DIE(aTHX_ PL_no_sock_func, "sethostent");
4979 #ifdef HAS_SETNETENT
4981 (void)PerlSock_setnetent(TOPi);
4984 DIE(aTHX_ PL_no_sock_func, "setnetent");
4990 #ifdef HAS_SETPROTOENT
4992 (void)PerlSock_setprotoent(TOPi);
4995 DIE(aTHX_ PL_no_sock_func, "setprotoent");
5001 #ifdef HAS_SETSERVENT
5003 (void)PerlSock_setservent(TOPi);
5006 DIE(aTHX_ PL_no_sock_func, "setservent");
5012 #ifdef HAS_ENDHOSTENT
5014 PerlSock_endhostent();
5018 DIE(aTHX_ PL_no_sock_func, "endhostent");
5024 #ifdef HAS_ENDNETENT
5026 PerlSock_endnetent();
5030 DIE(aTHX_ PL_no_sock_func, "endnetent");
5036 #ifdef HAS_ENDPROTOENT
5038 PerlSock_endprotoent();
5042 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5048 #ifdef HAS_ENDSERVENT
5050 PerlSock_endservent();
5054 DIE(aTHX_ PL_no_sock_func, "endservent");
5062 I32 which = PL_op->op_type;
5064 struct passwd *pwent = NULL;
5066 * We currently support only the SysV getsp* shadow password interface.
5067 * The interface is declared in <shadow.h> and often one needs to link
5068 * with -lsecurity or some such.
5069 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5072 * AIX getpwnam() is clever enough to return the encrypted password
5073 * only if the caller (euid?) is root.
5075 * There are at least three other shadow password APIs. Many platforms
5076 * seem to contain more than one interface for accessing the shadow
5077 * password databases, possibly for compatibility reasons.
5078 * The getsp*() is by far he simplest one, the other two interfaces
5079 * are much more complicated, but also very similar to each other.
5084 * struct pr_passwd *getprpw*();
5085 * The password is in
5086 * char getprpw*(...).ufld.fd_encrypt[]
5087 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5092 * struct es_passwd *getespw*();
5093 * The password is in
5094 * char *(getespw*(...).ufld.fd_encrypt)
5095 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5098 * struct userpw *getuserpw();
5099 * The password is in
5100 * char *(getuserpw(...)).spw_upw_passwd
5101 * (but the de facto standard getpwnam() should work okay)
5103 * Mention I_PROT here so that Configure probes for it.
5105 * In HP-UX for getprpw*() the manual page claims that one should include
5106 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5107 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5108 * and pp_sys.c already includes <shadow.h> if there is such.
5110 * Note that <sys/security.h> is already probed for, but currently
5111 * it is only included in special cases.
5113 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5114 * be preferred interface, even though also the getprpw*() interface
5115 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5116 * One also needs to call set_auth_parameters() in main() before
5117 * doing anything else, whether one is using getespw*() or getprpw*().
5119 * Note that accessing the shadow databases can be magnitudes
5120 * slower than accessing the standard databases.
5125 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5126 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5127 * the pw_comment is left uninitialized. */
5128 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5134 const char* const name = POPpbytex;
5135 pwent = getpwnam(name);
5141 pwent = getpwuid(uid);
5145 # ifdef HAS_GETPWENT
5147 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5148 if (pwent) pwent = getpwnam(pwent->pw_name);
5151 DIE(aTHX_ PL_no_func, "getpwent");
5157 if (GIMME != G_ARRAY) {
5158 PUSHs(sv = sv_newmortal());
5160 if (which == OP_GPWNAM)
5161 # if Uid_t_sign <= 0
5162 sv_setiv(sv, (IV)pwent->pw_uid);
5164 sv_setuv(sv, (UV)pwent->pw_uid);
5167 sv_setpv(sv, pwent->pw_name);
5173 mPUSHs(newSVpv(pwent->pw_name, 0));
5177 /* If we have getspnam(), we try to dig up the shadow
5178 * password. If we are underprivileged, the shadow
5179 * interface will set the errno to EACCES or similar,
5180 * and return a null pointer. If this happens, we will
5181 * use the dummy password (usually "*" or "x") from the
5182 * standard password database.
5184 * In theory we could skip the shadow call completely
5185 * if euid != 0 but in practice we cannot know which
5186 * security measures are guarding the shadow databases
5187 * on a random platform.
5189 * Resist the urge to use additional shadow interfaces.
5190 * Divert the urge to writing an extension instead.
5193 /* Some AIX setups falsely(?) detect some getspnam(), which
5194 * has a different API than the Solaris/IRIX one. */
5195 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5198 const struct spwd * const spwent = getspnam(pwent->pw_name);
5199 /* Save and restore errno so that
5200 * underprivileged attempts seem
5201 * to have never made the unsccessful
5202 * attempt to retrieve the shadow password. */
5204 if (spwent && spwent->sp_pwdp)
5205 sv_setpv(sv, spwent->sp_pwdp);
5209 if (!SvPOK(sv)) /* Use the standard password, then. */
5210 sv_setpv(sv, pwent->pw_passwd);
5213 # ifndef INCOMPLETE_TAINTS
5214 /* passwd is tainted because user himself can diddle with it.
5215 * admittedly not much and in a very limited way, but nevertheless. */
5219 # if Uid_t_sign <= 0
5220 mPUSHi(pwent->pw_uid);
5222 mPUSHu(pwent->pw_uid);
5225 # if Uid_t_sign <= 0
5226 mPUSHi(pwent->pw_gid);
5228 mPUSHu(pwent->pw_gid);
5230 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5231 * because of the poor interface of the Perl getpw*(),
5232 * not because there's some standard/convention saying so.
5233 * A better interface would have been to return a hash,
5234 * but we are accursed by our history, alas. --jhi. */
5236 mPUSHi(pwent->pw_change);
5239 mPUSHi(pwent->pw_quota);
5242 mPUSHs(newSVpv(pwent->pw_age, 0));
5244 /* I think that you can never get this compiled, but just in case. */
5245 PUSHs(sv_mortalcopy(&PL_sv_no));
5250 /* pw_class and pw_comment are mutually exclusive--.
5251 * see the above note for pw_change, pw_quota, and pw_age. */
5253 mPUSHs(newSVpv(pwent->pw_class, 0));
5256 mPUSHs(newSVpv(pwent->pw_comment, 0));
5258 /* I think that you can never get this compiled, but just in case. */
5259 PUSHs(sv_mortalcopy(&PL_sv_no));
5264 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5266 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5268 # ifndef INCOMPLETE_TAINTS
5269 /* pw_gecos is tainted because user himself can diddle with it. */
5273 mPUSHs(newSVpv(pwent->pw_dir, 0));
5275 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5276 # ifndef INCOMPLETE_TAINTS
5277 /* pw_shell is tainted because user himself can diddle with it. */
5282 mPUSHi(pwent->pw_expire);
5287 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5293 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5298 DIE(aTHX_ PL_no_func, "setpwent");
5304 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5309 DIE(aTHX_ PL_no_func, "endpwent");
5317 const I32 which = PL_op->op_type;
5318 const struct group *grent;
5320 if (which == OP_GGRNAM) {
5321 const char* const name = POPpbytex;
5322 grent = (const struct group *)getgrnam(name);
5324 else if (which == OP_GGRGID) {
5325 const Gid_t gid = POPi;
5326 grent = (const struct group *)getgrgid(gid);
5330 grent = (struct group *)getgrent();
5332 DIE(aTHX_ PL_no_func, "getgrent");
5336 if (GIMME != G_ARRAY) {
5337 SV * const sv = sv_newmortal();
5341 if (which == OP_GGRNAM)
5343 sv_setiv(sv, (IV)grent->gr_gid);
5345 sv_setuv(sv, (UV)grent->gr_gid);
5348 sv_setpv(sv, grent->gr_name);
5354 mPUSHs(newSVpv(grent->gr_name, 0));
5357 mPUSHs(newSVpv(grent->gr_passwd, 0));
5359 PUSHs(sv_mortalcopy(&PL_sv_no));
5363 mPUSHi(grent->gr_gid);
5365 mPUSHu(grent->gr_gid);
5368 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5369 /* In UNICOS/mk (_CRAYMPP) the multithreading
5370 * versions (getgrnam_r, getgrgid_r)
5371 * seem to return an illegal pointer
5372 * as the group members list, gr_mem.
5373 * getgrent() doesn't even have a _r version
5374 * but the gr_mem is poisonous anyway.
5375 * So yes, you cannot get the list of group
5376 * members if building multithreaded in UNICOS/mk. */
5377 PUSHs(space_join_names_mortal(grent->gr_mem));
5383 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5389 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5394 DIE(aTHX_ PL_no_func, "setgrent");
5400 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5405 DIE(aTHX_ PL_no_func, "endgrent");
5415 if (!(tmps = PerlProc_getlogin()))
5417 PUSHp(tmps, strlen(tmps));
5420 DIE(aTHX_ PL_no_func, "getlogin");
5424 /* Miscellaneous. */
5429 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5430 register I32 items = SP - MARK;
5431 unsigned long a[20];
5436 while (++MARK <= SP) {
5437 if (SvTAINTED(*MARK)) {
5443 TAINT_PROPER("syscall");
5446 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5447 * or where sizeof(long) != sizeof(char*). But such machines will
5448 * not likely have syscall implemented either, so who cares?
5450 while (++MARK <= SP) {
5451 if (SvNIOK(*MARK) || !i)
5452 a[i++] = SvIV(*MARK);
5453 else if (*MARK == &PL_sv_undef)
5456 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5462 DIE(aTHX_ "Too many args to syscall");
5464 DIE(aTHX_ "Too few args to syscall");
5466 retval = syscall(a[0]);
5469 retval = syscall(a[0],a[1]);
5472 retval = syscall(a[0],a[1],a[2]);
5475 retval = syscall(a[0],a[1],a[2],a[3]);
5478 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5481 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5484 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5487 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5491 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5494 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5497 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5501 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5505 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5509 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5510 a[10],a[11],a[12],a[13]);
5512 #endif /* atarist */
5518 DIE(aTHX_ PL_no_func, "syscall");
5522 #ifdef FCNTL_EMULATE_FLOCK
5524 /* XXX Emulate flock() with fcntl().
5525 What's really needed is a good file locking module.
5529 fcntl_emulate_flock(int fd, int operation)
5533 switch (operation & ~LOCK_NB) {
5535 flock.l_type = F_RDLCK;
5538 flock.l_type = F_WRLCK;
5541 flock.l_type = F_UNLCK;
5547 flock.l_whence = SEEK_SET;
5548 flock.l_start = flock.l_len = (Off_t)0;
5550 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5553 #endif /* FCNTL_EMULATE_FLOCK */
5555 #ifdef LOCKF_EMULATE_FLOCK
5557 /* XXX Emulate flock() with lockf(). This is just to increase
5558 portability of scripts. The calls are not completely
5559 interchangeable. What's really needed is a good file
5563 /* The lockf() constants might have been defined in <unistd.h>.
5564 Unfortunately, <unistd.h> causes troubles on some mixed
5565 (BSD/POSIX) systems, such as SunOS 4.1.3.
5567 Further, the lockf() constants aren't POSIX, so they might not be
5568 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5569 just stick in the SVID values and be done with it. Sigh.
5573 # define F_ULOCK 0 /* Unlock a previously locked region */
5576 # define F_LOCK 1 /* Lock a region for exclusive use */
5579 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5582 # define F_TEST 3 /* Test a region for other processes locks */
5586 lockf_emulate_flock(int fd, int operation)
5592 /* flock locks entire file so for lockf we need to do the same */
5593 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5594 if (pos > 0) /* is seekable and needs to be repositioned */
5595 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5596 pos = -1; /* seek failed, so don't seek back afterwards */
5599 switch (operation) {
5601 /* LOCK_SH - get a shared lock */
5603 /* LOCK_EX - get an exclusive lock */
5605 i = lockf (fd, F_LOCK, 0);
5608 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5609 case LOCK_SH|LOCK_NB:
5610 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5611 case LOCK_EX|LOCK_NB:
5612 i = lockf (fd, F_TLOCK, 0);
5614 if ((errno == EAGAIN) || (errno == EACCES))
5615 errno = EWOULDBLOCK;
5618 /* LOCK_UN - unlock (non-blocking is a no-op) */
5620 case LOCK_UN|LOCK_NB:
5621 i = lockf (fd, F_ULOCK, 0);
5624 /* Default - can't decipher operation */
5631 if (pos > 0) /* need to restore position of the handle */
5632 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5637 #endif /* LOCKF_EMULATE_FLOCK */
5641 * c-indentation-style: bsd
5643 * indent-tabs-mode: t
5646 * ex: set ts=8 sts=4 sw=4 noet: