3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
20 /* This file contains system pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
30 #define PERL_IN_PP_SYS_C
36 /* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
45 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
53 # include <sys/wait.h>
57 # include <sys/resource.h>
66 # include <sys/select.h>
70 /* XXX Configure test needed.
71 h_errno might not be a simple 'int', especially for multi-threaded
72 applications, see "extern int errno in perl.h". Creating such
73 a test requires taking into account the differences between
74 compiling multithreaded and singlethreaded ($ccflags et al).
75 HOST_NOT_FOUND is typically defined in <netdb.h>.
77 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
86 struct passwd *getpwnam (char *);
87 struct passwd *getpwuid (Uid_t);
92 struct passwd *getpwent (void);
93 #elif defined (VMS) && defined (my_getpwent)
94 struct passwd *Perl_my_getpwent (pTHX);
103 struct group *getgrnam (char *);
104 struct group *getgrgid (Gid_t);
108 struct group *getgrent (void);
114 # if defined(_MSC_VER) || defined(__MINGW32__)
115 # include <sys/utime.h>
122 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
125 # define my_chsize PerlLIO_chsize
128 # define my_chsize PerlLIO_chsize
130 I32 my_chsize(int fd, Off_t length);
136 #else /* no flock() */
138 /* fcntl.h might not have been included, even if it exists, because
139 the current Configure only sets I_FCNTL if it's needed to pick up
140 the *_OK constants. Make sure it has been included before testing
141 the fcntl() locking constants. */
142 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
146 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
147 # define FLOCK fcntl_emulate_flock
148 # define FCNTL_EMULATE_FLOCK
149 # else /* no flock() or fcntl(F_SETLK,...) */
151 # define FLOCK lockf_emulate_flock
152 # define LOCKF_EMULATE_FLOCK
154 # endif /* no flock() or fcntl(F_SETLK,...) */
157 static int FLOCK (int, int);
160 * These are the flock() constants. Since this sytems doesn't have
161 * flock(), the values of the constants are probably not available.
175 # endif /* emulating flock() */
177 #endif /* no flock() */
180 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
182 #if defined(I_SYS_ACCESS) && !defined(R_OK)
183 # include <sys/access.h>
186 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
187 # define FD_CLOEXEC 1 /* NeXT needs this */
193 /* Missing protos on LynxOS */
194 void sethostent(int);
195 void endhostent(void);
197 void endnetent(void);
198 void setprotoent(int);
199 void endprotoent(void);
200 void setservent(int);
201 void endservent(void);
204 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
206 /* F_OK unused: if stat() cannot find it... */
208 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
209 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
210 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
214 # ifdef I_SYS_SECURITY
215 # include <sys/security.h>
219 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
222 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
226 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
228 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
232 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
233 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
234 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
237 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
239 const Uid_t ruid = getuid();
240 const Uid_t euid = geteuid();
241 const Gid_t rgid = getgid();
242 const Gid_t egid = getegid();
245 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
246 Perl_croak(aTHX_ "switching effective uid is not implemented");
249 if (setreuid(euid, ruid))
252 if (setresuid(euid, ruid, (Uid_t)-1))
255 Perl_croak(aTHX_ "entering effective uid failed");
258 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
259 Perl_croak(aTHX_ "switching effective gid is not implemented");
262 if (setregid(egid, rgid))
265 if (setresgid(egid, rgid, (Gid_t)-1))
268 Perl_croak(aTHX_ "entering effective gid failed");
271 res = access(path, mode);
274 if (setreuid(ruid, euid))
277 if (setresuid(ruid, euid, (Uid_t)-1))
280 Perl_croak(aTHX_ "leaving effective uid failed");
283 if (setregid(rgid, egid))
286 if (setresgid(rgid, egid, (Gid_t)-1))
289 Perl_croak(aTHX_ "leaving effective gid failed");
293 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
300 const char * const tmps = POPpconstx;
301 const I32 gimme = GIMME_V;
302 const char *mode = "r";
305 if (PL_op->op_private & OPpOPEN_IN_RAW)
307 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
309 fp = PerlProc_popen(tmps, mode);
311 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
313 PerlIO_apply_layers(aTHX_ fp,mode,type);
315 if (gimme == G_VOID) {
317 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
320 else if (gimme == G_SCALAR) {
321 ENTER_with_name("backtick");
323 PL_rs = &PL_sv_undef;
324 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
325 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
327 LEAVE_with_name("backtick");
333 SV * const sv = newSV(79);
334 if (sv_gets(sv, fp, 0) == NULL) {
339 if (SvLEN(sv) - SvCUR(sv) > 20) {
340 SvPV_shrink_to_cur(sv);
345 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
346 TAINT; /* "I believe that this is not gratuitous!" */
349 STATUS_NATIVE_CHILD_SET(-1);
350 if (gimme == G_SCALAR)
361 tryAMAGICunTARGET(iter, -1);
363 /* Note that we only ever get here if File::Glob fails to load
364 * without at the same time croaking, for some reason, or if
365 * perl was built with PERL_EXTERNAL_GLOB */
367 ENTER_with_name("glob");
372 * The external globbing program may use things we can't control,
373 * so for security reasons we must assume the worst.
376 taint_proper(PL_no_security, "glob");
380 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
381 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
383 SAVESPTR(PL_rs); /* This is not permanent, either. */
384 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
387 *SvPVX(PL_rs) = '\n';
391 result = do_readline();
392 LEAVE_with_name("glob");
399 PL_last_in_gv = cGVOP_gv;
400 return do_readline();
411 do_join(TARG, &PL_sv_no, MARK, SP);
415 else if (SP == MARK) {
424 if (SvROK(exsv) || (pv = SvPV_const(exsv, len), len)) {
425 /* well-formed exception supplied */
427 else if (SvROK(ERRSV)) {
430 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
431 exsv = sv_mortalcopy(ERRSV);
432 sv_catpvs(exsv, "\t...caught");
435 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
448 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
450 if (SP - MARK != 1) {
452 do_join(TARG, &PL_sv_no, MARK, SP);
460 if (SvROK(exsv) || (pv = SvPV_const(exsv, len), len)) {
461 /* well-formed exception supplied */
463 else if (SvROK(ERRSV)) {
465 if (sv_isobject(exsv)) {
466 HV * const stash = SvSTASH(SvRV(exsv));
467 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
469 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
470 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
477 call_sv(MUTABLE_SV(GvCV(gv)),
478 G_SCALAR|G_EVAL|G_KEEPERR);
479 exsv = sv_mortalcopy(*PL_stack_sp--);
483 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
484 exsv = sv_mortalcopy(ERRSV);
485 sv_catpvs(exsv, "\t...propagated");
488 exsv = newSVpvs_flags("Died", SVs_TEMP);
506 GV * const gv = MUTABLE_GV(*++MARK);
509 DIE(aTHX_ PL_no_usym, "filehandle");
511 if ((io = GvIOp(gv))) {
513 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
516 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
517 "Opening dirhandle %s also as a file",
520 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
522 /* Method's args are same as ours ... */
523 /* ... except handle is replaced by the object */
524 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
527 ENTER_with_name("call_OPEN");
528 call_method("OPEN", G_SCALAR);
529 LEAVE_with_name("call_OPEN");
542 tmps = SvPV_const(sv, len);
543 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
546 PUSHi( (I32)PL_forkprocess );
547 else if (PL_forkprocess == 0) /* we are a new child */
554 /* These are private to this function, which is private to this file.
555 Use 0x04 rather than the next available bit, to help the compiler if the
556 architecture can generate more efficient instructions. */
557 #define MORTALIZE_NOT_NEEDED 0x04
558 #define TIED_HANDLE_ARGC_SHIFT 3
561 S_tied_handle_method(pTHX_ const char *const methname, SV **sp,
562 IO *const io, MAGIC *const mg, const U32 flags, ...)
564 U32 argc = flags >> TIED_HANDLE_ARGC_SHIFT;
566 PERL_ARGS_ASSERT_TIED_HANDLE_METHOD;
568 /* Ensure that our flag bits do not overlap. */
569 assert((MORTALIZE_NOT_NEEDED & G_WANT) == 0);
570 assert((G_WANT >> TIED_HANDLE_ARGC_SHIFT) == 0);
573 PUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
575 const U32 mortalize_not_needed = flags & MORTALIZE_NOT_NEEDED;
577 va_start(args, flags);
579 SV *const arg = va_arg(args, SV *);
580 if(mortalize_not_needed)
589 ENTER_with_name("call_tied_handle_method");
590 call_method(methname, flags & G_WANT);
591 LEAVE_with_name("call_tied_handle_method");
595 #define tied_handle_method(a,b,c,d) \
596 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR)
597 #define tied_handle_method1(a,b,c,d,e) \
598 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR | (1 << TIED_HANDLE_ARGC_SHIFT),e)
599 #define tied_handle_method2(a,b,c,d,e,f) \
600 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR | (2 << TIED_HANDLE_ARGC_SHIFT), e,f)
605 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
611 IO * const io = GvIO(gv);
613 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
615 return tied_handle_method("CLOSE", SP, io, mg);
619 PUSHs(boolSV(do_close(gv, TRUE)));
632 GV * const wgv = MUTABLE_GV(POPs);
633 GV * const rgv = MUTABLE_GV(POPs);
638 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
639 DIE(aTHX_ PL_no_usym, "filehandle");
644 do_close(rgv, FALSE);
646 do_close(wgv, FALSE);
648 if (PerlProc_pipe(fd) < 0)
651 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
652 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
653 IoOFP(rstio) = IoIFP(rstio);
654 IoIFP(wstio) = IoOFP(wstio);
655 IoTYPE(rstio) = IoTYPE_RDONLY;
656 IoTYPE(wstio) = IoTYPE_WRONLY;
658 if (!IoIFP(rstio) || !IoOFP(wstio)) {
660 PerlIO_close(IoIFP(rstio));
662 PerlLIO_close(fd[0]);
664 PerlIO_close(IoOFP(wstio));
666 PerlLIO_close(fd[1]);
669 #if defined(HAS_FCNTL) && defined(F_SETFD)
670 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
671 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
678 DIE(aTHX_ PL_no_func, "pipe");
692 gv = MUTABLE_GV(POPs);
694 if (gv && (io = GvIO(gv))
695 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
697 return tied_handle_method("FILENO", SP, io, mg);
700 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
701 /* Can't do this because people seem to do things like
702 defined(fileno($foo)) to check whether $foo is a valid fh.
703 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
704 report_evil_fh(gv, io, PL_op->op_type);
709 PUSHi(PerlIO_fileno(fp));
722 anum = PerlLIO_umask(022);
723 /* setting it to 022 between the two calls to umask avoids
724 * to have a window where the umask is set to 0 -- meaning
725 * that another thread could create world-writeable files. */
727 (void)PerlLIO_umask(anum);
730 anum = PerlLIO_umask(POPi);
731 TAINT_PROPER("umask");
734 /* Only DIE if trying to restrict permissions on "user" (self).
735 * Otherwise it's harmless and more useful to just return undef
736 * since 'group' and 'other' concepts probably don't exist here. */
737 if (MAXARG >= 1 && (POPi & 0700))
738 DIE(aTHX_ "umask not implemented");
739 XPUSHs(&PL_sv_undef);
758 gv = MUTABLE_GV(POPs);
760 if (gv && (io = GvIO(gv))) {
761 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
763 /* This takes advantage of the implementation of the varargs
764 function, which I don't think that the optimiser will be able to
765 figure out. Although, as it's a static function, in theory it
767 return S_tied_handle_method(aTHX_ "BINMODE", SP, io, mg,
768 G_SCALAR|MORTALIZE_NOT_NEEDED
770 ? (1 << TIED_HANDLE_ARGC_SHIFT) : 0),
775 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
776 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
777 report_evil_fh(gv, io, PL_op->op_type);
778 SETERRNO(EBADF,RMS_IFI);
785 const char *d = NULL;
788 d = SvPV_const(discp, len);
789 mode = mode_from_discipline(d, len);
790 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
791 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
792 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
813 const I32 markoff = MARK - PL_stack_base;
814 const char *methname;
815 int how = PERL_MAGIC_tied;
819 switch(SvTYPE(varsv)) {
821 methname = "TIEHASH";
822 HvEITER_set(MUTABLE_HV(varsv), 0);
825 methname = "TIEARRAY";
828 if (isGV_with_GP(varsv)) {
829 methname = "TIEHANDLE";
830 how = PERL_MAGIC_tiedscalar;
831 /* For tied filehandles, we apply tiedscalar magic to the IO
832 slot of the GP rather than the GV itself. AMS 20010812 */
834 GvIOp(varsv) = newIO();
835 varsv = MUTABLE_SV(GvIOp(varsv));
840 methname = "TIESCALAR";
841 how = PERL_MAGIC_tiedscalar;
845 if (sv_isobject(*MARK)) { /* Calls GET magic. */
846 ENTER_with_name("call_TIE");
847 PUSHSTACKi(PERLSI_MAGIC);
849 EXTEND(SP,(I32)items);
853 call_method(methname, G_SCALAR);
856 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
857 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
858 * wrong error message, and worse case, supreme action at a distance.
859 * (Sorry obfuscation writers. You're not going to be given this one.)
862 const char *name = SvPV_nomg_const(*MARK, len);
863 stash = gv_stashpvn(name, len, 0);
864 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
865 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
866 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
868 ENTER_with_name("call_TIE");
869 PUSHSTACKi(PERLSI_MAGIC);
871 EXTEND(SP,(I32)items);
875 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
881 if (sv_isobject(sv)) {
882 sv_unmagic(varsv, how);
883 /* Croak if a self-tie on an aggregate is attempted. */
884 if (varsv == SvRV(sv) &&
885 (SvTYPE(varsv) == SVt_PVAV ||
886 SvTYPE(varsv) == SVt_PVHV))
888 "Self-ties of arrays and hashes are not supported");
889 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
891 LEAVE_with_name("call_TIE");
892 SP = PL_stack_base + markoff;
902 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
903 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
905 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
908 if ((mg = SvTIED_mg(sv, how))) {
909 SV * const obj = SvRV(SvTIED_obj(sv, mg));
911 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
913 if (gv && isGV(gv) && (cv = GvCV(gv))) {
915 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
916 mXPUSHi(SvREFCNT(obj) - 1);
918 ENTER_with_name("call_UNTIE");
919 call_sv(MUTABLE_SV(cv), G_VOID);
920 LEAVE_with_name("call_UNTIE");
923 else if (mg && SvREFCNT(obj) > 1) {
924 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
925 "untie attempted while %"UVuf" inner references still exist",
926 (UV)SvREFCNT(obj) - 1 ) ;
930 sv_unmagic(sv, how) ;
940 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
941 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
943 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
946 if ((mg = SvTIED_mg(sv, how))) {
947 SV *osv = SvTIED_obj(sv, mg);
948 if (osv == mg->mg_obj)
949 osv = sv_mortalcopy(osv);
963 HV * const hv = MUTABLE_HV(POPs);
964 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
965 stash = gv_stashsv(sv, 0);
966 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
968 require_pv("AnyDBM_File.pm");
970 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
971 DIE(aTHX_ "No dbm on this machine");
981 mPUSHu(O_RDWR|O_CREAT);
986 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
989 if (!sv_isobject(TOPs)) {
997 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1001 if (sv_isobject(TOPs)) {
1002 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1003 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1020 struct timeval timebuf;
1021 struct timeval *tbuf = &timebuf;
1024 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1029 # if BYTEORDER & 0xf0000
1030 # define ORDERBYTE (0x88888888 - BYTEORDER)
1032 # define ORDERBYTE (0x4444 - BYTEORDER)
1038 for (i = 1; i <= 3; i++) {
1039 SV * const sv = SP[i];
1042 if (SvREADONLY(sv)) {
1044 sv_force_normal_flags(sv, 0);
1045 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1046 Perl_croak_no_modify(aTHX);
1049 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1050 SvPV_force_nolen(sv); /* force string conversion */
1057 /* little endians can use vecs directly */
1058 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1065 masksize = NFDBITS / NBBY;
1067 masksize = sizeof(long); /* documented int, everyone seems to use long */
1069 Zero(&fd_sets[0], 4, char*);
1072 # if SELECT_MIN_BITS == 1
1073 growsize = sizeof(fd_set);
1075 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1076 # undef SELECT_MIN_BITS
1077 # define SELECT_MIN_BITS __FD_SETSIZE
1079 /* If SELECT_MIN_BITS is greater than one we most probably will want
1080 * to align the sizes with SELECT_MIN_BITS/8 because for example
1081 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1082 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1083 * on (sets/tests/clears bits) is 32 bits. */
1084 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1092 timebuf.tv_sec = (long)value;
1093 value -= (NV)timebuf.tv_sec;
1094 timebuf.tv_usec = (long)(value * 1000000.0);
1099 for (i = 1; i <= 3; i++) {
1101 if (!SvOK(sv) || SvCUR(sv) == 0) {
1108 Sv_Grow(sv, growsize);
1112 while (++j <= growsize) {
1116 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1118 Newx(fd_sets[i], growsize, char);
1119 for (offset = 0; offset < growsize; offset += masksize) {
1120 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1121 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1124 fd_sets[i] = SvPVX(sv);
1128 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1129 /* Can't make just the (void*) conditional because that would be
1130 * cpp #if within cpp macro, and not all compilers like that. */
1131 nfound = PerlSock_select(
1133 (Select_fd_set_t) fd_sets[1],
1134 (Select_fd_set_t) fd_sets[2],
1135 (Select_fd_set_t) fd_sets[3],
1136 (void*) tbuf); /* Workaround for compiler bug. */
1138 nfound = PerlSock_select(
1140 (Select_fd_set_t) fd_sets[1],
1141 (Select_fd_set_t) fd_sets[2],
1142 (Select_fd_set_t) fd_sets[3],
1145 for (i = 1; i <= 3; i++) {
1148 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1150 for (offset = 0; offset < growsize; offset += masksize) {
1151 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1152 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1154 Safefree(fd_sets[i]);
1161 if (GIMME == G_ARRAY && tbuf) {
1162 value = (NV)(timebuf.tv_sec) +
1163 (NV)(timebuf.tv_usec) / 1000000.0;
1168 DIE(aTHX_ "select not implemented");
1173 =for apidoc setdefout
1175 Sets PL_defoutgv, the default file handle for output, to the passed in
1176 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1177 count of the passed in typeglob is increased by one, and the reference count
1178 of the typeglob that PL_defoutgv points to is decreased by one.
1184 Perl_setdefout(pTHX_ GV *gv)
1187 SvREFCNT_inc_simple_void(gv);
1188 SvREFCNT_dec(PL_defoutgv);
1196 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1197 GV * egv = GvEGVx(PL_defoutgv);
1201 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1203 XPUSHs(&PL_sv_undef);
1205 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1206 if (gvp && *gvp == egv) {
1207 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1211 mXPUSHs(newRV(MUTABLE_SV(egv)));
1216 if (!GvIO(newdefout))
1217 gv_IOadd(newdefout);
1218 setdefout(newdefout);
1228 GV * const gv = (MAXARG==0) ? PL_stdingv : MUTABLE_GV(POPs);
1233 if (gv && (io = GvIO(gv))) {
1234 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1236 const U32 gimme = GIMME_V;
1237 S_tied_handle_method(aTHX_ "GETC", SP, io, mg, gimme);
1238 if (gimme == G_SCALAR) {
1240 SvSetMagicSV_nosteal(TARG, TOPs);
1245 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1246 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1247 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1248 report_evil_fh(gv, io, PL_op->op_type);
1249 SETERRNO(EBADF,RMS_IFI);
1253 sv_setpvs(TARG, " ");
1254 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1255 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1256 /* Find out how many bytes the char needs */
1257 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1260 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1261 SvCUR_set(TARG,1+len);
1270 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1273 register PERL_CONTEXT *cx;
1274 const I32 gimme = GIMME_V;
1276 PERL_ARGS_ASSERT_DOFORM;
1281 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1282 PUSHFORMAT(cx, retop);
1284 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1286 setdefout(gv); /* locally select filehandle so $% et al work */
1305 gv = MUTABLE_GV(POPs);
1319 goto not_a_format_reference;
1324 tmpsv = sv_newmortal();
1325 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1326 name = SvPV_nolen_const(tmpsv);
1328 DIE(aTHX_ "Undefined format \"%s\" called", name);
1330 not_a_format_reference:
1331 DIE(aTHX_ "Not a format reference");
1334 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1336 IoFLAGS(io) &= ~IOf_DIDTOP;
1337 return doform(cv,gv,PL_op->op_next);
1343 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1344 register IO * const io = GvIOp(gv);
1349 register PERL_CONTEXT *cx;
1351 if (!io || !(ofp = IoOFP(io)))
1354 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1355 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1357 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1358 PL_formtarget != PL_toptarget)
1362 if (!IoTOP_GV(io)) {
1365 if (!IoTOP_NAME(io)) {
1367 if (!IoFMT_NAME(io))
1368 IoFMT_NAME(io) = savepv(GvNAME(gv));
1369 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1370 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1371 if ((topgv && GvFORM(topgv)) ||
1372 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1373 IoTOP_NAME(io) = savesvpv(topname);
1375 IoTOP_NAME(io) = savepvs("top");
1377 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1378 if (!topgv || !GvFORM(topgv)) {
1379 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1382 IoTOP_GV(io) = topgv;
1384 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1385 I32 lines = IoLINES_LEFT(io);
1386 const char *s = SvPVX_const(PL_formtarget);
1387 if (lines <= 0) /* Yow, header didn't even fit!!! */
1389 while (lines-- > 0) {
1390 s = strchr(s, '\n');
1396 const STRLEN save = SvCUR(PL_formtarget);
1397 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1398 do_print(PL_formtarget, ofp);
1399 SvCUR_set(PL_formtarget, save);
1400 sv_chop(PL_formtarget, s);
1401 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1404 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1405 do_print(PL_formfeed, ofp);
1406 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1408 PL_formtarget = PL_toptarget;
1409 IoFLAGS(io) |= IOf_DIDTOP;
1412 DIE(aTHX_ "bad top format reference");
1415 SV * const sv = sv_newmortal();
1417 gv_efullname4(sv, fgv, NULL, FALSE);
1418 name = SvPV_nolen_const(sv);
1420 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1422 DIE(aTHX_ "Undefined top format called");
1424 if (cv && CvCLONE(cv))
1425 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1426 return doform(cv, gv, PL_op);
1430 POPBLOCK(cx,PL_curpm);
1436 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1438 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1439 else if (ckWARN(WARN_CLOSED))
1440 report_evil_fh(gv, io, PL_op->op_type);
1445 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1446 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1448 if (!do_print(PL_formtarget, fp))
1451 FmLINES(PL_formtarget) = 0;
1452 SvCUR_set(PL_formtarget, 0);
1453 *SvEND(PL_formtarget) = '\0';
1454 if (IoFLAGS(io) & IOf_FLUSH)
1455 (void)PerlIO_flush(fp);
1460 PL_formtarget = PL_bodytarget;
1462 PERL_UNUSED_VAR(newsp);
1463 PERL_UNUSED_VAR(gimme);
1464 return cx->blk_sub.retop;
1469 dVAR; dSP; dMARK; dORIGMARK;
1475 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1477 if (gv && (io = GvIO(gv))) {
1478 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1480 if (MARK == ORIGMARK) {
1483 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1487 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1490 call_method("PRINTF", G_SCALAR);
1493 MARK = ORIGMARK + 1;
1501 if (!(io = GvIO(gv))) {
1502 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1503 report_evil_fh(gv, io, PL_op->op_type);
1504 SETERRNO(EBADF,RMS_IFI);
1507 else if (!(fp = IoOFP(io))) {
1508 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1510 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1511 else if (ckWARN(WARN_CLOSED))
1512 report_evil_fh(gv, io, PL_op->op_type);
1514 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1518 if (SvTAINTED(MARK[1]))
1519 TAINT_PROPER("printf");
1520 do_sprintf(sv, SP - MARK, MARK + 1);
1521 if (!do_print(sv, fp))
1524 if (IoFLAGS(io) & IOf_FLUSH)
1525 if (PerlIO_flush(fp) == EOF)
1536 PUSHs(&PL_sv_undef);
1544 const int perm = (MAXARG > 3) ? POPi : 0666;
1545 const int mode = POPi;
1546 SV * const sv = POPs;
1547 GV * const gv = MUTABLE_GV(POPs);
1550 /* Need TIEHANDLE method ? */
1551 const char * const tmps = SvPV_const(sv, len);
1552 /* FIXME? do_open should do const */
1553 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1554 IoLINES(GvIOp(gv)) = 0;
1558 PUSHs(&PL_sv_undef);
1565 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1571 Sock_size_t bufsize;
1579 bool charstart = FALSE;
1580 STRLEN charskip = 0;
1583 GV * const gv = MUTABLE_GV(*++MARK);
1584 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1585 && gv && (io = GvIO(gv)) )
1587 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1591 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1593 call_method("READ", G_SCALAR);
1607 sv_setpvs(bufsv, "");
1608 length = SvIVx(*++MARK);
1611 offset = SvIVx(*++MARK);
1615 if (!io || !IoIFP(io)) {
1616 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1617 report_evil_fh(gv, io, PL_op->op_type);
1618 SETERRNO(EBADF,RMS_IFI);
1621 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1622 buffer = SvPVutf8_force(bufsv, blen);
1623 /* UTF-8 may not have been set if they are all low bytes */
1628 buffer = SvPV_force(bufsv, blen);
1629 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1632 DIE(aTHX_ "Negative length");
1640 if (PL_op->op_type == OP_RECV) {
1641 char namebuf[MAXPATHLEN];
1642 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1643 bufsize = sizeof (struct sockaddr_in);
1645 bufsize = sizeof namebuf;
1647 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1651 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1652 /* 'offset' means 'flags' here */
1653 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1654 (struct sockaddr *)namebuf, &bufsize);
1658 /* Bogus return without padding */
1659 bufsize = sizeof (struct sockaddr_in);
1661 SvCUR_set(bufsv, count);
1662 *SvEND(bufsv) = '\0';
1663 (void)SvPOK_only(bufsv);
1667 /* This should not be marked tainted if the fp is marked clean */
1668 if (!(IoFLAGS(io) & IOf_UNTAINT))
1669 SvTAINTED_on(bufsv);
1671 sv_setpvn(TARG, namebuf, bufsize);
1676 if (PL_op->op_type == OP_RECV)
1677 DIE(aTHX_ PL_no_sock_func, "recv");
1679 if (DO_UTF8(bufsv)) {
1680 /* offset adjust in characters not bytes */
1681 blen = sv_len_utf8(bufsv);
1684 if (-offset > (int)blen)
1685 DIE(aTHX_ "Offset outside string");
1688 if (DO_UTF8(bufsv)) {
1689 /* convert offset-as-chars to offset-as-bytes */
1690 if (offset >= (int)blen)
1691 offset += SvCUR(bufsv) - blen;
1693 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1696 bufsize = SvCUR(bufsv);
1697 /* Allocating length + offset + 1 isn't perfect in the case of reading
1698 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1700 (should be 2 * length + offset + 1, or possibly something longer if
1701 PL_encoding is true) */
1702 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1703 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1704 Zero(buffer+bufsize, offset-bufsize, char);
1706 buffer = buffer + offset;
1708 read_target = bufsv;
1710 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1711 concatenate it to the current buffer. */
1713 /* Truncate the existing buffer to the start of where we will be
1715 SvCUR_set(bufsv, offset);
1717 read_target = sv_newmortal();
1718 SvUPGRADE(read_target, SVt_PV);
1719 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1722 if (PL_op->op_type == OP_SYSREAD) {
1723 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1724 if (IoTYPE(io) == IoTYPE_SOCKET) {
1725 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1731 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1736 #ifdef HAS_SOCKET__bad_code_maybe
1737 if (IoTYPE(io) == IoTYPE_SOCKET) {
1738 char namebuf[MAXPATHLEN];
1739 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1740 bufsize = sizeof (struct sockaddr_in);
1742 bufsize = sizeof namebuf;
1744 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1745 (struct sockaddr *)namebuf, &bufsize);
1750 count = PerlIO_read(IoIFP(io), buffer, length);
1751 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1752 if (count == 0 && PerlIO_error(IoIFP(io)))
1756 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1757 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1760 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1761 *SvEND(read_target) = '\0';
1762 (void)SvPOK_only(read_target);
1763 if (fp_utf8 && !IN_BYTES) {
1764 /* Look at utf8 we got back and count the characters */
1765 const char *bend = buffer + count;
1766 while (buffer < bend) {
1768 skip = UTF8SKIP(buffer);
1771 if (buffer - charskip + skip > bend) {
1772 /* partial character - try for rest of it */
1773 length = skip - (bend-buffer);
1774 offset = bend - SvPVX_const(bufsv);
1786 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1787 provided amount read (count) was what was requested (length)
1789 if (got < wanted && count == length) {
1790 length = wanted - got;
1791 offset = bend - SvPVX_const(bufsv);
1794 /* return value is character count */
1798 else if (buffer_utf8) {
1799 /* Let svcatsv upgrade the bytes we read in to utf8.
1800 The buffer is a mortal so will be freed soon. */
1801 sv_catsv_nomg(bufsv, read_target);
1804 /* This should not be marked tainted if the fp is marked clean */
1805 if (!(IoFLAGS(io) & IOf_UNTAINT))
1806 SvTAINTED_on(bufsv);
1818 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1824 STRLEN orig_blen_bytes;
1825 const int op_type = PL_op->op_type;
1829 GV *const gv = MUTABLE_GV(*++MARK);
1830 if (PL_op->op_type == OP_SYSWRITE
1831 && gv && (io = GvIO(gv))) {
1832 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1836 if (MARK == SP - 1) {
1838 mXPUSHi(sv_len(sv));
1843 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1845 call_method("WRITE", G_SCALAR);
1861 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1863 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1864 if (io && IoIFP(io))
1865 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1867 report_evil_fh(gv, io, PL_op->op_type);
1869 SETERRNO(EBADF,RMS_IFI);
1873 /* Do this first to trigger any overloading. */
1874 buffer = SvPV_const(bufsv, blen);
1875 orig_blen_bytes = blen;
1876 doing_utf8 = DO_UTF8(bufsv);
1878 if (PerlIO_isutf8(IoIFP(io))) {
1879 if (!SvUTF8(bufsv)) {
1880 /* We don't modify the original scalar. */
1881 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1882 buffer = (char *) tmpbuf;
1886 else if (doing_utf8) {
1887 STRLEN tmplen = blen;
1888 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1891 buffer = (char *) tmpbuf;
1895 assert((char *)result == buffer);
1896 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1900 if (op_type == OP_SYSWRITE) {
1901 Size_t length = 0; /* This length is in characters. */
1907 /* The SV is bytes, and we've had to upgrade it. */
1908 blen_chars = orig_blen_bytes;
1910 /* The SV really is UTF-8. */
1911 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1912 /* Don't call sv_len_utf8 again because it will call magic
1913 or overloading a second time, and we might get back a
1914 different result. */
1915 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1917 /* It's safe, and it may well be cached. */
1918 blen_chars = sv_len_utf8(bufsv);
1926 length = blen_chars;
1928 #if Size_t_size > IVSIZE
1929 length = (Size_t)SvNVx(*++MARK);
1931 length = (Size_t)SvIVx(*++MARK);
1933 if ((SSize_t)length < 0) {
1935 DIE(aTHX_ "Negative length");
1940 offset = SvIVx(*++MARK);
1942 if (-offset > (IV)blen_chars) {
1944 DIE(aTHX_ "Offset outside string");
1946 offset += blen_chars;
1947 } else if (offset > (IV)blen_chars) {
1949 DIE(aTHX_ "Offset outside string");
1953 if (length > blen_chars - offset)
1954 length = blen_chars - offset;
1956 /* Here we convert length from characters to bytes. */
1957 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1958 /* Either we had to convert the SV, or the SV is magical, or
1959 the SV has overloading, in which case we can't or mustn't
1960 or mustn't call it again. */
1962 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1963 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1965 /* It's a real UTF-8 SV, and it's not going to change under
1966 us. Take advantage of any cache. */
1968 I32 len_I32 = length;
1970 /* Convert the start and end character positions to bytes.
1971 Remember that the second argument to sv_pos_u2b is relative
1973 sv_pos_u2b(bufsv, &start, &len_I32);
1980 buffer = buffer+offset;
1982 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1983 if (IoTYPE(io) == IoTYPE_SOCKET) {
1984 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1990 /* See the note at doio.c:do_print about filesize limits. --jhi */
1991 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1997 const int flags = SvIVx(*++MARK);
2000 char * const sockbuf = SvPVx(*++MARK, mlen);
2001 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
2002 flags, (struct sockaddr *)sockbuf, mlen);
2006 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
2011 DIE(aTHX_ PL_no_sock_func, "send");
2018 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2021 #if Size_t_size > IVSIZE
2041 * in Perl 5.12 and later, the additional parameter is a bitmask:
2044 * 2 = eof() <- ARGV magic
2046 * I'll rely on the compiler's trace flow analysis to decide whether to
2047 * actually assign this out here, or punt it into the only block where it is
2048 * used. Doing it out here is DRY on the condition logic.
2053 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2059 if (PL_op->op_flags & OPf_SPECIAL) {
2060 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2064 gv = PL_last_in_gv; /* eof */
2072 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2073 return tied_handle_method1("EOF", SP, io, mg, newSVuv(which));
2076 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2077 if (io && !IoIFP(io)) {
2078 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2080 IoFLAGS(io) &= ~IOf_START;
2081 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2083 sv_setpvs(GvSV(gv), "-");
2085 GvSV(gv) = newSVpvs("-");
2086 SvSETMAGIC(GvSV(gv));
2088 else if (!nextargv(gv))
2093 PUSHs(boolSV(do_eof(gv)));
2104 PL_last_in_gv = MUTABLE_GV(POPs);
2109 if (gv && (io = GvIO(gv))) {
2110 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2112 return tied_handle_method("TELL", SP, io, mg);
2117 SETERRNO(EBADF,RMS_IFI);
2122 #if LSEEKSIZE > IVSIZE
2123 PUSHn( do_tell(gv) );
2125 PUSHi( do_tell(gv) );
2133 const int whence = POPi;
2134 #if LSEEKSIZE > IVSIZE
2135 const Off_t offset = (Off_t)SvNVx(POPs);
2137 const Off_t offset = (Off_t)SvIVx(POPs);
2140 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2143 if (gv && (io = GvIO(gv))) {
2144 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2146 #if LSEEKSIZE > IVSIZE
2147 SV *const offset_sv = newSVnv((NV) offset);
2149 SV *const offset_sv = newSViv(offset);
2152 return tied_handle_method2("SEEK", SP, io, mg, offset_sv,
2157 if (PL_op->op_type == OP_SEEK)
2158 PUSHs(boolSV(do_seek(gv, offset, whence)));
2160 const Off_t sought = do_sysseek(gv, offset, whence);
2162 PUSHs(&PL_sv_undef);
2164 SV* const sv = sought ?
2165 #if LSEEKSIZE > IVSIZE
2170 : newSVpvn(zero_but_true, ZBTLEN);
2181 /* There seems to be no consensus on the length type of truncate()
2182 * and ftruncate(), both off_t and size_t have supporters. In
2183 * general one would think that when using large files, off_t is
2184 * at least as wide as size_t, so using an off_t should be okay. */
2185 /* XXX Configure probe for the length type of *truncate() needed XXX */
2188 #if Off_t_size > IVSIZE
2193 /* Checking for length < 0 is problematic as the type might or
2194 * might not be signed: if it is not, clever compilers will moan. */
2195 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2202 if (PL_op->op_flags & OPf_SPECIAL) {
2203 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2212 TAINT_PROPER("truncate");
2213 if (!(fp = IoIFP(io))) {
2219 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2221 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2228 SV * const sv = POPs;
2231 if (isGV_with_GP(sv)) {
2232 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2233 goto do_ftruncate_gv;
2235 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2236 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2237 goto do_ftruncate_gv;
2239 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2240 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2241 goto do_ftruncate_io;
2244 name = SvPV_nolen_const(sv);
2245 TAINT_PROPER("truncate");
2247 if (truncate(name, len) < 0)
2251 const int tmpfd = PerlLIO_open(name, O_RDWR);
2256 if (my_chsize(tmpfd, len) < 0)
2258 PerlLIO_close(tmpfd);
2267 SETERRNO(EBADF,RMS_IFI);
2275 SV * const argsv = POPs;
2276 const unsigned int func = POPu;
2277 const int optype = PL_op->op_type;
2278 GV * const gv = MUTABLE_GV(POPs);
2279 IO * const io = gv ? GvIOn(gv) : NULL;
2283 if (!io || !argsv || !IoIFP(io)) {
2284 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2285 report_evil_fh(gv, io, PL_op->op_type);
2286 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2290 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2293 s = SvPV_force(argsv, len);
2294 need = IOCPARM_LEN(func);
2296 s = Sv_Grow(argsv, need + 1);
2297 SvCUR_set(argsv, need);
2300 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2303 retval = SvIV(argsv);
2304 s = INT2PTR(char*,retval); /* ouch */
2307 TAINT_PROPER(PL_op_desc[optype]);
2309 if (optype == OP_IOCTL)
2311 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2313 DIE(aTHX_ "ioctl is not implemented");
2317 DIE(aTHX_ "fcntl is not implemented");
2319 #if defined(OS2) && defined(__EMX__)
2320 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2322 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2326 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2328 if (s[SvCUR(argsv)] != 17)
2329 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2331 s[SvCUR(argsv)] = 0; /* put our null back */
2332 SvSETMAGIC(argsv); /* Assume it has changed */
2341 PUSHp(zero_but_true, ZBTLEN);
2354 const int argtype = POPi;
2355 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2357 if (gv && (io = GvIO(gv)))
2363 /* XXX Looks to me like io is always NULL at this point */
2365 (void)PerlIO_flush(fp);
2366 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2369 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2370 report_evil_fh(gv, io, PL_op->op_type);
2372 SETERRNO(EBADF,RMS_IFI);
2377 DIE(aTHX_ PL_no_func, "flock()");
2387 const int protocol = POPi;
2388 const int type = POPi;
2389 const int domain = POPi;
2390 GV * const gv = MUTABLE_GV(POPs);
2391 register IO * const io = gv ? GvIOn(gv) : NULL;
2395 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2396 report_evil_fh(gv, io, PL_op->op_type);
2397 if (io && IoIFP(io))
2398 do_close(gv, FALSE);
2399 SETERRNO(EBADF,LIB_INVARG);
2404 do_close(gv, FALSE);
2406 TAINT_PROPER("socket");
2407 fd = PerlSock_socket(domain, type, protocol);
2410 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2411 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2412 IoTYPE(io) = IoTYPE_SOCKET;
2413 if (!IoIFP(io) || !IoOFP(io)) {
2414 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2415 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2416 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2419 #if defined(HAS_FCNTL) && defined(F_SETFD)
2420 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2424 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2429 DIE(aTHX_ PL_no_sock_func, "socket");
2435 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2437 const int protocol = POPi;
2438 const int type = POPi;
2439 const int domain = POPi;
2440 GV * const gv2 = MUTABLE_GV(POPs);
2441 GV * const gv1 = MUTABLE_GV(POPs);
2442 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2443 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2446 if (!gv1 || !gv2 || !io1 || !io2) {
2447 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2449 report_evil_fh(gv1, io1, PL_op->op_type);
2451 report_evil_fh(gv1, io2, PL_op->op_type);
2453 if (io1 && IoIFP(io1))
2454 do_close(gv1, FALSE);
2455 if (io2 && IoIFP(io2))
2456 do_close(gv2, FALSE);
2461 do_close(gv1, FALSE);
2463 do_close(gv2, FALSE);
2465 TAINT_PROPER("socketpair");
2466 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2468 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2469 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2470 IoTYPE(io1) = IoTYPE_SOCKET;
2471 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2472 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2473 IoTYPE(io2) = IoTYPE_SOCKET;
2474 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2475 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2476 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2477 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2478 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2479 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2480 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2483 #if defined(HAS_FCNTL) && defined(F_SETFD)
2484 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2485 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2490 DIE(aTHX_ PL_no_sock_func, "socketpair");
2498 SV * const addrsv = POPs;
2499 /* OK, so on what platform does bind modify addr? */
2501 GV * const gv = MUTABLE_GV(POPs);
2502 register IO * const io = GvIOn(gv);
2505 if (!io || !IoIFP(io))
2508 addr = SvPV_const(addrsv, len);
2509 TAINT_PROPER("bind");
2510 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2516 if (ckWARN(WARN_CLOSED))
2517 report_evil_fh(gv, io, PL_op->op_type);
2518 SETERRNO(EBADF,SS_IVCHAN);
2521 DIE(aTHX_ PL_no_sock_func, "bind");
2529 SV * const addrsv = POPs;
2530 GV * const gv = MUTABLE_GV(POPs);
2531 register IO * const io = GvIOn(gv);
2535 if (!io || !IoIFP(io))
2538 addr = SvPV_const(addrsv, len);
2539 TAINT_PROPER("connect");
2540 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2546 if (ckWARN(WARN_CLOSED))
2547 report_evil_fh(gv, io, PL_op->op_type);
2548 SETERRNO(EBADF,SS_IVCHAN);
2551 DIE(aTHX_ PL_no_sock_func, "connect");
2559 const int backlog = POPi;
2560 GV * const gv = MUTABLE_GV(POPs);
2561 register IO * const io = gv ? GvIOn(gv) : NULL;
2563 if (!gv || !io || !IoIFP(io))
2566 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2572 if (ckWARN(WARN_CLOSED))
2573 report_evil_fh(gv, io, PL_op->op_type);
2574 SETERRNO(EBADF,SS_IVCHAN);
2577 DIE(aTHX_ PL_no_sock_func, "listen");
2587 char namebuf[MAXPATHLEN];
2588 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2589 Sock_size_t len = sizeof (struct sockaddr_in);
2591 Sock_size_t len = sizeof namebuf;
2593 GV * const ggv = MUTABLE_GV(POPs);
2594 GV * const ngv = MUTABLE_GV(POPs);
2603 if (!gstio || !IoIFP(gstio))
2607 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2610 /* Some platforms indicate zero length when an AF_UNIX client is
2611 * not bound. Simulate a non-zero-length sockaddr structure in
2613 namebuf[0] = 0; /* sun_len */
2614 namebuf[1] = AF_UNIX; /* sun_family */
2622 do_close(ngv, FALSE);
2623 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2624 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2625 IoTYPE(nstio) = IoTYPE_SOCKET;
2626 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2627 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2628 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2629 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2632 #if defined(HAS_FCNTL) && defined(F_SETFD)
2633 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2637 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2638 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2640 #ifdef __SCO_VERSION__
2641 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2644 PUSHp(namebuf, len);
2648 if (ckWARN(WARN_CLOSED))
2649 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2650 SETERRNO(EBADF,SS_IVCHAN);
2656 DIE(aTHX_ PL_no_sock_func, "accept");
2664 const int how = POPi;
2665 GV * const gv = MUTABLE_GV(POPs);
2666 register IO * const io = GvIOn(gv);
2668 if (!io || !IoIFP(io))
2671 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2675 if (ckWARN(WARN_CLOSED))
2676 report_evil_fh(gv, io, PL_op->op_type);
2677 SETERRNO(EBADF,SS_IVCHAN);
2680 DIE(aTHX_ PL_no_sock_func, "shutdown");
2688 const int optype = PL_op->op_type;
2689 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2690 const unsigned int optname = (unsigned int) POPi;
2691 const unsigned int lvl = (unsigned int) POPi;
2692 GV * const gv = MUTABLE_GV(POPs);
2693 register IO * const io = GvIOn(gv);
2697 if (!io || !IoIFP(io))
2700 fd = PerlIO_fileno(IoIFP(io));
2704 (void)SvPOK_only(sv);
2708 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2715 #if defined(__SYMBIAN32__)
2716 # define SETSOCKOPT_OPTION_VALUE_T void *
2718 # define SETSOCKOPT_OPTION_VALUE_T const char *
2720 /* XXX TODO: We need to have a proper type (a Configure probe,
2721 * etc.) for what the C headers think of the third argument of
2722 * setsockopt(), the option_value read-only buffer: is it
2723 * a "char *", or a "void *", const or not. Some compilers
2724 * don't take kindly to e.g. assuming that "char *" implicitly
2725 * promotes to a "void *", or to explicitly promoting/demoting
2726 * consts to non/vice versa. The "const void *" is the SUS
2727 * definition, but that does not fly everywhere for the above
2729 SETSOCKOPT_OPTION_VALUE_T buf;
2733 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2737 aint = (int)SvIV(sv);
2738 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2741 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2750 if (ckWARN(WARN_CLOSED))
2751 report_evil_fh(gv, io, optype);
2752 SETERRNO(EBADF,SS_IVCHAN);
2757 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2765 const int optype = PL_op->op_type;
2766 GV * const gv = MUTABLE_GV(POPs);
2767 register IO * const io = GvIOn(gv);
2772 if (!io || !IoIFP(io))
2775 sv = sv_2mortal(newSV(257));
2776 (void)SvPOK_only(sv);
2780 fd = PerlIO_fileno(IoIFP(io));
2782 case OP_GETSOCKNAME:
2783 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2786 case OP_GETPEERNAME:
2787 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2789 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2791 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";
2792 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2793 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2794 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2795 sizeof(u_short) + sizeof(struct in_addr))) {
2802 #ifdef BOGUS_GETNAME_RETURN
2803 /* Interactive Unix, getpeername() and getsockname()
2804 does not return valid namelen */
2805 if (len == BOGUS_GETNAME_RETURN)
2806 len = sizeof(struct sockaddr);
2814 if (ckWARN(WARN_CLOSED))
2815 report_evil_fh(gv, io, optype);
2816 SETERRNO(EBADF,SS_IVCHAN);
2821 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2836 if (PL_op->op_flags & OPf_REF) {
2838 if (PL_op->op_type == OP_LSTAT) {
2839 if (gv != PL_defgv) {
2840 do_fstat_warning_check:
2841 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2842 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2843 } else if (PL_laststype != OP_LSTAT)
2844 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2848 if (gv != PL_defgv) {
2849 PL_laststype = OP_STAT;
2851 sv_setpvs(PL_statname, "");
2858 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2859 } else if (IoDIRP(io)) {
2861 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2863 PL_laststatval = -1;
2869 if (PL_laststatval < 0) {
2870 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2871 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2876 SV* const sv = POPs;
2877 if (isGV_with_GP(sv)) {
2878 gv = MUTABLE_GV(sv);
2880 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2881 gv = MUTABLE_GV(SvRV(sv));
2882 if (PL_op->op_type == OP_LSTAT)
2883 goto do_fstat_warning_check;
2885 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2886 io = MUTABLE_IO(SvRV(sv));
2887 if (PL_op->op_type == OP_LSTAT)
2888 goto do_fstat_warning_check;
2889 goto do_fstat_have_io;
2892 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2894 PL_laststype = PL_op->op_type;
2895 if (PL_op->op_type == OP_LSTAT)
2896 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2898 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2899 if (PL_laststatval < 0) {
2900 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2901 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2907 if (gimme != G_ARRAY) {
2908 if (gimme != G_VOID)
2909 XPUSHs(boolSV(max));
2915 mPUSHi(PL_statcache.st_dev);
2916 mPUSHi(PL_statcache.st_ino);
2917 mPUSHu(PL_statcache.st_mode);
2918 mPUSHu(PL_statcache.st_nlink);
2919 #if Uid_t_size > IVSIZE
2920 mPUSHn(PL_statcache.st_uid);
2922 # if Uid_t_sign <= 0
2923 mPUSHi(PL_statcache.st_uid);
2925 mPUSHu(PL_statcache.st_uid);
2928 #if Gid_t_size > IVSIZE
2929 mPUSHn(PL_statcache.st_gid);
2931 # if Gid_t_sign <= 0
2932 mPUSHi(PL_statcache.st_gid);
2934 mPUSHu(PL_statcache.st_gid);
2937 #ifdef USE_STAT_RDEV
2938 mPUSHi(PL_statcache.st_rdev);
2940 PUSHs(newSVpvs_flags("", SVs_TEMP));
2942 #if Off_t_size > IVSIZE
2943 mPUSHn(PL_statcache.st_size);
2945 mPUSHi(PL_statcache.st_size);
2948 mPUSHn(PL_statcache.st_atime);
2949 mPUSHn(PL_statcache.st_mtime);
2950 mPUSHn(PL_statcache.st_ctime);
2952 mPUSHi(PL_statcache.st_atime);
2953 mPUSHi(PL_statcache.st_mtime);
2954 mPUSHi(PL_statcache.st_ctime);
2956 #ifdef USE_STAT_BLOCKS
2957 mPUSHu(PL_statcache.st_blksize);
2958 mPUSHu(PL_statcache.st_blocks);
2960 PUSHs(newSVpvs_flags("", SVs_TEMP));
2961 PUSHs(newSVpvs_flags("", SVs_TEMP));
2967 #define tryAMAGICftest_MG(chr) STMT_START { \
2968 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2969 && S_try_amagic_ftest(aTHX_ chr)) \
2974 S_try_amagic_ftest(pTHX_ char chr) {
2977 SV* const arg = TOPs;
2982 if ((PL_op->op_flags & OPf_KIDS)
2985 const char tmpchr = chr;
2987 SV * const tmpsv = amagic_call(arg,
2988 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2989 ftest_amg, AMGf_unary);
2996 next = PL_op->op_next;
2997 if (next->op_type >= OP_FTRREAD &&
2998 next->op_type <= OP_FTBINARY &&
2999 next->op_private & OPpFT_STACKED
3002 /* leave the object alone */
3014 /* This macro is used by the stacked filetest operators :
3015 * if the previous filetest failed, short-circuit and pass its value.
3016 * Else, discard it from the stack and continue. --rgs
3018 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
3019 if (!SvTRUE(TOPs)) { RETURN; } \
3020 else { (void)POPs; PUTBACK; } \
3027 /* Not const, because things tweak this below. Not bool, because there's
3028 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
3029 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3030 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3031 /* Giving some sort of initial value silences compilers. */
3033 int access_mode = R_OK;
3035 int access_mode = 0;
3038 /* access_mode is never used, but leaving use_access in makes the
3039 conditional compiling below much clearer. */
3042 int stat_mode = S_IRUSR;
3044 bool effective = FALSE;
3048 switch (PL_op->op_type) {
3049 case OP_FTRREAD: opchar = 'R'; break;
3050 case OP_FTRWRITE: opchar = 'W'; break;
3051 case OP_FTREXEC: opchar = 'X'; break;
3052 case OP_FTEREAD: opchar = 'r'; break;
3053 case OP_FTEWRITE: opchar = 'w'; break;
3054 case OP_FTEEXEC: opchar = 'x'; break;
3056 tryAMAGICftest_MG(opchar);
3058 STACKED_FTEST_CHECK;
3060 switch (PL_op->op_type) {
3062 #if !(defined(HAS_ACCESS) && defined(R_OK))
3068 #if defined(HAS_ACCESS) && defined(W_OK)
3073 stat_mode = S_IWUSR;
3077 #if defined(HAS_ACCESS) && defined(X_OK)
3082 stat_mode = S_IXUSR;
3086 #ifdef PERL_EFF_ACCESS
3089 stat_mode = S_IWUSR;
3093 #ifndef PERL_EFF_ACCESS
3100 #ifdef PERL_EFF_ACCESS
3105 stat_mode = S_IXUSR;
3111 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3112 const char *name = POPpx;
3114 # ifdef PERL_EFF_ACCESS
3115 result = PERL_EFF_ACCESS(name, access_mode);
3117 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3123 result = access(name, access_mode);
3125 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3136 result = my_stat_flags(0);
3140 if (cando(stat_mode, effective, &PL_statcache))
3149 const int op_type = PL_op->op_type;
3154 case OP_FTIS: opchar = 'e'; break;
3155 case OP_FTSIZE: opchar = 's'; break;
3156 case OP_FTMTIME: opchar = 'M'; break;
3157 case OP_FTCTIME: opchar = 'C'; break;
3158 case OP_FTATIME: opchar = 'A'; break;
3160 tryAMAGICftest_MG(opchar);
3162 STACKED_FTEST_CHECK;
3164 result = my_stat_flags(0);
3168 if (op_type == OP_FTIS)
3171 /* You can't dTARGET inside OP_FTIS, because you'll get
3172 "panic: pad_sv po" - the op is not flagged to have a target. */
3176 #if Off_t_size > IVSIZE
3177 PUSHn(PL_statcache.st_size);
3179 PUSHi(PL_statcache.st_size);
3183 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3186 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3189 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3203 switch (PL_op->op_type) {
3204 case OP_FTROWNED: opchar = 'O'; break;
3205 case OP_FTEOWNED: opchar = 'o'; break;
3206 case OP_FTZERO: opchar = 'z'; break;
3207 case OP_FTSOCK: opchar = 'S'; break;
3208 case OP_FTCHR: opchar = 'c'; break;
3209 case OP_FTBLK: opchar = 'b'; break;
3210 case OP_FTFILE: opchar = 'f'; break;
3211 case OP_FTDIR: opchar = 'd'; break;
3212 case OP_FTPIPE: opchar = 'p'; break;
3213 case OP_FTSUID: opchar = 'u'; break;
3214 case OP_FTSGID: opchar = 'g'; break;
3215 case OP_FTSVTX: opchar = 'k'; break;
3217 tryAMAGICftest_MG(opchar);
3219 STACKED_FTEST_CHECK;
3221 /* I believe that all these three are likely to be defined on most every
3222 system these days. */
3224 if(PL_op->op_type == OP_FTSUID) {
3225 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3231 if(PL_op->op_type == OP_FTSGID) {
3232 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3238 if(PL_op->op_type == OP_FTSVTX) {
3239 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3245 result = my_stat_flags(0);
3249 switch (PL_op->op_type) {
3251 if (PL_statcache.st_uid == PL_uid)
3255 if (PL_statcache.st_uid == PL_euid)
3259 if (PL_statcache.st_size == 0)
3263 if (S_ISSOCK(PL_statcache.st_mode))
3267 if (S_ISCHR(PL_statcache.st_mode))
3271 if (S_ISBLK(PL_statcache.st_mode))
3275 if (S_ISREG(PL_statcache.st_mode))
3279 if (S_ISDIR(PL_statcache.st_mode))
3283 if (S_ISFIFO(PL_statcache.st_mode))
3288 if (PL_statcache.st_mode & S_ISUID)
3294 if (PL_statcache.st_mode & S_ISGID)
3300 if (PL_statcache.st_mode & S_ISVTX)
3314 tryAMAGICftest_MG('l');
3315 result = my_lstat_flags(0);
3320 if (S_ISLNK(PL_statcache.st_mode))
3335 tryAMAGICftest_MG('t');
3337 STACKED_FTEST_CHECK;
3339 if (PL_op->op_flags & OPf_REF)
3341 else if (isGV(TOPs))
3342 gv = MUTABLE_GV(POPs);
3343 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3344 gv = MUTABLE_GV(SvRV(POPs));
3347 name = SvPV_nomg(tmpsv, namelen);
3348 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3351 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3352 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3353 else if (tmpsv && SvOK(tmpsv)) {
3361 if (PerlLIO_isatty(fd))
3366 #if defined(atarist) /* this will work with atariST. Configure will
3367 make guesses for other systems. */
3368 # define FILE_base(f) ((f)->_base)
3369 # define FILE_ptr(f) ((f)->_ptr)
3370 # define FILE_cnt(f) ((f)->_cnt)
3371 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3382 register STDCHAR *s;
3388 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3390 STACKED_FTEST_CHECK;
3392 if (PL_op->op_flags & OPf_REF)
3394 else if (isGV(TOPs))
3395 gv = MUTABLE_GV(POPs);
3396 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3397 gv = MUTABLE_GV(SvRV(POPs));
3403 if (gv == PL_defgv) {
3405 io = GvIO(PL_statgv);
3408 goto really_filename;
3413 PL_laststatval = -1;
3414 sv_setpvs(PL_statname, "");
3415 io = GvIO(PL_statgv);
3417 if (io && IoIFP(io)) {
3418 if (! PerlIO_has_base(IoIFP(io)))
3419 DIE(aTHX_ "-T and -B not implemented on filehandles");
3420 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3421 if (PL_laststatval < 0)
3423 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3424 if (PL_op->op_type == OP_FTTEXT)
3429 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3430 i = PerlIO_getc(IoIFP(io));
3432 (void)PerlIO_ungetc(IoIFP(io),i);
3434 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3436 len = PerlIO_get_bufsiz(IoIFP(io));
3437 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3438 /* sfio can have large buffers - limit to 512 */
3443 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3445 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3447 SETERRNO(EBADF,RMS_IFI);
3455 PL_laststype = OP_STAT;
3456 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3457 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3458 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3460 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3463 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3464 if (PL_laststatval < 0) {
3465 (void)PerlIO_close(fp);
3468 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3469 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3470 (void)PerlIO_close(fp);
3472 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3473 RETPUSHNO; /* special case NFS directories */
3474 RETPUSHYES; /* null file is anything */
3479 /* now scan s to look for textiness */
3480 /* XXX ASCII dependent code */
3482 #if defined(DOSISH) || defined(USEMYBINMODE)
3483 /* ignore trailing ^Z on short files */
3484 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3488 for (i = 0; i < len; i++, s++) {
3489 if (!*s) { /* null never allowed in text */
3494 else if (!(isPRINT(*s) || isSPACE(*s)))
3497 else if (*s & 128) {
3499 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3502 /* utf8 characters don't count as odd */
3503 if (UTF8_IS_START(*s)) {
3504 int ulen = UTF8SKIP(s);
3505 if (ulen < len - i) {
3507 for (j = 1; j < ulen; j++) {
3508 if (!UTF8_IS_CONTINUATION(s[j]))
3511 --ulen; /* loop does extra increment */
3521 *s != '\n' && *s != '\r' && *s != '\b' &&
3522 *s != '\t' && *s != '\f' && *s != 27)
3527 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3538 const char *tmps = NULL;
3542 SV * const sv = POPs;
3543 if (PL_op->op_flags & OPf_SPECIAL) {
3544 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3546 else if (isGV_with_GP(sv)) {
3547 gv = MUTABLE_GV(sv);
3549 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3550 gv = MUTABLE_GV(SvRV(sv));
3553 tmps = SvPV_nolen_const(sv);
3557 if( !gv && (!tmps || !*tmps) ) {
3558 HV * const table = GvHVn(PL_envgv);
3561 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3562 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3564 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3569 deprecate("chdir('') or chdir(undef) as chdir()");
3570 tmps = SvPV_nolen_const(*svp);
3574 TAINT_PROPER("chdir");
3579 TAINT_PROPER("chdir");
3582 IO* const io = GvIO(gv);
3585 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3586 } else if (IoIFP(io)) {
3587 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3590 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3591 report_evil_fh(gv, io, PL_op->op_type);
3592 SETERRNO(EBADF, RMS_IFI);
3597 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3598 report_evil_fh(gv, io, PL_op->op_type);
3599 SETERRNO(EBADF,RMS_IFI);
3603 DIE(aTHX_ PL_no_func, "fchdir");
3607 PUSHi( PerlDir_chdir(tmps) >= 0 );
3609 /* Clear the DEFAULT element of ENV so we'll get the new value
3611 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3618 dVAR; dSP; dMARK; dTARGET;
3619 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3630 char * const tmps = POPpx;
3631 TAINT_PROPER("chroot");
3632 PUSHi( chroot(tmps) >= 0 );
3635 DIE(aTHX_ PL_no_func, "chroot");
3643 const char * const tmps2 = POPpconstx;
3644 const char * const tmps = SvPV_nolen_const(TOPs);
3645 TAINT_PROPER("rename");
3647 anum = PerlLIO_rename(tmps, tmps2);
3649 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3650 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3653 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3654 (void)UNLINK(tmps2);
3655 if (!(anum = link(tmps, tmps2)))
3656 anum = UNLINK(tmps);
3664 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3668 const int op_type = PL_op->op_type;
3672 if (op_type == OP_LINK)
3673 DIE(aTHX_ PL_no_func, "link");
3675 # ifndef HAS_SYMLINK
3676 if (op_type == OP_SYMLINK)
3677 DIE(aTHX_ PL_no_func, "symlink");
3681 const char * const tmps2 = POPpconstx;
3682 const char * const tmps = SvPV_nolen_const(TOPs);
3683 TAINT_PROPER(PL_op_desc[op_type]);
3685 # if defined(HAS_LINK)
3686 # if defined(HAS_SYMLINK)
3687 /* Both present - need to choose which. */
3688 (op_type == OP_LINK) ?
3689 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3691 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3692 PerlLIO_link(tmps, tmps2);
3695 # if defined(HAS_SYMLINK)
3696 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3697 symlink(tmps, tmps2);
3702 SETi( result >= 0 );
3709 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3720 char buf[MAXPATHLEN];
3723 #ifndef INCOMPLETE_TAINTS
3727 len = readlink(tmps, buf, sizeof(buf) - 1);
3734 RETSETUNDEF; /* just pretend it's a normal file */
3738 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3740 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3742 char * const save_filename = filename;
3747 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3749 PERL_ARGS_ASSERT_DOONELINER;
3751 Newx(cmdline, size, char);
3752 my_strlcpy(cmdline, cmd, size);
3753 my_strlcat(cmdline, " ", size);
3754 for (s = cmdline + strlen(cmdline); *filename; ) {
3758 if (s - cmdline < size)
3759 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3760 myfp = PerlProc_popen(cmdline, "r");
3764 SV * const tmpsv = sv_newmortal();
3765 /* Need to save/restore 'PL_rs' ?? */
3766 s = sv_gets(tmpsv, myfp, 0);
3767 (void)PerlProc_pclose(myfp);
3771 #ifdef HAS_SYS_ERRLIST
3776 /* you don't see this */
3777 const char * const errmsg =
3778 #ifdef HAS_SYS_ERRLIST
3786 if (instr(s, errmsg)) {
3793 #define EACCES EPERM
3795 if (instr(s, "cannot make"))
3796 SETERRNO(EEXIST,RMS_FEX);
3797 else if (instr(s, "existing file"))
3798 SETERRNO(EEXIST,RMS_FEX);
3799 else if (instr(s, "ile exists"))
3800 SETERRNO(EEXIST,RMS_FEX);
3801 else if (instr(s, "non-exist"))
3802 SETERRNO(ENOENT,RMS_FNF);
3803 else if (instr(s, "does not exist"))
3804 SETERRNO(ENOENT,RMS_FNF);
3805 else if (instr(s, "not empty"))
3806 SETERRNO(EBUSY,SS_DEVOFFLINE);
3807 else if (instr(s, "cannot access"))
3808 SETERRNO(EACCES,RMS_PRV);
3810 SETERRNO(EPERM,RMS_PRV);
3813 else { /* some mkdirs return no failure indication */
3814 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3815 if (PL_op->op_type == OP_RMDIR)
3820 SETERRNO(EACCES,RMS_PRV); /* a guess */
3829 /* This macro removes trailing slashes from a directory name.
3830 * Different operating and file systems take differently to
3831 * trailing slashes. According to POSIX 1003.1 1996 Edition
3832 * any number of trailing slashes should be allowed.
3833 * Thusly we snip them away so that even non-conforming
3834 * systems are happy.
3835 * We should probably do this "filtering" for all
3836 * the functions that expect (potentially) directory names:
3837 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3838 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3840 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3841 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3844 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3845 (tmps) = savepvn((tmps), (len)); \
3855 const int mode = (MAXARG > 1) ? POPi : 0777;
3857 TRIMSLASHES(tmps,len,copy);
3859 TAINT_PROPER("mkdir");
3861 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3865 SETi( dooneliner("mkdir", tmps) );
3866 oldumask = PerlLIO_umask(0);
3867 PerlLIO_umask(oldumask);
3868 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3883 TRIMSLASHES(tmps,len,copy);
3884 TAINT_PROPER("rmdir");
3886 SETi( PerlDir_rmdir(tmps) >= 0 );
3888 SETi( dooneliner("rmdir", tmps) );
3895 /* Directory calls. */
3899 #if defined(Direntry_t) && defined(HAS_READDIR)
3901 const char * const dirname = POPpconstx;
3902 GV * const gv = MUTABLE_GV(POPs);
3903 register IO * const io = GvIOn(gv);
3908 if ((IoIFP(io) || IoOFP(io)))
3909 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3910 "Opening filehandle %s also as a directory",
3913 PerlDir_close(IoDIRP(io));
3914 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3920 SETERRNO(EBADF,RMS_DIR);
3923 DIE(aTHX_ PL_no_dir_func, "opendir");
3929 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3930 DIE(aTHX_ PL_no_dir_func, "readdir");
3932 #if !defined(I_DIRENT) && !defined(VMS)
3933 Direntry_t *readdir (DIR *);
3939 const I32 gimme = GIMME;
3940 GV * const gv = MUTABLE_GV(POPs);
3941 register const Direntry_t *dp;
3942 register IO * const io = GvIOn(gv);
3944 if (!io || !IoDIRP(io)) {
3945 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3946 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3951 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3955 sv = newSVpvn(dp->d_name, dp->d_namlen);
3957 sv = newSVpv(dp->d_name, 0);
3959 #ifndef INCOMPLETE_TAINTS
3960 if (!(IoFLAGS(io) & IOf_UNTAINT))
3964 } while (gimme == G_ARRAY);
3966 if (!dp && gimme != G_ARRAY)
3973 SETERRNO(EBADF,RMS_ISI);
3974 if (GIMME == G_ARRAY)
3983 #if defined(HAS_TELLDIR) || defined(telldir)
3985 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3986 /* XXX netbsd still seemed to.
3987 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3988 --JHI 1999-Feb-02 */
3989 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3990 long telldir (DIR *);
3992 GV * const gv = MUTABLE_GV(POPs);
3993 register IO * const io = GvIOn(gv);
3995 if (!io || !IoDIRP(io)) {
3996 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3997 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
4001 PUSHi( PerlDir_tell(IoDIRP(io)) );
4005 SETERRNO(EBADF,RMS_ISI);
4008 DIE(aTHX_ PL_no_dir_func, "telldir");
4014 #if defined(HAS_SEEKDIR) || defined(seekdir)
4016 const long along = POPl;
4017 GV * const gv = MUTABLE_GV(POPs);
4018 register IO * const io = GvIOn(gv);
4020 if (!io || !IoDIRP(io)) {
4021 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4022 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
4025 (void)PerlDir_seek(IoDIRP(io), along);
4030 SETERRNO(EBADF,RMS_ISI);
4033 DIE(aTHX_ PL_no_dir_func, "seekdir");
4039 #if defined(HAS_REWINDDIR) || defined(rewinddir)
4041 GV * const gv = MUTABLE_GV(POPs);
4042 register IO * const io = GvIOn(gv);
4044 if (!io || !IoDIRP(io)) {
4045 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4046 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
4049 (void)PerlDir_rewind(IoDIRP(io));
4053 SETERRNO(EBADF,RMS_ISI);
4056 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4062 #if defined(Direntry_t) && defined(HAS_READDIR)
4064 GV * const gv = MUTABLE_GV(POPs);
4065 register IO * const io = GvIOn(gv);
4067 if (!io || !IoDIRP(io)) {
4068 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4069 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
4072 #ifdef VOID_CLOSEDIR
4073 PerlDir_close(IoDIRP(io));
4075 if (PerlDir_close(IoDIRP(io)) < 0) {
4076 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4085 SETERRNO(EBADF,RMS_IFI);
4088 DIE(aTHX_ PL_no_dir_func, "closedir");
4092 /* Process control. */
4101 PERL_FLUSHALL_FOR_CHILD;
4102 childpid = PerlProc_fork();
4106 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
4108 SvREADONLY_off(GvSV(tmpgv));
4109 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4110 SvREADONLY_on(GvSV(tmpgv));
4112 #ifdef THREADS_HAVE_PIDS
4113 PL_ppid = (IV)getppid();
4115 #ifdef PERL_USES_PL_PIDSTATUS
4116 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4122 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4127 PERL_FLUSHALL_FOR_CHILD;
4128 childpid = PerlProc_fork();
4134 DIE(aTHX_ PL_no_func, "fork");
4141 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4146 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4147 childpid = wait4pid(-1, &argflags, 0);
4149 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4154 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4155 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4156 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4158 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4163 DIE(aTHX_ PL_no_func, "wait");
4169 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4171 const int optype = POPi;
4172 const Pid_t pid = TOPi;
4176 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4177 result = wait4pid(pid, &argflags, optype);
4179 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4184 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4185 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4186 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4188 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4193 DIE(aTHX_ PL_no_func, "waitpid");
4199 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4200 #if defined(__LIBCATAMOUNT__)
4201 PL_statusvalue = -1;
4210 while (++MARK <= SP) {
4211 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4216 TAINT_PROPER("system");
4218 PERL_FLUSHALL_FOR_CHILD;
4219 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4225 if (PerlProc_pipe(pp) >= 0)
4227 while ((childpid = PerlProc_fork()) == -1) {
4228 if (errno != EAGAIN) {
4233 PerlLIO_close(pp[0]);
4234 PerlLIO_close(pp[1]);
4241 Sigsave_t ihand,qhand; /* place to save signals during system() */
4245 PerlLIO_close(pp[1]);
4247 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4248 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4251 result = wait4pid(childpid, &status, 0);
4252 } while (result == -1 && errno == EINTR);
4254 (void)rsignal_restore(SIGINT, &ihand);
4255 (void)rsignal_restore(SIGQUIT, &qhand);
4257 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4258 do_execfree(); /* free any memory child malloced on fork */
4265 while (n < sizeof(int)) {
4266 n1 = PerlLIO_read(pp[0],
4267 (void*)(((char*)&errkid)+n),
4273 PerlLIO_close(pp[0]);
4274 if (n) { /* Error */
4275 if (n != sizeof(int))
4276 DIE(aTHX_ "panic: kid popen errno read");
4277 errno = errkid; /* Propagate errno from kid */
4278 STATUS_NATIVE_CHILD_SET(-1);
4281 XPUSHi(STATUS_CURRENT);
4285 PerlLIO_close(pp[0]);
4286 #if defined(HAS_FCNTL) && defined(F_SETFD)
4287 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4290 if (PL_op->op_flags & OPf_STACKED) {
4291 SV * const really = *++MARK;
4292 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4294 else if (SP - MARK != 1)
4295 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4297 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4301 #else /* ! FORK or VMS or OS/2 */
4304 if (PL_op->op_flags & OPf_STACKED) {
4305 SV * const really = *++MARK;
4306 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4307 value = (I32)do_aspawn(really, MARK, SP);
4309 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4312 else if (SP - MARK != 1) {
4313 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4314 value = (I32)do_aspawn(NULL, MARK, SP);
4316 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4320 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4322 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4324 STATUS_NATIVE_CHILD_SET(value);
4327 XPUSHi(result ? value : STATUS_CURRENT);
4328 #endif /* !FORK or VMS or OS/2 */
4335 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4340 while (++MARK <= SP) {
4341 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4346 TAINT_PROPER("exec");
4348 PERL_FLUSHALL_FOR_CHILD;
4349 if (PL_op->op_flags & OPf_STACKED) {
4350 SV * const really = *++MARK;
4351 value = (I32)do_aexec(really, MARK, SP);
4353 else if (SP - MARK != 1)
4355 value = (I32)vms_do_aexec(NULL, MARK, SP);
4359 (void ) do_aspawn(NULL, MARK, SP);
4363 value = (I32)do_aexec(NULL, MARK, SP);
4368 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4371 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4374 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4388 # ifdef THREADS_HAVE_PIDS
4389 if (PL_ppid != 1 && getppid() == 1)
4390 /* maybe the parent process has died. Refresh ppid cache */
4394 XPUSHi( getppid() );
4398 DIE(aTHX_ PL_no_func, "getppid");
4407 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4410 pgrp = (I32)BSD_GETPGRP(pid);
4412 if (pid != 0 && pid != PerlProc_getpid())
4413 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4419 DIE(aTHX_ PL_no_func, "getpgrp()");
4439 TAINT_PROPER("setpgrp");
4441 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4443 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4444 || (pid != 0 && pid != PerlProc_getpid()))
4446 DIE(aTHX_ "setpgrp can't take arguments");
4448 SETi( setpgrp() >= 0 );
4449 #endif /* USE_BSDPGRP */
4452 DIE(aTHX_ PL_no_func, "setpgrp()");
4458 #ifdef HAS_GETPRIORITY
4460 const int who = POPi;
4461 const int which = TOPi;
4462 SETi( getpriority(which, who) );
4465 DIE(aTHX_ PL_no_func, "getpriority()");
4471 #ifdef HAS_SETPRIORITY
4473 const int niceval = POPi;
4474 const int who = POPi;
4475 const int which = TOPi;
4476 TAINT_PROPER("setpriority");
4477 SETi( setpriority(which, who, niceval) >= 0 );
4480 DIE(aTHX_ PL_no_func, "setpriority()");
4490 XPUSHn( time(NULL) );
4492 XPUSHi( time(NULL) );
4504 (void)PerlProc_times(&PL_timesbuf);
4506 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4507 /* struct tms, though same data */
4511 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4512 if (GIMME == G_ARRAY) {
4513 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4514 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4515 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4523 if (GIMME == G_ARRAY) {
4530 DIE(aTHX_ "times not implemented");
4532 #endif /* HAS_TIMES */
4535 /* The 32 bit int year limits the times we can represent to these
4536 boundaries with a few days wiggle room to account for time zone
4539 /* Sat Jan 3 00:00:00 -2147481748 */
4540 #define TIME_LOWER_BOUND -67768100567755200.0
4541 /* Sun Dec 29 12:00:00 2147483647 */
4542 #define TIME_UPPER_BOUND 67767976233316800.0
4551 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4552 static const char * const dayname[] =
4553 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4554 static const char * const monname[] =
4555 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4556 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4561 when = (Time64_T)now;
4564 NV input = Perl_floor(POPn);
4565 when = (Time64_T)input;
4566 if (when != input) {
4567 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4568 "%s(%.0" NVff ") too large", opname, input);
4572 if ( TIME_LOWER_BOUND > when ) {
4573 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4574 "%s(%.0" NVff ") too small", opname, when);
4577 else if( when > TIME_UPPER_BOUND ) {
4578 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4579 "%s(%.0" NVff ") too large", opname, when);
4583 if (PL_op->op_type == OP_LOCALTIME)
4584 err = S_localtime64_r(&when, &tmbuf);
4586 err = S_gmtime64_r(&when, &tmbuf);
4590 /* XXX %lld broken for quads */
4591 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4592 "%s(%.0" NVff ") failed", opname, when);
4595 if (GIMME != G_ARRAY) { /* scalar context */
4597 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4598 double year = (double)tmbuf.tm_year + 1900;
4605 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4606 dayname[tmbuf.tm_wday],
4607 monname[tmbuf.tm_mon],
4615 else { /* list context */
4621 mPUSHi(tmbuf.tm_sec);
4622 mPUSHi(tmbuf.tm_min);
4623 mPUSHi(tmbuf.tm_hour);
4624 mPUSHi(tmbuf.tm_mday);
4625 mPUSHi(tmbuf.tm_mon);
4626 mPUSHn(tmbuf.tm_year);
4627 mPUSHi(tmbuf.tm_wday);
4628 mPUSHi(tmbuf.tm_yday);
4629 mPUSHi(tmbuf.tm_isdst);
4640 anum = alarm((unsigned int)anum);
4646 DIE(aTHX_ PL_no_func, "alarm");
4657 (void)time(&lasttime);
4662 PerlProc_sleep((unsigned int)duration);
4665 XPUSHi(when - lasttime);
4669 /* Shared memory. */
4670 /* Merged with some message passing. */
4674 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4675 dVAR; dSP; dMARK; dTARGET;
4676 const int op_type = PL_op->op_type;
4681 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4684 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4687 value = (I32)(do_semop(MARK, SP) >= 0);
4690 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4706 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4707 dVAR; dSP; dMARK; dTARGET;
4708 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4715 DIE(aTHX_ "System V IPC is not implemented on this machine");
4721 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4722 dVAR; dSP; dMARK; dTARGET;
4723 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4731 PUSHp(zero_but_true, ZBTLEN);
4739 /* I can't const this further without getting warnings about the types of
4740 various arrays passed in from structures. */
4742 S_space_join_names_mortal(pTHX_ char *const *array)
4746 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4748 if (array && *array) {
4749 target = newSVpvs_flags("", SVs_TEMP);
4751 sv_catpv(target, *array);
4754 sv_catpvs(target, " ");
4757 target = sv_mortalcopy(&PL_sv_no);
4762 /* Get system info. */
4766 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4768 I32 which = PL_op->op_type;
4769 register char **elem;
4771 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4772 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4773 struct hostent *gethostbyname(Netdb_name_t);
4774 struct hostent *gethostent(void);
4776 struct hostent *hent = NULL;
4780 if (which == OP_GHBYNAME) {
4781 #ifdef HAS_GETHOSTBYNAME
4782 const char* const name = POPpbytex;
4783 hent = PerlSock_gethostbyname(name);
4785 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4788 else if (which == OP_GHBYADDR) {
4789 #ifdef HAS_GETHOSTBYADDR
4790 const int addrtype = POPi;
4791 SV * const addrsv = POPs;
4793 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4795 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4797 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4801 #ifdef HAS_GETHOSTENT
4802 hent = PerlSock_gethostent();
4804 DIE(aTHX_ PL_no_sock_func, "gethostent");
4807 #ifdef HOST_NOT_FOUND
4809 #ifdef USE_REENTRANT_API
4810 # ifdef USE_GETHOSTENT_ERRNO
4811 h_errno = PL_reentrant_buffer->_gethostent_errno;
4814 STATUS_UNIX_SET(h_errno);
4818 if (GIMME != G_ARRAY) {
4819 PUSHs(sv = sv_newmortal());
4821 if (which == OP_GHBYNAME) {
4823 sv_setpvn(sv, hent->h_addr, hent->h_length);
4826 sv_setpv(sv, (char*)hent->h_name);
4832 mPUSHs(newSVpv((char*)hent->h_name, 0));
4833 PUSHs(space_join_names_mortal(hent->h_aliases));
4834 mPUSHi(hent->h_addrtype);
4835 len = hent->h_length;
4838 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4839 mXPUSHp(*elem, len);
4843 mPUSHp(hent->h_addr, len);
4845 PUSHs(sv_mortalcopy(&PL_sv_no));
4850 DIE(aTHX_ PL_no_sock_func, "gethostent");
4856 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4858 I32 which = PL_op->op_type;
4860 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4861 struct netent *getnetbyaddr(Netdb_net_t, int);
4862 struct netent *getnetbyname(Netdb_name_t);
4863 struct netent *getnetent(void);
4865 struct netent *nent;
4867 if (which == OP_GNBYNAME){
4868 #ifdef HAS_GETNETBYNAME
4869 const char * const name = POPpbytex;
4870 nent = PerlSock_getnetbyname(name);
4872 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4875 else if (which == OP_GNBYADDR) {
4876 #ifdef HAS_GETNETBYADDR
4877 const int addrtype = POPi;
4878 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4879 nent = PerlSock_getnetbyaddr(addr, addrtype);
4881 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4885 #ifdef HAS_GETNETENT
4886 nent = PerlSock_getnetent();
4888 DIE(aTHX_ PL_no_sock_func, "getnetent");
4891 #ifdef HOST_NOT_FOUND
4893 #ifdef USE_REENTRANT_API
4894 # ifdef USE_GETNETENT_ERRNO
4895 h_errno = PL_reentrant_buffer->_getnetent_errno;
4898 STATUS_UNIX_SET(h_errno);
4903 if (GIMME != G_ARRAY) {
4904 PUSHs(sv = sv_newmortal());
4906 if (which == OP_GNBYNAME)
4907 sv_setiv(sv, (IV)nent->n_net);
4909 sv_setpv(sv, nent->n_name);
4915 mPUSHs(newSVpv(nent->n_name, 0));
4916 PUSHs(space_join_names_mortal(nent->n_aliases));
4917 mPUSHi(nent->n_addrtype);
4918 mPUSHi(nent->n_net);
4923 DIE(aTHX_ PL_no_sock_func, "getnetent");
4929 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4931 I32 which = PL_op->op_type;
4933 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4934 struct protoent *getprotobyname(Netdb_name_t);
4935 struct protoent *getprotobynumber(int);
4936 struct protoent *getprotoent(void);
4938 struct protoent *pent;
4940 if (which == OP_GPBYNAME) {
4941 #ifdef HAS_GETPROTOBYNAME
4942 const char* const name = POPpbytex;
4943 pent = PerlSock_getprotobyname(name);
4945 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4948 else if (which == OP_GPBYNUMBER) {
4949 #ifdef HAS_GETPROTOBYNUMBER
4950 const int number = POPi;
4951 pent = PerlSock_getprotobynumber(number);
4953 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4957 #ifdef HAS_GETPROTOENT
4958 pent = PerlSock_getprotoent();
4960 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4964 if (GIMME != G_ARRAY) {
4965 PUSHs(sv = sv_newmortal());
4967 if (which == OP_GPBYNAME)
4968 sv_setiv(sv, (IV)pent->p_proto);
4970 sv_setpv(sv, pent->p_name);
4976 mPUSHs(newSVpv(pent->p_name, 0));
4977 PUSHs(space_join_names_mortal(pent->p_aliases));
4978 mPUSHi(pent->p_proto);
4983 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4989 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4991 I32 which = PL_op->op_type;
4993 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4994 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4995 struct servent *getservbyport(int, Netdb_name_t);
4996 struct servent *getservent(void);
4998 struct servent *sent;
5000 if (which == OP_GSBYNAME) {
5001 #ifdef HAS_GETSERVBYNAME
5002 const char * const proto = POPpbytex;
5003 const char * const name = POPpbytex;
5004 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
5006 DIE(aTHX_ PL_no_sock_func, "getservbyname");
5009 else if (which == OP_GSBYPORT) {
5010 #ifdef HAS_GETSERVBYPORT
5011 const char * const proto = POPpbytex;
5012 unsigned short port = (unsigned short)POPu;
5014 port = PerlSock_htons(port);
5016 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
5018 DIE(aTHX_ PL_no_sock_func, "getservbyport");
5022 #ifdef HAS_GETSERVENT
5023 sent = PerlSock_getservent();
5025 DIE(aTHX_ PL_no_sock_func, "getservent");
5029 if (GIMME != G_ARRAY) {
5030 PUSHs(sv = sv_newmortal());
5032 if (which == OP_GSBYNAME) {
5034 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5036 sv_setiv(sv, (IV)(sent->s_port));
5040 sv_setpv(sv, sent->s_name);
5046 mPUSHs(newSVpv(sent->s_name, 0));
5047 PUSHs(space_join_names_mortal(sent->s_aliases));
5049 mPUSHi(PerlSock_ntohs(sent->s_port));
5051 mPUSHi(sent->s_port);
5053 mPUSHs(newSVpv(sent->s_proto, 0));
5058 DIE(aTHX_ PL_no_sock_func, "getservent");
5064 #ifdef HAS_SETHOSTENT
5066 PerlSock_sethostent(TOPi);
5069 DIE(aTHX_ PL_no_sock_func, "sethostent");
5075 #ifdef HAS_SETNETENT
5077 (void)PerlSock_setnetent(TOPi);
5080 DIE(aTHX_ PL_no_sock_func, "setnetent");
5086 #ifdef HAS_SETPROTOENT
5088 (void)PerlSock_setprotoent(TOPi);
5091 DIE(aTHX_ PL_no_sock_func, "setprotoent");
5097 #ifdef HAS_SETSERVENT
5099 (void)PerlSock_setservent(TOPi);
5102 DIE(aTHX_ PL_no_sock_func, "setservent");
5108 #ifdef HAS_ENDHOSTENT
5110 PerlSock_endhostent();
5114 DIE(aTHX_ PL_no_sock_func, "endhostent");
5120 #ifdef HAS_ENDNETENT
5122 PerlSock_endnetent();
5126 DIE(aTHX_ PL_no_sock_func, "endnetent");
5132 #ifdef HAS_ENDPROTOENT
5134 PerlSock_endprotoent();
5138 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5144 #ifdef HAS_ENDSERVENT
5146 PerlSock_endservent();
5150 DIE(aTHX_ PL_no_sock_func, "endservent");
5158 I32 which = PL_op->op_type;
5160 struct passwd *pwent = NULL;
5162 * We currently support only the SysV getsp* shadow password interface.
5163 * The interface is declared in <shadow.h> and often one needs to link
5164 * with -lsecurity or some such.
5165 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5168 * AIX getpwnam() is clever enough to return the encrypted password
5169 * only if the caller (euid?) is root.
5171 * There are at least three other shadow password APIs. Many platforms
5172 * seem to contain more than one interface for accessing the shadow
5173 * password databases, possibly for compatibility reasons.
5174 * The getsp*() is by far he simplest one, the other two interfaces
5175 * are much more complicated, but also very similar to each other.
5180 * struct pr_passwd *getprpw*();
5181 * The password is in
5182 * char getprpw*(...).ufld.fd_encrypt[]
5183 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5188 * struct es_passwd *getespw*();
5189 * The password is in
5190 * char *(getespw*(...).ufld.fd_encrypt)
5191 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5194 * struct userpw *getuserpw();
5195 * The password is in
5196 * char *(getuserpw(...)).spw_upw_passwd
5197 * (but the de facto standard getpwnam() should work okay)
5199 * Mention I_PROT here so that Configure probes for it.
5201 * In HP-UX for getprpw*() the manual page claims that one should include
5202 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5203 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5204 * and pp_sys.c already includes <shadow.h> if there is such.
5206 * Note that <sys/security.h> is already probed for, but currently
5207 * it is only included in special cases.
5209 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5210 * be preferred interface, even though also the getprpw*() interface
5211 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5212 * One also needs to call set_auth_parameters() in main() before
5213 * doing anything else, whether one is using getespw*() or getprpw*().
5215 * Note that accessing the shadow databases can be magnitudes
5216 * slower than accessing the standard databases.
5221 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5222 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5223 * the pw_comment is left uninitialized. */
5224 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5230 const char* const name = POPpbytex;
5231 pwent = getpwnam(name);
5237 pwent = getpwuid(uid);
5241 # ifdef HAS_GETPWENT
5243 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5244 if (pwent) pwent = getpwnam(pwent->pw_name);
5247 DIE(aTHX_ PL_no_func, "getpwent");
5253 if (GIMME != G_ARRAY) {
5254 PUSHs(sv = sv_newmortal());
5256 if (which == OP_GPWNAM)
5257 # if Uid_t_sign <= 0
5258 sv_setiv(sv, (IV)pwent->pw_uid);
5260 sv_setuv(sv, (UV)pwent->pw_uid);
5263 sv_setpv(sv, pwent->pw_name);
5269 mPUSHs(newSVpv(pwent->pw_name, 0));
5273 /* If we have getspnam(), we try to dig up the shadow
5274 * password. If we are underprivileged, the shadow
5275 * interface will set the errno to EACCES or similar,
5276 * and return a null pointer. If this happens, we will
5277 * use the dummy password (usually "*" or "x") from the
5278 * standard password database.
5280 * In theory we could skip the shadow call completely
5281 * if euid != 0 but in practice we cannot know which
5282 * security measures are guarding the shadow databases
5283 * on a random platform.
5285 * Resist the urge to use additional shadow interfaces.
5286 * Divert the urge to writing an extension instead.
5289 /* Some AIX setups falsely(?) detect some getspnam(), which
5290 * has a different API than the Solaris/IRIX one. */
5291 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5294 const struct spwd * const spwent = getspnam(pwent->pw_name);
5295 /* Save and restore errno so that
5296 * underprivileged attempts seem
5297 * to have never made the unsccessful
5298 * attempt to retrieve the shadow password. */
5300 if (spwent && spwent->sp_pwdp)
5301 sv_setpv(sv, spwent->sp_pwdp);
5305 if (!SvPOK(sv)) /* Use the standard password, then. */
5306 sv_setpv(sv, pwent->pw_passwd);
5309 # ifndef INCOMPLETE_TAINTS
5310 /* passwd is tainted because user himself can diddle with it.
5311 * admittedly not much and in a very limited way, but nevertheless. */
5315 # if Uid_t_sign <= 0
5316 mPUSHi(pwent->pw_uid);
5318 mPUSHu(pwent->pw_uid);
5321 # if Uid_t_sign <= 0
5322 mPUSHi(pwent->pw_gid);
5324 mPUSHu(pwent->pw_gid);
5326 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5327 * because of the poor interface of the Perl getpw*(),
5328 * not because there's some standard/convention saying so.
5329 * A better interface would have been to return a hash,
5330 * but we are accursed by our history, alas. --jhi. */
5332 mPUSHi(pwent->pw_change);
5335 mPUSHi(pwent->pw_quota);
5338 mPUSHs(newSVpv(pwent->pw_age, 0));
5340 /* I think that you can never get this compiled, but just in case. */
5341 PUSHs(sv_mortalcopy(&PL_sv_no));
5346 /* pw_class and pw_comment are mutually exclusive--.
5347 * see the above note for pw_change, pw_quota, and pw_age. */
5349 mPUSHs(newSVpv(pwent->pw_class, 0));
5352 mPUSHs(newSVpv(pwent->pw_comment, 0));
5354 /* I think that you can never get this compiled, but just in case. */
5355 PUSHs(sv_mortalcopy(&PL_sv_no));
5360 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5362 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5364 # ifndef INCOMPLETE_TAINTS
5365 /* pw_gecos is tainted because user himself can diddle with it. */
5369 mPUSHs(newSVpv(pwent->pw_dir, 0));
5371 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5372 # ifndef INCOMPLETE_TAINTS
5373 /* pw_shell is tainted because user himself can diddle with it. */
5378 mPUSHi(pwent->pw_expire);
5383 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5389 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5394 DIE(aTHX_ PL_no_func, "setpwent");
5400 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5405 DIE(aTHX_ PL_no_func, "endpwent");
5413 const I32 which = PL_op->op_type;
5414 const struct group *grent;
5416 if (which == OP_GGRNAM) {
5417 const char* const name = POPpbytex;
5418 grent = (const struct group *)getgrnam(name);
5420 else if (which == OP_GGRGID) {
5421 const Gid_t gid = POPi;
5422 grent = (const struct group *)getgrgid(gid);
5426 grent = (struct group *)getgrent();
5428 DIE(aTHX_ PL_no_func, "getgrent");
5432 if (GIMME != G_ARRAY) {
5433 SV * const sv = sv_newmortal();
5437 if (which == OP_GGRNAM)
5439 sv_setiv(sv, (IV)grent->gr_gid);
5441 sv_setuv(sv, (UV)grent->gr_gid);
5444 sv_setpv(sv, grent->gr_name);
5450 mPUSHs(newSVpv(grent->gr_name, 0));
5453 mPUSHs(newSVpv(grent->gr_passwd, 0));
5455 PUSHs(sv_mortalcopy(&PL_sv_no));
5459 mPUSHi(grent->gr_gid);
5461 mPUSHu(grent->gr_gid);
5464 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5465 /* In UNICOS/mk (_CRAYMPP) the multithreading
5466 * versions (getgrnam_r, getgrgid_r)
5467 * seem to return an illegal pointer
5468 * as the group members list, gr_mem.
5469 * getgrent() doesn't even have a _r version
5470 * but the gr_mem is poisonous anyway.
5471 * So yes, you cannot get the list of group
5472 * members if building multithreaded in UNICOS/mk. */
5473 PUSHs(space_join_names_mortal(grent->gr_mem));
5479 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5485 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5490 DIE(aTHX_ PL_no_func, "setgrent");
5496 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5501 DIE(aTHX_ PL_no_func, "endgrent");
5511 if (!(tmps = PerlProc_getlogin()))
5513 PUSHp(tmps, strlen(tmps));
5516 DIE(aTHX_ PL_no_func, "getlogin");
5520 /* Miscellaneous. */
5525 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5526 register I32 items = SP - MARK;
5527 unsigned long a[20];
5532 while (++MARK <= SP) {
5533 if (SvTAINTED(*MARK)) {
5539 TAINT_PROPER("syscall");
5542 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5543 * or where sizeof(long) != sizeof(char*). But such machines will
5544 * not likely have syscall implemented either, so who cares?
5546 while (++MARK <= SP) {
5547 if (SvNIOK(*MARK) || !i)
5548 a[i++] = SvIV(*MARK);
5549 else if (*MARK == &PL_sv_undef)
5552 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5558 DIE(aTHX_ "Too many args to syscall");
5560 DIE(aTHX_ "Too few args to syscall");
5562 retval = syscall(a[0]);
5565 retval = syscall(a[0],a[1]);
5568 retval = syscall(a[0],a[1],a[2]);
5571 retval = syscall(a[0],a[1],a[2],a[3]);
5574 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5577 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5580 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5583 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5587 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5590 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5593 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5597 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5601 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5605 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5606 a[10],a[11],a[12],a[13]);
5608 #endif /* atarist */
5614 DIE(aTHX_ PL_no_func, "syscall");
5618 #ifdef FCNTL_EMULATE_FLOCK
5620 /* XXX Emulate flock() with fcntl().
5621 What's really needed is a good file locking module.
5625 fcntl_emulate_flock(int fd, int operation)
5630 switch (operation & ~LOCK_NB) {
5632 flock.l_type = F_RDLCK;
5635 flock.l_type = F_WRLCK;
5638 flock.l_type = F_UNLCK;
5644 flock.l_whence = SEEK_SET;
5645 flock.l_start = flock.l_len = (Off_t)0;
5647 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5648 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5649 errno = EWOULDBLOCK;
5653 #endif /* FCNTL_EMULATE_FLOCK */
5655 #ifdef LOCKF_EMULATE_FLOCK
5657 /* XXX Emulate flock() with lockf(). This is just to increase
5658 portability of scripts. The calls are not completely
5659 interchangeable. What's really needed is a good file
5663 /* The lockf() constants might have been defined in <unistd.h>.
5664 Unfortunately, <unistd.h> causes troubles on some mixed
5665 (BSD/POSIX) systems, such as SunOS 4.1.3.
5667 Further, the lockf() constants aren't POSIX, so they might not be
5668 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5669 just stick in the SVID values and be done with it. Sigh.
5673 # define F_ULOCK 0 /* Unlock a previously locked region */
5676 # define F_LOCK 1 /* Lock a region for exclusive use */
5679 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5682 # define F_TEST 3 /* Test a region for other processes locks */
5686 lockf_emulate_flock(int fd, int operation)
5692 /* flock locks entire file so for lockf we need to do the same */
5693 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5694 if (pos > 0) /* is seekable and needs to be repositioned */
5695 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5696 pos = -1; /* seek failed, so don't seek back afterwards */
5699 switch (operation) {
5701 /* LOCK_SH - get a shared lock */
5703 /* LOCK_EX - get an exclusive lock */
5705 i = lockf (fd, F_LOCK, 0);
5708 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5709 case LOCK_SH|LOCK_NB:
5710 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5711 case LOCK_EX|LOCK_NB:
5712 i = lockf (fd, F_TLOCK, 0);
5714 if ((errno == EAGAIN) || (errno == EACCES))
5715 errno = EWOULDBLOCK;
5718 /* LOCK_UN - unlock (non-blocking is a no-op) */
5720 case LOCK_UN|LOCK_NB:
5721 i = lockf (fd, F_ULOCK, 0);
5724 /* Default - can't decipher operation */
5731 if (pos > 0) /* need to restore position of the handle */
5732 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5737 #endif /* LOCKF_EMULATE_FLOCK */
5741 * c-indentation-style: bsd
5743 * indent-tabs-mode: t
5746 * ex: set ts=8 sts=4 sw=4 noet: