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;
524 if (IoDIRP(io) && ckWARN2(WARN_IO, WARN_DEPRECATED))
525 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
526 "Opening dirhandle %s also as a file", GvENAME(gv));
528 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
530 /* Method's args are same as ours ... */
531 /* ... except handle is replaced by the object */
532 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
536 call_method("OPEN", G_SCALAR);
550 tmps = SvPV_const(sv, len);
551 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
554 PUSHi( (I32)PL_forkprocess );
555 else if (PL_forkprocess == 0) /* we are a new child */
565 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
568 IO * const io = GvIO(gv);
570 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
573 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
576 call_method("CLOSE", G_SCALAR);
584 PUSHs(boolSV(do_close(gv, TRUE)));
597 GV * const wgv = MUTABLE_GV(POPs);
598 GV * const rgv = MUTABLE_GV(POPs);
603 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
604 DIE(aTHX_ PL_no_usym, "filehandle");
609 do_close(rgv, FALSE);
611 do_close(wgv, FALSE);
613 if (PerlProc_pipe(fd) < 0)
616 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
617 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
618 IoOFP(rstio) = IoIFP(rstio);
619 IoIFP(wstio) = IoOFP(wstio);
620 IoTYPE(rstio) = IoTYPE_RDONLY;
621 IoTYPE(wstio) = IoTYPE_WRONLY;
623 if (!IoIFP(rstio) || !IoOFP(wstio)) {
625 PerlIO_close(IoIFP(rstio));
627 PerlLIO_close(fd[0]);
629 PerlIO_close(IoOFP(wstio));
631 PerlLIO_close(fd[1]);
634 #if defined(HAS_FCNTL) && defined(F_SETFD)
635 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
636 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
643 DIE(aTHX_ PL_no_func, "pipe");
657 gv = MUTABLE_GV(POPs);
659 if (gv && (io = GvIO(gv))
660 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
663 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
666 call_method("FILENO", G_SCALAR);
672 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
673 /* Can't do this because people seem to do things like
674 defined(fileno($foo)) to check whether $foo is a valid fh.
675 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
676 report_evil_fh(gv, io, PL_op->op_type);
681 PUSHi(PerlIO_fileno(fp));
694 anum = PerlLIO_umask(022);
695 /* setting it to 022 between the two calls to umask avoids
696 * to have a window where the umask is set to 0 -- meaning
697 * that another thread could create world-writeable files. */
699 (void)PerlLIO_umask(anum);
702 anum = PerlLIO_umask(POPi);
703 TAINT_PROPER("umask");
706 /* Only DIE if trying to restrict permissions on "user" (self).
707 * Otherwise it's harmless and more useful to just return undef
708 * since 'group' and 'other' concepts probably don't exist here. */
709 if (MAXARG >= 1 && (POPi & 0700))
710 DIE(aTHX_ "umask not implemented");
711 XPUSHs(&PL_sv_undef);
730 gv = MUTABLE_GV(POPs);
732 if (gv && (io = GvIO(gv))) {
733 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
736 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
741 call_method("BINMODE", G_SCALAR);
749 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
750 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
751 report_evil_fh(gv, io, PL_op->op_type);
752 SETERRNO(EBADF,RMS_IFI);
759 const char *d = NULL;
762 d = SvPV_const(discp, len);
763 mode = mode_from_discipline(d, len);
764 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
765 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
766 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
787 const I32 markoff = MARK - PL_stack_base;
788 const char *methname;
789 int how = PERL_MAGIC_tied;
793 switch(SvTYPE(varsv)) {
795 methname = "TIEHASH";
796 HvEITER_set(MUTABLE_HV(varsv), 0);
799 methname = "TIEARRAY";
802 if (isGV_with_GP(varsv)) {
803 methname = "TIEHANDLE";
804 how = PERL_MAGIC_tiedscalar;
805 /* For tied filehandles, we apply tiedscalar magic to the IO
806 slot of the GP rather than the GV itself. AMS 20010812 */
808 GvIOp(varsv) = newIO();
809 varsv = MUTABLE_SV(GvIOp(varsv));
814 methname = "TIESCALAR";
815 how = PERL_MAGIC_tiedscalar;
819 if (sv_isobject(*MARK)) { /* Calls GET magic. */
821 PUSHSTACKi(PERLSI_MAGIC);
823 EXTEND(SP,(I32)items);
827 call_method(methname, G_SCALAR);
830 /* Not clear why we don't call call_method here too.
831 * perhaps to get different error message ?
834 const char *name = SvPV_nomg_const(*MARK, len);
835 stash = gv_stashpvn(name, len, 0);
836 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
837 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
838 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
841 PUSHSTACKi(PERLSI_MAGIC);
843 EXTEND(SP,(I32)items);
847 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
853 if (sv_isobject(sv)) {
854 sv_unmagic(varsv, how);
855 /* Croak if a self-tie on an aggregate is attempted. */
856 if (varsv == SvRV(sv) &&
857 (SvTYPE(varsv) == SVt_PVAV ||
858 SvTYPE(varsv) == SVt_PVHV))
860 "Self-ties of arrays and hashes are not supported");
861 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
864 SP = PL_stack_base + markoff;
874 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
875 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
877 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
880 if ((mg = SvTIED_mg(sv, how))) {
881 SV * const obj = SvRV(SvTIED_obj(sv, mg));
883 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
885 if (gv && isGV(gv) && (cv = GvCV(gv))) {
887 XPUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
888 mXPUSHi(SvREFCNT(obj) - 1);
891 call_sv(MUTABLE_SV(cv), G_VOID);
895 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
896 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
897 "untie attempted while %"UVuf" inner references still exist",
898 (UV)SvREFCNT(obj) - 1 ) ;
902 sv_unmagic(sv, how) ;
912 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
913 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
915 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
918 if ((mg = SvTIED_mg(sv, how))) {
919 SV *osv = SvTIED_obj(sv, mg);
920 if (osv == mg->mg_obj)
921 osv = sv_mortalcopy(osv);
935 HV * const hv = MUTABLE_HV(POPs);
936 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
937 stash = gv_stashsv(sv, 0);
938 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
940 require_pv("AnyDBM_File.pm");
942 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
943 DIE(aTHX_ "No dbm on this machine");
953 mPUSHu(O_RDWR|O_CREAT);
958 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
961 if (!sv_isobject(TOPs)) {
969 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
973 if (sv_isobject(TOPs)) {
974 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
975 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
992 struct timeval timebuf;
993 struct timeval *tbuf = &timebuf;
996 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1001 # if BYTEORDER & 0xf0000
1002 # define ORDERBYTE (0x88888888 - BYTEORDER)
1004 # define ORDERBYTE (0x4444 - BYTEORDER)
1010 for (i = 1; i <= 3; i++) {
1011 SV * const sv = SP[i];
1014 if (SvREADONLY(sv)) {
1016 sv_force_normal_flags(sv, 0);
1017 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1018 DIE(aTHX_ "%s", PL_no_modify);
1021 if (ckWARN(WARN_MISC))
1022 Perl_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 if (ckWARN(WARN_IO))
1421 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1423 if (!do_print(PL_formtarget, fp))
1426 FmLINES(PL_formtarget) = 0;
1427 SvCUR_set(PL_formtarget, 0);
1428 *SvEND(PL_formtarget) = '\0';
1429 if (IoFLAGS(io) & IOf_FLUSH)
1430 (void)PerlIO_flush(fp);
1435 PL_formtarget = PL_bodytarget;
1437 PERL_UNUSED_VAR(newsp);
1438 PERL_UNUSED_VAR(gimme);
1439 return cx->blk_sub.retop;
1444 dVAR; dSP; dMARK; dORIGMARK;
1450 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1452 if (gv && (io = GvIO(gv))) {
1453 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1455 if (MARK == ORIGMARK) {
1458 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1462 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1465 call_method("PRINTF", G_SCALAR);
1468 MARK = ORIGMARK + 1;
1476 if (!(io = GvIO(gv))) {
1477 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1478 report_evil_fh(gv, io, PL_op->op_type);
1479 SETERRNO(EBADF,RMS_IFI);
1482 else if (!(fp = IoOFP(io))) {
1483 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1485 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1486 else if (ckWARN(WARN_CLOSED))
1487 report_evil_fh(gv, io, PL_op->op_type);
1489 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1493 if (SvTAINTED(MARK[1]))
1494 TAINT_PROPER("printf");
1495 do_sprintf(sv, SP - MARK, MARK + 1);
1496 if (!do_print(sv, fp))
1499 if (IoFLAGS(io) & IOf_FLUSH)
1500 if (PerlIO_flush(fp) == EOF)
1511 PUSHs(&PL_sv_undef);
1519 const int perm = (MAXARG > 3) ? POPi : 0666;
1520 const int mode = POPi;
1521 SV * const sv = POPs;
1522 GV * const gv = MUTABLE_GV(POPs);
1525 /* Need TIEHANDLE method ? */
1526 const char * const tmps = SvPV_const(sv, len);
1527 /* FIXME? do_open should do const */
1528 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1529 IoLINES(GvIOp(gv)) = 0;
1533 PUSHs(&PL_sv_undef);
1540 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1546 Sock_size_t bufsize;
1554 bool charstart = FALSE;
1555 STRLEN charskip = 0;
1558 GV * const gv = MUTABLE_GV(*++MARK);
1559 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1560 && gv && (io = GvIO(gv)) )
1562 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1566 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1568 call_method("READ", G_SCALAR);
1582 sv_setpvs(bufsv, "");
1583 length = SvIVx(*++MARK);
1586 offset = SvIVx(*++MARK);
1590 if (!io || !IoIFP(io)) {
1591 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1592 report_evil_fh(gv, io, PL_op->op_type);
1593 SETERRNO(EBADF,RMS_IFI);
1596 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1597 buffer = SvPVutf8_force(bufsv, blen);
1598 /* UTF-8 may not have been set if they are all low bytes */
1603 buffer = SvPV_force(bufsv, blen);
1604 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1607 DIE(aTHX_ "Negative length");
1615 if (PL_op->op_type == OP_RECV) {
1616 char namebuf[MAXPATHLEN];
1617 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1618 bufsize = sizeof (struct sockaddr_in);
1620 bufsize = sizeof namebuf;
1622 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1626 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1627 /* 'offset' means 'flags' here */
1628 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1629 (struct sockaddr *)namebuf, &bufsize);
1633 /* Bogus return without padding */
1634 bufsize = sizeof (struct sockaddr_in);
1636 SvCUR_set(bufsv, count);
1637 *SvEND(bufsv) = '\0';
1638 (void)SvPOK_only(bufsv);
1642 /* This should not be marked tainted if the fp is marked clean */
1643 if (!(IoFLAGS(io) & IOf_UNTAINT))
1644 SvTAINTED_on(bufsv);
1646 sv_setpvn(TARG, namebuf, bufsize);
1651 if (PL_op->op_type == OP_RECV)
1652 DIE(aTHX_ PL_no_sock_func, "recv");
1654 if (DO_UTF8(bufsv)) {
1655 /* offset adjust in characters not bytes */
1656 blen = sv_len_utf8(bufsv);
1659 if (-offset > (int)blen)
1660 DIE(aTHX_ "Offset outside string");
1663 if (DO_UTF8(bufsv)) {
1664 /* convert offset-as-chars to offset-as-bytes */
1665 if (offset >= (int)blen)
1666 offset += SvCUR(bufsv) - blen;
1668 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1671 bufsize = SvCUR(bufsv);
1672 /* Allocating length + offset + 1 isn't perfect in the case of reading
1673 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1675 (should be 2 * length + offset + 1, or possibly something longer if
1676 PL_encoding is true) */
1677 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1678 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1679 Zero(buffer+bufsize, offset-bufsize, char);
1681 buffer = buffer + offset;
1683 read_target = bufsv;
1685 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1686 concatenate it to the current buffer. */
1688 /* Truncate the existing buffer to the start of where we will be
1690 SvCUR_set(bufsv, offset);
1692 read_target = sv_newmortal();
1693 SvUPGRADE(read_target, SVt_PV);
1694 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1697 if (PL_op->op_type == OP_SYSREAD) {
1698 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1699 if (IoTYPE(io) == IoTYPE_SOCKET) {
1700 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1706 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1711 #ifdef HAS_SOCKET__bad_code_maybe
1712 if (IoTYPE(io) == IoTYPE_SOCKET) {
1713 char namebuf[MAXPATHLEN];
1714 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1715 bufsize = sizeof (struct sockaddr_in);
1717 bufsize = sizeof namebuf;
1719 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1720 (struct sockaddr *)namebuf, &bufsize);
1725 count = PerlIO_read(IoIFP(io), buffer, length);
1726 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1727 if (count == 0 && PerlIO_error(IoIFP(io)))
1731 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1732 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1735 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1736 *SvEND(read_target) = '\0';
1737 (void)SvPOK_only(read_target);
1738 if (fp_utf8 && !IN_BYTES) {
1739 /* Look at utf8 we got back and count the characters */
1740 const char *bend = buffer + count;
1741 while (buffer < bend) {
1743 skip = UTF8SKIP(buffer);
1746 if (buffer - charskip + skip > bend) {
1747 /* partial character - try for rest of it */
1748 length = skip - (bend-buffer);
1749 offset = bend - SvPVX_const(bufsv);
1761 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1762 provided amount read (count) was what was requested (length)
1764 if (got < wanted && count == length) {
1765 length = wanted - got;
1766 offset = bend - SvPVX_const(bufsv);
1769 /* return value is character count */
1773 else if (buffer_utf8) {
1774 /* Let svcatsv upgrade the bytes we read in to utf8.
1775 The buffer is a mortal so will be freed soon. */
1776 sv_catsv_nomg(bufsv, read_target);
1779 /* This should not be marked tainted if the fp is marked clean */
1780 if (!(IoFLAGS(io) & IOf_UNTAINT))
1781 SvTAINTED_on(bufsv);
1793 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1799 STRLEN orig_blen_bytes;
1800 const int op_type = PL_op->op_type;
1804 GV *const gv = MUTABLE_GV(*++MARK);
1805 if (PL_op->op_type == OP_SYSWRITE
1806 && gv && (io = GvIO(gv))) {
1807 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1811 if (MARK == SP - 1) {
1813 mXPUSHi(sv_len(sv));
1818 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1820 call_method("WRITE", G_SCALAR);
1836 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1838 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1839 if (io && IoIFP(io))
1840 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1842 report_evil_fh(gv, io, PL_op->op_type);
1844 SETERRNO(EBADF,RMS_IFI);
1848 /* Do this first to trigger any overloading. */
1849 buffer = SvPV_const(bufsv, blen);
1850 orig_blen_bytes = blen;
1851 doing_utf8 = DO_UTF8(bufsv);
1853 if (PerlIO_isutf8(IoIFP(io))) {
1854 if (!SvUTF8(bufsv)) {
1855 /* We don't modify the original scalar. */
1856 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1857 buffer = (char *) tmpbuf;
1861 else if (doing_utf8) {
1862 STRLEN tmplen = blen;
1863 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1866 buffer = (char *) tmpbuf;
1870 assert((char *)result == buffer);
1871 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1875 if (op_type == OP_SYSWRITE) {
1876 Size_t length = 0; /* This length is in characters. */
1882 /* The SV is bytes, and we've had to upgrade it. */
1883 blen_chars = orig_blen_bytes;
1885 /* The SV really is UTF-8. */
1886 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1887 /* Don't call sv_len_utf8 again because it will call magic
1888 or overloading a second time, and we might get back a
1889 different result. */
1890 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1892 /* It's safe, and it may well be cached. */
1893 blen_chars = sv_len_utf8(bufsv);
1901 length = blen_chars;
1903 #if Size_t_size > IVSIZE
1904 length = (Size_t)SvNVx(*++MARK);
1906 length = (Size_t)SvIVx(*++MARK);
1908 if ((SSize_t)length < 0) {
1910 DIE(aTHX_ "Negative length");
1915 offset = SvIVx(*++MARK);
1917 if (-offset > (IV)blen_chars) {
1919 DIE(aTHX_ "Offset outside string");
1921 offset += blen_chars;
1922 } else if (offset >= (IV)blen_chars) {
1924 DIE(aTHX_ "Offset outside string");
1928 if (length > blen_chars - offset)
1929 length = blen_chars - offset;
1931 /* Here we convert length from characters to bytes. */
1932 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1933 /* Either we had to convert the SV, or the SV is magical, or
1934 the SV has overloading, in which case we can't or mustn't
1935 or mustn't call it again. */
1937 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1938 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1940 /* It's a real UTF-8 SV, and it's not going to change under
1941 us. Take advantage of any cache. */
1943 I32 len_I32 = length;
1945 /* Convert the start and end character positions to bytes.
1946 Remember that the second argument to sv_pos_u2b is relative
1948 sv_pos_u2b(bufsv, &start, &len_I32);
1955 buffer = buffer+offset;
1957 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1958 if (IoTYPE(io) == IoTYPE_SOCKET) {
1959 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1965 /* See the note at doio.c:do_print about filesize limits. --jhi */
1966 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1972 const int flags = SvIVx(*++MARK);
1975 char * const sockbuf = SvPVx(*++MARK, mlen);
1976 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1977 flags, (struct sockaddr *)sockbuf, mlen);
1981 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1986 DIE(aTHX_ PL_no_sock_func, "send");
1993 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1996 #if Size_t_size > IVSIZE
2017 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2018 else if (PL_op->op_flags & OPf_SPECIAL)
2019 gv = PL_last_in_gv = GvEGV(PL_argvgv); /* eof() - ARGV magic */
2021 gv = PL_last_in_gv; /* eof */
2026 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2028 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2030 * in Perl 5.12 and later, the additional paramter is a bitmask:
2033 * 2 = eof() <- ARGV magic
2036 mPUSHi(1); /* 1 = eof(FH) - simple, explicit FH */
2037 else if (PL_op->op_flags & OPf_SPECIAL)
2038 mPUSHi(2); /* 2 = eof() - ARGV magic */
2040 mPUSHi(0); /* 0 = eof - simple, implicit FH */
2043 call_method("EOF", G_SCALAR);
2049 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2050 if (io && !IoIFP(io)) {
2051 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2053 IoFLAGS(io) &= ~IOf_START;
2054 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2056 sv_setpvs(GvSV(gv), "-");
2058 GvSV(gv) = newSVpvs("-");
2059 SvSETMAGIC(GvSV(gv));
2061 else if (!nextargv(gv))
2066 PUSHs(boolSV(do_eof(gv)));
2077 PL_last_in_gv = MUTABLE_GV(POPs);
2080 if (gv && (io = GvIO(gv))) {
2081 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2084 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2087 call_method("TELL", G_SCALAR);
2095 SETERRNO(EBADF,RMS_IFI);
2100 #if LSEEKSIZE > IVSIZE
2101 PUSHn( do_tell(gv) );
2103 PUSHi( do_tell(gv) );
2111 const int whence = POPi;
2112 #if LSEEKSIZE > IVSIZE
2113 const Off_t offset = (Off_t)SvNVx(POPs);
2115 const Off_t offset = (Off_t)SvIVx(POPs);
2118 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2121 if (gv && (io = GvIO(gv))) {
2122 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2125 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2126 #if LSEEKSIZE > IVSIZE
2127 mXPUSHn((NV) offset);
2134 call_method("SEEK", G_SCALAR);
2141 if (PL_op->op_type == OP_SEEK)
2142 PUSHs(boolSV(do_seek(gv, offset, whence)));
2144 const Off_t sought = do_sysseek(gv, offset, whence);
2146 PUSHs(&PL_sv_undef);
2148 SV* const sv = sought ?
2149 #if LSEEKSIZE > IVSIZE
2154 : newSVpvn(zero_but_true, ZBTLEN);
2165 /* There seems to be no consensus on the length type of truncate()
2166 * and ftruncate(), both off_t and size_t have supporters. In
2167 * general one would think that when using large files, off_t is
2168 * at least as wide as size_t, so using an off_t should be okay. */
2169 /* XXX Configure probe for the length type of *truncate() needed XXX */
2172 #if Off_t_size > IVSIZE
2177 /* Checking for length < 0 is problematic as the type might or
2178 * might not be signed: if it is not, clever compilers will moan. */
2179 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2186 if (PL_op->op_flags & OPf_SPECIAL) {
2187 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2196 TAINT_PROPER("truncate");
2197 if (!(fp = IoIFP(io))) {
2203 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2205 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2212 SV * const sv = POPs;
2215 if (isGV_with_GP(sv)) {
2216 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2217 goto do_ftruncate_gv;
2219 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2220 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2221 goto do_ftruncate_gv;
2223 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2224 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2225 goto do_ftruncate_io;
2228 name = SvPV_nolen_const(sv);
2229 TAINT_PROPER("truncate");
2231 if (truncate(name, len) < 0)
2235 const int tmpfd = PerlLIO_open(name, O_RDWR);
2240 if (my_chsize(tmpfd, len) < 0)
2242 PerlLIO_close(tmpfd);
2251 SETERRNO(EBADF,RMS_IFI);
2259 SV * const argsv = POPs;
2260 const unsigned int func = POPu;
2261 const int optype = PL_op->op_type;
2262 GV * const gv = MUTABLE_GV(POPs);
2263 IO * const io = gv ? GvIOn(gv) : NULL;
2267 if (!io || !argsv || !IoIFP(io)) {
2268 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2269 report_evil_fh(gv, io, PL_op->op_type);
2270 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2274 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2277 s = SvPV_force(argsv, len);
2278 need = IOCPARM_LEN(func);
2280 s = Sv_Grow(argsv, need + 1);
2281 SvCUR_set(argsv, need);
2284 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2287 retval = SvIV(argsv);
2288 s = INT2PTR(char*,retval); /* ouch */
2291 TAINT_PROPER(PL_op_desc[optype]);
2293 if (optype == OP_IOCTL)
2295 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2297 DIE(aTHX_ "ioctl is not implemented");
2301 DIE(aTHX_ "fcntl is not implemented");
2303 #if defined(OS2) && defined(__EMX__)
2304 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2306 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2310 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2312 if (s[SvCUR(argsv)] != 17)
2313 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2315 s[SvCUR(argsv)] = 0; /* put our null back */
2316 SvSETMAGIC(argsv); /* Assume it has changed */
2325 PUSHp(zero_but_true, ZBTLEN);
2338 const int argtype = POPi;
2339 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2341 if (gv && (io = GvIO(gv)))
2347 /* XXX Looks to me like io is always NULL at this point */
2349 (void)PerlIO_flush(fp);
2350 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2353 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2354 report_evil_fh(gv, io, PL_op->op_type);
2356 SETERRNO(EBADF,RMS_IFI);
2361 DIE(aTHX_ PL_no_func, "flock()");
2371 const int protocol = POPi;
2372 const int type = POPi;
2373 const int domain = POPi;
2374 GV * const gv = MUTABLE_GV(POPs);
2375 register IO * const io = gv ? GvIOn(gv) : NULL;
2379 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2380 report_evil_fh(gv, io, PL_op->op_type);
2381 if (io && IoIFP(io))
2382 do_close(gv, FALSE);
2383 SETERRNO(EBADF,LIB_INVARG);
2388 do_close(gv, FALSE);
2390 TAINT_PROPER("socket");
2391 fd = PerlSock_socket(domain, type, protocol);
2394 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2395 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2396 IoTYPE(io) = IoTYPE_SOCKET;
2397 if (!IoIFP(io) || !IoOFP(io)) {
2398 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2399 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2400 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2403 #if defined(HAS_FCNTL) && defined(F_SETFD)
2404 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2408 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2413 DIE(aTHX_ PL_no_sock_func, "socket");
2419 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2421 const int protocol = POPi;
2422 const int type = POPi;
2423 const int domain = POPi;
2424 GV * const gv2 = MUTABLE_GV(POPs);
2425 GV * const gv1 = MUTABLE_GV(POPs);
2426 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2427 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2430 if (!gv1 || !gv2 || !io1 || !io2) {
2431 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2433 report_evil_fh(gv1, io1, PL_op->op_type);
2435 report_evil_fh(gv1, io2, PL_op->op_type);
2437 if (io1 && IoIFP(io1))
2438 do_close(gv1, FALSE);
2439 if (io2 && IoIFP(io2))
2440 do_close(gv2, FALSE);
2445 do_close(gv1, FALSE);
2447 do_close(gv2, FALSE);
2449 TAINT_PROPER("socketpair");
2450 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2452 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2453 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2454 IoTYPE(io1) = IoTYPE_SOCKET;
2455 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2456 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2457 IoTYPE(io2) = IoTYPE_SOCKET;
2458 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2459 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2460 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2461 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2462 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2463 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2464 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2467 #if defined(HAS_FCNTL) && defined(F_SETFD)
2468 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2469 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2474 DIE(aTHX_ PL_no_sock_func, "socketpair");
2482 SV * const addrsv = POPs;
2483 /* OK, so on what platform does bind modify addr? */
2485 GV * const gv = MUTABLE_GV(POPs);
2486 register IO * const io = GvIOn(gv);
2489 if (!io || !IoIFP(io))
2492 addr = SvPV_const(addrsv, len);
2493 TAINT_PROPER("bind");
2494 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2500 if (ckWARN(WARN_CLOSED))
2501 report_evil_fh(gv, io, PL_op->op_type);
2502 SETERRNO(EBADF,SS_IVCHAN);
2505 DIE(aTHX_ PL_no_sock_func, "bind");
2513 SV * const addrsv = POPs;
2514 GV * const gv = MUTABLE_GV(POPs);
2515 register IO * const io = GvIOn(gv);
2519 if (!io || !IoIFP(io))
2522 addr = SvPV_const(addrsv, len);
2523 TAINT_PROPER("connect");
2524 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2530 if (ckWARN(WARN_CLOSED))
2531 report_evil_fh(gv, io, PL_op->op_type);
2532 SETERRNO(EBADF,SS_IVCHAN);
2535 DIE(aTHX_ PL_no_sock_func, "connect");
2543 const int backlog = POPi;
2544 GV * const gv = MUTABLE_GV(POPs);
2545 register IO * const io = gv ? GvIOn(gv) : NULL;
2547 if (!gv || !io || !IoIFP(io))
2550 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2556 if (ckWARN(WARN_CLOSED))
2557 report_evil_fh(gv, io, PL_op->op_type);
2558 SETERRNO(EBADF,SS_IVCHAN);
2561 DIE(aTHX_ PL_no_sock_func, "listen");
2571 char namebuf[MAXPATHLEN];
2572 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2573 Sock_size_t len = sizeof (struct sockaddr_in);
2575 Sock_size_t len = sizeof namebuf;
2577 GV * const ggv = MUTABLE_GV(POPs);
2578 GV * const ngv = MUTABLE_GV(POPs);
2587 if (!gstio || !IoIFP(gstio))
2591 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2594 /* Some platforms indicate zero length when an AF_UNIX client is
2595 * not bound. Simulate a non-zero-length sockaddr structure in
2597 namebuf[0] = 0; /* sun_len */
2598 namebuf[1] = AF_UNIX; /* sun_family */
2606 do_close(ngv, FALSE);
2607 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2608 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2609 IoTYPE(nstio) = IoTYPE_SOCKET;
2610 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2611 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2612 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2613 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2616 #if defined(HAS_FCNTL) && defined(F_SETFD)
2617 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2621 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2622 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2624 #ifdef __SCO_VERSION__
2625 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2628 PUSHp(namebuf, len);
2632 if (ckWARN(WARN_CLOSED))
2633 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2634 SETERRNO(EBADF,SS_IVCHAN);
2640 DIE(aTHX_ PL_no_sock_func, "accept");
2648 const int how = POPi;
2649 GV * const gv = MUTABLE_GV(POPs);
2650 register IO * const io = GvIOn(gv);
2652 if (!io || !IoIFP(io))
2655 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2659 if (ckWARN(WARN_CLOSED))
2660 report_evil_fh(gv, io, PL_op->op_type);
2661 SETERRNO(EBADF,SS_IVCHAN);
2664 DIE(aTHX_ PL_no_sock_func, "shutdown");
2672 const int optype = PL_op->op_type;
2673 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2674 const unsigned int optname = (unsigned int) POPi;
2675 const unsigned int lvl = (unsigned int) POPi;
2676 GV * const gv = MUTABLE_GV(POPs);
2677 register IO * const io = GvIOn(gv);
2681 if (!io || !IoIFP(io))
2684 fd = PerlIO_fileno(IoIFP(io));
2688 (void)SvPOK_only(sv);
2692 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2699 #if defined(__SYMBIAN32__)
2700 # define SETSOCKOPT_OPTION_VALUE_T void *
2702 # define SETSOCKOPT_OPTION_VALUE_T const char *
2704 /* XXX TODO: We need to have a proper type (a Configure probe,
2705 * etc.) for what the C headers think of the third argument of
2706 * setsockopt(), the option_value read-only buffer: is it
2707 * a "char *", or a "void *", const or not. Some compilers
2708 * don't take kindly to e.g. assuming that "char *" implicitly
2709 * promotes to a "void *", or to explicitly promoting/demoting
2710 * consts to non/vice versa. The "const void *" is the SUS
2711 * definition, but that does not fly everywhere for the above
2713 SETSOCKOPT_OPTION_VALUE_T buf;
2717 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2721 aint = (int)SvIV(sv);
2722 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2725 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2734 if (ckWARN(WARN_CLOSED))
2735 report_evil_fh(gv, io, optype);
2736 SETERRNO(EBADF,SS_IVCHAN);
2741 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2749 const int optype = PL_op->op_type;
2750 GV * const gv = MUTABLE_GV(POPs);
2751 register IO * const io = GvIOn(gv);
2756 if (!io || !IoIFP(io))
2759 sv = sv_2mortal(newSV(257));
2760 (void)SvPOK_only(sv);
2764 fd = PerlIO_fileno(IoIFP(io));
2766 case OP_GETSOCKNAME:
2767 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2770 case OP_GETPEERNAME:
2771 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2773 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2775 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";
2776 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2777 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2778 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2779 sizeof(u_short) + sizeof(struct in_addr))) {
2786 #ifdef BOGUS_GETNAME_RETURN
2787 /* Interactive Unix, getpeername() and getsockname()
2788 does not return valid namelen */
2789 if (len == BOGUS_GETNAME_RETURN)
2790 len = sizeof(struct sockaddr);
2798 if (ckWARN(WARN_CLOSED))
2799 report_evil_fh(gv, io, optype);
2800 SETERRNO(EBADF,SS_IVCHAN);
2805 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2820 if (PL_op->op_flags & OPf_REF) {
2822 if (PL_op->op_type == OP_LSTAT) {
2823 if (gv != PL_defgv) {
2824 do_fstat_warning_check:
2825 if (ckWARN(WARN_IO))
2826 Perl_warner(aTHX_ packWARN(WARN_IO),
2827 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2828 } else if (PL_laststype != OP_LSTAT)
2829 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2833 if (gv != PL_defgv) {
2834 PL_laststype = OP_STAT;
2836 sv_setpvs(PL_statname, "");
2843 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2844 } else if (IoDIRP(io)) {
2846 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2848 PL_laststatval = -1;
2854 if (PL_laststatval < 0) {
2855 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2856 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2861 SV* const sv = POPs;
2862 if (isGV_with_GP(sv)) {
2863 gv = MUTABLE_GV(sv);
2865 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2866 gv = MUTABLE_GV(SvRV(sv));
2867 if (PL_op->op_type == OP_LSTAT)
2868 goto do_fstat_warning_check;
2870 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2871 io = MUTABLE_IO(SvRV(sv));
2872 if (PL_op->op_type == OP_LSTAT)
2873 goto do_fstat_warning_check;
2874 goto do_fstat_have_io;
2877 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2879 PL_laststype = PL_op->op_type;
2880 if (PL_op->op_type == OP_LSTAT)
2881 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2883 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2884 if (PL_laststatval < 0) {
2885 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2886 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2892 if (gimme != G_ARRAY) {
2893 if (gimme != G_VOID)
2894 XPUSHs(boolSV(max));
2900 mPUSHi(PL_statcache.st_dev);
2901 mPUSHi(PL_statcache.st_ino);
2902 mPUSHu(PL_statcache.st_mode);
2903 mPUSHu(PL_statcache.st_nlink);
2904 #if Uid_t_size > IVSIZE
2905 mPUSHn(PL_statcache.st_uid);
2907 # if Uid_t_sign <= 0
2908 mPUSHi(PL_statcache.st_uid);
2910 mPUSHu(PL_statcache.st_uid);
2913 #if Gid_t_size > IVSIZE
2914 mPUSHn(PL_statcache.st_gid);
2916 # if Gid_t_sign <= 0
2917 mPUSHi(PL_statcache.st_gid);
2919 mPUSHu(PL_statcache.st_gid);
2922 #ifdef USE_STAT_RDEV
2923 mPUSHi(PL_statcache.st_rdev);
2925 PUSHs(newSVpvs_flags("", SVs_TEMP));
2927 #if Off_t_size > IVSIZE
2928 mPUSHn(PL_statcache.st_size);
2930 mPUSHi(PL_statcache.st_size);
2933 mPUSHn(PL_statcache.st_atime);
2934 mPUSHn(PL_statcache.st_mtime);
2935 mPUSHn(PL_statcache.st_ctime);
2937 mPUSHi(PL_statcache.st_atime);
2938 mPUSHi(PL_statcache.st_mtime);
2939 mPUSHi(PL_statcache.st_ctime);
2941 #ifdef USE_STAT_BLOCKS
2942 mPUSHu(PL_statcache.st_blksize);
2943 mPUSHu(PL_statcache.st_blocks);
2945 PUSHs(newSVpvs_flags("", SVs_TEMP));
2946 PUSHs(newSVpvs_flags("", SVs_TEMP));
2952 /* This macro is used by the stacked filetest operators :
2953 * if the previous filetest failed, short-circuit and pass its value.
2954 * Else, discard it from the stack and continue. --rgs
2956 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2957 if (!SvTRUE(TOPs)) { RETURN; } \
2958 else { (void)POPs; PUTBACK; } \
2965 /* Not const, because things tweak this below. Not bool, because there's
2966 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2967 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2968 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2969 /* Giving some sort of initial value silences compilers. */
2971 int access_mode = R_OK;
2973 int access_mode = 0;
2976 /* access_mode is never used, but leaving use_access in makes the
2977 conditional compiling below much clearer. */
2980 int stat_mode = S_IRUSR;
2982 bool effective = FALSE;
2986 switch (PL_op->op_type) {
2987 case OP_FTRREAD: opchar = 'R'; break;
2988 case OP_FTRWRITE: opchar = 'W'; break;
2989 case OP_FTREXEC: opchar = 'X'; break;
2990 case OP_FTEREAD: opchar = 'r'; break;
2991 case OP_FTEWRITE: opchar = 'w'; break;
2992 case OP_FTEEXEC: opchar = 'x'; break;
2994 tryAMAGICftest(opchar);
2996 STACKED_FTEST_CHECK;
2998 switch (PL_op->op_type) {
3000 #if !(defined(HAS_ACCESS) && defined(R_OK))
3006 #if defined(HAS_ACCESS) && defined(W_OK)
3011 stat_mode = S_IWUSR;
3015 #if defined(HAS_ACCESS) && defined(X_OK)
3020 stat_mode = S_IXUSR;
3024 #ifdef PERL_EFF_ACCESS
3027 stat_mode = S_IWUSR;
3031 #ifndef PERL_EFF_ACCESS
3038 #ifdef PERL_EFF_ACCESS
3043 stat_mode = S_IXUSR;
3049 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3050 const char *name = POPpx;
3052 # ifdef PERL_EFF_ACCESS
3053 result = PERL_EFF_ACCESS(name, access_mode);
3055 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3061 result = access(name, access_mode);
3063 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3078 if (cando(stat_mode, effective, &PL_statcache))
3087 const int op_type = PL_op->op_type;
3092 case OP_FTIS: opchar = 'e'; break;
3093 case OP_FTSIZE: opchar = 's'; break;
3094 case OP_FTMTIME: opchar = 'M'; break;
3095 case OP_FTCTIME: opchar = 'C'; break;
3096 case OP_FTATIME: opchar = 'A'; break;
3098 tryAMAGICftest(opchar);
3100 STACKED_FTEST_CHECK;
3106 if (op_type == OP_FTIS)
3109 /* You can't dTARGET inside OP_FTIS, because you'll get
3110 "panic: pad_sv po" - the op is not flagged to have a target. */
3114 #if Off_t_size > IVSIZE
3115 PUSHn(PL_statcache.st_size);
3117 PUSHi(PL_statcache.st_size);
3121 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3124 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3127 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3141 switch (PL_op->op_type) {
3142 case OP_FTROWNED: opchar = 'O'; break;
3143 case OP_FTEOWNED: opchar = 'o'; break;
3144 case OP_FTZERO: opchar = 'z'; break;
3145 case OP_FTSOCK: opchar = 'S'; break;
3146 case OP_FTCHR: opchar = 'c'; break;
3147 case OP_FTBLK: opchar = 'b'; break;
3148 case OP_FTFILE: opchar = 'f'; break;
3149 case OP_FTDIR: opchar = 'd'; break;
3150 case OP_FTPIPE: opchar = 'p'; break;
3151 case OP_FTSUID: opchar = 'u'; break;
3152 case OP_FTSGID: opchar = 'g'; break;
3153 case OP_FTSVTX: opchar = 'k'; break;
3155 tryAMAGICftest(opchar);
3157 /* I believe that all these three are likely to be defined on most every
3158 system these days. */
3160 if(PL_op->op_type == OP_FTSUID)
3164 if(PL_op->op_type == OP_FTSGID)
3168 if(PL_op->op_type == OP_FTSVTX)
3172 STACKED_FTEST_CHECK;
3178 switch (PL_op->op_type) {
3180 if (PL_statcache.st_uid == PL_uid)
3184 if (PL_statcache.st_uid == PL_euid)
3188 if (PL_statcache.st_size == 0)
3192 if (S_ISSOCK(PL_statcache.st_mode))
3196 if (S_ISCHR(PL_statcache.st_mode))
3200 if (S_ISBLK(PL_statcache.st_mode))
3204 if (S_ISREG(PL_statcache.st_mode))
3208 if (S_ISDIR(PL_statcache.st_mode))
3212 if (S_ISFIFO(PL_statcache.st_mode))
3217 if (PL_statcache.st_mode & S_ISUID)
3223 if (PL_statcache.st_mode & S_ISGID)
3229 if (PL_statcache.st_mode & S_ISVTX)
3243 tryAMAGICftest('l');
3244 result = my_lstat();
3249 if (S_ISLNK(PL_statcache.st_mode))
3262 tryAMAGICftest('t');
3264 STACKED_FTEST_CHECK;
3266 if (PL_op->op_flags & OPf_REF)
3268 else if (isGV(TOPs))
3269 gv = MUTABLE_GV(POPs);
3270 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3271 gv = MUTABLE_GV(SvRV(POPs));
3273 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3275 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3276 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3277 else if (tmpsv && SvOK(tmpsv)) {
3278 const char *tmps = SvPV_nolen_const(tmpsv);
3286 if (PerlLIO_isatty(fd))
3291 #if defined(atarist) /* this will work with atariST. Configure will
3292 make guesses for other systems. */
3293 # define FILE_base(f) ((f)->_base)
3294 # define FILE_ptr(f) ((f)->_ptr)
3295 # define FILE_cnt(f) ((f)->_cnt)
3296 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3307 register STDCHAR *s;
3313 tryAMAGICftest(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3315 STACKED_FTEST_CHECK;
3317 if (PL_op->op_flags & OPf_REF)
3319 else if (isGV(TOPs))
3320 gv = MUTABLE_GV(POPs);
3321 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3322 gv = MUTABLE_GV(SvRV(POPs));
3328 if (gv == PL_defgv) {
3330 io = GvIO(PL_statgv);
3333 goto really_filename;
3338 PL_laststatval = -1;
3339 sv_setpvs(PL_statname, "");
3340 io = GvIO(PL_statgv);
3342 if (io && IoIFP(io)) {
3343 if (! PerlIO_has_base(IoIFP(io)))
3344 DIE(aTHX_ "-T and -B not implemented on filehandles");
3345 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3346 if (PL_laststatval < 0)
3348 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3349 if (PL_op->op_type == OP_FTTEXT)
3354 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3355 i = PerlIO_getc(IoIFP(io));
3357 (void)PerlIO_ungetc(IoIFP(io),i);
3359 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3361 len = PerlIO_get_bufsiz(IoIFP(io));
3362 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3363 /* sfio can have large buffers - limit to 512 */
3368 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3370 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3372 SETERRNO(EBADF,RMS_IFI);
3380 PL_laststype = OP_STAT;
3381 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3382 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3383 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3385 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3388 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3389 if (PL_laststatval < 0) {
3390 (void)PerlIO_close(fp);
3393 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3394 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3395 (void)PerlIO_close(fp);
3397 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3398 RETPUSHNO; /* special case NFS directories */
3399 RETPUSHYES; /* null file is anything */
3404 /* now scan s to look for textiness */
3405 /* XXX ASCII dependent code */
3407 #if defined(DOSISH) || defined(USEMYBINMODE)
3408 /* ignore trailing ^Z on short files */
3409 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3413 for (i = 0; i < len; i++, s++) {
3414 if (!*s) { /* null never allowed in text */
3419 else if (!(isPRINT(*s) || isSPACE(*s)))
3422 else if (*s & 128) {
3424 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3427 /* utf8 characters don't count as odd */
3428 if (UTF8_IS_START(*s)) {
3429 int ulen = UTF8SKIP(s);
3430 if (ulen < len - i) {
3432 for (j = 1; j < ulen; j++) {
3433 if (!UTF8_IS_CONTINUATION(s[j]))
3436 --ulen; /* loop does extra increment */
3446 *s != '\n' && *s != '\r' && *s != '\b' &&
3447 *s != '\t' && *s != '\f' && *s != 27)
3452 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3463 const char *tmps = NULL;
3467 SV * const sv = POPs;
3468 if (PL_op->op_flags & OPf_SPECIAL) {
3469 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3471 else if (isGV_with_GP(sv)) {
3472 gv = MUTABLE_GV(sv);
3474 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3475 gv = MUTABLE_GV(SvRV(sv));
3478 tmps = SvPV_nolen_const(sv);
3482 if( !gv && (!tmps || !*tmps) ) {
3483 HV * const table = GvHVn(PL_envgv);
3486 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3487 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3489 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3494 deprecate("chdir('') or chdir(undef) as chdir()");
3495 tmps = SvPV_nolen_const(*svp);
3499 TAINT_PROPER("chdir");
3504 TAINT_PROPER("chdir");
3507 IO* const io = GvIO(gv);
3510 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3511 } else if (IoIFP(io)) {
3512 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3515 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3516 report_evil_fh(gv, io, PL_op->op_type);
3517 SETERRNO(EBADF, RMS_IFI);
3522 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3523 report_evil_fh(gv, io, PL_op->op_type);
3524 SETERRNO(EBADF,RMS_IFI);
3528 DIE(aTHX_ PL_no_func, "fchdir");
3532 PUSHi( PerlDir_chdir(tmps) >= 0 );
3534 /* Clear the DEFAULT element of ENV so we'll get the new value
3536 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3543 dVAR; dSP; dMARK; dTARGET;
3544 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3555 char * const tmps = POPpx;
3556 TAINT_PROPER("chroot");
3557 PUSHi( chroot(tmps) >= 0 );
3560 DIE(aTHX_ PL_no_func, "chroot");
3568 const char * const tmps2 = POPpconstx;
3569 const char * const tmps = SvPV_nolen_const(TOPs);
3570 TAINT_PROPER("rename");
3572 anum = PerlLIO_rename(tmps, tmps2);
3574 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3575 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3578 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3579 (void)UNLINK(tmps2);
3580 if (!(anum = link(tmps, tmps2)))
3581 anum = UNLINK(tmps);
3589 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3593 const int op_type = PL_op->op_type;
3597 if (op_type == OP_LINK)
3598 DIE(aTHX_ PL_no_func, "link");
3600 # ifndef HAS_SYMLINK
3601 if (op_type == OP_SYMLINK)
3602 DIE(aTHX_ PL_no_func, "symlink");
3606 const char * const tmps2 = POPpconstx;
3607 const char * const tmps = SvPV_nolen_const(TOPs);
3608 TAINT_PROPER(PL_op_desc[op_type]);
3610 # if defined(HAS_LINK)
3611 # if defined(HAS_SYMLINK)
3612 /* Both present - need to choose which. */
3613 (op_type == OP_LINK) ?
3614 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3616 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3617 PerlLIO_link(tmps, tmps2);
3620 # if defined(HAS_SYMLINK)
3621 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3622 symlink(tmps, tmps2);
3627 SETi( result >= 0 );
3634 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3645 char buf[MAXPATHLEN];
3648 #ifndef INCOMPLETE_TAINTS
3652 len = readlink(tmps, buf, sizeof(buf) - 1);
3660 RETSETUNDEF; /* just pretend it's a normal file */
3664 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3666 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3668 char * const save_filename = filename;
3673 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3675 PERL_ARGS_ASSERT_DOONELINER;
3677 Newx(cmdline, size, char);
3678 my_strlcpy(cmdline, cmd, size);
3679 my_strlcat(cmdline, " ", size);
3680 for (s = cmdline + strlen(cmdline); *filename; ) {
3684 if (s - cmdline < size)
3685 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3686 myfp = PerlProc_popen(cmdline, "r");
3690 SV * const tmpsv = sv_newmortal();
3691 /* Need to save/restore 'PL_rs' ?? */
3692 s = sv_gets(tmpsv, myfp, 0);
3693 (void)PerlProc_pclose(myfp);
3697 #ifdef HAS_SYS_ERRLIST
3702 /* you don't see this */
3703 const char * const errmsg =
3704 #ifdef HAS_SYS_ERRLIST
3712 if (instr(s, errmsg)) {
3719 #define EACCES EPERM
3721 if (instr(s, "cannot make"))
3722 SETERRNO(EEXIST,RMS_FEX);
3723 else if (instr(s, "existing file"))
3724 SETERRNO(EEXIST,RMS_FEX);
3725 else if (instr(s, "ile exists"))
3726 SETERRNO(EEXIST,RMS_FEX);
3727 else if (instr(s, "non-exist"))
3728 SETERRNO(ENOENT,RMS_FNF);
3729 else if (instr(s, "does not exist"))
3730 SETERRNO(ENOENT,RMS_FNF);
3731 else if (instr(s, "not empty"))
3732 SETERRNO(EBUSY,SS_DEVOFFLINE);
3733 else if (instr(s, "cannot access"))
3734 SETERRNO(EACCES,RMS_PRV);
3736 SETERRNO(EPERM,RMS_PRV);
3739 else { /* some mkdirs return no failure indication */
3740 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3741 if (PL_op->op_type == OP_RMDIR)
3746 SETERRNO(EACCES,RMS_PRV); /* a guess */
3755 /* This macro removes trailing slashes from a directory name.
3756 * Different operating and file systems take differently to
3757 * trailing slashes. According to POSIX 1003.1 1996 Edition
3758 * any number of trailing slashes should be allowed.
3759 * Thusly we snip them away so that even non-conforming
3760 * systems are happy.
3761 * We should probably do this "filtering" for all
3762 * the functions that expect (potentially) directory names:
3763 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3764 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3766 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3767 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3770 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3771 (tmps) = savepvn((tmps), (len)); \
3781 const int mode = (MAXARG > 1) ? POPi : 0777;
3783 TRIMSLASHES(tmps,len,copy);
3785 TAINT_PROPER("mkdir");
3787 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3791 SETi( dooneliner("mkdir", tmps) );
3792 oldumask = PerlLIO_umask(0);
3793 PerlLIO_umask(oldumask);
3794 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3809 TRIMSLASHES(tmps,len,copy);
3810 TAINT_PROPER("rmdir");
3812 SETi( PerlDir_rmdir(tmps) >= 0 );
3814 SETi( dooneliner("rmdir", tmps) );
3821 /* Directory calls. */
3825 #if defined(Direntry_t) && defined(HAS_READDIR)
3827 const char * const dirname = POPpconstx;
3828 GV * const gv = MUTABLE_GV(POPs);
3829 register IO * const io = GvIOn(gv);
3834 if ((IoIFP(io) || IoOFP(io)) && ckWARN2(WARN_IO, WARN_DEPRECATED))
3835 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3836 "Opening filehandle %s also as a directory", GvENAME(gv));
3838 PerlDir_close(IoDIRP(io));
3839 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3845 SETERRNO(EBADF,RMS_DIR);
3848 DIE(aTHX_ PL_no_dir_func, "opendir");
3854 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3855 DIE(aTHX_ PL_no_dir_func, "readdir");
3857 #if !defined(I_DIRENT) && !defined(VMS)
3858 Direntry_t *readdir (DIR *);
3864 const I32 gimme = GIMME;
3865 GV * const gv = MUTABLE_GV(POPs);
3866 register const Direntry_t *dp;
3867 register IO * const io = GvIOn(gv);
3869 if (!io || !IoDIRP(io)) {
3870 if(ckWARN(WARN_IO)) {
3871 Perl_warner(aTHX_ packWARN(WARN_IO),
3872 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3878 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3882 sv = newSVpvn(dp->d_name, dp->d_namlen);
3884 sv = newSVpv(dp->d_name, 0);
3886 #ifndef INCOMPLETE_TAINTS
3887 if (!(IoFLAGS(io) & IOf_UNTAINT))
3891 } while (gimme == G_ARRAY);
3893 if (!dp && gimme != G_ARRAY)
3900 SETERRNO(EBADF,RMS_ISI);
3901 if (GIMME == G_ARRAY)
3910 #if defined(HAS_TELLDIR) || defined(telldir)
3912 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3913 /* XXX netbsd still seemed to.
3914 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3915 --JHI 1999-Feb-02 */
3916 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3917 long telldir (DIR *);
3919 GV * const gv = MUTABLE_GV(POPs);
3920 register IO * const io = GvIOn(gv);
3922 if (!io || !IoDIRP(io)) {
3923 if(ckWARN(WARN_IO)) {
3924 Perl_warner(aTHX_ packWARN(WARN_IO),
3925 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3930 PUSHi( PerlDir_tell(IoDIRP(io)) );
3934 SETERRNO(EBADF,RMS_ISI);
3937 DIE(aTHX_ PL_no_dir_func, "telldir");
3943 #if defined(HAS_SEEKDIR) || defined(seekdir)
3945 const long along = POPl;
3946 GV * const gv = MUTABLE_GV(POPs);
3947 register IO * const io = GvIOn(gv);
3949 if (!io || !IoDIRP(io)) {
3950 if(ckWARN(WARN_IO)) {
3951 Perl_warner(aTHX_ packWARN(WARN_IO),
3952 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3956 (void)PerlDir_seek(IoDIRP(io), along);
3961 SETERRNO(EBADF,RMS_ISI);
3964 DIE(aTHX_ PL_no_dir_func, "seekdir");
3970 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3972 GV * const gv = MUTABLE_GV(POPs);
3973 register IO * const io = GvIOn(gv);
3975 if (!io || !IoDIRP(io)) {
3976 if(ckWARN(WARN_IO)) {
3977 Perl_warner(aTHX_ packWARN(WARN_IO),
3978 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3982 (void)PerlDir_rewind(IoDIRP(io));
3986 SETERRNO(EBADF,RMS_ISI);
3989 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3995 #if defined(Direntry_t) && defined(HAS_READDIR)
3997 GV * const gv = MUTABLE_GV(POPs);
3998 register IO * const io = GvIOn(gv);
4000 if (!io || !IoDIRP(io)) {
4001 if(ckWARN(WARN_IO)) {
4002 Perl_warner(aTHX_ packWARN(WARN_IO),
4003 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
4007 #ifdef VOID_CLOSEDIR
4008 PerlDir_close(IoDIRP(io));
4010 if (PerlDir_close(IoDIRP(io)) < 0) {
4011 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4020 SETERRNO(EBADF,RMS_IFI);
4023 DIE(aTHX_ PL_no_dir_func, "closedir");
4027 /* Process control. */
4036 PERL_FLUSHALL_FOR_CHILD;
4037 childpid = PerlProc_fork();
4041 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
4043 SvREADONLY_off(GvSV(tmpgv));
4044 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4045 SvREADONLY_on(GvSV(tmpgv));
4047 #ifdef THREADS_HAVE_PIDS
4048 PL_ppid = (IV)getppid();
4050 #ifdef PERL_USES_PL_PIDSTATUS
4051 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4057 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4062 PERL_FLUSHALL_FOR_CHILD;
4063 childpid = PerlProc_fork();
4069 DIE(aTHX_ PL_no_func, "fork");
4076 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4081 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4082 childpid = wait4pid(-1, &argflags, 0);
4084 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4089 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4090 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4091 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4093 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4098 DIE(aTHX_ PL_no_func, "wait");
4104 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4106 const int optype = POPi;
4107 const Pid_t pid = TOPi;
4111 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4112 result = wait4pid(pid, &argflags, optype);
4114 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4119 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4120 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4121 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4123 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4128 DIE(aTHX_ PL_no_func, "waitpid");
4134 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4135 #if defined(__LIBCATAMOUNT__)
4136 PL_statusvalue = -1;
4145 while (++MARK <= SP) {
4146 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4151 TAINT_PROPER("system");
4153 PERL_FLUSHALL_FOR_CHILD;
4154 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4160 if (PerlProc_pipe(pp) >= 0)
4162 while ((childpid = PerlProc_fork()) == -1) {
4163 if (errno != EAGAIN) {
4168 PerlLIO_close(pp[0]);
4169 PerlLIO_close(pp[1]);
4176 Sigsave_t ihand,qhand; /* place to save signals during system() */
4180 PerlLIO_close(pp[1]);
4182 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4183 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4186 result = wait4pid(childpid, &status, 0);
4187 } while (result == -1 && errno == EINTR);
4189 (void)rsignal_restore(SIGINT, &ihand);
4190 (void)rsignal_restore(SIGQUIT, &qhand);
4192 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4193 do_execfree(); /* free any memory child malloced on fork */
4200 while (n < sizeof(int)) {
4201 n1 = PerlLIO_read(pp[0],
4202 (void*)(((char*)&errkid)+n),
4208 PerlLIO_close(pp[0]);
4209 if (n) { /* Error */
4210 if (n != sizeof(int))
4211 DIE(aTHX_ "panic: kid popen errno read");
4212 errno = errkid; /* Propagate errno from kid */
4213 STATUS_NATIVE_CHILD_SET(-1);
4216 XPUSHi(STATUS_CURRENT);
4220 PerlLIO_close(pp[0]);
4221 #if defined(HAS_FCNTL) && defined(F_SETFD)
4222 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4225 if (PL_op->op_flags & OPf_STACKED) {
4226 SV * const really = *++MARK;
4227 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4229 else if (SP - MARK != 1)
4230 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4232 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4236 #else /* ! FORK or VMS or OS/2 */
4239 if (PL_op->op_flags & OPf_STACKED) {
4240 SV * const really = *++MARK;
4241 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4242 value = (I32)do_aspawn(really, MARK, SP);
4244 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4247 else if (SP - MARK != 1) {
4248 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4249 value = (I32)do_aspawn(NULL, MARK, SP);
4251 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4255 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4257 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4259 STATUS_NATIVE_CHILD_SET(value);
4262 XPUSHi(result ? value : STATUS_CURRENT);
4263 #endif /* !FORK or VMS or OS/2 */
4270 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4275 while (++MARK <= SP) {
4276 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4281 TAINT_PROPER("exec");
4283 PERL_FLUSHALL_FOR_CHILD;
4284 if (PL_op->op_flags & OPf_STACKED) {
4285 SV * const really = *++MARK;
4286 value = (I32)do_aexec(really, MARK, SP);
4288 else if (SP - MARK != 1)
4290 value = (I32)vms_do_aexec(NULL, MARK, SP);
4294 (void ) do_aspawn(NULL, MARK, SP);
4298 value = (I32)do_aexec(NULL, MARK, SP);
4303 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4306 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4309 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4323 # ifdef THREADS_HAVE_PIDS
4324 if (PL_ppid != 1 && getppid() == 1)
4325 /* maybe the parent process has died. Refresh ppid cache */
4329 XPUSHi( getppid() );
4333 DIE(aTHX_ PL_no_func, "getppid");
4342 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4345 pgrp = (I32)BSD_GETPGRP(pid);
4347 if (pid != 0 && pid != PerlProc_getpid())
4348 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4354 DIE(aTHX_ PL_no_func, "getpgrp()");
4374 TAINT_PROPER("setpgrp");
4376 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4378 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4379 || (pid != 0 && pid != PerlProc_getpid()))
4381 DIE(aTHX_ "setpgrp can't take arguments");
4383 SETi( setpgrp() >= 0 );
4384 #endif /* USE_BSDPGRP */
4387 DIE(aTHX_ PL_no_func, "setpgrp()");
4393 #ifdef HAS_GETPRIORITY
4395 const int who = POPi;
4396 const int which = TOPi;
4397 SETi( getpriority(which, who) );
4400 DIE(aTHX_ PL_no_func, "getpriority()");
4406 #ifdef HAS_SETPRIORITY
4408 const int niceval = POPi;
4409 const int who = POPi;
4410 const int which = TOPi;
4411 TAINT_PROPER("setpriority");
4412 SETi( setpriority(which, who, niceval) >= 0 );
4415 DIE(aTHX_ PL_no_func, "setpriority()");
4425 XPUSHn( time(NULL) );
4427 XPUSHi( time(NULL) );
4439 (void)PerlProc_times(&PL_timesbuf);
4441 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4442 /* struct tms, though same data */
4446 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4447 if (GIMME == G_ARRAY) {
4448 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4449 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4450 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4458 if (GIMME == G_ARRAY) {
4465 DIE(aTHX_ "times not implemented");
4467 #endif /* HAS_TIMES */
4477 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4478 static const char * const dayname[] =
4479 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4480 static const char * const monname[] =
4481 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4482 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4487 when = (Time64_T)now;
4490 double input = Perl_floor(POPn);
4491 when = (Time64_T)input;
4492 if (when != input && ckWARN(WARN_OVERFLOW)) {
4493 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
4494 "%s(%.0f) too large", opname, input);
4498 if (PL_op->op_type == OP_LOCALTIME)
4499 err = S_localtime64_r(&when, &tmbuf);
4501 err = S_gmtime64_r(&when, &tmbuf);
4503 if (err == NULL && ckWARN(WARN_OVERFLOW)) {
4504 /* XXX %lld broken for quads */
4505 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
4506 "%s(%.0f) failed", opname, (double)when);
4509 if (GIMME != G_ARRAY) { /* scalar context */
4511 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4512 double year = (double)tmbuf.tm_year + 1900;
4519 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4520 dayname[tmbuf.tm_wday],
4521 monname[tmbuf.tm_mon],
4529 else { /* list context */
4535 mPUSHi(tmbuf.tm_sec);
4536 mPUSHi(tmbuf.tm_min);
4537 mPUSHi(tmbuf.tm_hour);
4538 mPUSHi(tmbuf.tm_mday);
4539 mPUSHi(tmbuf.tm_mon);
4540 mPUSHn(tmbuf.tm_year);
4541 mPUSHi(tmbuf.tm_wday);
4542 mPUSHi(tmbuf.tm_yday);
4543 mPUSHi(tmbuf.tm_isdst);
4554 anum = alarm((unsigned int)anum);
4561 DIE(aTHX_ PL_no_func, "alarm");
4572 (void)time(&lasttime);
4577 PerlProc_sleep((unsigned int)duration);
4580 XPUSHi(when - lasttime);
4584 /* Shared memory. */
4585 /* Merged with some message passing. */
4589 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4590 dVAR; dSP; dMARK; dTARGET;
4591 const int op_type = PL_op->op_type;
4596 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4599 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4602 value = (I32)(do_semop(MARK, SP) >= 0);
4605 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4621 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4622 dVAR; dSP; dMARK; dTARGET;
4623 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4630 DIE(aTHX_ "System V IPC is not implemented on this machine");
4636 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4637 dVAR; dSP; dMARK; dTARGET;
4638 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4646 PUSHp(zero_but_true, ZBTLEN);
4654 /* I can't const this further without getting warnings about the types of
4655 various arrays passed in from structures. */
4657 S_space_join_names_mortal(pTHX_ char *const *array)
4661 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4663 if (array && *array) {
4664 target = newSVpvs_flags("", SVs_TEMP);
4666 sv_catpv(target, *array);
4669 sv_catpvs(target, " ");
4672 target = sv_mortalcopy(&PL_sv_no);
4677 /* Get system info. */
4681 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4683 I32 which = PL_op->op_type;
4684 register char **elem;
4686 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4687 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4688 struct hostent *gethostbyname(Netdb_name_t);
4689 struct hostent *gethostent(void);
4691 struct hostent *hent;
4695 if (which == OP_GHBYNAME) {
4696 #ifdef HAS_GETHOSTBYNAME
4697 const char* const name = POPpbytex;
4698 hent = PerlSock_gethostbyname(name);
4700 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4703 else if (which == OP_GHBYADDR) {
4704 #ifdef HAS_GETHOSTBYADDR
4705 const int addrtype = POPi;
4706 SV * const addrsv = POPs;
4708 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4710 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4712 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4716 #ifdef HAS_GETHOSTENT
4717 hent = PerlSock_gethostent();
4719 DIE(aTHX_ PL_no_sock_func, "gethostent");
4722 #ifdef HOST_NOT_FOUND
4724 #ifdef USE_REENTRANT_API
4725 # ifdef USE_GETHOSTENT_ERRNO
4726 h_errno = PL_reentrant_buffer->_gethostent_errno;
4729 STATUS_UNIX_SET(h_errno);
4733 if (GIMME != G_ARRAY) {
4734 PUSHs(sv = sv_newmortal());
4736 if (which == OP_GHBYNAME) {
4738 sv_setpvn(sv, hent->h_addr, hent->h_length);
4741 sv_setpv(sv, (char*)hent->h_name);
4747 mPUSHs(newSVpv((char*)hent->h_name, 0));
4748 PUSHs(space_join_names_mortal(hent->h_aliases));
4749 mPUSHi(hent->h_addrtype);
4750 len = hent->h_length;
4753 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4754 mXPUSHp(*elem, len);
4758 mPUSHp(hent->h_addr, len);
4760 PUSHs(sv_mortalcopy(&PL_sv_no));
4765 DIE(aTHX_ PL_no_sock_func, "gethostent");
4771 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4773 I32 which = PL_op->op_type;
4775 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4776 struct netent *getnetbyaddr(Netdb_net_t, int);
4777 struct netent *getnetbyname(Netdb_name_t);
4778 struct netent *getnetent(void);
4780 struct netent *nent;
4782 if (which == OP_GNBYNAME){
4783 #ifdef HAS_GETNETBYNAME
4784 const char * const name = POPpbytex;
4785 nent = PerlSock_getnetbyname(name);
4787 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4790 else if (which == OP_GNBYADDR) {
4791 #ifdef HAS_GETNETBYADDR
4792 const int addrtype = POPi;
4793 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4794 nent = PerlSock_getnetbyaddr(addr, addrtype);
4796 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4800 #ifdef HAS_GETNETENT
4801 nent = PerlSock_getnetent();
4803 DIE(aTHX_ PL_no_sock_func, "getnetent");
4806 #ifdef HOST_NOT_FOUND
4808 #ifdef USE_REENTRANT_API
4809 # ifdef USE_GETNETENT_ERRNO
4810 h_errno = PL_reentrant_buffer->_getnetent_errno;
4813 STATUS_UNIX_SET(h_errno);
4818 if (GIMME != G_ARRAY) {
4819 PUSHs(sv = sv_newmortal());
4821 if (which == OP_GNBYNAME)
4822 sv_setiv(sv, (IV)nent->n_net);
4824 sv_setpv(sv, nent->n_name);
4830 mPUSHs(newSVpv(nent->n_name, 0));
4831 PUSHs(space_join_names_mortal(nent->n_aliases));
4832 mPUSHi(nent->n_addrtype);
4833 mPUSHi(nent->n_net);
4838 DIE(aTHX_ PL_no_sock_func, "getnetent");
4844 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4846 I32 which = PL_op->op_type;
4848 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4849 struct protoent *getprotobyname(Netdb_name_t);
4850 struct protoent *getprotobynumber(int);
4851 struct protoent *getprotoent(void);
4853 struct protoent *pent;
4855 if (which == OP_GPBYNAME) {
4856 #ifdef HAS_GETPROTOBYNAME
4857 const char* const name = POPpbytex;
4858 pent = PerlSock_getprotobyname(name);
4860 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4863 else if (which == OP_GPBYNUMBER) {
4864 #ifdef HAS_GETPROTOBYNUMBER
4865 const int number = POPi;
4866 pent = PerlSock_getprotobynumber(number);
4868 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4872 #ifdef HAS_GETPROTOENT
4873 pent = PerlSock_getprotoent();
4875 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4879 if (GIMME != G_ARRAY) {
4880 PUSHs(sv = sv_newmortal());
4882 if (which == OP_GPBYNAME)
4883 sv_setiv(sv, (IV)pent->p_proto);
4885 sv_setpv(sv, pent->p_name);
4891 mPUSHs(newSVpv(pent->p_name, 0));
4892 PUSHs(space_join_names_mortal(pent->p_aliases));
4893 mPUSHi(pent->p_proto);
4898 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4904 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4906 I32 which = PL_op->op_type;
4908 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4909 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4910 struct servent *getservbyport(int, Netdb_name_t);
4911 struct servent *getservent(void);
4913 struct servent *sent;
4915 if (which == OP_GSBYNAME) {
4916 #ifdef HAS_GETSERVBYNAME
4917 const char * const proto = POPpbytex;
4918 const char * const name = POPpbytex;
4919 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4921 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4924 else if (which == OP_GSBYPORT) {
4925 #ifdef HAS_GETSERVBYPORT
4926 const char * const proto = POPpbytex;
4927 unsigned short port = (unsigned short)POPu;
4929 port = PerlSock_htons(port);
4931 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4933 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4937 #ifdef HAS_GETSERVENT
4938 sent = PerlSock_getservent();
4940 DIE(aTHX_ PL_no_sock_func, "getservent");
4944 if (GIMME != G_ARRAY) {
4945 PUSHs(sv = sv_newmortal());
4947 if (which == OP_GSBYNAME) {
4949 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4951 sv_setiv(sv, (IV)(sent->s_port));
4955 sv_setpv(sv, sent->s_name);
4961 mPUSHs(newSVpv(sent->s_name, 0));
4962 PUSHs(space_join_names_mortal(sent->s_aliases));
4964 mPUSHi(PerlSock_ntohs(sent->s_port));
4966 mPUSHi(sent->s_port);
4968 mPUSHs(newSVpv(sent->s_proto, 0));
4973 DIE(aTHX_ PL_no_sock_func, "getservent");
4979 #ifdef HAS_SETHOSTENT
4981 PerlSock_sethostent(TOPi);
4984 DIE(aTHX_ PL_no_sock_func, "sethostent");
4990 #ifdef HAS_SETNETENT
4992 (void)PerlSock_setnetent(TOPi);
4995 DIE(aTHX_ PL_no_sock_func, "setnetent");
5001 #ifdef HAS_SETPROTOENT
5003 (void)PerlSock_setprotoent(TOPi);
5006 DIE(aTHX_ PL_no_sock_func, "setprotoent");
5012 #ifdef HAS_SETSERVENT
5014 (void)PerlSock_setservent(TOPi);
5017 DIE(aTHX_ PL_no_sock_func, "setservent");
5023 #ifdef HAS_ENDHOSTENT
5025 PerlSock_endhostent();
5029 DIE(aTHX_ PL_no_sock_func, "endhostent");
5035 #ifdef HAS_ENDNETENT
5037 PerlSock_endnetent();
5041 DIE(aTHX_ PL_no_sock_func, "endnetent");
5047 #ifdef HAS_ENDPROTOENT
5049 PerlSock_endprotoent();
5053 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5059 #ifdef HAS_ENDSERVENT
5061 PerlSock_endservent();
5065 DIE(aTHX_ PL_no_sock_func, "endservent");
5073 I32 which = PL_op->op_type;
5075 struct passwd *pwent = NULL;
5077 * We currently support only the SysV getsp* shadow password interface.
5078 * The interface is declared in <shadow.h> and often one needs to link
5079 * with -lsecurity or some such.
5080 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5083 * AIX getpwnam() is clever enough to return the encrypted password
5084 * only if the caller (euid?) is root.
5086 * There are at least three other shadow password APIs. Many platforms
5087 * seem to contain more than one interface for accessing the shadow
5088 * password databases, possibly for compatibility reasons.
5089 * The getsp*() is by far he simplest one, the other two interfaces
5090 * are much more complicated, but also very similar to each other.
5095 * struct pr_passwd *getprpw*();
5096 * The password is in
5097 * char getprpw*(...).ufld.fd_encrypt[]
5098 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5103 * struct es_passwd *getespw*();
5104 * The password is in
5105 * char *(getespw*(...).ufld.fd_encrypt)
5106 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5109 * struct userpw *getuserpw();
5110 * The password is in
5111 * char *(getuserpw(...)).spw_upw_passwd
5112 * (but the de facto standard getpwnam() should work okay)
5114 * Mention I_PROT here so that Configure probes for it.
5116 * In HP-UX for getprpw*() the manual page claims that one should include
5117 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5118 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5119 * and pp_sys.c already includes <shadow.h> if there is such.
5121 * Note that <sys/security.h> is already probed for, but currently
5122 * it is only included in special cases.
5124 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5125 * be preferred interface, even though also the getprpw*() interface
5126 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5127 * One also needs to call set_auth_parameters() in main() before
5128 * doing anything else, whether one is using getespw*() or getprpw*().
5130 * Note that accessing the shadow databases can be magnitudes
5131 * slower than accessing the standard databases.
5136 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5137 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5138 * the pw_comment is left uninitialized. */
5139 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5145 const char* const name = POPpbytex;
5146 pwent = getpwnam(name);
5152 pwent = getpwuid(uid);
5156 # ifdef HAS_GETPWENT
5158 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5159 if (pwent) pwent = getpwnam(pwent->pw_name);
5162 DIE(aTHX_ PL_no_func, "getpwent");
5168 if (GIMME != G_ARRAY) {
5169 PUSHs(sv = sv_newmortal());
5171 if (which == OP_GPWNAM)
5172 # if Uid_t_sign <= 0
5173 sv_setiv(sv, (IV)pwent->pw_uid);
5175 sv_setuv(sv, (UV)pwent->pw_uid);
5178 sv_setpv(sv, pwent->pw_name);
5184 mPUSHs(newSVpv(pwent->pw_name, 0));
5188 /* If we have getspnam(), we try to dig up the shadow
5189 * password. If we are underprivileged, the shadow
5190 * interface will set the errno to EACCES or similar,
5191 * and return a null pointer. If this happens, we will
5192 * use the dummy password (usually "*" or "x") from the
5193 * standard password database.
5195 * In theory we could skip the shadow call completely
5196 * if euid != 0 but in practice we cannot know which
5197 * security measures are guarding the shadow databases
5198 * on a random platform.
5200 * Resist the urge to use additional shadow interfaces.
5201 * Divert the urge to writing an extension instead.
5204 /* Some AIX setups falsely(?) detect some getspnam(), which
5205 * has a different API than the Solaris/IRIX one. */
5206 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5209 const struct spwd * const spwent = getspnam(pwent->pw_name);
5210 /* Save and restore errno so that
5211 * underprivileged attempts seem
5212 * to have never made the unsccessful
5213 * attempt to retrieve the shadow password. */
5215 if (spwent && spwent->sp_pwdp)
5216 sv_setpv(sv, spwent->sp_pwdp);
5220 if (!SvPOK(sv)) /* Use the standard password, then. */
5221 sv_setpv(sv, pwent->pw_passwd);
5224 # ifndef INCOMPLETE_TAINTS
5225 /* passwd is tainted because user himself can diddle with it.
5226 * admittedly not much and in a very limited way, but nevertheless. */
5230 # if Uid_t_sign <= 0
5231 mPUSHi(pwent->pw_uid);
5233 mPUSHu(pwent->pw_uid);
5236 # if Uid_t_sign <= 0
5237 mPUSHi(pwent->pw_gid);
5239 mPUSHu(pwent->pw_gid);
5241 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5242 * because of the poor interface of the Perl getpw*(),
5243 * not because there's some standard/convention saying so.
5244 * A better interface would have been to return a hash,
5245 * but we are accursed by our history, alas. --jhi. */
5247 mPUSHi(pwent->pw_change);
5250 mPUSHi(pwent->pw_quota);
5253 mPUSHs(newSVpv(pwent->pw_age, 0));
5255 /* I think that you can never get this compiled, but just in case. */
5256 PUSHs(sv_mortalcopy(&PL_sv_no));
5261 /* pw_class and pw_comment are mutually exclusive--.
5262 * see the above note for pw_change, pw_quota, and pw_age. */
5264 mPUSHs(newSVpv(pwent->pw_class, 0));
5267 mPUSHs(newSVpv(pwent->pw_comment, 0));
5269 /* I think that you can never get this compiled, but just in case. */
5270 PUSHs(sv_mortalcopy(&PL_sv_no));
5275 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5277 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5279 # ifndef INCOMPLETE_TAINTS
5280 /* pw_gecos is tainted because user himself can diddle with it. */
5284 mPUSHs(newSVpv(pwent->pw_dir, 0));
5286 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5287 # ifndef INCOMPLETE_TAINTS
5288 /* pw_shell is tainted because user himself can diddle with it. */
5293 mPUSHi(pwent->pw_expire);
5298 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5304 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5309 DIE(aTHX_ PL_no_func, "setpwent");
5315 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5320 DIE(aTHX_ PL_no_func, "endpwent");
5328 const I32 which = PL_op->op_type;
5329 const struct group *grent;
5331 if (which == OP_GGRNAM) {
5332 const char* const name = POPpbytex;
5333 grent = (const struct group *)getgrnam(name);
5335 else if (which == OP_GGRGID) {
5336 const Gid_t gid = POPi;
5337 grent = (const struct group *)getgrgid(gid);
5341 grent = (struct group *)getgrent();
5343 DIE(aTHX_ PL_no_func, "getgrent");
5347 if (GIMME != G_ARRAY) {
5348 SV * const sv = sv_newmortal();
5352 if (which == OP_GGRNAM)
5354 sv_setiv(sv, (IV)grent->gr_gid);
5356 sv_setuv(sv, (UV)grent->gr_gid);
5359 sv_setpv(sv, grent->gr_name);
5365 mPUSHs(newSVpv(grent->gr_name, 0));
5368 mPUSHs(newSVpv(grent->gr_passwd, 0));
5370 PUSHs(sv_mortalcopy(&PL_sv_no));
5374 mPUSHi(grent->gr_gid);
5376 mPUSHu(grent->gr_gid);
5379 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5380 /* In UNICOS/mk (_CRAYMPP) the multithreading
5381 * versions (getgrnam_r, getgrgid_r)
5382 * seem to return an illegal pointer
5383 * as the group members list, gr_mem.
5384 * getgrent() doesn't even have a _r version
5385 * but the gr_mem is poisonous anyway.
5386 * So yes, you cannot get the list of group
5387 * members if building multithreaded in UNICOS/mk. */
5388 PUSHs(space_join_names_mortal(grent->gr_mem));
5394 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5400 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5405 DIE(aTHX_ PL_no_func, "setgrent");
5411 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5416 DIE(aTHX_ PL_no_func, "endgrent");
5426 if (!(tmps = PerlProc_getlogin()))
5428 PUSHp(tmps, strlen(tmps));
5431 DIE(aTHX_ PL_no_func, "getlogin");
5435 /* Miscellaneous. */
5440 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5441 register I32 items = SP - MARK;
5442 unsigned long a[20];
5447 while (++MARK <= SP) {
5448 if (SvTAINTED(*MARK)) {
5454 TAINT_PROPER("syscall");
5457 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5458 * or where sizeof(long) != sizeof(char*). But such machines will
5459 * not likely have syscall implemented either, so who cares?
5461 while (++MARK <= SP) {
5462 if (SvNIOK(*MARK) || !i)
5463 a[i++] = SvIV(*MARK);
5464 else if (*MARK == &PL_sv_undef)
5467 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5473 DIE(aTHX_ "Too many args to syscall");
5475 DIE(aTHX_ "Too few args to syscall");
5477 retval = syscall(a[0]);
5480 retval = syscall(a[0],a[1]);
5483 retval = syscall(a[0],a[1],a[2]);
5486 retval = syscall(a[0],a[1],a[2],a[3]);
5489 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5492 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5495 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5498 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5502 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5505 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5508 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5512 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5516 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5520 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5521 a[10],a[11],a[12],a[13]);
5523 #endif /* atarist */
5529 DIE(aTHX_ PL_no_func, "syscall");
5533 #ifdef FCNTL_EMULATE_FLOCK
5535 /* XXX Emulate flock() with fcntl().
5536 What's really needed is a good file locking module.
5540 fcntl_emulate_flock(int fd, int operation)
5544 switch (operation & ~LOCK_NB) {
5546 flock.l_type = F_RDLCK;
5549 flock.l_type = F_WRLCK;
5552 flock.l_type = F_UNLCK;
5558 flock.l_whence = SEEK_SET;
5559 flock.l_start = flock.l_len = (Off_t)0;
5561 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5564 #endif /* FCNTL_EMULATE_FLOCK */
5566 #ifdef LOCKF_EMULATE_FLOCK
5568 /* XXX Emulate flock() with lockf(). This is just to increase
5569 portability of scripts. The calls are not completely
5570 interchangeable. What's really needed is a good file
5574 /* The lockf() constants might have been defined in <unistd.h>.
5575 Unfortunately, <unistd.h> causes troubles on some mixed
5576 (BSD/POSIX) systems, such as SunOS 4.1.3.
5578 Further, the lockf() constants aren't POSIX, so they might not be
5579 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5580 just stick in the SVID values and be done with it. Sigh.
5584 # define F_ULOCK 0 /* Unlock a previously locked region */
5587 # define F_LOCK 1 /* Lock a region for exclusive use */
5590 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5593 # define F_TEST 3 /* Test a region for other processes locks */
5597 lockf_emulate_flock(int fd, int operation)
5603 /* flock locks entire file so for lockf we need to do the same */
5604 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5605 if (pos > 0) /* is seekable and needs to be repositioned */
5606 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5607 pos = -1; /* seek failed, so don't seek back afterwards */
5610 switch (operation) {
5612 /* LOCK_SH - get a shared lock */
5614 /* LOCK_EX - get an exclusive lock */
5616 i = lockf (fd, F_LOCK, 0);
5619 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5620 case LOCK_SH|LOCK_NB:
5621 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5622 case LOCK_EX|LOCK_NB:
5623 i = lockf (fd, F_TLOCK, 0);
5625 if ((errno == EAGAIN) || (errno == EACCES))
5626 errno = EWOULDBLOCK;
5629 /* LOCK_UN - unlock (non-blocking is a no-op) */
5631 case LOCK_UN|LOCK_NB:
5632 i = lockf (fd, F_ULOCK, 0);
5635 /* Default - can't decipher operation */
5642 if (pos > 0) /* need to restore position of the handle */
5643 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5648 #endif /* LOCKF_EMULATE_FLOCK */
5652 * c-indentation-style: bsd
5654 * indent-tabs-mode: t
5657 * ex: set ts=8 sts=4 sw=4 noet: