3 * Copyright (C) 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
18 /* This file contains system pp ("push/pop") functions that
19 * execute the opcodes that make up a perl program. A typical pp function
20 * expects to find its arguments on the stack, and usually pushes its
21 * results onto the stack, hence the 'pp' terminology. Each OP structure
22 * contains a pointer to the relevant pp_foo() function.
24 * By 'system', we mean ops which interact with the OS, such as pp_open().
28 #define PERL_IN_PP_SYS_C
32 /* Shadow password support for solaris - pdo@cs.umd.edu
33 * Not just Solaris: at least HP-UX, IRIX, Linux.
34 * The API is from SysV.
36 * There are at least two more shadow interfaces,
37 * see the comments in pp_gpwent().
41 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
42 * and another MAXINT from "perl.h" <- <sys/param.h>. */
49 # include <sys/wait.h>
53 # include <sys/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* AIX 5.2 and below use mktime for localtime, and defines the edge case
203 * for time 0x7fffffff to be valid only in UTC. AIX 5.3 provides localtime64
204 * available in the 32bit environment, which could warrant Configure
205 * checks in the future.
208 #define LOCALTIME_EDGECASE_BROKEN
211 /* F_OK unused: if stat() cannot find it... */
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
214 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
215 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
218 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
219 # ifdef I_SYS_SECURITY
220 # include <sys/security.h>
224 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
227 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
231 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
233 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
237 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
238 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
239 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
242 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
244 const Uid_t ruid = getuid();
245 const Uid_t euid = geteuid();
246 const Gid_t rgid = getgid();
247 const Gid_t egid = getegid();
251 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
252 Perl_croak(aTHX_ "switching effective uid is not implemented");
255 if (setreuid(euid, ruid))
258 if (setresuid(euid, ruid, (Uid_t)-1))
261 Perl_croak(aTHX_ "entering effective uid failed");
264 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
265 Perl_croak(aTHX_ "switching effective gid is not implemented");
268 if (setregid(egid, rgid))
271 if (setresgid(egid, rgid, (Gid_t)-1))
274 Perl_croak(aTHX_ "entering effective gid failed");
277 res = access(path, mode);
280 if (setreuid(ruid, euid))
283 if (setresuid(ruid, euid, (Uid_t)-1))
286 Perl_croak(aTHX_ "leaving effective uid failed");
289 if (setregid(rgid, egid))
292 if (setresgid(rgid, egid, (Gid_t)-1))
295 Perl_croak(aTHX_ "leaving effective gid failed");
300 # define PERL_EFF_ACCESS(p,f) (emulate_eaccess((p), (f)))
303 #if !defined(PERL_EFF_ACCESS)
304 /* With it or without it: anyway you get a warning: either that
305 it is unused, or it is declared static and never defined.
308 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
310 PERL_UNUSED_ARG(path);
311 PERL_UNUSED_ARG(mode);
312 Perl_croak(aTHX_ "switching effective uid is not implemented");
322 const char * const tmps = POPpconstx;
323 const I32 gimme = GIMME_V;
324 const char *mode = "r";
327 if (PL_op->op_private & OPpOPEN_IN_RAW)
329 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
331 fp = PerlProc_popen(tmps, mode);
333 const char * const type = PL_curcop->cop_io ? SvPV_nolen_const(PL_curcop->cop_io) : NULL;
335 PerlIO_apply_layers(aTHX_ fp,mode,type);
337 if (gimme == G_VOID) {
339 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
342 else if (gimme == G_SCALAR) {
345 PL_rs = &PL_sv_undef;
346 sv_setpvn(TARG, "", 0); /* note that this preserves previous buffer */
347 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
355 SV * const sv = newSV(79);
356 if (sv_gets(sv, fp, 0) == NULL) {
360 XPUSHs(sv_2mortal(sv));
361 if (SvLEN(sv) - SvCUR(sv) > 20) {
362 SvPV_shrink_to_cur(sv);
367 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
368 TAINT; /* "I believe that this is not gratuitous!" */
371 STATUS_NATIVE_CHILD_SET(-1);
372 if (gimme == G_SCALAR)
383 tryAMAGICunTARGET(iter, -1);
385 /* Note that we only ever get here if File::Glob fails to load
386 * without at the same time croaking, for some reason, or if
387 * perl was built with PERL_EXTERNAL_GLOB */
394 * The external globbing program may use things we can't control,
395 * so for security reasons we must assume the worst.
398 taint_proper(PL_no_security, "glob");
402 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
403 PL_last_in_gv = (GV*)*PL_stack_sp--;
405 SAVESPTR(PL_rs); /* This is not permanent, either. */
406 PL_rs = sv_2mortal(newSVpvs("\000"));
409 *SvPVX(PL_rs) = '\n';
413 result = do_readline();
421 PL_last_in_gv = cGVOP_gv;
422 return do_readline();
433 do_join(TARG, &PL_sv_no, MARK, SP);
437 else if (SP == MARK) {
444 tmps = SvPV_const(tmpsv, len);
445 if ((!tmps || !len) && PL_errgv) {
446 SV * const error = ERRSV;
447 SvUPGRADE(error, SVt_PV);
448 if (SvPOK(error) && SvCUR(error))
449 sv_catpvs(error, "\t...caught");
451 tmps = SvPV_const(tmpsv, len);
454 tmpsv = sv_2mortal(newSVpvs("Warning: something's wrong"));
456 Perl_warn(aTHX_ "%"SVf, (void*)tmpsv);
468 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
470 if (SP - MARK != 1) {
472 do_join(TARG, &PL_sv_no, MARK, SP);
474 tmps = SvPV_const(tmpsv, len);
480 tmps = SvROK(tmpsv) ? NULL : SvPV_const(tmpsv, len);
483 SV * const error = ERRSV;
484 SvUPGRADE(error, SVt_PV);
485 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
487 SvSetSV(error,tmpsv);
488 else if (sv_isobject(error)) {
489 HV * const stash = SvSTASH(SvRV(error));
490 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
492 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
493 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
500 call_sv((SV*)GvCV(gv),
501 G_SCALAR|G_EVAL|G_KEEPERR);
502 sv_setsv(error,*PL_stack_sp--);
508 if (SvPOK(error) && SvCUR(error))
509 sv_catpvs(error, "\t...propagated");
512 tmps = SvPV_const(tmpsv, len);
518 tmpsv = sv_2mortal(newSVpvs("Died"));
520 DIE(aTHX_ "%"SVf, (void*)tmpsv);
536 GV * const gv = (GV *)*++MARK;
539 DIE(aTHX_ PL_no_usym, "filehandle");
540 if ((io = GvIOp(gv)))
541 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
544 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
546 /* Method's args are same as ours ... */
547 /* ... except handle is replaced by the object */
548 *MARK-- = SvTIED_obj((SV*)io, mg);
552 call_method("OPEN", G_SCALAR);
566 tmps = SvPV_const(sv, len);
567 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
570 PUSHi( (I32)PL_forkprocess );
571 else if (PL_forkprocess == 0) /* we are a new child */
583 GV * const gv = (MAXARG == 0) ? PL_defoutgv : (GV*)POPs;
585 if (gv && (io = GvIO(gv))
586 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
589 XPUSHs(SvTIED_obj((SV*)io, mg));
592 call_method("CLOSE", G_SCALAR);
598 PUSHs(boolSV(do_close(gv, TRUE)));
611 GV * const wgv = (GV*)POPs;
612 GV * const rgv = (GV*)POPs;
617 if (SvTYPE(rgv) != SVt_PVGV || SvTYPE(wgv) != SVt_PVGV)
618 DIE(aTHX_ PL_no_usym, "filehandle");
623 do_close(rgv, FALSE);
625 do_close(wgv, FALSE);
627 if (PerlProc_pipe(fd) < 0)
630 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
631 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
632 IoOFP(rstio) = IoIFP(rstio);
633 IoIFP(wstio) = IoOFP(wstio);
634 IoTYPE(rstio) = IoTYPE_RDONLY;
635 IoTYPE(wstio) = IoTYPE_WRONLY;
637 if (!IoIFP(rstio) || !IoOFP(wstio)) {
638 if (IoIFP(rstio)) PerlIO_close(IoIFP(rstio));
639 else PerlLIO_close(fd[0]);
640 if (IoOFP(wstio)) PerlIO_close(IoOFP(wstio));
641 else PerlLIO_close(fd[1]);
644 #if defined(HAS_FCNTL) && defined(F_SETFD)
645 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
646 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
653 DIE(aTHX_ PL_no_func, "pipe");
669 if (gv && (io = GvIO(gv))
670 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
673 XPUSHs(SvTIED_obj((SV*)io, mg));
676 call_method("FILENO", G_SCALAR);
682 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
683 /* Can't do this because people seem to do things like
684 defined(fileno($foo)) to check whether $foo is a valid fh.
685 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
686 report_evil_fh(gv, io, PL_op->op_type);
691 PUSHi(PerlIO_fileno(fp));
704 anum = PerlLIO_umask(0);
705 (void)PerlLIO_umask(anum);
708 anum = PerlLIO_umask(POPi);
709 TAINT_PROPER("umask");
712 /* Only DIE if trying to restrict permissions on "user" (self).
713 * Otherwise it's harmless and more useful to just return undef
714 * since 'group' and 'other' concepts probably don't exist here. */
715 if (MAXARG >= 1 && (POPi & 0700))
716 DIE(aTHX_ "umask not implemented");
717 XPUSHs(&PL_sv_undef);
739 if (gv && (io = GvIO(gv))
740 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
743 XPUSHs(SvTIED_obj((SV*)io, mg));
748 call_method("BINMODE", G_SCALAR);
755 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
756 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
757 report_evil_fh(gv, io, PL_op->op_type);
758 SETERRNO(EBADF,RMS_IFI);
763 if (PerlIO_binmode(aTHX_ fp,IoTYPE(io),mode_from_discipline(discp),
764 (discp) ? SvPV_nolen_const(discp) : NULL)) {
765 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
766 if (!PerlIO_binmode(aTHX_ IoOFP(io),IoTYPE(io),
767 mode_from_discipline(discp),
768 (discp) ? SvPV_nolen_const(discp) : NULL)) {
788 const I32 markoff = MARK - PL_stack_base;
789 const char *methname;
790 int how = PERL_MAGIC_tied;
794 switch(SvTYPE(varsv)) {
796 methname = "TIEHASH";
797 HvEITER_set((HV *)varsv, 0);
800 methname = "TIEARRAY";
803 #ifdef GV_UNIQUE_CHECK
804 if (GvUNIQUE((GV*)varsv)) {
805 Perl_croak(aTHX_ "Attempt to tie unique GV");
808 methname = "TIEHANDLE";
809 how = PERL_MAGIC_tiedscalar;
810 /* For tied filehandles, we apply tiedscalar magic to the IO
811 slot of the GP rather than the GV itself. AMS 20010812 */
813 GvIOp(varsv) = newIO();
814 varsv = (SV *)GvIOp(varsv);
817 methname = "TIESCALAR";
818 how = PERL_MAGIC_tiedscalar;
822 if (sv_isobject(*MARK)) {
824 PUSHSTACKi(PERLSI_MAGIC);
826 EXTEND(SP,(I32)items);
830 call_method(methname, G_SCALAR);
833 /* Not clear why we don't call call_method here too.
834 * perhaps to get different error message ?
836 stash = gv_stashsv(*MARK, FALSE);
837 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
838 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
839 methname, (void*)*MARK);
842 PUSHSTACKi(PERLSI_MAGIC);
844 EXTEND(SP,(I32)items);
848 call_sv((SV*)GvCV(gv), G_SCALAR);
854 if (sv_isobject(sv)) {
855 sv_unmagic(varsv, how);
856 /* Croak if a self-tie on an aggregate is attempted. */
857 if (varsv == SvRV(sv) &&
858 (SvTYPE(varsv) == SVt_PVAV ||
859 SvTYPE(varsv) == SVt_PVHV))
861 "Self-ties of arrays and hashes are not supported");
862 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
865 SP = PL_stack_base + markoff;
875 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
876 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
878 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
881 if ((mg = SvTIED_mg(sv, how))) {
882 SV * const obj = SvRV(SvTIED_obj(sv, mg));
884 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
886 if (gv && isGV(gv) && (cv = GvCV(gv))) {
888 XPUSHs(SvTIED_obj((SV*)gv, mg));
889 XPUSHs(sv_2mortal(newSViv(SvREFCNT(obj)-1)));
892 call_sv((SV *)cv, G_VOID);
896 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
897 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
898 "untie attempted while %"UVuf" inner references still exist",
899 (UV)SvREFCNT(obj) - 1 ) ;
903 sv_unmagic(sv, how) ;
913 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
914 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
916 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
919 if ((mg = SvTIED_mg(sv, how))) {
920 SV *osv = SvTIED_obj(sv, mg);
921 if (osv == mg->mg_obj)
922 osv = sv_mortalcopy(osv);
936 HV * const hv = (HV*)POPs;
937 SV * const sv = sv_2mortal(newSVpvs("AnyDBM_File"));
938 stash = gv_stashsv(sv, FALSE);
939 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
941 require_pv("AnyDBM_File.pm");
943 if (!(gv = gv_fetchmethod(stash, "TIEHASH")))
944 DIE(aTHX_ "No dbm on this machine");
954 PUSHs(sv_2mortal(newSVuv(O_RDWR|O_CREAT)));
956 PUSHs(sv_2mortal(newSVuv(O_RDWR)));
959 call_sv((SV*)GvCV(gv), G_SCALAR);
962 if (!sv_isobject(TOPs)) {
967 PUSHs(sv_2mortal(newSVuv(O_RDONLY)));
970 call_sv((SV*)GvCV(gv), G_SCALAR);
974 if (sv_isobject(TOPs)) {
975 sv_unmagic((SV *) hv, PERL_MAGIC_tied);
976 sv_magic((SV*)hv, TOPs, PERL_MAGIC_tied, NULL, 0);
993 struct timeval timebuf;
994 struct timeval *tbuf = &timebuf;
997 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1002 # if BYTEORDER & 0xf0000
1003 # define ORDERBYTE (0x88888888 - BYTEORDER)
1005 # define ORDERBYTE (0x4444 - BYTEORDER)
1011 for (i = 1; i <= 3; i++) {
1012 SV * const sv = SP[i];
1015 if (SvREADONLY(sv)) {
1017 sv_force_normal_flags(sv, 0);
1018 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1019 DIE(aTHX_ PL_no_modify);
1022 if (ckWARN(WARN_MISC))
1023 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1024 SvPV_force_nolen(sv); /* force string conversion */
1031 /* little endians can use vecs directly */
1032 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1039 masksize = NFDBITS / NBBY;
1041 masksize = sizeof(long); /* documented int, everyone seems to use long */
1043 Zero(&fd_sets[0], 4, char*);
1046 # if SELECT_MIN_BITS == 1
1047 growsize = sizeof(fd_set);
1049 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1050 # undef SELECT_MIN_BITS
1051 # define SELECT_MIN_BITS __FD_SETSIZE
1053 /* If SELECT_MIN_BITS is greater than one we most probably will want
1054 * to align the sizes with SELECT_MIN_BITS/8 because for example
1055 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1056 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1057 * on (sets/tests/clears bits) is 32 bits. */
1058 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1066 timebuf.tv_sec = (long)value;
1067 value -= (NV)timebuf.tv_sec;
1068 timebuf.tv_usec = (long)(value * 1000000.0);
1073 for (i = 1; i <= 3; i++) {
1075 if (!SvOK(sv) || SvCUR(sv) == 0) {
1082 Sv_Grow(sv, growsize);
1086 while (++j <= growsize) {
1090 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1092 Newx(fd_sets[i], growsize, char);
1093 for (offset = 0; offset < growsize; offset += masksize) {
1094 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1095 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1098 fd_sets[i] = SvPVX(sv);
1102 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1103 /* Can't make just the (void*) conditional because that would be
1104 * cpp #if within cpp macro, and not all compilers like that. */
1105 nfound = PerlSock_select(
1107 (Select_fd_set_t) fd_sets[1],
1108 (Select_fd_set_t) fd_sets[2],
1109 (Select_fd_set_t) fd_sets[3],
1110 (void*) tbuf); /* Workaround for compiler bug. */
1112 nfound = PerlSock_select(
1114 (Select_fd_set_t) fd_sets[1],
1115 (Select_fd_set_t) fd_sets[2],
1116 (Select_fd_set_t) fd_sets[3],
1119 for (i = 1; i <= 3; i++) {
1122 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1124 for (offset = 0; offset < growsize; offset += masksize) {
1125 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1126 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1128 Safefree(fd_sets[i]);
1135 if (GIMME == G_ARRAY && tbuf) {
1136 value = (NV)(timebuf.tv_sec) +
1137 (NV)(timebuf.tv_usec) / 1000000.0;
1138 PUSHs(sv_2mortal(newSVnv(value)));
1142 DIE(aTHX_ "select not implemented");
1147 Perl_setdefout(pTHX_ GV *gv)
1150 SvREFCNT_inc_simple_void(gv);
1152 SvREFCNT_dec(PL_defoutgv);
1160 GV * const newdefout = (PL_op->op_private > 0) ? ((GV *) POPs) : (GV *) NULL;
1161 GV * egv = GvEGV(PL_defoutgv);
1167 XPUSHs(&PL_sv_undef);
1169 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1170 if (gvp && *gvp == egv) {
1171 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1175 XPUSHs(sv_2mortal(newRV((SV*)egv)));
1180 if (!GvIO(newdefout))
1181 gv_IOadd(newdefout);
1182 setdefout(newdefout);
1193 GV * const gv = (MAXARG==0) ? PL_stdingv : (GV*)POPs;
1195 if (gv && (io = GvIO(gv))
1196 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1198 const I32 gimme = GIMME_V;
1200 XPUSHs(SvTIED_obj((SV*)io, mg));
1203 call_method("GETC", gimme);
1206 if (gimme == G_SCALAR)
1207 SvSetMagicSV_nosteal(TARG, TOPs);
1210 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1211 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1212 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1213 report_evil_fh(gv, io, PL_op->op_type);
1214 SETERRNO(EBADF,RMS_IFI);
1218 sv_setpvn(TARG, " ", 1);
1219 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1220 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1221 /* Find out how many bytes the char needs */
1222 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1225 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1226 SvCUR_set(TARG,1+len);
1235 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1238 register PERL_CONTEXT *cx;
1239 const I32 gimme = GIMME_V;
1244 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1246 cx->blk_sub.retop = retop;
1248 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1250 setdefout(gv); /* locally select filehandle so $% et al work */
1281 DIE(aTHX_ "Not a format reference");
1285 SV * const tmpsv = sv_newmortal();
1287 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1288 name = SvPV_nolen_const(tmpsv);
1290 DIE(aTHX_ "Undefined format \"%s\" called", name);
1291 DIE(aTHX_ "Not a format reference");
1294 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1296 IoFLAGS(io) &= ~IOf_DIDTOP;
1297 return doform(cv,gv,PL_op->op_next);
1303 GV * const gv = cxstack[cxstack_ix].blk_sub.gv;
1304 register IO * const io = GvIOp(gv);
1309 register PERL_CONTEXT *cx;
1311 if (!io || !(ofp = IoOFP(io)))
1314 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1315 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1317 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1318 PL_formtarget != PL_toptarget)
1322 if (!IoTOP_GV(io)) {
1325 if (!IoTOP_NAME(io)) {
1327 if (!IoFMT_NAME(io))
1328 IoFMT_NAME(io) = savepv(GvNAME(gv));
1329 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1330 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1331 if ((topgv && GvFORM(topgv)) ||
1332 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1333 IoTOP_NAME(io) = savesvpv(topname);
1335 IoTOP_NAME(io) = savepvs("top");
1337 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1338 if (!topgv || !GvFORM(topgv)) {
1339 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1342 IoTOP_GV(io) = topgv;
1344 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1345 I32 lines = IoLINES_LEFT(io);
1346 const char *s = SvPVX_const(PL_formtarget);
1347 if (lines <= 0) /* Yow, header didn't even fit!!! */
1349 while (lines-- > 0) {
1350 s = strchr(s, '\n');
1356 const STRLEN save = SvCUR(PL_formtarget);
1357 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1358 do_print(PL_formtarget, ofp);
1359 SvCUR_set(PL_formtarget, save);
1360 sv_chop(PL_formtarget, s);
1361 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1364 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1365 do_print(PL_formfeed, ofp);
1366 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1368 PL_formtarget = PL_toptarget;
1369 IoFLAGS(io) |= IOf_DIDTOP;
1372 DIE(aTHX_ "bad top format reference");
1375 SV * const sv = sv_newmortal();
1377 gv_efullname4(sv, fgv, NULL, FALSE);
1378 name = SvPV_nolen_const(sv);
1380 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1382 DIE(aTHX_ "Undefined top format called");
1384 if (cv && CvCLONE(cv))
1385 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1386 return doform(cv, gv, PL_op);
1390 POPBLOCK(cx,PL_curpm);
1396 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1398 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1399 else if (ckWARN(WARN_CLOSED))
1400 report_evil_fh(gv, io, PL_op->op_type);
1405 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1406 if (ckWARN(WARN_IO))
1407 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1409 if (!do_print(PL_formtarget, fp))
1412 FmLINES(PL_formtarget) = 0;
1413 SvCUR_set(PL_formtarget, 0);
1414 *SvEND(PL_formtarget) = '\0';
1415 if (IoFLAGS(io) & IOf_FLUSH)
1416 (void)PerlIO_flush(fp);
1421 PL_formtarget = PL_bodytarget;
1423 PERL_UNUSED_VAR(newsp);
1424 PERL_UNUSED_VAR(gimme);
1425 return cx->blk_sub.retop;
1430 dVAR; dSP; dMARK; dORIGMARK;
1436 GV * const gv = (PL_op->op_flags & OPf_STACKED) ? (GV*)*++MARK : PL_defoutgv;
1438 if (gv && (io = GvIO(gv))
1439 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1441 if (MARK == ORIGMARK) {
1444 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1448 *MARK = SvTIED_obj((SV*)io, mg);
1451 call_method("PRINTF", G_SCALAR);
1454 MARK = ORIGMARK + 1;
1461 if (!(io = GvIO(gv))) {
1462 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1463 report_evil_fh(gv, io, PL_op->op_type);
1464 SETERRNO(EBADF,RMS_IFI);
1467 else if (!(fp = IoOFP(io))) {
1468 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1470 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1471 else if (ckWARN(WARN_CLOSED))
1472 report_evil_fh(gv, io, PL_op->op_type);
1474 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1478 do_sprintf(sv, SP - MARK, MARK + 1);
1479 if (!do_print(sv, fp))
1482 if (IoFLAGS(io) & IOf_FLUSH)
1483 if (PerlIO_flush(fp) == EOF)
1494 PUSHs(&PL_sv_undef);
1502 const int perm = (MAXARG > 3) ? POPi : 0666;
1503 const int mode = POPi;
1504 SV * const sv = POPs;
1505 GV * const gv = (GV *)POPs;
1508 /* Need TIEHANDLE method ? */
1509 const char * const tmps = SvPV_const(sv, len);
1510 /* FIXME? do_open should do const */
1511 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1512 IoLINES(GvIOp(gv)) = 0;
1516 PUSHs(&PL_sv_undef);
1523 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1529 Sock_size_t bufsize;
1537 bool charstart = FALSE;
1538 STRLEN charskip = 0;
1541 GV * const gv = (GV*)*++MARK;
1542 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1543 && gv && (io = GvIO(gv)) )
1545 const MAGIC * mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1549 *MARK = SvTIED_obj((SV*)io, mg);
1551 call_method("READ", G_SCALAR);
1565 sv_setpvn(bufsv, "", 0);
1566 length = SvIVx(*++MARK);
1569 offset = SvIVx(*++MARK);
1573 if (!io || !IoIFP(io)) {
1574 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1575 report_evil_fh(gv, io, PL_op->op_type);
1576 SETERRNO(EBADF,RMS_IFI);
1579 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1580 buffer = SvPVutf8_force(bufsv, blen);
1581 /* UTF-8 may not have been set if they are all low bytes */
1586 buffer = SvPV_force(bufsv, blen);
1587 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1590 DIE(aTHX_ "Negative length");
1598 if (PL_op->op_type == OP_RECV) {
1599 char namebuf[MAXPATHLEN];
1600 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1601 bufsize = sizeof (struct sockaddr_in);
1603 bufsize = sizeof namebuf;
1605 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1609 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1610 /* 'offset' means 'flags' here */
1611 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1612 (struct sockaddr *)namebuf, &bufsize);
1616 /* Bogus return without padding */
1617 bufsize = sizeof (struct sockaddr_in);
1619 SvCUR_set(bufsv, count);
1620 *SvEND(bufsv) = '\0';
1621 (void)SvPOK_only(bufsv);
1625 /* This should not be marked tainted if the fp is marked clean */
1626 if (!(IoFLAGS(io) & IOf_UNTAINT))
1627 SvTAINTED_on(bufsv);
1629 sv_setpvn(TARG, namebuf, bufsize);
1634 if (PL_op->op_type == OP_RECV)
1635 DIE(aTHX_ PL_no_sock_func, "recv");
1637 if (DO_UTF8(bufsv)) {
1638 /* offset adjust in characters not bytes */
1639 blen = sv_len_utf8(bufsv);
1642 if (-offset > (int)blen)
1643 DIE(aTHX_ "Offset outside string");
1646 if (DO_UTF8(bufsv)) {
1647 /* convert offset-as-chars to offset-as-bytes */
1648 if (offset >= (int)blen)
1649 offset += SvCUR(bufsv) - blen;
1651 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1654 bufsize = SvCUR(bufsv);
1655 /* Allocating length + offset + 1 isn't perfect in the case of reading
1656 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1658 (should be 2 * length + offset + 1, or possibly something longer if
1659 PL_encoding is true) */
1660 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1661 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1662 Zero(buffer+bufsize, offset-bufsize, char);
1664 buffer = buffer + offset;
1666 read_target = bufsv;
1668 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1669 concatenate it to the current buffer. */
1671 /* Truncate the existing buffer to the start of where we will be
1673 SvCUR_set(bufsv, offset);
1675 read_target = sv_newmortal();
1676 SvUPGRADE(read_target, SVt_PV);
1677 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1680 if (PL_op->op_type == OP_SYSREAD) {
1681 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1682 if (IoTYPE(io) == IoTYPE_SOCKET) {
1683 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1689 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1694 #ifdef HAS_SOCKET__bad_code_maybe
1695 if (IoTYPE(io) == IoTYPE_SOCKET) {
1696 char namebuf[MAXPATHLEN];
1697 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1698 bufsize = sizeof (struct sockaddr_in);
1700 bufsize = sizeof namebuf;
1702 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1703 (struct sockaddr *)namebuf, &bufsize);
1708 count = PerlIO_read(IoIFP(io), buffer, length);
1709 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1710 if (count == 0 && PerlIO_error(IoIFP(io)))
1714 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1715 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1718 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1719 *SvEND(read_target) = '\0';
1720 (void)SvPOK_only(read_target);
1721 if (fp_utf8 && !IN_BYTES) {
1722 /* Look at utf8 we got back and count the characters */
1723 const char *bend = buffer + count;
1724 while (buffer < bend) {
1726 skip = UTF8SKIP(buffer);
1729 if (buffer - charskip + skip > bend) {
1730 /* partial character - try for rest of it */
1731 length = skip - (bend-buffer);
1732 offset = bend - SvPVX_const(bufsv);
1744 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1745 provided amount read (count) was what was requested (length)
1747 if (got < wanted && count == length) {
1748 length = wanted - got;
1749 offset = bend - SvPVX_const(bufsv);
1752 /* return value is character count */
1756 else if (buffer_utf8) {
1757 /* Let svcatsv upgrade the bytes we read in to utf8.
1758 The buffer is a mortal so will be freed soon. */
1759 sv_catsv_nomg(bufsv, read_target);
1762 /* This should not be marked tainted if the fp is marked clean */
1763 if (!(IoFLAGS(io) & IOf_UNTAINT))
1764 SvTAINTED_on(bufsv);
1776 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1782 STRLEN orig_blen_bytes;
1784 const int op_type = PL_op->op_type;
1788 GV *const gv = (GV*)*++MARK;
1789 if (PL_op->op_type == OP_SYSWRITE
1790 && gv && (io = GvIO(gv))
1791 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
1795 if (MARK == SP - 1) {
1797 sv = sv_2mortal(newSViv(sv_len(*SP)));
1803 *(ORIGMARK+1) = SvTIED_obj((SV*)io, mg);
1805 call_method("WRITE", G_SCALAR);
1820 if (!io || !IoIFP(io)) {
1822 if (ckWARN(WARN_CLOSED))
1823 report_evil_fh(gv, io, PL_op->op_type);
1824 SETERRNO(EBADF,RMS_IFI);
1828 /* Do this first to trigger any overloading. */
1829 buffer = SvPV_const(bufsv, blen);
1830 orig_blen_bytes = blen;
1831 doing_utf8 = DO_UTF8(bufsv);
1833 if (PerlIO_isutf8(IoIFP(io))) {
1834 if (!SvUTF8(bufsv)) {
1835 /* We don't modify the original scalar. */
1836 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1837 buffer = (char *) tmpbuf;
1841 else if (doing_utf8) {
1842 STRLEN tmplen = blen;
1843 U8 *result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1846 buffer = (char *) tmpbuf;
1850 assert((char *)result == buffer);
1851 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1855 if (op_type == OP_SYSWRITE) {
1856 Size_t length = 0; /* This length is in characters. */
1862 /* The SV is bytes, and we've had to upgrade it. */
1863 blen_chars = orig_blen_bytes;
1865 /* The SV really is UTF-8. */
1866 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1867 /* Don't call sv_len_utf8 again because it will call magic
1868 or overloading a second time, and we might get back a
1869 different result. */
1870 blen_chars = utf8_length(buffer, buffer + blen);
1872 /* It's safe, and it may well be cached. */
1873 blen_chars = sv_len_utf8(bufsv);
1881 length = blen_chars;
1883 #if Size_t_size > IVSIZE
1884 length = (Size_t)SvNVx(*++MARK);
1886 length = (Size_t)SvIVx(*++MARK);
1888 if ((SSize_t)length < 0)
1889 DIE(aTHX_ "Negative length");
1893 offset = SvIVx(*++MARK);
1895 if (-offset > (IV)blen_chars)
1896 DIE(aTHX_ "Offset outside string");
1897 offset += blen_chars;
1898 } else if (offset >= (IV)blen_chars && blen_chars > 0)
1899 DIE(aTHX_ "Offset outside string");
1902 if (length > blen_chars - offset)
1903 length = blen_chars - offset;
1905 /* Here we convert length from characters to bytes. */
1906 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1907 /* Either we had to convert the SV, or the SV is magical, or
1908 the SV has overloading, in which case we can't or mustn't
1909 or mustn't call it again. */
1911 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1912 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1914 /* It's a real UTF-8 SV, and it's not going to change under
1915 us. Take advantage of any cache. */
1917 I32 len_I32 = length;
1919 /* Convert the start and end character positions to bytes.
1920 Remember that the second argument to sv_pos_u2b is relative
1922 sv_pos_u2b(bufsv, &start, &len_I32);
1929 buffer = buffer+offset;
1931 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1932 if (IoTYPE(io) == IoTYPE_SOCKET) {
1933 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1939 /* See the note at doio.c:do_print about filesize limits. --jhi */
1940 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1946 const int flags = SvIVx(*++MARK);
1949 char * const sockbuf = SvPVx(*++MARK, mlen);
1950 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1951 flags, (struct sockaddr *)sockbuf, mlen);
1955 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1960 DIE(aTHX_ PL_no_sock_func, "send");
1969 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1970 #if Size_t_size > IVSIZE
1988 if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */
1990 gv = PL_last_in_gv = GvEGV(PL_argvgv);
1992 if (io && !IoIFP(io)) {
1993 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
1995 IoFLAGS(io) &= ~IOf_START;
1996 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
1997 sv_setpvn(GvSV(gv), "-", 1);
1998 SvSETMAGIC(GvSV(gv));
2000 else if (!nextargv(gv))
2005 gv = PL_last_in_gv; /* eof */
2008 gv = PL_last_in_gv = (GV*)POPs; /* eof(FH) */
2011 IO * const io = GvIO(gv);
2013 if (io && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
2015 XPUSHs(SvTIED_obj((SV*)io, mg));
2018 call_method("EOF", G_SCALAR);
2025 PUSHs(boolSV(!gv || do_eof(gv)));
2037 PL_last_in_gv = (GV*)POPs;
2040 if (gv && (io = GvIO(gv))
2041 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
2044 XPUSHs(SvTIED_obj((SV*)io, mg));
2047 call_method("TELL", G_SCALAR);
2053 #if LSEEKSIZE > IVSIZE
2054 PUSHn( do_tell(gv) );
2056 PUSHi( do_tell(gv) );
2065 const int whence = POPi;
2066 #if LSEEKSIZE > IVSIZE
2067 const Off_t offset = (Off_t)SvNVx(POPs);
2069 const Off_t offset = (Off_t)SvIVx(POPs);
2073 GV * const gv = PL_last_in_gv = (GV*)POPs;
2075 if (gv && (io = GvIO(gv))
2076 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
2079 XPUSHs(SvTIED_obj((SV*)io, mg));
2080 #if LSEEKSIZE > IVSIZE
2081 XPUSHs(sv_2mortal(newSVnv((NV) offset)));
2083 XPUSHs(sv_2mortal(newSViv(offset)));
2085 XPUSHs(sv_2mortal(newSViv(whence)));
2088 call_method("SEEK", G_SCALAR);
2094 if (PL_op->op_type == OP_SEEK)
2095 PUSHs(boolSV(do_seek(gv, offset, whence)));
2097 const Off_t sought = do_sysseek(gv, offset, whence);
2099 PUSHs(&PL_sv_undef);
2101 SV* const sv = sought ?
2102 #if LSEEKSIZE > IVSIZE
2107 : newSVpvn(zero_but_true, ZBTLEN);
2108 PUSHs(sv_2mortal(sv));
2118 /* There seems to be no consensus on the length type of truncate()
2119 * and ftruncate(), both off_t and size_t have supporters. In
2120 * general one would think that when using large files, off_t is
2121 * at least as wide as size_t, so using an off_t should be okay. */
2122 /* XXX Configure probe for the length type of *truncate() needed XXX */
2125 #if Off_t_size > IVSIZE
2130 /* Checking for length < 0 is problematic as the type might or
2131 * might not be signed: if it is not, clever compilers will moan. */
2132 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2139 if (PL_op->op_flags & OPf_SPECIAL) {
2140 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2149 TAINT_PROPER("truncate");
2150 if (!(fp = IoIFP(io))) {
2156 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2158 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2165 SV * const sv = POPs;
2168 if (SvTYPE(sv) == SVt_PVGV) {
2169 tmpgv = (GV*)sv; /* *main::FRED for example */
2170 goto do_ftruncate_gv;
2172 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2173 tmpgv = (GV*) SvRV(sv); /* \*main::FRED for example */
2174 goto do_ftruncate_gv;
2176 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2177 io = (IO*) SvRV(sv); /* *main::FRED{IO} for example */
2178 goto do_ftruncate_io;
2181 name = SvPV_nolen_const(sv);
2182 TAINT_PROPER("truncate");
2184 if (truncate(name, len) < 0)
2188 const int tmpfd = PerlLIO_open(name, O_RDWR);
2193 if (my_chsize(tmpfd, len) < 0)
2195 PerlLIO_close(tmpfd);
2204 SETERRNO(EBADF,RMS_IFI);
2212 SV * const argsv = POPs;
2213 const unsigned int func = POPu;
2214 const int optype = PL_op->op_type;
2215 GV * const gv = (GV*)POPs;
2216 IO * const io = gv ? GvIOn(gv) : NULL;
2220 if (!io || !argsv || !IoIFP(io)) {
2221 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2222 report_evil_fh(gv, io, PL_op->op_type);
2223 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2227 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2230 s = SvPV_force(argsv, len);
2231 need = IOCPARM_LEN(func);
2233 s = Sv_Grow(argsv, need + 1);
2234 SvCUR_set(argsv, need);
2237 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2240 retval = SvIV(argsv);
2241 s = INT2PTR(char*,retval); /* ouch */
2244 TAINT_PROPER(PL_op_desc[optype]);
2246 if (optype == OP_IOCTL)
2248 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2250 DIE(aTHX_ "ioctl is not implemented");
2254 DIE(aTHX_ "fcntl is not implemented");
2256 #if defined(OS2) && defined(__EMX__)
2257 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2259 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2263 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2265 if (s[SvCUR(argsv)] != 17)
2266 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2268 s[SvCUR(argsv)] = 0; /* put our null back */
2269 SvSETMAGIC(argsv); /* Assume it has changed */
2278 PUSHp(zero_but_true, ZBTLEN);
2291 const int argtype = POPi;
2292 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : (GV*)POPs;
2294 if (gv && (io = GvIO(gv)))
2300 /* XXX Looks to me like io is always NULL at this point */
2302 (void)PerlIO_flush(fp);
2303 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2306 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2307 report_evil_fh(gv, io, PL_op->op_type);
2309 SETERRNO(EBADF,RMS_IFI);
2314 DIE(aTHX_ PL_no_func, "flock()");
2324 const int protocol = POPi;
2325 const int type = POPi;
2326 const int domain = POPi;
2327 GV * const gv = (GV*)POPs;
2328 register IO * const io = gv ? GvIOn(gv) : NULL;
2332 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2333 report_evil_fh(gv, io, PL_op->op_type);
2334 if (io && IoIFP(io))
2335 do_close(gv, FALSE);
2336 SETERRNO(EBADF,LIB_INVARG);
2341 do_close(gv, FALSE);
2343 TAINT_PROPER("socket");
2344 fd = PerlSock_socket(domain, type, protocol);
2347 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2348 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2349 IoTYPE(io) = IoTYPE_SOCKET;
2350 if (!IoIFP(io) || !IoOFP(io)) {
2351 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2352 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2353 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2356 #if defined(HAS_FCNTL) && defined(F_SETFD)
2357 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2361 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2366 DIE(aTHX_ PL_no_sock_func, "socket");
2372 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2374 const int protocol = POPi;
2375 const int type = POPi;
2376 const int domain = POPi;
2377 GV * const gv2 = (GV*)POPs;
2378 GV * const gv1 = (GV*)POPs;
2379 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2380 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2383 if (!gv1 || !gv2 || !io1 || !io2) {
2384 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2386 report_evil_fh(gv1, io1, PL_op->op_type);
2388 report_evil_fh(gv1, io2, PL_op->op_type);
2390 if (io1 && IoIFP(io1))
2391 do_close(gv1, FALSE);
2392 if (io2 && IoIFP(io2))
2393 do_close(gv2, FALSE);
2398 do_close(gv1, FALSE);
2400 do_close(gv2, FALSE);
2402 TAINT_PROPER("socketpair");
2403 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2405 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2406 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2407 IoTYPE(io1) = IoTYPE_SOCKET;
2408 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2409 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2410 IoTYPE(io2) = IoTYPE_SOCKET;
2411 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2412 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2413 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2414 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2415 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2416 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2417 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2420 #if defined(HAS_FCNTL) && defined(F_SETFD)
2421 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2422 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2427 DIE(aTHX_ PL_no_sock_func, "socketpair");
2435 SV * const addrsv = POPs;
2436 /* OK, so on what platform does bind modify addr? */
2438 GV * const gv = (GV*)POPs;
2439 register IO * const io = GvIOn(gv);
2443 if (!io || !IoIFP(io))
2446 addr = SvPV_const(addrsv, len);
2447 TAINT_PROPER("bind");
2448 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)),
2449 (struct sockaddr *)addr, len) >= 0)
2459 if (ckWARN(WARN_CLOSED))
2460 report_evil_fh(gv, io, PL_op->op_type);
2461 SETERRNO(EBADF,SS_IVCHAN);
2464 DIE(aTHX_ PL_no_sock_func, "bind");
2472 SV * const addrsv = POPs;
2473 GV * const gv = (GV*)POPs;
2474 register IO * const io = GvIOn(gv);
2478 if (!io || !IoIFP(io))
2481 addr = SvPV_const(addrsv, len);
2482 TAINT_PROPER("connect");
2483 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2489 if (ckWARN(WARN_CLOSED))
2490 report_evil_fh(gv, io, PL_op->op_type);
2491 SETERRNO(EBADF,SS_IVCHAN);
2494 DIE(aTHX_ PL_no_sock_func, "connect");
2502 const int backlog = POPi;
2503 GV * const gv = (GV*)POPs;
2504 register IO * const io = gv ? GvIOn(gv) : NULL;
2506 if (!gv || !io || !IoIFP(io))
2509 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2515 if (ckWARN(WARN_CLOSED))
2516 report_evil_fh(gv, io, PL_op->op_type);
2517 SETERRNO(EBADF,SS_IVCHAN);
2520 DIE(aTHX_ PL_no_sock_func, "listen");
2530 char namebuf[MAXPATHLEN];
2531 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2532 Sock_size_t len = sizeof (struct sockaddr_in);
2534 Sock_size_t len = sizeof namebuf;
2536 GV * const ggv = (GV*)POPs;
2537 GV * const ngv = (GV*)POPs;
2546 if (!gstio || !IoIFP(gstio))
2550 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2554 do_close(ngv, FALSE);
2555 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2556 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2557 IoTYPE(nstio) = IoTYPE_SOCKET;
2558 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2559 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2560 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2561 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2564 #if defined(HAS_FCNTL) && defined(F_SETFD)
2565 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2569 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2570 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2572 #ifdef __SCO_VERSION__
2573 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2576 PUSHp(namebuf, len);
2580 if (ckWARN(WARN_CLOSED))
2581 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2582 SETERRNO(EBADF,SS_IVCHAN);
2588 DIE(aTHX_ PL_no_sock_func, "accept");
2596 const int how = POPi;
2597 GV * const gv = (GV*)POPs;
2598 register IO * const io = GvIOn(gv);
2600 if (!io || !IoIFP(io))
2603 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2607 if (ckWARN(WARN_CLOSED))
2608 report_evil_fh(gv, io, PL_op->op_type);
2609 SETERRNO(EBADF,SS_IVCHAN);
2612 DIE(aTHX_ PL_no_sock_func, "shutdown");
2620 const int optype = PL_op->op_type;
2621 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2622 const unsigned int optname = (unsigned int) POPi;
2623 const unsigned int lvl = (unsigned int) POPi;
2624 GV * const gv = (GV*)POPs;
2625 register IO * const io = GvIOn(gv);
2629 if (!io || !IoIFP(io))
2632 fd = PerlIO_fileno(IoIFP(io));
2636 (void)SvPOK_only(sv);
2640 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2647 #if defined(__SYMBIAN32__)
2648 # define SETSOCKOPT_OPTION_VALUE_T void *
2650 # define SETSOCKOPT_OPTION_VALUE_T const char *
2652 /* XXX TODO: We need to have a proper type (a Configure probe,
2653 * etc.) for what the C headers think of the third argument of
2654 * setsockopt(), the option_value read-only buffer: is it
2655 * a "char *", or a "void *", const or not. Some compilers
2656 * don't take kindly to e.g. assuming that "char *" implicitly
2657 * promotes to a "void *", or to explicitly promoting/demoting
2658 * consts to non/vice versa. The "const void *" is the SUS
2659 * definition, but that does not fly everywhere for the above
2661 SETSOCKOPT_OPTION_VALUE_T buf;
2665 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2669 aint = (int)SvIV(sv);
2670 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2673 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2682 if (ckWARN(WARN_CLOSED))
2683 report_evil_fh(gv, io, optype);
2684 SETERRNO(EBADF,SS_IVCHAN);
2689 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2697 const int optype = PL_op->op_type;
2698 GV * const gv = (GV*)POPs;
2699 register IO * const io = GvIOn(gv);
2704 if (!io || !IoIFP(io))
2707 sv = sv_2mortal(newSV(257));
2708 (void)SvPOK_only(sv);
2712 fd = PerlIO_fileno(IoIFP(io));
2714 case OP_GETSOCKNAME:
2715 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2718 case OP_GETPEERNAME:
2719 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2721 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2723 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";
2724 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2725 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2726 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2727 sizeof(u_short) + sizeof(struct in_addr))) {
2734 #ifdef BOGUS_GETNAME_RETURN
2735 /* Interactive Unix, getpeername() and getsockname()
2736 does not return valid namelen */
2737 if (len == BOGUS_GETNAME_RETURN)
2738 len = sizeof(struct sockaddr);
2746 if (ckWARN(WARN_CLOSED))
2747 report_evil_fh(gv, io, optype);
2748 SETERRNO(EBADF,SS_IVCHAN);
2753 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2767 if (PL_op->op_flags & OPf_REF) {
2769 if (PL_op->op_type == OP_LSTAT) {
2770 if (gv != PL_defgv) {
2771 do_fstat_warning_check:
2772 if (ckWARN(WARN_IO))
2773 Perl_warner(aTHX_ packWARN(WARN_IO),
2774 "lstat() on filehandle %s", GvENAME(gv));
2775 } else if (PL_laststype != OP_LSTAT)
2776 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2780 if (gv != PL_defgv) {
2781 PL_laststype = OP_STAT;
2783 sv_setpvn(PL_statname, "", 0);
2784 PL_laststatval = (GvIO(gv) && IoIFP(GvIOp(gv))
2785 ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(gv))), &PL_statcache) : -1);
2787 if (PL_laststatval < 0) {
2788 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2789 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2794 SV* const sv = POPs;
2795 if (SvTYPE(sv) == SVt_PVGV) {
2799 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2801 if (PL_op->op_type == OP_LSTAT)
2802 goto do_fstat_warning_check;
2805 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2807 PL_laststype = PL_op->op_type;
2808 if (PL_op->op_type == OP_LSTAT)
2809 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2811 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2812 if (PL_laststatval < 0) {
2813 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2814 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2820 if (gimme != G_ARRAY) {
2821 if (gimme != G_VOID)
2822 XPUSHs(boolSV(max));
2828 PUSHs(sv_2mortal(newSViv(PL_statcache.st_dev)));
2829 PUSHs(sv_2mortal(newSViv(PL_statcache.st_ino)));
2830 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_mode)));
2831 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_nlink)));
2832 #if Uid_t_size > IVSIZE
2833 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_uid)));
2835 # if Uid_t_sign <= 0
2836 PUSHs(sv_2mortal(newSViv(PL_statcache.st_uid)));
2838 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_uid)));
2841 #if Gid_t_size > IVSIZE
2842 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_gid)));
2844 # if Gid_t_sign <= 0
2845 PUSHs(sv_2mortal(newSViv(PL_statcache.st_gid)));
2847 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_gid)));
2850 #ifdef USE_STAT_RDEV
2851 PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev)));
2853 PUSHs(sv_2mortal(newSVpvs("")));
2855 #if Off_t_size > IVSIZE
2856 PUSHs(sv_2mortal(newSVnv((NV)PL_statcache.st_size)));
2858 PUSHs(sv_2mortal(newSViv(PL_statcache.st_size)));
2861 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_atime)));
2862 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_mtime)));
2863 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_ctime)));
2865 PUSHs(sv_2mortal(newSViv(PL_statcache.st_atime)));
2866 PUSHs(sv_2mortal(newSViv(PL_statcache.st_mtime)));
2867 PUSHs(sv_2mortal(newSViv(PL_statcache.st_ctime)));
2869 #ifdef USE_STAT_BLOCKS
2870 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blksize)));
2871 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blocks)));
2873 PUSHs(sv_2mortal(newSVpvs("")));
2874 PUSHs(sv_2mortal(newSVpvs("")));
2880 /* This macro is used by the stacked filetest operators :
2881 * if the previous filetest failed, short-circuit and pass its value.
2882 * Else, discard it from the stack and continue. --rgs
2884 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2885 if (TOPs == &PL_sv_no || TOPs == &PL_sv_undef) { RETURN; } \
2886 else { (void)POPs; PUTBACK; } \
2893 /* Not const, because things tweak this below. Not bool, because there's
2894 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2895 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2896 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2897 /* Giving some sort of initial value silences compilers. */
2899 int access_mode = R_OK;
2901 int access_mode = 0;
2904 /* access_mode is never used, but leaving use_access in makes the
2905 conditional compiling below much clearer. */
2908 int stat_mode = S_IRUSR;
2910 bool effective = FALSE;
2913 STACKED_FTEST_CHECK;
2915 switch (PL_op->op_type) {
2917 #if !(defined(HAS_ACCESS) && defined(R_OK))
2923 #if defined(HAS_ACCESS) && defined(W_OK)
2928 stat_mode = S_IWUSR;
2932 #if defined(HAS_ACCESS) && defined(X_OK)
2937 stat_mode = S_IXUSR;
2941 #ifdef PERL_EFF_ACCESS
2944 stat_mode = S_IWUSR;
2948 #ifndef PERL_EFF_ACCESS
2956 #ifdef PERL_EFF_ACCESS
2961 stat_mode = S_IXUSR;
2967 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2968 const char *const name = POPpx;
2970 # ifdef PERL_EFF_ACCESS
2971 result = PERL_EFF_ACCESS(name, access_mode);
2973 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
2979 result = access(name, access_mode);
2981 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
2996 if (cando(stat_mode, effective, &PL_statcache))
3005 const int op_type = PL_op->op_type;
3007 STACKED_FTEST_CHECK;
3012 if (op_type == OP_FTIS)
3015 /* You can't dTARGET inside OP_FTIS, because you'll get
3016 "panic: pad_sv po" - the op is not flagged to have a target. */
3020 #if Off_t_size > IVSIZE
3021 PUSHn(PL_statcache.st_size);
3023 PUSHi(PL_statcache.st_size);
3027 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3030 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3033 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3046 /* I believe that all these three are likely to be defined on most every
3047 system these days. */
3049 if(PL_op->op_type == OP_FTSUID)
3053 if(PL_op->op_type == OP_FTSGID)
3057 if(PL_op->op_type == OP_FTSVTX)
3061 STACKED_FTEST_CHECK;
3066 switch (PL_op->op_type) {
3068 if (PL_statcache.st_uid == PL_uid)
3072 if (PL_statcache.st_uid == PL_euid)
3076 if (PL_statcache.st_size == 0)
3080 if (S_ISSOCK(PL_statcache.st_mode))
3084 if (S_ISCHR(PL_statcache.st_mode))
3088 if (S_ISBLK(PL_statcache.st_mode))
3092 if (S_ISREG(PL_statcache.st_mode))
3096 if (S_ISDIR(PL_statcache.st_mode))
3100 if (S_ISFIFO(PL_statcache.st_mode))
3105 if (PL_statcache.st_mode & S_ISUID)
3111 if (PL_statcache.st_mode & S_ISGID)
3117 if (PL_statcache.st_mode & S_ISVTX)
3128 I32 result = my_lstat();
3132 if (S_ISLNK(PL_statcache.st_mode))
3145 STACKED_FTEST_CHECK;
3147 if (PL_op->op_flags & OPf_REF)
3149 else if (isGV(TOPs))
3151 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3152 gv = (GV*)SvRV(POPs);
3154 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3156 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3157 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3158 else if (tmpsv && SvOK(tmpsv)) {
3159 const char *tmps = SvPV_nolen_const(tmpsv);
3167 if (PerlLIO_isatty(fd))
3172 #if defined(atarist) /* this will work with atariST. Configure will
3173 make guesses for other systems. */
3174 # define FILE_base(f) ((f)->_base)
3175 # define FILE_ptr(f) ((f)->_ptr)
3176 # define FILE_cnt(f) ((f)->_cnt)
3177 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3188 register STDCHAR *s;
3194 STACKED_FTEST_CHECK;
3196 if (PL_op->op_flags & OPf_REF)
3198 else if (isGV(TOPs))
3200 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3201 gv = (GV*)SvRV(POPs);
3207 if (gv == PL_defgv) {
3209 io = GvIO(PL_statgv);
3212 goto really_filename;
3217 PL_laststatval = -1;
3218 sv_setpvn(PL_statname, "", 0);
3219 io = GvIO(PL_statgv);
3221 if (io && IoIFP(io)) {
3222 if (! PerlIO_has_base(IoIFP(io)))
3223 DIE(aTHX_ "-T and -B not implemented on filehandles");
3224 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3225 if (PL_laststatval < 0)
3227 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3228 if (PL_op->op_type == OP_FTTEXT)
3233 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3234 i = PerlIO_getc(IoIFP(io));
3236 (void)PerlIO_ungetc(IoIFP(io),i);
3238 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3240 len = PerlIO_get_bufsiz(IoIFP(io));
3241 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3242 /* sfio can have large buffers - limit to 512 */
3247 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3249 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3251 SETERRNO(EBADF,RMS_IFI);
3259 PL_laststype = OP_STAT;
3260 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3261 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3262 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3264 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3267 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3268 if (PL_laststatval < 0) {
3269 (void)PerlIO_close(fp);
3272 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3273 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3274 (void)PerlIO_close(fp);
3276 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3277 RETPUSHNO; /* special case NFS directories */
3278 RETPUSHYES; /* null file is anything */
3283 /* now scan s to look for textiness */
3284 /* XXX ASCII dependent code */
3286 #if defined(DOSISH) || defined(USEMYBINMODE)
3287 /* ignore trailing ^Z on short files */
3288 if (len && len < sizeof(tbuf) && tbuf[len-1] == 26)
3292 for (i = 0; i < len; i++, s++) {
3293 if (!*s) { /* null never allowed in text */
3298 else if (!(isPRINT(*s) || isSPACE(*s)))
3301 else if (*s & 128) {
3303 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3306 /* utf8 characters don't count as odd */
3307 if (UTF8_IS_START(*s)) {
3308 int ulen = UTF8SKIP(s);
3309 if (ulen < len - i) {
3311 for (j = 1; j < ulen; j++) {
3312 if (!UTF8_IS_CONTINUATION(s[j]))
3315 --ulen; /* loop does extra increment */
3325 *s != '\n' && *s != '\r' && *s != '\b' &&
3326 *s != '\t' && *s != '\f' && *s != 27)
3331 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3342 const char *tmps = NULL;
3346 SV * const sv = POPs;
3347 if (PL_op->op_flags & OPf_SPECIAL) {
3348 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3350 else if (SvTYPE(sv) == SVt_PVGV) {
3353 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
3357 tmps = SvPVx_nolen_const(sv);
3361 if( !gv && (!tmps || !*tmps) ) {
3362 HV * const table = GvHVn(PL_envgv);
3365 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3366 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3368 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3373 deprecate("chdir('') or chdir(undef) as chdir()");
3374 tmps = SvPV_nolen_const(*svp);
3378 TAINT_PROPER("chdir");
3383 TAINT_PROPER("chdir");
3386 IO* const io = GvIO(gv);
3389 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3391 else if (IoDIRP(io)) {
3393 PUSHi(fchdir(dirfd(IoDIRP(io))) >= 0);
3395 DIE(aTHX_ PL_no_func, "dirfd");
3399 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3400 report_evil_fh(gv, io, PL_op->op_type);
3401 SETERRNO(EBADF, RMS_IFI);
3406 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3407 report_evil_fh(gv, io, PL_op->op_type);
3408 SETERRNO(EBADF,RMS_IFI);
3412 DIE(aTHX_ PL_no_func, "fchdir");
3416 PUSHi( PerlDir_chdir(tmps) >= 0 );
3418 /* Clear the DEFAULT element of ENV so we'll get the new value
3420 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3427 dVAR; dSP; dMARK; dTARGET;
3428 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3439 char * const tmps = POPpx;
3440 TAINT_PROPER("chroot");
3441 PUSHi( chroot(tmps) >= 0 );
3444 DIE(aTHX_ PL_no_func, "chroot");
3452 const char * const tmps2 = POPpconstx;
3453 const char * const tmps = SvPV_nolen_const(TOPs);
3454 TAINT_PROPER("rename");
3456 anum = PerlLIO_rename(tmps, tmps2);
3458 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3459 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3462 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3463 (void)UNLINK(tmps2);
3464 if (!(anum = link(tmps, tmps2)))
3465 anum = UNLINK(tmps);
3473 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3477 const int op_type = PL_op->op_type;
3481 if (op_type == OP_LINK)
3482 DIE(aTHX_ PL_no_func, "link");
3484 # ifndef HAS_SYMLINK
3485 if (op_type == OP_SYMLINK)
3486 DIE(aTHX_ PL_no_func, "symlink");
3490 const char * const tmps2 = POPpconstx;
3491 const char * const tmps = SvPV_nolen_const(TOPs);
3492 TAINT_PROPER(PL_op_desc[op_type]);
3494 # if defined(HAS_LINK)
3495 # if defined(HAS_SYMLINK)
3496 /* Both present - need to choose which. */
3497 (op_type == OP_LINK) ?
3498 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3500 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3501 PerlLIO_link(tmps, tmps2);
3504 # if defined(HAS_SYMLINK)
3505 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3506 symlink(tmps, tmps2);
3511 SETi( result >= 0 );
3518 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3529 char buf[MAXPATHLEN];
3532 #ifndef INCOMPLETE_TAINTS
3536 len = readlink(tmps, buf, sizeof(buf) - 1);
3544 RETSETUNDEF; /* just pretend it's a normal file */
3548 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3550 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3552 char * const save_filename = filename;
3558 Newx(cmdline, strlen(cmd) + (strlen(filename) * 2) + 10, char);
3559 strcpy(cmdline, cmd);
3560 strcat(cmdline, " ");
3561 for (s = cmdline + strlen(cmdline); *filename; ) {
3566 myfp = PerlProc_popen(cmdline, "r");
3570 SV * const tmpsv = sv_newmortal();
3571 /* Need to save/restore 'PL_rs' ?? */
3572 s = sv_gets(tmpsv, myfp, 0);
3573 (void)PerlProc_pclose(myfp);
3577 #ifdef HAS_SYS_ERRLIST
3582 /* you don't see this */
3583 const char * const errmsg =
3584 #ifdef HAS_SYS_ERRLIST
3592 if (instr(s, errmsg)) {
3599 #define EACCES EPERM
3601 if (instr(s, "cannot make"))
3602 SETERRNO(EEXIST,RMS_FEX);
3603 else if (instr(s, "existing file"))
3604 SETERRNO(EEXIST,RMS_FEX);
3605 else if (instr(s, "ile exists"))
3606 SETERRNO(EEXIST,RMS_FEX);
3607 else if (instr(s, "non-exist"))
3608 SETERRNO(ENOENT,RMS_FNF);
3609 else if (instr(s, "does not exist"))
3610 SETERRNO(ENOENT,RMS_FNF);
3611 else if (instr(s, "not empty"))
3612 SETERRNO(EBUSY,SS_DEVOFFLINE);
3613 else if (instr(s, "cannot access"))
3614 SETERRNO(EACCES,RMS_PRV);
3616 SETERRNO(EPERM,RMS_PRV);
3619 else { /* some mkdirs return no failure indication */
3620 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3621 if (PL_op->op_type == OP_RMDIR)
3626 SETERRNO(EACCES,RMS_PRV); /* a guess */
3635 /* This macro removes trailing slashes from a directory name.
3636 * Different operating and file systems take differently to
3637 * trailing slashes. According to POSIX 1003.1 1996 Edition
3638 * any number of trailing slashes should be allowed.
3639 * Thusly we snip them away so that even non-conforming
3640 * systems are happy.
3641 * We should probably do this "filtering" for all
3642 * the functions that expect (potentially) directory names:
3643 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3644 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3646 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3647 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3650 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3651 (tmps) = savepvn((tmps), (len)); \
3661 const int mode = (MAXARG > 1) ? POPi : 0777;
3663 TRIMSLASHES(tmps,len,copy);
3665 TAINT_PROPER("mkdir");
3667 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3671 SETi( dooneliner("mkdir", tmps) );
3672 oldumask = PerlLIO_umask(0);
3673 PerlLIO_umask(oldumask);
3674 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3689 TRIMSLASHES(tmps,len,copy);
3690 TAINT_PROPER("rmdir");
3692 SETi( PerlDir_rmdir(tmps) >= 0 );
3694 SETi( dooneliner("rmdir", tmps) );
3701 /* Directory calls. */
3705 #if defined(Direntry_t) && defined(HAS_READDIR)
3707 const char * const dirname = POPpconstx;
3708 GV * const gv = (GV*)POPs;
3709 register IO * const io = GvIOn(gv);
3715 PerlDir_close(IoDIRP(io));
3716 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3722 SETERRNO(EBADF,RMS_DIR);
3725 DIE(aTHX_ PL_no_dir_func, "opendir");
3731 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3732 DIE(aTHX_ PL_no_dir_func, "readdir");
3734 #if !defined(I_DIRENT) && !defined(VMS)
3735 Direntry_t *readdir (DIR *);
3741 const I32 gimme = GIMME;
3742 GV * const gv = (GV *)POPs;
3743 register const Direntry_t *dp;
3744 register IO * const io = GvIOn(gv);
3746 if (!io || !IoDIRP(io)) {
3747 if(ckWARN(WARN_IO)) {
3748 Perl_warner(aTHX_ packWARN(WARN_IO),
3749 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3755 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3759 sv = newSVpvn(dp->d_name, dp->d_namlen);
3761 sv = newSVpv(dp->d_name, 0);
3763 #ifndef INCOMPLETE_TAINTS
3764 if (!(IoFLAGS(io) & IOf_UNTAINT))
3767 XPUSHs(sv_2mortal(sv));
3769 while (gimme == G_ARRAY);
3771 if (!dp && gimme != G_ARRAY)
3778 SETERRNO(EBADF,RMS_ISI);
3779 if (GIMME == G_ARRAY)
3788 #if defined(HAS_TELLDIR) || defined(telldir)
3790 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3791 /* XXX netbsd still seemed to.
3792 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3793 --JHI 1999-Feb-02 */
3794 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3795 long telldir (DIR *);
3797 GV * const gv = (GV*)POPs;
3798 register IO * const io = GvIOn(gv);
3800 if (!io || !IoDIRP(io)) {
3801 if(ckWARN(WARN_IO)) {
3802 Perl_warner(aTHX_ packWARN(WARN_IO),
3803 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3808 PUSHi( PerlDir_tell(IoDIRP(io)) );
3812 SETERRNO(EBADF,RMS_ISI);
3815 DIE(aTHX_ PL_no_dir_func, "telldir");
3821 #if defined(HAS_SEEKDIR) || defined(seekdir)
3823 const long along = POPl;
3824 GV * const gv = (GV*)POPs;
3825 register IO * const io = GvIOn(gv);
3827 if (!io || !IoDIRP(io)) {
3828 if(ckWARN(WARN_IO)) {
3829 Perl_warner(aTHX_ packWARN(WARN_IO),
3830 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3834 (void)PerlDir_seek(IoDIRP(io), along);
3839 SETERRNO(EBADF,RMS_ISI);
3842 DIE(aTHX_ PL_no_dir_func, "seekdir");
3848 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3850 GV * const gv = (GV*)POPs;
3851 register IO * const io = GvIOn(gv);
3853 if (!io || !IoDIRP(io)) {
3854 if(ckWARN(WARN_IO)) {
3855 Perl_warner(aTHX_ packWARN(WARN_IO),
3856 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3860 (void)PerlDir_rewind(IoDIRP(io));
3864 SETERRNO(EBADF,RMS_ISI);
3867 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3873 #if defined(Direntry_t) && defined(HAS_READDIR)
3875 GV * const gv = (GV*)POPs;
3876 register IO * const io = GvIOn(gv);
3878 if (!io || !IoDIRP(io)) {
3879 if(ckWARN(WARN_IO)) {
3880 Perl_warner(aTHX_ packWARN(WARN_IO),
3881 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3885 #ifdef VOID_CLOSEDIR
3886 PerlDir_close(IoDIRP(io));
3888 if (PerlDir_close(IoDIRP(io)) < 0) {
3889 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3898 SETERRNO(EBADF,RMS_IFI);
3901 DIE(aTHX_ PL_no_dir_func, "closedir");
3905 /* Process control. */
3914 PERL_FLUSHALL_FOR_CHILD;
3915 childpid = PerlProc_fork();
3919 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
3921 SvREADONLY_off(GvSV(tmpgv));
3922 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3923 SvREADONLY_on(GvSV(tmpgv));
3925 #ifdef THREADS_HAVE_PIDS
3926 PL_ppid = (IV)getppid();
3928 #ifdef PERL_USES_PL_PIDSTATUS
3929 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
3935 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3940 PERL_FLUSHALL_FOR_CHILD;
3941 childpid = PerlProc_fork();
3947 DIE(aTHX_ PL_no_func, "fork");
3954 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
3959 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3960 childpid = wait4pid(-1, &argflags, 0);
3962 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
3967 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3968 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
3969 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
3971 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
3976 DIE(aTHX_ PL_no_func, "wait");
3982 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
3984 const int optype = POPi;
3985 const Pid_t pid = TOPi;
3989 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3990 result = wait4pid(pid, &argflags, optype);
3992 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
3997 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3998 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
3999 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4001 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4006 DIE(aTHX_ PL_no_func, "waitpid");
4012 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4018 while (++MARK <= SP) {
4019 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4024 TAINT_PROPER("system");
4026 PERL_FLUSHALL_FOR_CHILD;
4027 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4033 if (PerlProc_pipe(pp) >= 0)
4035 while ((childpid = PerlProc_fork()) == -1) {
4036 if (errno != EAGAIN) {
4041 PerlLIO_close(pp[0]);
4042 PerlLIO_close(pp[1]);
4049 Sigsave_t ihand,qhand; /* place to save signals during system() */
4053 PerlLIO_close(pp[1]);
4055 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4056 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4059 result = wait4pid(childpid, &status, 0);
4060 } while (result == -1 && errno == EINTR);
4062 (void)rsignal_restore(SIGINT, &ihand);
4063 (void)rsignal_restore(SIGQUIT, &qhand);
4065 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4066 do_execfree(); /* free any memory child malloced on fork */
4073 while (n < sizeof(int)) {
4074 n1 = PerlLIO_read(pp[0],
4075 (void*)(((char*)&errkid)+n),
4081 PerlLIO_close(pp[0]);
4082 if (n) { /* Error */
4083 if (n != sizeof(int))
4084 DIE(aTHX_ "panic: kid popen errno read");
4085 errno = errkid; /* Propagate errno from kid */
4086 STATUS_NATIVE_CHILD_SET(-1);
4089 XPUSHi(STATUS_CURRENT);
4093 PerlLIO_close(pp[0]);
4094 #if defined(HAS_FCNTL) && defined(F_SETFD)
4095 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4098 if (PL_op->op_flags & OPf_STACKED) {
4099 SV * const really = *++MARK;
4100 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4102 else if (SP - MARK != 1)
4103 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4105 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4109 #else /* ! FORK or VMS or OS/2 */
4112 if (PL_op->op_flags & OPf_STACKED) {
4113 SV * const really = *++MARK;
4114 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__)
4115 value = (I32)do_aspawn(really, MARK, SP);
4117 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4120 else if (SP - MARK != 1) {
4121 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__)
4122 value = (I32)do_aspawn(NULL, MARK, SP);
4124 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4128 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4130 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4132 STATUS_NATIVE_CHILD_SET(value);
4135 XPUSHi(result ? value : STATUS_CURRENT);
4136 #endif /* !FORK or VMS */
4142 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4147 while (++MARK <= SP) {
4148 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4153 TAINT_PROPER("exec");
4155 PERL_FLUSHALL_FOR_CHILD;
4156 if (PL_op->op_flags & OPf_STACKED) {
4157 SV * const really = *++MARK;
4158 value = (I32)do_aexec(really, MARK, SP);
4160 else if (SP - MARK != 1)
4162 value = (I32)vms_do_aexec(NULL, MARK, SP);
4166 (void ) do_aspawn(NULL, MARK, SP);
4170 value = (I32)do_aexec(NULL, MARK, SP);
4175 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4178 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4181 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4195 # ifdef THREADS_HAVE_PIDS
4196 if (PL_ppid != 1 && getppid() == 1)
4197 /* maybe the parent process has died. Refresh ppid cache */
4201 XPUSHi( getppid() );
4205 DIE(aTHX_ PL_no_func, "getppid");
4214 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4217 pgrp = (I32)BSD_GETPGRP(pid);
4219 if (pid != 0 && pid != PerlProc_getpid())
4220 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4226 DIE(aTHX_ PL_no_func, "getpgrp()");
4245 TAINT_PROPER("setpgrp");
4247 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4249 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4250 || (pid != 0 && pid != PerlProc_getpid()))
4252 DIE(aTHX_ "setpgrp can't take arguments");
4254 SETi( setpgrp() >= 0 );
4255 #endif /* USE_BSDPGRP */
4258 DIE(aTHX_ PL_no_func, "setpgrp()");
4264 #ifdef HAS_GETPRIORITY
4266 const int who = POPi;
4267 const int which = TOPi;
4268 SETi( getpriority(which, who) );
4271 DIE(aTHX_ PL_no_func, "getpriority()");
4277 #ifdef HAS_SETPRIORITY
4279 const int niceval = POPi;
4280 const int who = POPi;
4281 const int which = TOPi;
4282 TAINT_PROPER("setpriority");
4283 SETi( setpriority(which, who, niceval) >= 0 );
4286 DIE(aTHX_ PL_no_func, "setpriority()");
4296 XPUSHn( time(NULL) );
4298 XPUSHi( time(NULL) );
4310 (void)PerlProc_times(&PL_timesbuf);
4312 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4313 /* struct tms, though same data */
4317 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick)));
4318 if (GIMME == G_ARRAY) {
4319 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick)));
4320 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick)));
4321 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick)));
4327 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4329 if (GIMME == G_ARRAY) {
4330 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4331 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4332 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4336 DIE(aTHX_ "times not implemented");
4338 #endif /* HAS_TIMES */
4341 #ifdef LOCALTIME_EDGECASE_BROKEN
4342 static struct tm *S_my_localtime (pTHX_ Time_t *tp)
4347 /* No workarounds in the valid range */
4348 if (!tp || *tp < 0x7fff573f || *tp >= 0x80000000)
4349 return (localtime (tp));
4351 /* This edge case is to workaround the undefined behaviour, where the
4352 * TIMEZONE makes the time go beyond the defined range.
4353 * gmtime (0x7fffffff) => 2038-01-19 03:14:07
4354 * If there is a negative offset in TZ, like MET-1METDST, some broken
4355 * implementations of localtime () (like AIX 5.2) barf with bogus
4357 * 0x7fffffff gmtime 2038-01-19 03:14:07
4358 * 0x7fffffff localtime 1901-12-13 21:45:51
4359 * 0x7fffffff mylocaltime 2038-01-19 04:14:07
4360 * 0x3c19137f gmtime 2001-12-13 20:45:51
4361 * 0x3c19137f localtime 2001-12-13 21:45:51
4362 * 0x3c19137f mylocaltime 2001-12-13 21:45:51
4363 * Given that legal timezones are typically between GMT-12 and GMT+12
4364 * we turn back the clock 23 hours before calling the localtime
4365 * function, and add those to the return value. This will never cause
4366 * day wrapping problems, since the edge case is Tue Jan *19*
4368 T = *tp - 82800; /* 23 hour. allows up to GMT-23 */
4371 if (P->tm_hour >= 24) {
4373 P->tm_mday++; /* 18 -> 19 */
4374 P->tm_wday++; /* Mon -> Tue */
4375 P->tm_yday++; /* 18 -> 19 */
4378 } /* S_my_localtime */
4386 const struct tm *tmbuf;
4387 static const char * const dayname[] =
4388 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4389 static const char * const monname[] =
4390 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4391 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4397 when = (Time_t)SvNVx(POPs);
4399 when = (Time_t)SvIVx(POPs);
4402 if (PL_op->op_type == OP_LOCALTIME)
4403 #ifdef LOCALTIME_EDGECASE_BROKEN
4404 tmbuf = S_my_localtime(aTHX_ &when);
4406 tmbuf = localtime(&when);
4409 tmbuf = gmtime(&when);
4411 if (GIMME != G_ARRAY) {
4417 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
4418 dayname[tmbuf->tm_wday],
4419 monname[tmbuf->tm_mon],
4424 tmbuf->tm_year + 1900);
4425 PUSHs(sv_2mortal(tsv));
4430 PUSHs(sv_2mortal(newSViv(tmbuf->tm_sec)));
4431 PUSHs(sv_2mortal(newSViv(tmbuf->tm_min)));
4432 PUSHs(sv_2mortal(newSViv(tmbuf->tm_hour)));
4433 PUSHs(sv_2mortal(newSViv(tmbuf->tm_mday)));
4434 PUSHs(sv_2mortal(newSViv(tmbuf->tm_mon)));
4435 PUSHs(sv_2mortal(newSViv(tmbuf->tm_year)));
4436 PUSHs(sv_2mortal(newSViv(tmbuf->tm_wday)));
4437 PUSHs(sv_2mortal(newSViv(tmbuf->tm_yday)));
4438 PUSHs(sv_2mortal(newSViv(tmbuf->tm_isdst)));
4449 anum = alarm((unsigned int)anum);
4456 DIE(aTHX_ PL_no_func, "alarm");
4467 (void)time(&lasttime);
4472 PerlProc_sleep((unsigned int)duration);
4475 XPUSHi(when - lasttime);
4479 /* Shared memory. */
4480 /* Merged with some message passing. */
4484 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4485 dVAR; dSP; dMARK; dTARGET;
4486 const int op_type = PL_op->op_type;
4491 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4494 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4497 value = (I32)(do_semop(MARK, SP) >= 0);
4500 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4516 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4517 dVAR; dSP; dMARK; dTARGET;
4518 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4525 DIE(aTHX_ "System V IPC is not implemented on this machine");
4531 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4532 dVAR; dSP; dMARK; dTARGET;
4533 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4541 PUSHp(zero_but_true, ZBTLEN);
4549 /* I can't const this further without getting warnings about the types of
4550 various arrays passed in from structures. */
4552 S_space_join_names_mortal(pTHX_ char *const *array)
4556 if (array && *array) {
4557 target = sv_2mortal(newSVpvs(""));
4559 sv_catpv(target, *array);
4562 sv_catpvs(target, " ");
4565 target = sv_mortalcopy(&PL_sv_no);
4570 /* Get system info. */
4574 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4576 I32 which = PL_op->op_type;
4577 register char **elem;
4579 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4580 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4581 struct hostent *gethostbyname(Netdb_name_t);
4582 struct hostent *gethostent(void);
4584 struct hostent *hent;
4588 if (which == OP_GHBYNAME) {
4589 #ifdef HAS_GETHOSTBYNAME
4590 const char* const name = POPpbytex;
4591 hent = PerlSock_gethostbyname(name);
4593 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4596 else if (which == OP_GHBYADDR) {
4597 #ifdef HAS_GETHOSTBYADDR
4598 const int addrtype = POPi;
4599 SV * const addrsv = POPs;
4601 Netdb_host_t addr = (Netdb_host_t) SvPVbyte(addrsv, addrlen);
4603 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4605 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4609 #ifdef HAS_GETHOSTENT
4610 hent = PerlSock_gethostent();
4612 DIE(aTHX_ PL_no_sock_func, "gethostent");
4615 #ifdef HOST_NOT_FOUND
4617 #ifdef USE_REENTRANT_API
4618 # ifdef USE_GETHOSTENT_ERRNO
4619 h_errno = PL_reentrant_buffer->_gethostent_errno;
4622 STATUS_UNIX_SET(h_errno);
4626 if (GIMME != G_ARRAY) {
4627 PUSHs(sv = sv_newmortal());
4629 if (which == OP_GHBYNAME) {
4631 sv_setpvn(sv, hent->h_addr, hent->h_length);
4634 sv_setpv(sv, (char*)hent->h_name);
4640 PUSHs(sv_2mortal(newSVpv((char*)hent->h_name, 0)));
4641 PUSHs(S_space_join_names_mortal(aTHX_ hent->h_aliases));
4642 PUSHs(sv_2mortal(newSViv((IV)hent->h_addrtype)));
4643 len = hent->h_length;
4644 PUSHs(sv_2mortal(newSViv((IV)len)));
4646 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4647 XPUSHs(sv_2mortal(newSVpvn(*elem, len)));
4651 PUSHs(newSVpvn(hent->h_addr, len));
4653 PUSHs(sv_mortalcopy(&PL_sv_no));
4658 DIE(aTHX_ PL_no_sock_func, "gethostent");
4664 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4666 I32 which = PL_op->op_type;
4668 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4669 struct netent *getnetbyaddr(Netdb_net_t, int);
4670 struct netent *getnetbyname(Netdb_name_t);
4671 struct netent *getnetent(void);
4673 struct netent *nent;
4675 if (which == OP_GNBYNAME){
4676 #ifdef HAS_GETNETBYNAME
4677 const char * const name = POPpbytex;
4678 nent = PerlSock_getnetbyname(name);
4680 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4683 else if (which == OP_GNBYADDR) {
4684 #ifdef HAS_GETNETBYADDR
4685 const int addrtype = POPi;
4686 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4687 nent = PerlSock_getnetbyaddr(addr, addrtype);
4689 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4693 #ifdef HAS_GETNETENT
4694 nent = PerlSock_getnetent();
4696 DIE(aTHX_ PL_no_sock_func, "getnetent");
4699 #ifdef HOST_NOT_FOUND
4701 #ifdef USE_REENTRANT_API
4702 # ifdef USE_GETNETENT_ERRNO
4703 h_errno = PL_reentrant_buffer->_getnetent_errno;
4706 STATUS_UNIX_SET(h_errno);
4711 if (GIMME != G_ARRAY) {
4712 PUSHs(sv = sv_newmortal());
4714 if (which == OP_GNBYNAME)
4715 sv_setiv(sv, (IV)nent->n_net);
4717 sv_setpv(sv, nent->n_name);
4723 PUSHs(sv_2mortal(newSVpv(nent->n_name, 0)));
4724 PUSHs(S_space_join_names_mortal(aTHX_ nent->n_aliases));
4725 PUSHs(sv_2mortal(newSViv((IV)nent->n_addrtype)));
4726 PUSHs(sv_2mortal(newSViv((IV)nent->n_net)));
4731 DIE(aTHX_ PL_no_sock_func, "getnetent");
4737 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4739 I32 which = PL_op->op_type;
4741 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4742 struct protoent *getprotobyname(Netdb_name_t);
4743 struct protoent *getprotobynumber(int);
4744 struct protoent *getprotoent(void);
4746 struct protoent *pent;
4748 if (which == OP_GPBYNAME) {
4749 #ifdef HAS_GETPROTOBYNAME
4750 const char* const name = POPpbytex;
4751 pent = PerlSock_getprotobyname(name);
4753 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4756 else if (which == OP_GPBYNUMBER) {
4757 #ifdef HAS_GETPROTOBYNUMBER
4758 const int number = POPi;
4759 pent = PerlSock_getprotobynumber(number);
4761 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4765 #ifdef HAS_GETPROTOENT
4766 pent = PerlSock_getprotoent();
4768 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4772 if (GIMME != G_ARRAY) {
4773 PUSHs(sv = sv_newmortal());
4775 if (which == OP_GPBYNAME)
4776 sv_setiv(sv, (IV)pent->p_proto);
4778 sv_setpv(sv, pent->p_name);
4784 PUSHs(sv_2mortal(newSVpv(pent->p_name, 0)));
4785 PUSHs(S_space_join_names_mortal(aTHX_ pent->p_aliases));
4786 PUSHs(sv_2mortal(newSViv((IV)pent->p_proto)));
4791 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4797 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4799 I32 which = PL_op->op_type;
4801 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4802 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4803 struct servent *getservbyport(int, Netdb_name_t);
4804 struct servent *getservent(void);
4806 struct servent *sent;
4808 if (which == OP_GSBYNAME) {
4809 #ifdef HAS_GETSERVBYNAME
4810 const char * const proto = POPpbytex;
4811 const char * const name = POPpbytex;
4812 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4814 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4817 else if (which == OP_GSBYPORT) {
4818 #ifdef HAS_GETSERVBYPORT
4819 const char * const proto = POPpbytex;
4820 unsigned short port = (unsigned short)POPu;
4822 port = PerlSock_htons(port);
4824 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4826 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4830 #ifdef HAS_GETSERVENT
4831 sent = PerlSock_getservent();
4833 DIE(aTHX_ PL_no_sock_func, "getservent");
4837 if (GIMME != G_ARRAY) {
4838 PUSHs(sv = sv_newmortal());
4840 if (which == OP_GSBYNAME) {
4842 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4844 sv_setiv(sv, (IV)(sent->s_port));
4848 sv_setpv(sv, sent->s_name);
4854 PUSHs(sv_2mortal(newSVpv(sent->s_name, 0)));
4855 PUSHs(S_space_join_names_mortal(aTHX_ sent->s_aliases));
4857 PUSHs(sv_2mortal(newSViv((IV)PerlSock_ntohs(sent->s_port))));
4859 PUSHs(sv_2mortal(newSViv((IV)(sent->s_port))));
4861 PUSHs(sv_2mortal(newSVpv(sent->s_proto, 0)));
4866 DIE(aTHX_ PL_no_sock_func, "getservent");
4872 #ifdef HAS_SETHOSTENT
4874 PerlSock_sethostent(TOPi);
4877 DIE(aTHX_ PL_no_sock_func, "sethostent");
4883 #ifdef HAS_SETNETENT
4885 PerlSock_setnetent(TOPi);
4888 DIE(aTHX_ PL_no_sock_func, "setnetent");
4894 #ifdef HAS_SETPROTOENT
4896 PerlSock_setprotoent(TOPi);
4899 DIE(aTHX_ PL_no_sock_func, "setprotoent");
4905 #ifdef HAS_SETSERVENT
4907 PerlSock_setservent(TOPi);
4910 DIE(aTHX_ PL_no_sock_func, "setservent");
4916 #ifdef HAS_ENDHOSTENT
4918 PerlSock_endhostent();
4922 DIE(aTHX_ PL_no_sock_func, "endhostent");
4928 #ifdef HAS_ENDNETENT
4930 PerlSock_endnetent();
4934 DIE(aTHX_ PL_no_sock_func, "endnetent");
4940 #ifdef HAS_ENDPROTOENT
4942 PerlSock_endprotoent();
4946 DIE(aTHX_ PL_no_sock_func, "endprotoent");
4952 #ifdef HAS_ENDSERVENT
4954 PerlSock_endservent();
4958 DIE(aTHX_ PL_no_sock_func, "endservent");
4966 I32 which = PL_op->op_type;
4968 struct passwd *pwent = NULL;
4970 * We currently support only the SysV getsp* shadow password interface.
4971 * The interface is declared in <shadow.h> and often one needs to link
4972 * with -lsecurity or some such.
4973 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
4976 * AIX getpwnam() is clever enough to return the encrypted password
4977 * only if the caller (euid?) is root.
4979 * There are at least three other shadow password APIs. Many platforms
4980 * seem to contain more than one interface for accessing the shadow
4981 * password databases, possibly for compatibility reasons.
4982 * The getsp*() is by far he simplest one, the other two interfaces
4983 * are much more complicated, but also very similar to each other.
4988 * struct pr_passwd *getprpw*();
4989 * The password is in
4990 * char getprpw*(...).ufld.fd_encrypt[]
4991 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
4996 * struct es_passwd *getespw*();
4997 * The password is in
4998 * char *(getespw*(...).ufld.fd_encrypt)
4999 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5002 * struct userpw *getuserpw();
5003 * The password is in
5004 * char *(getuserpw(...)).spw_upw_passwd
5005 * (but the de facto standard getpwnam() should work okay)
5007 * Mention I_PROT here so that Configure probes for it.
5009 * In HP-UX for getprpw*() the manual page claims that one should include
5010 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5011 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5012 * and pp_sys.c already includes <shadow.h> if there is such.
5014 * Note that <sys/security.h> is already probed for, but currently
5015 * it is only included in special cases.
5017 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5018 * be preferred interface, even though also the getprpw*() interface
5019 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5020 * One also needs to call set_auth_parameters() in main() before
5021 * doing anything else, whether one is using getespw*() or getprpw*().
5023 * Note that accessing the shadow databases can be magnitudes
5024 * slower than accessing the standard databases.
5029 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5030 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5031 * the pw_comment is left uninitialized. */
5032 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5038 const char* const name = POPpbytex;
5039 pwent = getpwnam(name);
5045 pwent = getpwuid(uid);
5049 # ifdef HAS_GETPWENT
5051 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5052 if (pwent) pwent = getpwnam(pwent->pw_name);
5055 DIE(aTHX_ PL_no_func, "getpwent");
5061 if (GIMME != G_ARRAY) {
5062 PUSHs(sv = sv_newmortal());
5064 if (which == OP_GPWNAM)
5065 # if Uid_t_sign <= 0
5066 sv_setiv(sv, (IV)pwent->pw_uid);
5068 sv_setuv(sv, (UV)pwent->pw_uid);
5071 sv_setpv(sv, pwent->pw_name);
5077 PUSHs(sv_2mortal(newSVpv(pwent->pw_name, 0)));
5079 PUSHs(sv = sv_2mortal(newSViv(0)));
5080 /* If we have getspnam(), we try to dig up the shadow
5081 * password. If we are underprivileged, the shadow
5082 * interface will set the errno to EACCES or similar,
5083 * and return a null pointer. If this happens, we will
5084 * use the dummy password (usually "*" or "x") from the
5085 * standard password database.
5087 * In theory we could skip the shadow call completely
5088 * if euid != 0 but in practice we cannot know which
5089 * security measures are guarding the shadow databases
5090 * on a random platform.
5092 * Resist the urge to use additional shadow interfaces.
5093 * Divert the urge to writing an extension instead.
5096 /* Some AIX setups falsely(?) detect some getspnam(), which
5097 * has a different API than the Solaris/IRIX one. */
5098 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5100 const int saverrno = errno;
5101 const struct spwd * const spwent = getspnam(pwent->pw_name);
5102 /* Save and restore errno so that
5103 * underprivileged attempts seem
5104 * to have never made the unsccessful
5105 * attempt to retrieve the shadow password. */
5107 if (spwent && spwent->sp_pwdp)
5108 sv_setpv(sv, spwent->sp_pwdp);
5112 if (!SvPOK(sv)) /* Use the standard password, then. */
5113 sv_setpv(sv, pwent->pw_passwd);
5116 # ifndef INCOMPLETE_TAINTS
5117 /* passwd is tainted because user himself can diddle with it.
5118 * admittedly not much and in a very limited way, but nevertheless. */
5122 # if Uid_t_sign <= 0
5123 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_uid)));
5125 PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_uid)));
5128 # if Uid_t_sign <= 0
5129 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_gid)));
5131 PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_gid)));
5133 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5134 * because of the poor interface of the Perl getpw*(),
5135 * not because there's some standard/convention saying so.
5136 * A better interface would have been to return a hash,
5137 * but we are accursed by our history, alas. --jhi. */
5139 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_change)));
5142 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_quota)));
5145 PUSHs(sv_2mortal(newSVpv(pwent->pw_age, 0)));
5147 /* I think that you can never get this compiled, but just in case. */
5148 PUSHs(sv_mortalcopy(&PL_sv_no));
5153 /* pw_class and pw_comment are mutually exclusive--.
5154 * see the above note for pw_change, pw_quota, and pw_age. */
5156 PUSHs(sv_2mortal(newSVpv(pwent->pw_class, 0)));
5159 PUSHs(sv_2mortal(newSVpv(pwent->pw_comment, 0)));
5161 /* I think that you can never get this compiled, but just in case. */
5162 PUSHs(sv_mortalcopy(&PL_sv_no));
5167 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5169 PUSHs(sv_mortalcopy(&PL_sv_no));
5171 # ifndef INCOMPLETE_TAINTS
5172 /* pw_gecos is tainted because user himself can diddle with it. */
5176 PUSHs(sv_2mortal(newSVpv(pwent->pw_dir, 0)));
5178 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5179 # ifndef INCOMPLETE_TAINTS
5180 /* pw_shell is tainted because user himself can diddle with it. */
5185 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_expire)));
5190 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5196 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5201 DIE(aTHX_ PL_no_func, "setpwent");
5207 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5212 DIE(aTHX_ PL_no_func, "endpwent");
5220 const I32 which = PL_op->op_type;
5221 const struct group *grent;
5223 if (which == OP_GGRNAM) {
5224 const char* const name = POPpbytex;
5225 grent = (const struct group *)getgrnam(name);
5227 else if (which == OP_GGRGID) {
5228 const Gid_t gid = POPi;
5229 grent = (const struct group *)getgrgid(gid);
5233 grent = (struct group *)getgrent();
5235 DIE(aTHX_ PL_no_func, "getgrent");
5239 if (GIMME != G_ARRAY) {
5240 SV * const sv = sv_newmortal();
5244 if (which == OP_GGRNAM)
5245 sv_setiv(sv, (IV)grent->gr_gid);
5247 sv_setpv(sv, grent->gr_name);
5253 PUSHs(sv_2mortal(newSVpv(grent->gr_name, 0)));
5256 PUSHs(sv_2mortal(newSVpv(grent->gr_passwd, 0)));
5258 PUSHs(sv_mortalcopy(&PL_sv_no));
5261 PUSHs(sv_2mortal(newSViv((IV)grent->gr_gid)));
5263 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5264 /* In UNICOS/mk (_CRAYMPP) the multithreading
5265 * versions (getgrnam_r, getgrgid_r)
5266 * seem to return an illegal pointer
5267 * as the group members list, gr_mem.
5268 * getgrent() doesn't even have a _r version
5269 * but the gr_mem is poisonous anyway.
5270 * So yes, you cannot get the list of group
5271 * members if building multithreaded in UNICOS/mk. */
5272 PUSHs(S_space_join_names_mortal(aTHX_ grent->gr_mem));
5278 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5284 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5289 DIE(aTHX_ PL_no_func, "setgrent");
5295 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5300 DIE(aTHX_ PL_no_func, "endgrent");
5310 if (!(tmps = PerlProc_getlogin()))
5312 PUSHp(tmps, strlen(tmps));
5315 DIE(aTHX_ PL_no_func, "getlogin");
5319 /* Miscellaneous. */
5324 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5325 register I32 items = SP - MARK;
5326 unsigned long a[20];
5331 while (++MARK <= SP) {
5332 if (SvTAINTED(*MARK)) {
5338 TAINT_PROPER("syscall");
5341 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5342 * or where sizeof(long) != sizeof(char*). But such machines will
5343 * not likely have syscall implemented either, so who cares?
5345 while (++MARK <= SP) {
5346 if (SvNIOK(*MARK) || !i)
5347 a[i++] = SvIV(*MARK);
5348 else if (*MARK == &PL_sv_undef)
5351 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5357 DIE(aTHX_ "Too many args to syscall");
5359 DIE(aTHX_ "Too few args to syscall");
5361 retval = syscall(a[0]);
5364 retval = syscall(a[0],a[1]);
5367 retval = syscall(a[0],a[1],a[2]);
5370 retval = syscall(a[0],a[1],a[2],a[3]);
5373 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5376 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5379 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5382 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5386 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5389 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5392 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5396 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5400 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5404 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5405 a[10],a[11],a[12],a[13]);
5407 #endif /* atarist */
5413 DIE(aTHX_ PL_no_func, "syscall");
5417 #ifdef FCNTL_EMULATE_FLOCK
5419 /* XXX Emulate flock() with fcntl().
5420 What's really needed is a good file locking module.
5424 fcntl_emulate_flock(int fd, int operation)
5428 switch (operation & ~LOCK_NB) {
5430 flock.l_type = F_RDLCK;
5433 flock.l_type = F_WRLCK;
5436 flock.l_type = F_UNLCK;
5442 flock.l_whence = SEEK_SET;
5443 flock.l_start = flock.l_len = (Off_t)0;
5445 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5448 #endif /* FCNTL_EMULATE_FLOCK */
5450 #ifdef LOCKF_EMULATE_FLOCK
5452 /* XXX Emulate flock() with lockf(). This is just to increase
5453 portability of scripts. The calls are not completely
5454 interchangeable. What's really needed is a good file
5458 /* The lockf() constants might have been defined in <unistd.h>.
5459 Unfortunately, <unistd.h> causes troubles on some mixed
5460 (BSD/POSIX) systems, such as SunOS 4.1.3.
5462 Further, the lockf() constants aren't POSIX, so they might not be
5463 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5464 just stick in the SVID values and be done with it. Sigh.
5468 # define F_ULOCK 0 /* Unlock a previously locked region */
5471 # define F_LOCK 1 /* Lock a region for exclusive use */
5474 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5477 # define F_TEST 3 /* Test a region for other processes locks */
5481 lockf_emulate_flock(int fd, int operation)
5484 const int save_errno = errno;
5487 /* flock locks entire file so for lockf we need to do the same */
5488 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5489 if (pos > 0) /* is seekable and needs to be repositioned */
5490 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5491 pos = -1; /* seek failed, so don't seek back afterwards */
5494 switch (operation) {
5496 /* LOCK_SH - get a shared lock */
5498 /* LOCK_EX - get an exclusive lock */
5500 i = lockf (fd, F_LOCK, 0);
5503 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5504 case LOCK_SH|LOCK_NB:
5505 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5506 case LOCK_EX|LOCK_NB:
5507 i = lockf (fd, F_TLOCK, 0);
5509 if ((errno == EAGAIN) || (errno == EACCES))
5510 errno = EWOULDBLOCK;
5513 /* LOCK_UN - unlock (non-blocking is a no-op) */
5515 case LOCK_UN|LOCK_NB:
5516 i = lockf (fd, F_ULOCK, 0);
5519 /* Default - can't decipher operation */
5526 if (pos > 0) /* need to restore position of the handle */
5527 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5532 #endif /* LOCKF_EMULATE_FLOCK */
5536 * c-indentation-style: bsd
5538 * indent-tabs-mode: t
5541 * ex: set ts=8 sts=4 sw=4 noet: