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((char*)tmps, (char *)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)
382 tryAMAGICunTARGET(iter, -1);
384 /* Note that we only ever get here if File::Glob fails to load
385 * without at the same time croaking, for some reason, or if
386 * perl was built with PERL_EXTERNAL_GLOB */
393 * The external globbing program may use things we can't control,
394 * so for security reasons we must assume the worst.
397 taint_proper(PL_no_security, "glob");
401 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
402 PL_last_in_gv = (GV*)*PL_stack_sp--;
404 SAVESPTR(PL_rs); /* This is not permanent, either. */
405 PL_rs = sv_2mortal(newSVpvs("\000"));
408 *SvPVX(PL_rs) = '\n';
412 result = do_readline();
419 PL_last_in_gv = cGVOP_gv;
420 return do_readline();
431 do_join(TARG, &PL_sv_no, MARK, SP);
435 else if (SP == MARK) {
442 tmps = SvPV_const(tmpsv, len);
443 if ((!tmps || !len) && PL_errgv) {
444 SV * const error = ERRSV;
445 (void)SvUPGRADE(error, SVt_PV);
446 if (SvPOK(error) && SvCUR(error))
447 sv_catpvs(error, "\t...caught");
449 tmps = SvPV_const(tmpsv, len);
452 tmpsv = sv_2mortal(newSVpvs("Warning: something's wrong"));
454 Perl_warn(aTHX_ "%"SVf, (void*)tmpsv);
466 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
468 if (SP - MARK != 1) {
470 do_join(TARG, &PL_sv_no, MARK, SP);
472 tmps = SvPV_const(tmpsv, len);
478 tmps = SvROK(tmpsv) ? NULL : SvPV_const(tmpsv, len);
481 SV * const error = ERRSV;
482 (void)SvUPGRADE(error, SVt_PV);
483 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
485 SvSetSV(error,tmpsv);
486 else if (sv_isobject(error)) {
487 HV * const stash = SvSTASH(SvRV(error));
488 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
490 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
491 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
498 call_sv((SV*)GvCV(gv),
499 G_SCALAR|G_EVAL|G_KEEPERR);
500 sv_setsv(error,*PL_stack_sp--);
506 if (SvPOK(error) && SvCUR(error))
507 sv_catpvs(error, "\t...propagated");
510 tmps = SvPV_const(tmpsv, len);
516 tmpsv = sv_2mortal(newSVpvs("Died"));
518 DIE(aTHX_ "%"SVf, (void*)tmpsv);
534 GV * const gv = (GV *)*++MARK;
537 DIE(aTHX_ PL_no_usym, "filehandle");
538 if ((io = GvIOp(gv))) {
540 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
542 mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
544 /* Method's args are same as ours ... */
545 /* ... except handle is replaced by the object */
546 *MARK-- = SvTIED_obj((SV*)io, mg);
550 call_method("OPEN", G_SCALAR);
564 tmps = SvPV_const(sv, len);
565 ok = do_openn(gv, (char *)tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
568 PUSHi( (I32)PL_forkprocess );
569 else if (PL_forkprocess == 0) /* we are a new child */
579 GV * const gv = (MAXARG == 0) ? PL_defoutgv : (GV*)POPs;
582 IO * const io = GvIO(gv);
584 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
587 XPUSHs(SvTIED_obj((SV*)io, mg));
590 call_method("CLOSE", G_SCALAR);
598 PUSHs(boolSV(do_close(gv, TRUE)));
610 GV * const wgv = (GV*)POPs;
611 GV * const rgv = (GV*)POPs;
616 if (SvTYPE(rgv) != SVt_PVGV || SvTYPE(wgv) != SVt_PVGV)
617 DIE(aTHX_ PL_no_usym, "filehandle");
622 do_close(rgv, FALSE);
624 do_close(wgv, FALSE);
626 if (PerlProc_pipe(fd) < 0)
629 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
630 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
631 IoOFP(rstio) = IoIFP(rstio);
632 IoIFP(wstio) = IoOFP(wstio);
633 IoTYPE(rstio) = IoTYPE_RDONLY;
634 IoTYPE(wstio) = IoTYPE_WRONLY;
636 if (!IoIFP(rstio) || !IoOFP(wstio)) {
638 PerlIO_close(IoIFP(rstio));
640 PerlLIO_close(fd[0]);
642 PerlIO_close(IoOFP(wstio));
644 PerlLIO_close(fd[1]);
647 #if defined(HAS_FCNTL) && defined(F_SETFD)
648 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
649 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
656 DIE(aTHX_ PL_no_func, "pipe");
672 if (gv && (io = GvIO(gv))
673 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
676 XPUSHs(SvTIED_obj((SV*)io, mg));
679 call_method("FILENO", G_SCALAR);
685 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
686 /* Can't do this because people seem to do things like
687 defined(fileno($foo)) to check whether $foo is a valid fh.
688 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
689 report_evil_fh(gv, io, PL_op->op_type);
694 PUSHi(PerlIO_fileno(fp));
706 anum = PerlLIO_umask(0);
707 (void)PerlLIO_umask(anum);
710 anum = PerlLIO_umask(POPi);
711 TAINT_PROPER("umask");
714 /* Only DIE if trying to restrict permissions on "user" (self).
715 * Otherwise it's harmless and more useful to just return undef
716 * since 'group' and 'other' concepts probably don't exist here. */
717 if (MAXARG >= 1 && (POPi & 0700))
718 DIE(aTHX_ "umask not implemented");
719 XPUSHs(&PL_sv_undef);
740 if (gv && (io = GvIO(gv))) {
741 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
744 XPUSHs(SvTIED_obj((SV*)io, mg));
749 call_method("BINMODE", G_SCALAR);
757 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
758 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
759 report_evil_fh(gv, io, PL_op->op_type);
760 SETERRNO(EBADF,RMS_IFI);
766 const int mode = mode_from_discipline(discp);
767 const char *const d = (discp ? SvPV_nolen_const(discp) : NULL);
768 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
769 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
770 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
791 const I32 markoff = MARK - PL_stack_base;
792 const char *methname;
793 int how = PERL_MAGIC_tied;
797 switch(SvTYPE(varsv)) {
799 methname = "TIEHASH";
800 HvEITER_set((HV *)varsv, 0);
803 methname = "TIEARRAY";
806 #ifdef GV_UNIQUE_CHECK
807 if (GvUNIQUE((GV*)varsv)) {
808 Perl_croak(aTHX_ "Attempt to tie unique GV");
811 methname = "TIEHANDLE";
812 how = PERL_MAGIC_tiedscalar;
813 /* For tied filehandles, we apply tiedscalar magic to the IO
814 slot of the GP rather than the GV itself. AMS 20010812 */
816 GvIOp(varsv) = newIO();
817 varsv = (SV *)GvIOp(varsv);
820 methname = "TIESCALAR";
821 how = PERL_MAGIC_tiedscalar;
825 if (sv_isobject(*MARK)) {
827 PUSHSTACKi(PERLSI_MAGIC);
829 EXTEND(SP,(I32)items);
833 call_method(methname, G_SCALAR);
836 /* Not clear why we don't call call_method here too.
837 * perhaps to get different error message ?
839 stash = gv_stashsv(*MARK, FALSE);
840 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
841 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
842 methname, (void*)*MARK);
845 PUSHSTACKi(PERLSI_MAGIC);
847 EXTEND(SP,(I32)items);
851 call_sv((SV*)GvCV(gv), G_SCALAR);
857 if (sv_isobject(sv)) {
858 sv_unmagic(varsv, how);
859 /* Croak if a self-tie on an aggregate is attempted. */
860 if (varsv == SvRV(sv) &&
861 (SvTYPE(varsv) == SVt_PVAV ||
862 SvTYPE(varsv) == SVt_PVHV))
864 "Self-ties of arrays and hashes are not supported");
865 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
868 SP = PL_stack_base + markoff;
878 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
879 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
881 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
884 if ((mg = SvTIED_mg(sv, how))) {
885 SV * const obj = SvRV(SvTIED_obj(sv, mg));
887 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
889 if (gv && isGV(gv) && (cv = GvCV(gv))) {
891 XPUSHs(SvTIED_obj((SV*)gv, mg));
892 XPUSHs(sv_2mortal(newSViv(SvREFCNT(obj)-1)));
895 call_sv((SV *)cv, G_VOID);
899 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
900 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
901 "untie attempted while %"UVuf" inner references still exist",
902 (UV)SvREFCNT(obj) - 1 ) ;
906 sv_unmagic(sv, how) ;
915 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
916 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
918 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
921 if ((mg = SvTIED_mg(sv, how))) {
922 SV *osv = SvTIED_obj(sv, mg);
923 if (osv == mg->mg_obj)
924 osv = sv_mortalcopy(osv);
938 HV * const hv = (HV*)POPs;
939 SV * const sv = sv_2mortal(newSVpvs("AnyDBM_File"));
940 stash = gv_stashsv(sv, FALSE);
941 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
943 require_pv("AnyDBM_File.pm");
945 if (!(gv = gv_fetchmethod(stash, "TIEHASH")))
946 DIE(aTHX_ "No dbm on this machine");
956 PUSHs(sv_2mortal(newSVuv(O_RDWR|O_CREAT)));
958 PUSHs(sv_2mortal(newSVuv(O_RDWR)));
961 call_sv((SV*)GvCV(gv), G_SCALAR);
964 if (!sv_isobject(TOPs)) {
969 PUSHs(sv_2mortal(newSVuv(O_RDONLY)));
972 call_sv((SV*)GvCV(gv), G_SCALAR);
976 if (sv_isobject(TOPs)) {
977 sv_unmagic((SV *) hv, PERL_MAGIC_tied);
978 sv_magic((SV*)hv, TOPs, PERL_MAGIC_tied, NULL, 0);
995 struct timeval timebuf;
996 struct timeval *tbuf = &timebuf;
999 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1004 # if BYTEORDER & 0xf0000
1005 # define ORDERBYTE (0x88888888 - BYTEORDER)
1007 # define ORDERBYTE (0x4444 - BYTEORDER)
1013 for (i = 1; i <= 3; i++) {
1014 SV * const sv = SP[i];
1017 if (SvREADONLY(sv)) {
1019 sv_force_normal_flags(sv, 0);
1020 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1021 DIE(aTHX_ PL_no_modify);
1024 if (ckWARN(WARN_MISC))
1025 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1026 SvPV_force_nolen(sv); /* force string conversion */
1033 /* little endians can use vecs directly */
1034 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1041 masksize = NFDBITS / NBBY;
1043 masksize = sizeof(long); /* documented int, everyone seems to use long */
1045 Zero(&fd_sets[0], 4, char*);
1048 # if SELECT_MIN_BITS == 1
1049 growsize = sizeof(fd_set);
1051 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1052 # undef SELECT_MIN_BITS
1053 # define SELECT_MIN_BITS __FD_SETSIZE
1055 /* If SELECT_MIN_BITS is greater than one we most probably will want
1056 * to align the sizes with SELECT_MIN_BITS/8 because for example
1057 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1058 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1059 * on (sets/tests/clears bits) is 32 bits. */
1060 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1068 timebuf.tv_sec = (long)value;
1069 value -= (NV)timebuf.tv_sec;
1070 timebuf.tv_usec = (long)(value * 1000000.0);
1075 for (i = 1; i <= 3; i++) {
1077 if (!SvOK(sv) || SvCUR(sv) == 0) {
1084 Sv_Grow(sv, growsize);
1088 while (++j <= growsize) {
1092 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1094 Newx(fd_sets[i], growsize, char);
1095 for (offset = 0; offset < growsize; offset += masksize) {
1096 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1097 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1100 fd_sets[i] = SvPVX(sv);
1104 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1105 /* Can't make just the (void*) conditional because that would be
1106 * cpp #if within cpp macro, and not all compilers like that. */
1107 nfound = PerlSock_select(
1109 (Select_fd_set_t) fd_sets[1],
1110 (Select_fd_set_t) fd_sets[2],
1111 (Select_fd_set_t) fd_sets[3],
1112 (void*) tbuf); /* Workaround for compiler bug. */
1114 nfound = PerlSock_select(
1116 (Select_fd_set_t) fd_sets[1],
1117 (Select_fd_set_t) fd_sets[2],
1118 (Select_fd_set_t) fd_sets[3],
1121 for (i = 1; i <= 3; i++) {
1124 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1126 for (offset = 0; offset < growsize; offset += masksize) {
1127 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1128 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1130 Safefree(fd_sets[i]);
1137 if (GIMME == G_ARRAY && tbuf) {
1138 value = (NV)(timebuf.tv_sec) +
1139 (NV)(timebuf.tv_usec) / 1000000.0;
1140 PUSHs(sv_2mortal(newSVnv(value)));
1144 DIE(aTHX_ "select not implemented");
1149 Perl_setdefout(pTHX_ GV *gv)
1151 SvREFCNT_inc_simple_void(gv);
1153 SvREFCNT_dec(PL_defoutgv);
1161 GV * const newdefout = (PL_op->op_private > 0) ? ((GV *) POPs) : NULL;
1162 GV * egv = GvEGV(PL_defoutgv);
1168 XPUSHs(&PL_sv_undef);
1170 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1171 if (gvp && *gvp == egv) {
1172 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1176 XPUSHs(sv_2mortal(newRV((SV*)egv)));
1181 if (!GvIO(newdefout))
1182 gv_IOadd(newdefout);
1183 setdefout(newdefout);
1193 GV * const gv = (MAXARG==0) ? PL_stdingv : (GV*)POPs;
1195 if (gv && (io = GvIO(gv))) {
1196 MAGIC * const 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);
1211 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1212 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1213 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1214 report_evil_fh(gv, io, PL_op->op_type);
1215 SETERRNO(EBADF,RMS_IFI);
1219 sv_setpvn(TARG, " ", 1);
1220 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1221 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1222 /* Find out how many bytes the char needs */
1223 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1226 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1227 SvCUR_set(TARG,1+len);
1236 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1238 register PERL_CONTEXT *cx;
1239 const I32 gimme = GIMME_V;
1245 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1248 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1250 setdefout(gv); /* locally select filehandle so $% et al work */
1281 goto not_a_format_reference;
1286 tmpsv = sv_newmortal();
1287 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1288 name = SvPV_nolen_const(tmpsv);
1290 DIE(aTHX_ "Undefined format \"%s\" called", name);
1292 not_a_format_reference:
1293 DIE(aTHX_ "Not a format reference");
1296 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1298 IoFLAGS(io) &= ~IOf_DIDTOP;
1299 return doform(cv,gv,PL_op->op_next);
1305 GV * const gv = cxstack[cxstack_ix].blk_sub.gv;
1306 register IO * const io = GvIOp(gv);
1311 register PERL_CONTEXT *cx;
1313 if (!io || !(ofp = IoOFP(io)))
1316 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1317 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1319 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1320 PL_formtarget != PL_toptarget)
1324 if (!IoTOP_GV(io)) {
1327 if (!IoTOP_NAME(io)) {
1329 if (!IoFMT_NAME(io))
1330 IoFMT_NAME(io) = savepv(GvNAME(gv));
1331 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1332 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1333 if ((topgv && GvFORM(topgv)) ||
1334 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1335 IoTOP_NAME(io) = savesvpv(topname);
1337 IoTOP_NAME(io) = savepvs("top");
1339 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1340 if (!topgv || !GvFORM(topgv)) {
1341 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1344 IoTOP_GV(io) = topgv;
1346 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1347 I32 lines = IoLINES_LEFT(io);
1348 const char *s = SvPVX_const(PL_formtarget);
1349 if (lines <= 0) /* Yow, header didn't even fit!!! */
1351 while (lines-- > 0) {
1352 s = strchr(s, '\n');
1358 const STRLEN save = SvCUR(PL_formtarget);
1359 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1360 do_print(PL_formtarget, ofp);
1361 SvCUR_set(PL_formtarget, save);
1362 sv_chop(PL_formtarget, (char *)s);
1363 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1366 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1367 do_print(PL_formfeed, ofp);
1368 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1370 PL_formtarget = PL_toptarget;
1371 IoFLAGS(io) |= IOf_DIDTOP;
1374 DIE(aTHX_ "bad top format reference");
1377 SV * const sv = sv_newmortal();
1379 gv_efullname4(sv, fgv, NULL, FALSE);
1380 name = SvPV_nolen_const(sv);
1382 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1384 DIE(aTHX_ "Undefined top format called");
1386 if (cv && CvCLONE(cv))
1387 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1388 return doform(cv, gv, PL_op);
1392 POPBLOCK(cx,PL_curpm);
1398 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1400 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1401 else if (ckWARN(WARN_CLOSED))
1402 report_evil_fh(gv, io, PL_op->op_type);
1407 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1408 if (ckWARN(WARN_IO))
1409 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1411 if (!do_print(PL_formtarget, fp))
1414 FmLINES(PL_formtarget) = 0;
1415 SvCUR_set(PL_formtarget, 0);
1416 *SvEND(PL_formtarget) = '\0';
1417 if (IoFLAGS(io) & IOf_FLUSH)
1418 (void)PerlIO_flush(fp);
1423 PL_formtarget = PL_bodytarget;
1425 PERL_UNUSED_VAR(newsp);
1426 PERL_UNUSED_VAR(gimme);
1427 return pop_return();
1432 dSP; dMARK; dORIGMARK;
1437 GV * const gv = (PL_op->op_flags & OPf_STACKED) ? (GV*)*++MARK : PL_defoutgv;
1439 if (gv && (io = GvIO(gv))) {
1440 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1442 if (MARK == ORIGMARK) {
1445 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1449 *MARK = SvTIED_obj((SV*)io, mg);
1452 call_method("PRINTF", G_SCALAR);
1455 MARK = ORIGMARK + 1;
1463 if (!(io = GvIO(gv))) {
1464 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1465 report_evil_fh(gv, io, PL_op->op_type);
1466 SETERRNO(EBADF,RMS_IFI);
1469 else if (!(fp = IoOFP(io))) {
1470 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1472 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1473 else if (ckWARN(WARN_CLOSED))
1474 report_evil_fh(gv, io, PL_op->op_type);
1476 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1480 do_sprintf(sv, SP - MARK, MARK + 1);
1481 if (!do_print(sv, fp))
1484 if (IoFLAGS(io) & IOf_FLUSH)
1485 if (PerlIO_flush(fp) == EOF)
1496 PUSHs(&PL_sv_undef);
1503 const int perm = (MAXARG > 3) ? POPi : 0666;
1504 const int mode = POPi;
1505 SV * const sv = POPs;
1506 GV * const gv = (GV *)POPs;
1509 /* Need TIEHANDLE method ? */
1510 const char * const tmps = SvPV_const(sv, len);
1511 /* FIXME? do_open should do const */
1512 if (do_open(gv, (char*)tmps, len, TRUE, mode, perm, NULL)) {
1513 IoLINES(GvIOp(gv)) = 0;
1517 PUSHs(&PL_sv_undef);
1524 dSP; dMARK; dORIGMARK; dTARGET;
1530 Sock_size_t bufsize;
1538 bool charstart = FALSE;
1539 STRLEN charskip = 0;
1542 GV * const gv = (GV*)*++MARK;
1543 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1544 && gv && (io = GvIO(gv)) )
1546 const MAGIC * mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1550 *MARK = SvTIED_obj((SV*)io, mg);
1552 call_method("READ", G_SCALAR);
1566 sv_setpvn(bufsv, "", 0);
1567 length = SvIVx(*++MARK);
1570 offset = SvIVx(*++MARK);
1574 if (!io || !IoIFP(io)) {
1575 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1576 report_evil_fh(gv, io, PL_op->op_type);
1577 SETERRNO(EBADF,RMS_IFI);
1580 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1581 buffer = SvPVutf8_force(bufsv, blen);
1582 /* UTF-8 may not have been set if they are all low bytes */
1587 buffer = SvPV_force(bufsv, blen);
1588 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1591 DIE(aTHX_ "Negative length");
1599 if (PL_op->op_type == OP_RECV) {
1600 char namebuf[MAXPATHLEN];
1601 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1602 bufsize = sizeof (struct sockaddr_in);
1604 bufsize = sizeof namebuf;
1606 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1610 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1611 /* 'offset' means 'flags' here */
1612 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1613 (struct sockaddr *)namebuf, &bufsize);
1617 /* Bogus return without padding */
1618 bufsize = sizeof (struct sockaddr_in);
1620 SvCUR_set(bufsv, count);
1621 *SvEND(bufsv) = '\0';
1622 (void)SvPOK_only(bufsv);
1626 /* This should not be marked tainted if the fp is marked clean */
1627 if (!(IoFLAGS(io) & IOf_UNTAINT))
1628 SvTAINTED_on(bufsv);
1630 sv_setpvn(TARG, namebuf, bufsize);
1635 if (PL_op->op_type == OP_RECV)
1636 DIE(aTHX_ PL_no_sock_func, "recv");
1638 if (DO_UTF8(bufsv)) {
1639 /* offset adjust in characters not bytes */
1640 blen = sv_len_utf8(bufsv);
1643 if (-offset > (int)blen)
1644 DIE(aTHX_ "Offset outside string");
1647 if (DO_UTF8(bufsv)) {
1648 /* convert offset-as-chars to offset-as-bytes */
1649 if (offset >= (int)blen)
1650 offset += SvCUR(bufsv) - blen;
1652 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1655 bufsize = SvCUR(bufsv);
1656 /* Allocating length + offset + 1 isn't perfect in the case of reading
1657 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1659 (should be 2 * length + offset + 1, or possibly something longer if
1660 PL_encoding is true) */
1661 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1662 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1663 Zero(buffer+bufsize, offset-bufsize, char);
1665 buffer = buffer + offset;
1667 read_target = bufsv;
1669 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1670 concatenate it to the current buffer. */
1672 /* Truncate the existing buffer to the start of where we will be
1674 SvCUR_set(bufsv, offset);
1676 read_target = sv_newmortal();
1677 (void)SvUPGRADE(read_target, SVt_PV);
1678 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1681 if (PL_op->op_type == OP_SYSREAD) {
1682 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1683 if (IoTYPE(io) == IoTYPE_SOCKET) {
1684 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1690 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1695 #ifdef HAS_SOCKET__bad_code_maybe
1696 if (IoTYPE(io) == IoTYPE_SOCKET) {
1697 char namebuf[MAXPATHLEN];
1698 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1699 bufsize = sizeof (struct sockaddr_in);
1701 bufsize = sizeof namebuf;
1703 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1704 (struct sockaddr *)namebuf, &bufsize);
1709 count = PerlIO_read(IoIFP(io), buffer, length);
1710 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1711 if (count == 0 && PerlIO_error(IoIFP(io)))
1715 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1716 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1719 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1720 *SvEND(read_target) = '\0';
1721 (void)SvPOK_only(read_target);
1722 if (fp_utf8 && !IN_BYTES) {
1723 /* Look at utf8 we got back and count the characters */
1724 const char *bend = buffer + count;
1725 while (buffer < bend) {
1727 skip = UTF8SKIP(buffer);
1730 if (buffer - charskip + skip > bend) {
1731 /* partial character - try for rest of it */
1732 length = skip - (bend-buffer);
1733 offset = bend - SvPVX_const(bufsv);
1745 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1746 provided amount read (count) was what was requested (length)
1748 if (got < wanted && count == length) {
1749 length = wanted - got;
1750 offset = bend - SvPVX_const(bufsv);
1753 /* return value is character count */
1757 else if (buffer_utf8) {
1758 /* Let svcatsv upgrade the bytes we read in to utf8.
1759 The buffer is a mortal so will be freed soon. */
1760 sv_catsv_nomg(bufsv, read_target);
1763 /* This should not be marked tainted if the fp is marked clean */
1764 if (!(IoFLAGS(io) & IOf_UNTAINT))
1765 SvTAINTED_on(bufsv);
1777 dSP; dMARK; dORIGMARK; dTARGET;
1783 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 MAGIC * const 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);
1821 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1823 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1824 if (io && IoIFP(io))
1825 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1827 report_evil_fh(gv, io, PL_op->op_type);
1829 SETERRNO(EBADF,RMS_IFI);
1833 /* Do this first to trigger any overloading. */
1834 buffer = SvPV_const(bufsv, blen);
1835 orig_blen_bytes = blen;
1836 doing_utf8 = DO_UTF8(bufsv);
1838 if (PerlIO_isutf8(IoIFP(io))) {
1839 if (!SvUTF8(bufsv)) {
1840 /* We don't modify the original scalar. */
1841 tmpbuf = bytes_to_utf8((U8*) buffer, &blen);
1842 buffer = (char *) tmpbuf;
1846 else if (doing_utf8) {
1847 STRLEN tmplen = blen;
1848 U8 * const result = bytes_from_utf8((U8*) buffer, &tmplen, &doing_utf8);
1851 buffer = (char *) tmpbuf;
1855 assert((char *)result == buffer);
1856 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1860 if (op_type == OP_SYSWRITE) {
1861 Size_t length = 0; /* This length is in characters. */
1867 /* The SV is bytes, and we've had to upgrade it. */
1868 blen_chars = orig_blen_bytes;
1870 /* The SV really is UTF-8. */
1871 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1872 /* Don't call sv_len_utf8 again because it will call magic
1873 or overloading a second time, and we might get back a
1874 different result. */
1875 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1877 /* It's safe, and it may well be cached. */
1878 blen_chars = sv_len_utf8(bufsv);
1886 length = blen_chars;
1888 #if Size_t_size > IVSIZE
1889 length = (Size_t)SvNVx(*++MARK);
1891 length = (Size_t)SvIVx(*++MARK);
1893 if ((SSize_t)length < 0) {
1895 DIE(aTHX_ "Negative length");
1900 offset = SvIVx(*++MARK);
1902 if (-offset > (IV)blen_chars) {
1904 DIE(aTHX_ "Offset outside string");
1906 offset += blen_chars;
1907 } else if (offset >= (IV)blen_chars && blen_chars > 0) {
1909 DIE(aTHX_ "Offset outside string");
1913 if (length > blen_chars - offset)
1914 length = blen_chars - offset;
1916 /* Here we convert length from characters to bytes. */
1917 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1918 /* Either we had to convert the SV, or the SV is magical, or
1919 the SV has overloading, in which case we can't or mustn't
1920 or mustn't call it again. */
1922 buffer = (const char*)utf8_hop((U8 *)buffer, offset);
1923 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1925 /* It's a real UTF-8 SV, and it's not going to change under
1926 us. Take advantage of any cache. */
1928 I32 len_I32 = length;
1930 /* Convert the start and end character positions to bytes.
1931 Remember that the second argument to sv_pos_u2b is relative
1933 sv_pos_u2b(bufsv, &start, &len_I32);
1940 buffer = buffer+offset;
1942 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1943 if (IoTYPE(io) == IoTYPE_SOCKET) {
1944 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1950 /* See the note at doio.c:do_print about filesize limits. --jhi */
1951 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1957 const int flags = SvIVx(*++MARK);
1960 char * const sockbuf = SvPVx(*++MARK, mlen);
1961 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1962 flags, (struct sockaddr *)sockbuf, mlen);
1966 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1971 DIE(aTHX_ PL_no_sock_func, "send");
1978 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1981 #if Size_t_size > IVSIZE
2000 if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */
2002 gv = PL_last_in_gv = GvEGV(PL_argvgv);
2004 if (io && !IoIFP(io)) {
2005 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2007 IoFLAGS(io) &= ~IOf_START;
2008 do_open(gv, (char *)"-", 1, FALSE, O_RDONLY, 0, NULL);
2009 sv_setpvn(GvSV(gv), "-", 1);
2010 SvSETMAGIC(GvSV(gv));
2012 else if (!nextargv(gv))
2017 gv = PL_last_in_gv; /* eof */
2020 gv = PL_last_in_gv = (GV*)POPs; /* eof(FH) */
2023 IO * const io = GvIO(gv);
2025 if (io && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
2027 XPUSHs(SvTIED_obj((SV*)io, mg));
2030 call_method("EOF", G_SCALAR);
2037 PUSHs(boolSV(!gv || do_eof(gv)));
2048 PL_last_in_gv = (GV*)POPs;
2051 if (gv && (io = GvIO(gv))) {
2052 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
2055 XPUSHs(SvTIED_obj((SV*)io, mg));
2058 call_method("TELL", G_SCALAR);
2065 #if LSEEKSIZE > IVSIZE
2066 PUSHn( do_tell(gv) );
2068 PUSHi( do_tell(gv) );
2076 const int whence = POPi;
2077 #if LSEEKSIZE > IVSIZE
2078 const Off_t offset = (Off_t)SvNVx(POPs);
2080 const Off_t offset = (Off_t)SvIVx(POPs);
2083 GV * const gv = PL_last_in_gv = (GV*)POPs;
2086 if (gv && (io = GvIO(gv))) {
2087 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
2090 XPUSHs(SvTIED_obj((SV*)io, mg));
2091 #if LSEEKSIZE > IVSIZE
2092 XPUSHs(sv_2mortal(newSVnv((NV) offset)));
2094 XPUSHs(sv_2mortal(newSViv(offset)));
2096 XPUSHs(sv_2mortal(newSViv(whence)));
2099 call_method("SEEK", G_SCALAR);
2106 if (PL_op->op_type == OP_SEEK)
2107 PUSHs(boolSV(do_seek(gv, offset, whence)));
2109 const Off_t sought = do_sysseek(gv, offset, whence);
2111 PUSHs(&PL_sv_undef);
2113 SV* const sv = sought ?
2114 #if LSEEKSIZE > IVSIZE
2119 : newSVpvn(zero_but_true, ZBTLEN);
2120 PUSHs(sv_2mortal(sv));
2129 /* There seems to be no consensus on the length type of truncate()
2130 * and ftruncate(), both off_t and size_t have supporters. In
2131 * general one would think that when using large files, off_t is
2132 * at least as wide as size_t, so using an off_t should be okay. */
2133 /* XXX Configure probe for the length type of *truncate() needed XXX */
2136 #if Off_t_size > IVSIZE
2141 /* Checking for length < 0 is problematic as the type might or
2142 * might not be signed: if it is not, clever compilers will moan. */
2143 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2150 if (PL_op->op_flags & OPf_SPECIAL) {
2151 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2160 TAINT_PROPER("truncate");
2161 if (!(fp = IoIFP(io))) {
2167 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2169 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2176 SV * const sv = POPs;
2179 if (SvTYPE(sv) == SVt_PVGV) {
2180 tmpgv = (GV*)sv; /* *main::FRED for example */
2181 goto do_ftruncate_gv;
2183 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2184 tmpgv = (GV*) SvRV(sv); /* \*main::FRED for example */
2185 goto do_ftruncate_gv;
2187 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2188 io = (IO*) SvRV(sv); /* *main::FRED{IO} for example */
2189 goto do_ftruncate_io;
2192 name = SvPV_nolen_const(sv);
2193 TAINT_PROPER("truncate");
2195 if (truncate(name, len) < 0)
2199 const int tmpfd = PerlLIO_open(name, O_RDWR);
2204 if (my_chsize(tmpfd, len) < 0)
2206 PerlLIO_close(tmpfd);
2215 SETERRNO(EBADF,RMS_IFI);
2223 SV * const argsv = POPs;
2224 const unsigned int func = POPu;
2225 const int optype = PL_op->op_type;
2226 GV * const gv = (GV*)POPs;
2227 IO * const io = gv ? GvIOn(gv) : Null(IO*);
2231 if (!io || !argsv || !IoIFP(io)) {
2232 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2233 report_evil_fh(gv, io, PL_op->op_type);
2234 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2238 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2241 s = SvPV_force(argsv, len);
2242 need = IOCPARM_LEN(func);
2244 s = Sv_Grow(argsv, need + 1);
2245 SvCUR_set(argsv, need);
2248 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2251 retval = SvIV(argsv);
2252 s = INT2PTR(char*,retval); /* ouch */
2255 TAINT_PROPER(PL_op_desc[optype]);
2257 if (optype == OP_IOCTL)
2259 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2261 DIE(aTHX_ "ioctl is not implemented");
2265 DIE(aTHX_ "fcntl is not implemented");
2267 #if defined(OS2) && defined(__EMX__)
2268 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2270 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2274 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2276 if (s[SvCUR(argsv)] != 17)
2277 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2279 s[SvCUR(argsv)] = 0; /* put our null back */
2280 SvSETMAGIC(argsv); /* Assume it has changed */
2289 PUSHp(zero_but_true, ZBTLEN);
2302 const int argtype = POPi;
2303 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : (GV*)POPs;
2305 if (gv && (io = GvIO(gv)))
2311 /* XXX Looks to me like io is always NULL at this point */
2313 (void)PerlIO_flush(fp);
2314 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2317 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2318 report_evil_fh(gv, io, PL_op->op_type);
2320 SETERRNO(EBADF,RMS_IFI);
2325 DIE(aTHX_ PL_no_func, "flock()");
2335 const int protocol = POPi;
2336 const int type = POPi;
2337 const int domain = POPi;
2338 GV * const gv = (GV*)POPs;
2339 register IO * const io = gv ? GvIOn(gv) : NULL;
2343 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2344 report_evil_fh(gv, io, PL_op->op_type);
2345 if (io && IoIFP(io))
2346 do_close(gv, FALSE);
2347 SETERRNO(EBADF,LIB_INVARG);
2352 do_close(gv, FALSE);
2354 TAINT_PROPER("socket");
2355 fd = PerlSock_socket(domain, type, protocol);
2358 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2359 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2360 IoTYPE(io) = IoTYPE_SOCKET;
2361 if (!IoIFP(io) || !IoOFP(io)) {
2362 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2363 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2364 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2367 #if defined(HAS_FCNTL) && defined(F_SETFD)
2368 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2372 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2377 DIE(aTHX_ PL_no_sock_func, "socket");
2383 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2385 const int protocol = POPi;
2386 const int type = POPi;
2387 const int domain = POPi;
2388 GV * const gv2 = (GV*)POPs;
2389 GV * const gv1 = (GV*)POPs;
2390 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2391 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2394 if (!gv1 || !gv2 || !io1 || !io2) {
2395 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2397 report_evil_fh(gv1, io1, PL_op->op_type);
2399 report_evil_fh(gv1, io2, PL_op->op_type);
2401 if (io1 && IoIFP(io1))
2402 do_close(gv1, FALSE);
2403 if (io2 && IoIFP(io2))
2404 do_close(gv2, FALSE);
2409 do_close(gv1, FALSE);
2411 do_close(gv2, FALSE);
2413 TAINT_PROPER("socketpair");
2414 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2416 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2417 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2418 IoTYPE(io1) = IoTYPE_SOCKET;
2419 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2420 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2421 IoTYPE(io2) = IoTYPE_SOCKET;
2422 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2423 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2424 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2425 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2426 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2427 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2428 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2431 #if defined(HAS_FCNTL) && defined(F_SETFD)
2432 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2433 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2438 DIE(aTHX_ PL_no_sock_func, "socketpair");
2446 SV * const addrsv = POPs;
2447 /* OK, so on what platform does bind modify addr? */
2449 GV * const gv = (GV*)POPs;
2450 register IO * const io = GvIOn(gv);
2453 if (!io || !IoIFP(io))
2456 addr = SvPV_const(addrsv, len);
2457 TAINT_PROPER("bind");
2458 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2464 if (ckWARN(WARN_CLOSED))
2465 report_evil_fh(gv, io, PL_op->op_type);
2466 SETERRNO(EBADF,SS_IVCHAN);
2469 DIE(aTHX_ PL_no_sock_func, "bind");
2477 SV * const addrsv = POPs;
2478 GV * const gv = (GV*)POPs;
2479 register IO * const io = GvIOn(gv);
2483 if (!io || !IoIFP(io))
2486 addr = SvPV_const(addrsv, len);
2487 TAINT_PROPER("connect");
2488 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2494 if (ckWARN(WARN_CLOSED))
2495 report_evil_fh(gv, io, PL_op->op_type);
2496 SETERRNO(EBADF,SS_IVCHAN);
2499 DIE(aTHX_ PL_no_sock_func, "connect");
2507 const int backlog = POPi;
2508 GV * const gv = (GV*)POPs;
2509 register IO * const io = gv ? GvIOn(gv) : NULL;
2511 if (!gv || !io || !IoIFP(io))
2514 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2520 if (ckWARN(WARN_CLOSED))
2521 report_evil_fh(gv, io, PL_op->op_type);
2522 SETERRNO(EBADF,SS_IVCHAN);
2525 DIE(aTHX_ PL_no_sock_func, "listen");
2535 char namebuf[MAXPATHLEN];
2536 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2537 Sock_size_t len = sizeof (struct sockaddr_in);
2539 Sock_size_t len = sizeof namebuf;
2541 GV * const ggv = (GV*)POPs;
2542 GV * const ngv = (GV*)POPs;
2551 if (!gstio || !IoIFP(gstio))
2555 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2558 /* Some platforms indicate zero length when an AF_UNIX client is
2559 * not bound. Simulate a non-zero-length sockaddr structure in
2561 namebuf[0] = 0; /* sun_len */
2562 namebuf[1] = AF_UNIX; /* sun_family */
2570 do_close(ngv, FALSE);
2571 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2572 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2573 IoTYPE(nstio) = IoTYPE_SOCKET;
2574 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2575 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2576 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2577 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2580 #if defined(HAS_FCNTL) && defined(F_SETFD)
2581 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2585 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2586 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2588 #ifdef __SCO_VERSION__
2589 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2592 PUSHp(namebuf, len);
2596 if (ckWARN(WARN_CLOSED))
2597 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2598 SETERRNO(EBADF,SS_IVCHAN);
2604 DIE(aTHX_ PL_no_sock_func, "accept");
2612 const int how = POPi;
2613 GV * const gv = (GV*)POPs;
2614 register IO * const io = GvIOn(gv);
2616 if (!io || !IoIFP(io))
2619 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2623 if (ckWARN(WARN_CLOSED))
2624 report_evil_fh(gv, io, PL_op->op_type);
2625 SETERRNO(EBADF,SS_IVCHAN);
2628 DIE(aTHX_ PL_no_sock_func, "shutdown");
2636 const int optype = PL_op->op_type;
2637 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2638 const unsigned int optname = (unsigned int) POPi;
2639 const unsigned int lvl = (unsigned int) POPi;
2640 GV * const gv = (GV*)POPs;
2641 register IO * const io = GvIOn(gv);
2645 if (!io || !IoIFP(io))
2648 fd = PerlIO_fileno(IoIFP(io));
2652 (void)SvPOK_only(sv);
2656 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2663 #if defined(__SYMBIAN32__)
2664 # define SETSOCKOPT_OPTION_VALUE_T void *
2666 # define SETSOCKOPT_OPTION_VALUE_T const char *
2668 /* XXX TODO: We need to have a proper type (a Configure probe,
2669 * etc.) for what the C headers think of the third argument of
2670 * setsockopt(), the option_value read-only buffer: is it
2671 * a "char *", or a "void *", const or not. Some compilers
2672 * don't take kindly to e.g. assuming that "char *" implicitly
2673 * promotes to a "void *", or to explicitly promoting/demoting
2674 * consts to non/vice versa. The "const void *" is the SUS
2675 * definition, but that does not fly everywhere for the above
2677 SETSOCKOPT_OPTION_VALUE_T buf;
2681 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2685 aint = (int)SvIV(sv);
2686 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2689 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2698 if (ckWARN(WARN_CLOSED))
2699 report_evil_fh(gv, io, optype);
2700 SETERRNO(EBADF,SS_IVCHAN);
2705 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2713 const int optype = PL_op->op_type;
2714 GV * const gv = (GV*)POPs;
2715 register IO * const io = GvIOn(gv);
2720 if (!io || !IoIFP(io))
2723 sv = sv_2mortal(newSV(257));
2724 (void)SvPOK_only(sv);
2728 fd = PerlIO_fileno(IoIFP(io));
2730 case OP_GETSOCKNAME:
2731 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2734 case OP_GETPEERNAME:
2735 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2737 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2739 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";
2740 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2741 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2742 !memcmp((char *)SvPVX_const(sv) + sizeof(u_short), nowhere,
2743 sizeof(u_short) + sizeof(struct in_addr))) {
2750 #ifdef BOGUS_GETNAME_RETURN
2751 /* Interactive Unix, getpeername() and getsockname()
2752 does not return valid namelen */
2753 if (len == BOGUS_GETNAME_RETURN)
2754 len = sizeof(struct sockaddr);
2762 if (ckWARN(WARN_CLOSED))
2763 report_evil_fh(gv, io, optype);
2764 SETERRNO(EBADF,SS_IVCHAN);
2769 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2782 if (PL_op->op_flags & OPf_REF) {
2784 if (PL_op->op_type == OP_LSTAT) {
2785 if (gv != PL_defgv) {
2786 do_fstat_warning_check:
2787 if (ckWARN(WARN_IO))
2788 Perl_warner(aTHX_ packWARN(WARN_IO),
2789 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2790 } else if (PL_laststype != OP_LSTAT)
2791 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2795 if (gv != PL_defgv) {
2796 PL_laststype = OP_STAT;
2798 sv_setpvn(PL_statname, "", 0);
2799 PL_laststatval = (GvIO(gv) && IoIFP(GvIOp(gv))
2800 ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(gv))), &PL_statcache) : -1);
2802 if (PL_laststatval < 0) {
2803 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2804 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2809 SV* const sv = POPs;
2810 if (SvTYPE(sv) == SVt_PVGV) {
2814 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2816 if (PL_op->op_type == OP_LSTAT)
2817 goto do_fstat_warning_check;
2820 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2822 PL_laststype = PL_op->op_type;
2823 if (PL_op->op_type == OP_LSTAT)
2824 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2826 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2827 if (PL_laststatval < 0) {
2828 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2829 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2835 if (gimme != G_ARRAY) {
2836 if (gimme != G_VOID)
2837 XPUSHs(boolSV(max));
2843 PUSHs(sv_2mortal(newSViv(PL_statcache.st_dev)));
2844 PUSHs(sv_2mortal(newSViv(PL_statcache.st_ino)));
2845 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_mode)));
2846 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_nlink)));
2847 #if Uid_t_size > IVSIZE
2848 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_uid)));
2850 # if Uid_t_sign <= 0
2851 PUSHs(sv_2mortal(newSViv(PL_statcache.st_uid)));
2853 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_uid)));
2856 #if Gid_t_size > IVSIZE
2857 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_gid)));
2859 # if Gid_t_sign <= 0
2860 PUSHs(sv_2mortal(newSViv(PL_statcache.st_gid)));
2862 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_gid)));
2865 #ifdef USE_STAT_RDEV
2866 PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev)));
2868 PUSHs(sv_2mortal(newSVpvs("")));
2870 #if Off_t_size > IVSIZE
2871 PUSHs(sv_2mortal(newSVnv((NV)PL_statcache.st_size)));
2873 PUSHs(sv_2mortal(newSViv(PL_statcache.st_size)));
2876 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_atime)));
2877 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_mtime)));
2878 PUSHs(sv_2mortal(newSVnv(PL_statcache.st_ctime)));
2880 PUSHs(sv_2mortal(newSViv(PL_statcache.st_atime)));
2881 PUSHs(sv_2mortal(newSViv(PL_statcache.st_mtime)));
2882 PUSHs(sv_2mortal(newSViv(PL_statcache.st_ctime)));
2884 #ifdef USE_STAT_BLOCKS
2885 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blksize)));
2886 PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blocks)));
2888 PUSHs(sv_2mortal(newSVpvs("")));
2889 PUSHs(sv_2mortal(newSVpvs("")));
2898 /* Not const, because things tweak this below. Not bool, because there's
2899 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2900 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2901 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2902 /* Giving some sort of initial value silences compilers. */
2904 int access_mode = R_OK;
2906 int access_mode = 0;
2909 /* access_mode is never used, but leaving use_access in makes the
2910 conditional compiling below much clearer. */
2913 int stat_mode = S_IRUSR;
2915 bool effective = FALSE;
2919 switch (PL_op->op_type) {
2921 #if !(defined(HAS_ACCESS) && defined(R_OK))
2927 #if defined(HAS_ACCESS) && defined(W_OK)
2932 stat_mode = S_IWUSR;
2936 #if defined(HAS_ACCESS) && defined(X_OK)
2941 stat_mode = S_IXUSR;
2945 #ifdef PERL_EFF_ACCESS
2948 stat_mode = S_IWUSR;
2952 #ifndef PERL_EFF_ACCESS
2960 #ifdef PERL_EFF_ACCESS
2965 stat_mode = S_IXUSR;
2971 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2972 const char *name = POPpx;
2974 # ifdef PERL_EFF_ACCESS
2975 result = PERL_EFF_ACCESS(name, access_mode);
2977 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
2983 result = access(name, access_mode);
2985 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3000 if (cando(stat_mode, effective, &PL_statcache))
3007 I32 result = my_stat();
3008 const int op_type = PL_op->op_type;
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 );
3042 I32 result = my_stat();
3045 /* I believe that all these three are likely to be defined on most every
3046 system these days. */
3048 if(PL_op->op_type == OP_FTSUID)
3052 if(PL_op->op_type == OP_FTSGID)
3056 if(PL_op->op_type == OP_FTSVTX)
3062 switch (PL_op->op_type) {
3064 if (PL_statcache.st_uid == PL_uid)
3068 if (PL_statcache.st_uid == PL_euid)
3072 if (PL_statcache.st_size == 0)
3076 if (S_ISSOCK(PL_statcache.st_mode))
3080 if (S_ISCHR(PL_statcache.st_mode))
3084 if (S_ISBLK(PL_statcache.st_mode))
3088 if (S_ISREG(PL_statcache.st_mode))
3092 if (S_ISDIR(PL_statcache.st_mode))
3096 if (S_ISFIFO(PL_statcache.st_mode))
3101 if (PL_statcache.st_mode & S_ISUID)
3107 if (PL_statcache.st_mode & S_ISGID)
3113 if (PL_statcache.st_mode & S_ISVTX)
3123 I32 result = my_lstat();
3127 if (S_ISLNK(PL_statcache.st_mode))
3140 if (PL_op->op_flags & OPf_REF)
3142 else if (isGV(TOPs))
3144 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3145 gv = (GV*)SvRV(POPs);
3147 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3149 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3150 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3151 else if (tmpsv && SvOK(tmpsv)) {
3153 char *tmps = SvPV(tmpsv, n_a);
3161 if (PerlLIO_isatty(fd))
3166 #if defined(atarist) /* this will work with atariST. Configure will
3167 make guesses for other systems. */
3168 # define FILE_base(f) ((f)->_base)
3169 # define FILE_ptr(f) ((f)->_ptr)
3170 # define FILE_cnt(f) ((f)->_cnt)
3171 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3181 register STDCHAR *s;
3187 if (PL_op->op_flags & OPf_REF)
3189 else if (isGV(TOPs))
3191 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3192 gv = (GV*)SvRV(POPs);
3198 if (gv == PL_defgv) {
3200 io = GvIO(PL_statgv);
3203 goto really_filename;
3208 PL_laststatval = -1;
3209 sv_setpvn(PL_statname, "", 0);
3210 io = GvIO(PL_statgv);
3212 if (io && IoIFP(io)) {
3213 if (! PerlIO_has_base(IoIFP(io)))
3214 DIE(aTHX_ "-T and -B not implemented on filehandles");
3215 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3216 if (PL_laststatval < 0)
3218 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3219 if (PL_op->op_type == OP_FTTEXT)
3224 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3225 i = PerlIO_getc(IoIFP(io));
3227 (void)PerlIO_ungetc(IoIFP(io),i);
3229 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3231 len = PerlIO_get_bufsiz(IoIFP(io));
3232 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3233 /* sfio can have large buffers - limit to 512 */
3238 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3240 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3242 SETERRNO(EBADF,RMS_IFI);
3250 PL_laststype = OP_STAT;
3251 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3252 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3253 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3255 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3258 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3259 if (PL_laststatval < 0) {
3260 (void)PerlIO_close(fp);
3263 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3264 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3265 (void)PerlIO_close(fp);
3267 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3268 RETPUSHNO; /* special case NFS directories */
3269 RETPUSHYES; /* null file is anything */
3274 /* now scan s to look for textiness */
3275 /* XXX ASCII dependent code */
3277 #if defined(DOSISH) || defined(USEMYBINMODE)
3278 /* ignore trailing ^Z on short files */
3279 if (len && len < sizeof(tbuf) && tbuf[len-1] == 26)
3283 for (i = 0; i < len; i++, s++) {
3284 if (!*s) { /* null never allowed in text */
3289 else if (!(isPRINT(*s) || isSPACE(*s)))
3292 else if (*s & 128) {
3294 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3297 /* utf8 characters don't count as odd */
3298 if (UTF8_IS_START(*s)) {
3299 int ulen = UTF8SKIP(s);
3300 if (ulen < len - i) {
3302 for (j = 1; j < ulen; j++) {
3303 if (!UTF8_IS_CONTINUATION(s[j]))
3306 --ulen; /* loop does extra increment */
3316 *s != '\n' && *s != '\r' && *s != '\b' &&
3317 *s != '\t' && *s != '\f' && *s != 27)
3322 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3333 const char *tmps = NULL;
3337 SV * const sv = POPs;
3338 if (SvTYPE(sv) == SVt_PVGV) {
3341 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
3345 tmps = SvPVx_nolen_const(sv);
3349 if( !gv && (!tmps || !*tmps) ) {
3350 HV * const table = GvHVn(PL_envgv);
3353 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3354 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3356 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3361 deprecate("chdir('') or chdir(undef) as chdir()");
3362 tmps = SvPV_nolen_const(*svp);
3366 TAINT_PROPER("chdir");
3371 TAINT_PROPER("chdir");
3374 IO* const io = GvIO(gv);
3377 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3379 else if (IoDIRP(io)) {
3381 PUSHi(fchdir(dirfd(IoDIRP(io))) >= 0);
3383 DIE(aTHX_ PL_no_func, "dirfd");
3394 DIE(aTHX_ PL_no_func, "fchdir");
3398 PUSHi( PerlDir_chdir((char *)tmps) >= 0 );
3400 /* Clear the DEFAULT element of ENV so we'll get the new value
3402 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3409 dSP; dMARK; dTARGET;
3410 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3421 char * const tmps = POPpx;
3422 TAINT_PROPER("chroot");
3423 PUSHi( chroot(tmps) >= 0 );
3426 DIE(aTHX_ PL_no_func, "chroot");
3434 const char * const tmps2 = POPpconstx;
3435 const char * const tmps = SvPV_nolen_const(TOPs);
3436 TAINT_PROPER("rename");
3438 anum = PerlLIO_rename(tmps, tmps2);
3440 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3441 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3444 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3445 (void)UNLINK(tmps2);
3446 if (!(anum = link(tmps, tmps2)))
3447 anum = UNLINK(tmps);
3455 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3459 const int op_type = PL_op->op_type;
3463 if (op_type == OP_LINK)
3464 DIE(aTHX_ PL_no_func, "link");
3466 # ifndef HAS_SYMLINK
3467 if (op_type == OP_SYMLINK)
3468 DIE(aTHX_ PL_no_func, "symlink");
3472 const char * const tmps2 = POPpconstx;
3473 const char * const tmps = SvPV_nolen_const(TOPs);
3474 TAINT_PROPER(PL_op_desc[op_type]);
3476 # if defined(HAS_LINK)
3477 # if defined(HAS_SYMLINK)
3478 /* Both present - need to choose which. */
3479 (op_type == OP_LINK) ?
3480 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3482 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3483 PerlLIO_link(tmps, tmps2);
3486 # if defined(HAS_SYMLINK)
3487 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3488 symlink(tmps, tmps2);
3493 SETi( result >= 0 );
3500 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3510 char buf[MAXPATHLEN];
3513 #ifndef INCOMPLETE_TAINTS
3517 len = readlink(tmps, buf, sizeof(buf) - 1);
3525 RETSETUNDEF; /* just pretend it's a normal file */
3529 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3531 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3533 char * const save_filename = filename;
3538 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3540 Newx(cmdline, size, char);
3541 my_strlcpy(cmdline, cmd, size);
3542 my_strlcat(cmdline, " ", size);
3543 for (s = cmdline + strlen(cmdline); *filename; ) {
3547 if (s - cmdline < size)
3548 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3549 myfp = PerlProc_popen(cmdline, "r");
3553 SV * const tmpsv = sv_newmortal();
3554 /* Need to save/restore 'PL_rs' ?? */
3555 s = sv_gets(tmpsv, myfp, 0);
3556 (void)PerlProc_pclose(myfp);
3560 #ifdef HAS_SYS_ERRLIST
3565 /* you don't see this */
3566 const char * const errmsg =
3567 #ifdef HAS_SYS_ERRLIST
3575 if (instr(s, errmsg)) {
3582 #define EACCES EPERM
3584 if (instr(s, "cannot make"))
3585 SETERRNO(EEXIST,RMS_FEX);
3586 else if (instr(s, "existing file"))
3587 SETERRNO(EEXIST,RMS_FEX);
3588 else if (instr(s, "ile exists"))
3589 SETERRNO(EEXIST,RMS_FEX);
3590 else if (instr(s, "non-exist"))
3591 SETERRNO(ENOENT,RMS_FNF);
3592 else if (instr(s, "does not exist"))
3593 SETERRNO(ENOENT,RMS_FNF);
3594 else if (instr(s, "not empty"))
3595 SETERRNO(EBUSY,SS_DEVOFFLINE);
3596 else if (instr(s, "cannot access"))
3597 SETERRNO(EACCES,RMS_PRV);
3599 SETERRNO(EPERM,RMS_PRV);
3602 else { /* some mkdirs return no failure indication */
3603 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3604 if (PL_op->op_type == OP_RMDIR)
3609 SETERRNO(EACCES,RMS_PRV); /* a guess */
3618 /* This macro removes trailing slashes from a directory name.
3619 * Different operating and file systems take differently to
3620 * trailing slashes. According to POSIX 1003.1 1996 Edition
3621 * any number of trailing slashes should be allowed.
3622 * Thusly we snip them away so that even non-conforming
3623 * systems are happy.
3624 * We should probably do this "filtering" for all
3625 * the functions that expect (potentially) directory names:
3626 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3627 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3629 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3630 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3633 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3634 (tmps) = savepvn((tmps), (len)); \
3644 const int mode = (MAXARG > 1) ? POPi : 0777;
3646 TRIMSLASHES(tmps,len,copy);
3648 TAINT_PROPER("mkdir");
3650 SETi( PerlDir_mkdir((char *)tmps, mode) >= 0 );
3654 SETi( dooneliner("mkdir", tmps) );
3655 oldumask = PerlLIO_umask(0);
3656 PerlLIO_umask(oldumask);
3657 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3672 TRIMSLASHES(tmps,len,copy);
3673 TAINT_PROPER("rmdir");
3675 SETi( PerlDir_rmdir((char *)tmps) >= 0 );
3677 SETi( dooneliner("rmdir", tmps) );
3684 /* Directory calls. */
3688 #if defined(Direntry_t) && defined(HAS_READDIR)
3690 const char * const dirname = POPpconstx;
3691 GV * const gv = (GV*)POPs;
3692 register IO * const io = GvIOn(gv);
3698 PerlDir_close(IoDIRP(io));
3699 if (!(IoDIRP(io) = PerlDir_open((char *)dirname)))
3705 SETERRNO(EBADF,RMS_DIR);
3708 DIE(aTHX_ PL_no_dir_func, "opendir");
3714 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3715 DIE(aTHX_ PL_no_dir_func, "readdir");
3717 #if !defined(I_DIRENT) && !defined(VMS)
3718 Direntry_t *readdir (DIR *);
3723 const I32 gimme = GIMME;
3724 GV * const gv = (GV *)POPs;
3725 register const Direntry_t *dp;
3726 register IO * const io = GvIOn(gv);
3728 if (!io || !IoDIRP(io)) {
3729 if(ckWARN(WARN_IO)) {
3730 Perl_warner(aTHX_ packWARN(WARN_IO),
3731 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3737 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3741 sv = newSVpvn(dp->d_name, dp->d_namlen);
3743 sv = newSVpv(dp->d_name, 0);
3745 #ifndef INCOMPLETE_TAINTS
3746 if (!(IoFLAGS(io) & IOf_UNTAINT))
3749 XPUSHs(sv_2mortal(sv));
3750 } while (gimme == G_ARRAY);
3752 if (!dp && gimme != G_ARRAY)
3759 SETERRNO(EBADF,RMS_ISI);
3760 if (GIMME == G_ARRAY)
3769 #if defined(HAS_TELLDIR) || defined(telldir)
3771 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3772 /* XXX netbsd still seemed to.
3773 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3774 --JHI 1999-Feb-02 */
3775 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3776 long telldir (DIR *);
3778 GV * const gv = (GV*)POPs;
3779 register IO * const io = GvIOn(gv);
3781 if (!io || !IoDIRP(io)) {
3782 if(ckWARN(WARN_IO)) {
3783 Perl_warner(aTHX_ packWARN(WARN_IO),
3784 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3789 PUSHi( PerlDir_tell(IoDIRP(io)) );
3793 SETERRNO(EBADF,RMS_ISI);
3796 DIE(aTHX_ PL_no_dir_func, "telldir");
3802 #if defined(HAS_SEEKDIR) || defined(seekdir)
3804 const long along = POPl;
3805 GV * const gv = (GV*)POPs;
3806 register IO * const io = GvIOn(gv);
3808 if (!io || !IoDIRP(io)) {
3809 if(ckWARN(WARN_IO)) {
3810 Perl_warner(aTHX_ packWARN(WARN_IO),
3811 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3815 (void)PerlDir_seek(IoDIRP(io), along);
3820 SETERRNO(EBADF,RMS_ISI);
3823 DIE(aTHX_ PL_no_dir_func, "seekdir");
3829 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3831 GV * const gv = (GV*)POPs;
3832 register IO * const io = GvIOn(gv);
3834 if (!io || !IoDIRP(io)) {
3835 if(ckWARN(WARN_IO)) {
3836 Perl_warner(aTHX_ packWARN(WARN_IO),
3837 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3841 (void)PerlDir_rewind(IoDIRP(io));
3845 SETERRNO(EBADF,RMS_ISI);
3848 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3854 #if defined(Direntry_t) && defined(HAS_READDIR)
3856 GV * const gv = (GV*)POPs;
3857 register IO * const io = GvIOn(gv);
3859 if (!io || !IoDIRP(io)) {
3860 if(ckWARN(WARN_IO)) {
3861 Perl_warner(aTHX_ packWARN(WARN_IO),
3862 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3866 #ifdef VOID_CLOSEDIR
3867 PerlDir_close(IoDIRP(io));
3869 if (PerlDir_close(IoDIRP(io)) < 0) {
3870 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3879 SETERRNO(EBADF,RMS_IFI);
3882 DIE(aTHX_ PL_no_dir_func, "closedir");
3886 /* Process control. */
3895 PERL_FLUSHALL_FOR_CHILD;
3896 childpid = PerlProc_fork();
3900 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
3902 SvREADONLY_off(GvSV(tmpgv));
3903 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3904 SvREADONLY_on(GvSV(tmpgv));
3906 #ifdef THREADS_HAVE_PIDS
3907 PL_ppid = (IV)getppid();
3909 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
3914 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3919 PERL_FLUSHALL_FOR_CHILD;
3920 childpid = PerlProc_fork();
3926 DIE(aTHX_ PL_no_func, "fork");
3933 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
3938 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3939 childpid = wait4pid(-1, &argflags, 0);
3941 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
3946 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3947 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
3948 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
3950 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
3955 DIE(aTHX_ PL_no_func, "wait");
3961 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
3963 const int optype = POPi;
3964 const Pid_t pid = TOPi;
3968 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
3969 result = wait4pid(pid, &argflags, optype);
3971 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
3976 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3977 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
3978 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
3980 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
3985 DIE(aTHX_ PL_no_func, "waitpid");
3991 dSP; dMARK; dORIGMARK; dTARGET;
3997 while (++MARK <= SP) {
3998 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4003 TAINT_PROPER("system");
4005 PERL_FLUSHALL_FOR_CHILD;
4006 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4012 if (PerlProc_pipe(pp) >= 0)
4014 while ((childpid = PerlProc_fork()) == -1) {
4015 if (errno != EAGAIN) {
4020 PerlLIO_close(pp[0]);
4021 PerlLIO_close(pp[1]);
4028 Sigsave_t ihand,qhand; /* place to save signals during system() */
4032 PerlLIO_close(pp[1]);
4034 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4035 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4038 result = wait4pid(childpid, &status, 0);
4039 } while (result == -1 && errno == EINTR);
4041 (void)rsignal_restore(SIGINT, &ihand);
4042 (void)rsignal_restore(SIGQUIT, &qhand);
4044 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4045 do_execfree(); /* free any memory child malloced on fork */
4052 while (n < sizeof(int)) {
4053 n1 = PerlLIO_read(pp[0],
4054 (void*)(((char*)&errkid)+n),
4060 PerlLIO_close(pp[0]);
4061 if (n) { /* Error */
4062 if (n != sizeof(int))
4063 DIE(aTHX_ "panic: kid popen errno read");
4064 errno = errkid; /* Propagate errno from kid */
4065 STATUS_NATIVE_CHILD_SET(-1);
4068 XPUSHi(STATUS_CURRENT);
4072 PerlLIO_close(pp[0]);
4073 #if defined(HAS_FCNTL) && defined(F_SETFD)
4074 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4077 if (PL_op->op_flags & OPf_STACKED) {
4078 SV * const really = *++MARK;
4079 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4081 else if (SP - MARK != 1)
4082 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4084 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4088 #else /* ! FORK or VMS or OS/2 */
4091 if (PL_op->op_flags & OPf_STACKED) {
4092 SV * const really = *++MARK;
4093 # if defined(WIN32) || defined(OS2) || defined(SYMBIAN)
4094 value = (I32)do_aspawn(really, MARK, SP);
4096 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4099 else if (SP - MARK != 1) {
4100 # if defined(WIN32) || defined(OS2) || defined(SYMBIAN)
4101 value = (I32)do_aspawn(NULL, MARK, SP);
4103 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4107 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4109 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4111 STATUS_NATIVE_CHILD_SET(value);
4114 XPUSHi(result ? value : STATUS_CURRENT);
4115 #endif /* !FORK or VMS */
4121 dSP; dMARK; dORIGMARK; dTARGET;
4126 while (++MARK <= SP) {
4127 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4132 TAINT_PROPER("exec");
4134 PERL_FLUSHALL_FOR_CHILD;
4135 if (PL_op->op_flags & OPf_STACKED) {
4136 SV * const really = *++MARK;
4137 value = (I32)do_aexec(really, MARK, SP);
4139 else if (SP - MARK != 1)
4141 value = (I32)vms_do_aexec(NULL, MARK, SP);
4145 (void ) do_aspawn(NULL, MARK, SP);
4149 value = (I32)do_aexec(NULL, MARK, SP);
4154 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4157 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4160 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4174 # ifdef THREADS_HAVE_PIDS
4175 if (PL_ppid != 1 && getppid() == 1)
4176 /* maybe the parent process has died. Refresh ppid cache */
4180 XPUSHi( getppid() );
4184 DIE(aTHX_ PL_no_func, "getppid");
4193 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4196 pgrp = (I32)BSD_GETPGRP(pid);
4198 if (pid != 0 && pid != PerlProc_getpid())
4199 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4205 DIE(aTHX_ PL_no_func, "getpgrp()");
4224 TAINT_PROPER("setpgrp");
4226 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4228 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4229 || (pid != 0 && pid != PerlProc_getpid()))
4231 DIE(aTHX_ "setpgrp can't take arguments");
4233 SETi( setpgrp() >= 0 );
4234 #endif /* USE_BSDPGRP */
4237 DIE(aTHX_ PL_no_func, "setpgrp()");
4243 #ifdef HAS_GETPRIORITY
4245 const int who = POPi;
4246 const int which = TOPi;
4247 SETi( getpriority(which, who) );
4250 DIE(aTHX_ PL_no_func, "getpriority()");
4256 #ifdef HAS_SETPRIORITY
4258 const int niceval = POPi;
4259 const int who = POPi;
4260 const int which = TOPi;
4261 TAINT_PROPER("setpriority");
4262 SETi( setpriority(which, who, niceval) >= 0 );
4265 DIE(aTHX_ PL_no_func, "setpriority()");
4275 XPUSHn( time(NULL) );
4277 XPUSHi( time(NULL) );
4288 (void)PerlProc_times(&PL_timesbuf);
4290 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4291 /* struct tms, though same data */
4295 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick)));
4296 if (GIMME == G_ARRAY) {
4297 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick)));
4298 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick)));
4299 PUSHs(sv_2mortal(newSVnv(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick)));
4305 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4307 if (GIMME == G_ARRAY) {
4308 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4309 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4310 PUSHs(sv_2mortal(newSVnv((NV)0.0)));
4314 DIE(aTHX_ "times not implemented");
4316 #endif /* HAS_TIMES */
4319 #ifdef LOCALTIME_EDGECASE_BROKEN
4320 static struct tm *S_my_localtime (pTHX_ Time_t *tp)
4325 /* No workarounds in the valid range */
4326 if (!tp || *tp < 0x7fff573f || *tp >= 0x80000000)
4327 return (localtime (tp));
4329 /* This edge case is to workaround the undefined behaviour, where the
4330 * TIMEZONE makes the time go beyond the defined range.
4331 * gmtime (0x7fffffff) => 2038-01-19 03:14:07
4332 * If there is a negative offset in TZ, like MET-1METDST, some broken
4333 * implementations of localtime () (like AIX 5.2) barf with bogus
4335 * 0x7fffffff gmtime 2038-01-19 03:14:07
4336 * 0x7fffffff localtime 1901-12-13 21:45:51
4337 * 0x7fffffff mylocaltime 2038-01-19 04:14:07
4338 * 0x3c19137f gmtime 2001-12-13 20:45:51
4339 * 0x3c19137f localtime 2001-12-13 21:45:51
4340 * 0x3c19137f mylocaltime 2001-12-13 21:45:51
4341 * Given that legal timezones are typically between GMT-12 and GMT+12
4342 * we turn back the clock 23 hours before calling the localtime
4343 * function, and add those to the return value. This will never cause
4344 * day wrapping problems, since the edge case is Tue Jan *19*
4346 T = *tp - 82800; /* 23 hour. allows up to GMT-23 */
4349 if (P->tm_hour >= 24) {
4351 P->tm_mday++; /* 18 -> 19 */
4352 P->tm_wday++; /* Mon -> Tue */
4353 P->tm_yday++; /* 18 -> 19 */
4356 } /* S_my_localtime */
4363 const struct tm *tmbuf;
4364 static const char * const dayname[] =
4365 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4366 static const char * const monname[] =
4367 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4368 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4374 when = (Time_t)SvNVx(POPs);
4376 when = (Time_t)SvIVx(POPs);
4379 if (PL_op->op_type == OP_LOCALTIME)
4380 #ifdef LOCALTIME_EDGECASE_BROKEN
4381 tmbuf = S_my_localtime(aTHX_ &when);
4383 tmbuf = localtime(&when);
4386 tmbuf = gmtime(&when);
4388 if (GIMME != G_ARRAY) {
4394 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
4395 dayname[tmbuf->tm_wday],
4396 monname[tmbuf->tm_mon],
4401 tmbuf->tm_year + 1900);
4402 PUSHs(sv_2mortal(tsv));
4407 PUSHs(sv_2mortal(newSViv(tmbuf->tm_sec)));
4408 PUSHs(sv_2mortal(newSViv(tmbuf->tm_min)));
4409 PUSHs(sv_2mortal(newSViv(tmbuf->tm_hour)));
4410 PUSHs(sv_2mortal(newSViv(tmbuf->tm_mday)));
4411 PUSHs(sv_2mortal(newSViv(tmbuf->tm_mon)));
4412 PUSHs(sv_2mortal(newSViv(tmbuf->tm_year)));
4413 PUSHs(sv_2mortal(newSViv(tmbuf->tm_wday)));
4414 PUSHs(sv_2mortal(newSViv(tmbuf->tm_yday)));
4415 PUSHs(sv_2mortal(newSViv(tmbuf->tm_isdst)));
4426 anum = alarm((unsigned int)anum);
4433 DIE(aTHX_ PL_no_func, "alarm");
4444 (void)time(&lasttime);
4449 PerlProc_sleep((unsigned int)duration);
4452 XPUSHi(when - lasttime);
4456 /* Shared memory. */
4457 /* Merged with some message passing. */
4461 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4462 dSP; dMARK; dTARGET;
4463 const int op_type = PL_op->op_type;
4468 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4471 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4474 value = (I32)(do_semop(MARK, SP) >= 0);
4477 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4493 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4494 dSP; dMARK; dTARGET;
4495 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4502 DIE(aTHX_ "System V IPC is not implemented on this machine");
4508 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4509 dSP; dMARK; dTARGET;
4510 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4518 PUSHp(zero_but_true, ZBTLEN);
4526 /* I can't const this further without getting warnings about the types of
4527 various arrays passed in from structures. */
4529 S_space_join_names_mortal(pTHX_ char *const *array)
4533 if (array && *array) {
4534 target = sv_2mortal(newSVpvs(""));
4536 sv_catpv(target, *array);
4539 sv_catpvs(target, " ");
4542 target = sv_mortalcopy(&PL_sv_no);
4547 /* Get system info. */
4551 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4553 I32 which = PL_op->op_type;
4554 register char **elem;
4556 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4557 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4558 struct hostent *gethostbyname(Netdb_name_t);
4559 struct hostent *gethostent(void);
4561 struct hostent *hent;
4565 if (which == OP_GHBYNAME) {
4566 #ifdef HAS_GETHOSTBYNAME
4567 const char* const name = POPpbytex;
4568 hent = PerlSock_gethostbyname(name);
4570 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4573 else if (which == OP_GHBYADDR) {
4574 #ifdef HAS_GETHOSTBYADDR
4575 const int addrtype = POPi;
4576 SV * const addrsv = POPs;
4578 Netdb_host_t addr = (Netdb_host_t) SvPVbyte(addrsv, addrlen);
4580 hent = PerlSock_gethostbyaddr((const char*)addr, (Netdb_hlen_t) addrlen, addrtype);
4582 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4586 #ifdef HAS_GETHOSTENT
4587 hent = PerlSock_gethostent();
4589 DIE(aTHX_ PL_no_sock_func, "gethostent");
4592 #ifdef HOST_NOT_FOUND
4594 #ifdef USE_REENTRANT_API
4595 # ifdef USE_GETHOSTENT_ERRNO
4596 h_errno = PL_reentrant_buffer->_gethostent_errno;
4599 STATUS_UNIX_SET(h_errno);
4603 if (GIMME != G_ARRAY) {
4604 PUSHs(sv = sv_newmortal());
4606 if (which == OP_GHBYNAME) {
4608 sv_setpvn(sv, hent->h_addr, hent->h_length);
4611 sv_setpv(sv, (char*)hent->h_name);
4617 PUSHs(sv_2mortal(newSVpv((char*)hent->h_name, 0)));
4618 PUSHs(space_join_names_mortal(hent->h_aliases));
4619 PUSHs(sv_2mortal(newSViv((IV)hent->h_addrtype)));
4620 len = hent->h_length;
4621 PUSHs(sv_2mortal(newSViv((IV)len)));
4623 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4624 XPUSHs(sv_2mortal(newSVpvn(*elem, len)));
4628 PUSHs(newSVpvn(hent->h_addr, len));
4630 PUSHs(sv_mortalcopy(&PL_sv_no));
4635 DIE(aTHX_ PL_no_sock_func, "gethostent");
4641 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4643 I32 which = PL_op->op_type;
4645 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4646 struct netent *getnetbyaddr(Netdb_net_t, int);
4647 struct netent *getnetbyname(Netdb_name_t);
4648 struct netent *getnetent(void);
4650 struct netent *nent;
4652 if (which == OP_GNBYNAME){
4653 #ifdef HAS_GETNETBYNAME
4654 const char * const name = POPpbytex;
4655 nent = PerlSock_getnetbyname(name);
4657 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4660 else if (which == OP_GNBYADDR) {
4661 #ifdef HAS_GETNETBYADDR
4662 const int addrtype = POPi;
4663 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4664 nent = PerlSock_getnetbyaddr(addr, addrtype);
4666 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4670 #ifdef HAS_GETNETENT
4671 nent = PerlSock_getnetent();
4673 DIE(aTHX_ PL_no_sock_func, "getnetent");
4676 #ifdef HOST_NOT_FOUND
4678 #ifdef USE_REENTRANT_API
4679 # ifdef USE_GETNETENT_ERRNO
4680 h_errno = PL_reentrant_buffer->_getnetent_errno;
4683 STATUS_UNIX_SET(h_errno);
4688 if (GIMME != G_ARRAY) {
4689 PUSHs(sv = sv_newmortal());
4691 if (which == OP_GNBYNAME)
4692 sv_setiv(sv, (IV)nent->n_net);
4694 sv_setpv(sv, nent->n_name);
4700 PUSHs(sv_2mortal(newSVpv(nent->n_name, 0)));
4701 PUSHs(space_join_names_mortal(nent->n_aliases));
4702 PUSHs(sv_2mortal(newSViv((IV)nent->n_addrtype)));
4703 PUSHs(sv_2mortal(newSViv((IV)nent->n_net)));
4708 DIE(aTHX_ PL_no_sock_func, "getnetent");
4714 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4716 I32 which = PL_op->op_type;
4718 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4719 struct protoent *getprotobyname(Netdb_name_t);
4720 struct protoent *getprotobynumber(int);
4721 struct protoent *getprotoent(void);
4723 struct protoent *pent;
4725 if (which == OP_GPBYNAME) {
4726 #ifdef HAS_GETPROTOBYNAME
4727 const char* const name = POPpbytex;
4728 pent = PerlSock_getprotobyname(name);
4730 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4733 else if (which == OP_GPBYNUMBER) {
4734 #ifdef HAS_GETPROTOBYNUMBER
4735 const int number = POPi;
4736 pent = PerlSock_getprotobynumber(number);
4738 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4742 #ifdef HAS_GETPROTOENT
4743 pent = PerlSock_getprotoent();
4745 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4749 if (GIMME != G_ARRAY) {
4750 PUSHs(sv = sv_newmortal());
4752 if (which == OP_GPBYNAME)
4753 sv_setiv(sv, (IV)pent->p_proto);
4755 sv_setpv(sv, pent->p_name);
4761 PUSHs(sv_2mortal(newSVpv(pent->p_name, 0)));
4762 PUSHs(space_join_names_mortal(pent->p_aliases));
4763 PUSHs(sv_2mortal(newSViv((IV)pent->p_proto)));
4768 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4774 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4776 I32 which = PL_op->op_type;
4778 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4779 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4780 struct servent *getservbyport(int, Netdb_name_t);
4781 struct servent *getservent(void);
4783 struct servent *sent;
4785 if (which == OP_GSBYNAME) {
4786 #ifdef HAS_GETSERVBYNAME
4787 const char * const proto = POPpbytex;
4788 const char * const name = POPpbytex;
4789 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4791 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4794 else if (which == OP_GSBYPORT) {
4795 #ifdef HAS_GETSERVBYPORT
4796 const char * const proto = POPpbytex;
4797 unsigned short port = (unsigned short)POPu;
4799 port = PerlSock_htons(port);
4801 sent = PerlSock_getservbyport(port, (proto && !*proto) ? Nullch : proto);
4803 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4807 #ifdef HAS_GETSERVENT
4808 sent = PerlSock_getservent();
4810 DIE(aTHX_ PL_no_sock_func, "getservent");
4814 if (GIMME != G_ARRAY) {
4815 PUSHs(sv = sv_newmortal());
4817 if (which == OP_GSBYNAME) {
4819 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4821 sv_setiv(sv, (IV)(sent->s_port));
4825 sv_setpv(sv, sent->s_name);
4831 PUSHs(sv_2mortal(newSVpv(sent->s_name, 0)));
4832 PUSHs(space_join_names_mortal(sent->s_aliases));
4834 PUSHs(sv_2mortal(newSViv((IV)PerlSock_ntohs(sent->s_port))));
4836 PUSHs(sv_2mortal(newSViv((IV)(sent->s_port))));
4838 PUSHs(sv_2mortal(newSVpv(sent->s_proto, 0)));
4843 DIE(aTHX_ PL_no_sock_func, "getservent");
4849 #ifdef HAS_SETHOSTENT
4851 PerlSock_sethostent(TOPi);
4854 DIE(aTHX_ PL_no_sock_func, "sethostent");
4860 #ifdef HAS_SETNETENT
4862 PerlSock_setnetent(TOPi);
4865 DIE(aTHX_ PL_no_sock_func, "setnetent");
4871 #ifdef HAS_SETPROTOENT
4873 PerlSock_setprotoent(TOPi);
4876 DIE(aTHX_ PL_no_sock_func, "setprotoent");
4882 #ifdef HAS_SETSERVENT
4884 PerlSock_setservent(TOPi);
4887 DIE(aTHX_ PL_no_sock_func, "setservent");
4893 #ifdef HAS_ENDHOSTENT
4895 PerlSock_endhostent();
4899 DIE(aTHX_ PL_no_sock_func, "endhostent");
4905 #ifdef HAS_ENDNETENT
4907 PerlSock_endnetent();
4911 DIE(aTHX_ PL_no_sock_func, "endnetent");
4917 #ifdef HAS_ENDPROTOENT
4919 PerlSock_endprotoent();
4923 DIE(aTHX_ PL_no_sock_func, "endprotoent");
4929 #ifdef HAS_ENDSERVENT
4931 PerlSock_endservent();
4935 DIE(aTHX_ PL_no_sock_func, "endservent");
4943 I32 which = PL_op->op_type;
4945 struct passwd *pwent = NULL;
4947 * We currently support only the SysV getsp* shadow password interface.
4948 * The interface is declared in <shadow.h> and often one needs to link
4949 * with -lsecurity or some such.
4950 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
4953 * AIX getpwnam() is clever enough to return the encrypted password
4954 * only if the caller (euid?) is root.
4956 * There are at least three other shadow password APIs. Many platforms
4957 * seem to contain more than one interface for accessing the shadow
4958 * password databases, possibly for compatibility reasons.
4959 * The getsp*() is by far he simplest one, the other two interfaces
4960 * are much more complicated, but also very similar to each other.
4965 * struct pr_passwd *getprpw*();
4966 * The password is in
4967 * char getprpw*(...).ufld.fd_encrypt[]
4968 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
4973 * struct es_passwd *getespw*();
4974 * The password is in
4975 * char *(getespw*(...).ufld.fd_encrypt)
4976 * Mention HAS_GETESPWNAM here so that Configure probes for it.
4979 * struct userpw *getuserpw();
4980 * The password is in
4981 * char *(getuserpw(...)).spw_upw_passwd
4982 * (but the de facto standard getpwnam() should work okay)
4984 * Mention I_PROT here so that Configure probes for it.
4986 * In HP-UX for getprpw*() the manual page claims that one should include
4987 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
4988 * if one includes <shadow.h> as that includes <hpsecurity.h>,
4989 * and pp_sys.c already includes <shadow.h> if there is such.
4991 * Note that <sys/security.h> is already probed for, but currently
4992 * it is only included in special cases.
4994 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
4995 * be preferred interface, even though also the getprpw*() interface
4996 * is available) one needs to link with -lsecurity -ldb -laud -lm.
4997 * One also needs to call set_auth_parameters() in main() before
4998 * doing anything else, whether one is using getespw*() or getprpw*().
5000 * Note that accessing the shadow databases can be magnitudes
5001 * slower than accessing the standard databases.
5006 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5007 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5008 * the pw_comment is left uninitialized. */
5009 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5015 const char* const name = POPpbytex;
5016 pwent = getpwnam(name);
5022 pwent = getpwuid(uid);
5026 # ifdef HAS_GETPWENT
5028 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5029 if (pwent) pwent = getpwnam(pwent->pw_name);
5032 DIE(aTHX_ PL_no_func, "getpwent");
5038 if (GIMME != G_ARRAY) {
5039 PUSHs(sv = sv_newmortal());
5041 if (which == OP_GPWNAM)
5042 # if Uid_t_sign <= 0
5043 sv_setiv(sv, (IV)pwent->pw_uid);
5045 sv_setuv(sv, (UV)pwent->pw_uid);
5048 sv_setpv(sv, pwent->pw_name);
5054 PUSHs(sv_2mortal(newSVpv(pwent->pw_name, 0)));
5056 PUSHs(sv = sv_2mortal(newSViv(0)));
5057 /* If we have getspnam(), we try to dig up the shadow
5058 * password. If we are underprivileged, the shadow
5059 * interface will set the errno to EACCES or similar,
5060 * and return a null pointer. If this happens, we will
5061 * use the dummy password (usually "*" or "x") from the
5062 * standard password database.
5064 * In theory we could skip the shadow call completely
5065 * if euid != 0 but in practice we cannot know which
5066 * security measures are guarding the shadow databases
5067 * on a random platform.
5069 * Resist the urge to use additional shadow interfaces.
5070 * Divert the urge to writing an extension instead.
5073 /* Some AIX setups falsely(?) detect some getspnam(), which
5074 * has a different API than the Solaris/IRIX one. */
5075 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5077 const int saverrno = errno;
5078 const struct spwd * const spwent = getspnam(pwent->pw_name);
5079 /* Save and restore errno so that
5080 * underprivileged attempts seem
5081 * to have never made the unsccessful
5082 * attempt to retrieve the shadow password. */
5084 if (spwent && spwent->sp_pwdp)
5085 sv_setpv(sv, spwent->sp_pwdp);
5089 if (!SvPOK(sv)) /* Use the standard password, then. */
5090 sv_setpv(sv, pwent->pw_passwd);
5093 # ifndef INCOMPLETE_TAINTS
5094 /* passwd is tainted because user himself can diddle with it.
5095 * admittedly not much and in a very limited way, but nevertheless. */
5099 # if Uid_t_sign <= 0
5100 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_uid)));
5102 PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_uid)));
5105 # if Uid_t_sign <= 0
5106 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_gid)));
5108 PUSHs(sv_2mortal(newSVuv((UV)pwent->pw_gid)));
5110 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5111 * because of the poor interface of the Perl getpw*(),
5112 * not because there's some standard/convention saying so.
5113 * A better interface would have been to return a hash,
5114 * but we are accursed by our history, alas. --jhi. */
5116 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_change)));
5119 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_quota)));
5122 PUSHs(sv_2mortal(newSVpv(pwent->pw_age, 0)));
5124 /* I think that you can never get this compiled, but just in case. */
5125 PUSHs(sv_mortalcopy(&PL_sv_no));
5130 /* pw_class and pw_comment are mutually exclusive--.
5131 * see the above note for pw_change, pw_quota, and pw_age. */
5133 PUSHs(sv_2mortal(newSVpv(pwent->pw_class, 0)));
5136 PUSHs(sv_2mortal(newSVpv(pwent->pw_comment, 0)));
5138 /* I think that you can never get this compiled, but just in case. */
5139 PUSHs(sv_mortalcopy(&PL_sv_no));
5144 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5146 PUSHs(sv_mortalcopy(&PL_sv_no));
5148 # ifndef INCOMPLETE_TAINTS
5149 /* pw_gecos is tainted because user himself can diddle with it. */
5153 PUSHs(sv_2mortal(newSVpv(pwent->pw_dir, 0)));
5155 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5156 # ifndef INCOMPLETE_TAINTS
5157 /* pw_shell is tainted because user himself can diddle with it. */
5162 PUSHs(sv_2mortal(newSViv((IV)pwent->pw_expire)));
5167 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5173 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5178 DIE(aTHX_ PL_no_func, "setpwent");
5184 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5189 DIE(aTHX_ PL_no_func, "endpwent");
5197 const I32 which = PL_op->op_type;
5198 const struct group *grent;
5200 if (which == OP_GGRNAM) {
5201 const char* const name = POPpbytex;
5202 grent = (const struct group *)getgrnam(name);
5204 else if (which == OP_GGRGID) {
5205 const Gid_t gid = POPi;
5206 grent = (const struct group *)getgrgid(gid);
5210 grent = (struct group *)getgrent();
5212 DIE(aTHX_ PL_no_func, "getgrent");
5216 if (GIMME != G_ARRAY) {
5217 SV * const sv = sv_newmortal();
5221 if (which == OP_GGRNAM)
5222 sv_setiv(sv, (IV)grent->gr_gid);
5224 sv_setpv(sv, grent->gr_name);
5230 PUSHs(sv_2mortal(newSVpv(grent->gr_name, 0)));
5233 PUSHs(sv_2mortal(newSVpv(grent->gr_passwd, 0)));
5235 PUSHs(sv_mortalcopy(&PL_sv_no));
5238 PUSHs(sv_2mortal(newSViv((IV)grent->gr_gid)));
5240 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5241 /* In UNICOS/mk (_CRAYMPP) the multithreading
5242 * versions (getgrnam_r, getgrgid_r)
5243 * seem to return an illegal pointer
5244 * as the group members list, gr_mem.
5245 * getgrent() doesn't even have a _r version
5246 * but the gr_mem is poisonous anyway.
5247 * So yes, you cannot get the list of group
5248 * members if building multithreaded in UNICOS/mk. */
5249 PUSHs(space_join_names_mortal(grent->gr_mem));
5255 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5261 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5266 DIE(aTHX_ PL_no_func, "setgrent");
5272 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5277 DIE(aTHX_ PL_no_func, "endgrent");
5287 if (!(tmps = PerlProc_getlogin()))
5289 PUSHp(tmps, strlen(tmps));
5292 DIE(aTHX_ PL_no_func, "getlogin");
5296 /* Miscellaneous. */
5301 dSP; dMARK; dORIGMARK; dTARGET;
5302 register I32 items = SP - MARK;
5303 unsigned long a[20];
5308 while (++MARK <= SP) {
5309 if (SvTAINTED(*MARK)) {
5315 TAINT_PROPER("syscall");
5318 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5319 * or where sizeof(long) != sizeof(char*). But such machines will
5320 * not likely have syscall implemented either, so who cares?
5322 while (++MARK <= SP) {
5323 if (SvNIOK(*MARK) || !i)
5324 a[i++] = SvIV(*MARK);
5325 else if (*MARK == &PL_sv_undef)
5328 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5334 DIE(aTHX_ "Too many args to syscall");
5336 DIE(aTHX_ "Too few args to syscall");
5338 retval = syscall(a[0]);
5341 retval = syscall(a[0],a[1]);
5344 retval = syscall(a[0],a[1],a[2]);
5347 retval = syscall(a[0],a[1],a[2],a[3]);
5350 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5353 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5356 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5359 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5363 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5366 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5369 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5373 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5377 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5381 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5382 a[10],a[11],a[12],a[13]);
5384 #endif /* atarist */
5390 DIE(aTHX_ PL_no_func, "syscall");
5394 #ifdef FCNTL_EMULATE_FLOCK
5396 /* XXX Emulate flock() with fcntl().
5397 What's really needed is a good file locking module.
5401 fcntl_emulate_flock(int fd, int operation)
5405 switch (operation & ~LOCK_NB) {
5407 flock.l_type = F_RDLCK;
5410 flock.l_type = F_WRLCK;
5413 flock.l_type = F_UNLCK;
5419 flock.l_whence = SEEK_SET;
5420 flock.l_start = flock.l_len = (Off_t)0;
5422 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5425 #endif /* FCNTL_EMULATE_FLOCK */
5427 #ifdef LOCKF_EMULATE_FLOCK
5429 /* XXX Emulate flock() with lockf(). This is just to increase
5430 portability of scripts. The calls are not completely
5431 interchangeable. What's really needed is a good file
5435 /* The lockf() constants might have been defined in <unistd.h>.
5436 Unfortunately, <unistd.h> causes troubles on some mixed
5437 (BSD/POSIX) systems, such as SunOS 4.1.3.
5439 Further, the lockf() constants aren't POSIX, so they might not be
5440 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5441 just stick in the SVID values and be done with it. Sigh.
5445 # define F_ULOCK 0 /* Unlock a previously locked region */
5448 # define F_LOCK 1 /* Lock a region for exclusive use */
5451 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5454 # define F_TEST 3 /* Test a region for other processes locks */
5458 lockf_emulate_flock(int fd, int operation)
5461 const int save_errno = errno;
5464 /* flock locks entire file so for lockf we need to do the same */
5465 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5466 if (pos > 0) /* is seekable and needs to be repositioned */
5467 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5468 pos = -1; /* seek failed, so don't seek back afterwards */
5471 switch (operation) {
5473 /* LOCK_SH - get a shared lock */
5475 /* LOCK_EX - get an exclusive lock */
5477 i = lockf (fd, F_LOCK, 0);
5480 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5481 case LOCK_SH|LOCK_NB:
5482 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5483 case LOCK_EX|LOCK_NB:
5484 i = lockf (fd, F_TLOCK, 0);
5486 if ((errno == EAGAIN) || (errno == EACCES))
5487 errno = EWOULDBLOCK;
5490 /* LOCK_UN - unlock (non-blocking is a no-op) */
5492 case LOCK_UN|LOCK_NB:
5493 i = lockf (fd, F_ULOCK, 0);
5496 /* Default - can't decipher operation */
5503 if (pos > 0) /* need to restore position of the handle */
5504 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5509 #endif /* LOCKF_EMULATE_FLOCK */
5513 * c-indentation-style: bsd
5515 * indent-tabs-mode: t
5518 * ex: set ts=8 sts=4 sw=4 noet: