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/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* F_OK unused: if stat() cannot find it... */
204 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
205 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
206 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
209 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
210 # ifdef I_SYS_SECURITY
211 # include <sys/security.h>
215 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
218 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
222 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
224 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
228 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
229 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
230 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
233 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
235 const Uid_t ruid = getuid();
236 const Uid_t euid = geteuid();
237 const Gid_t rgid = getgid();
238 const Gid_t egid = getegid();
241 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
242 Perl_croak(aTHX_ "switching effective uid is not implemented");
245 if (setreuid(euid, ruid))
248 if (setresuid(euid, ruid, (Uid_t)-1))
251 /* diag_listed_as: entering effective %s failed */
252 Perl_croak(aTHX_ "entering effective uid failed");
255 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
256 Perl_croak(aTHX_ "switching effective gid is not implemented");
259 if (setregid(egid, rgid))
262 if (setresgid(egid, rgid, (Gid_t)-1))
265 /* diag_listed_as: entering effective %s failed */
266 Perl_croak(aTHX_ "entering effective gid failed");
269 res = access(path, mode);
272 if (setreuid(ruid, euid))
275 if (setresuid(ruid, euid, (Uid_t)-1))
278 /* diag_listed_as: leaving effective %s failed */
279 Perl_croak(aTHX_ "leaving effective uid failed");
282 if (setregid(rgid, egid))
285 if (setresgid(rgid, egid, (Gid_t)-1))
288 /* diag_listed_as: leaving effective %s failed */
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)
362 /* make a copy of the pattern if it is gmagical, to ensure that magic
363 * is called once and only once */
364 if (SvGMAGICAL(TOPm1s)) TOPm1s = sv_2mortal(newSVsv(TOPm1s));
366 tryAMAGICunTARGETlist(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
368 if (PL_op->op_flags & OPf_SPECIAL) {
369 /* call Perl-level glob function instead. Stack args are:
370 * MARK, wildcard, csh_glob context index
371 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
375 /* stack args are: wildcard, gv(_GEN_n) */
383 /* Note that we only ever get here if File::Glob fails to load
384 * without at the same time croaking, for some reason, or if
385 * perl was built with PERL_EXTERNAL_GLOB */
387 ENTER_with_name("glob");
392 * The external globbing program may use things we can't control,
393 * so for security reasons we must assume the worst.
396 taint_proper(PL_no_security, "glob");
400 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
401 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
403 SAVESPTR(PL_rs); /* This is not permanent, either. */
404 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
407 *SvPVX(PL_rs) = '\n';
411 result = do_readline();
412 LEAVE_with_name("glob");
419 PL_last_in_gv = cGVOP_gv;
420 return do_readline();
430 do_join(TARG, &PL_sv_no, MARK, SP);
434 else if (SP == MARK) {
441 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
444 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
445 /* well-formed exception supplied */
450 if (SvGMAGICAL(ERRSV)) {
451 exsv = sv_newmortal();
452 sv_setsv_nomg(exsv, ERRSV);
456 else if (SvPOKp(ERRSV) ? SvCUR(ERRSV) : SvNIOKp(ERRSV)) {
457 exsv = sv_newmortal();
458 sv_setsv_nomg(exsv, ERRSV);
459 sv_catpvs(exsv, "\t...caught");
462 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
465 if (SvROK(exsv) && !PL_warnhook)
466 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
477 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
479 if (SP - MARK != 1) {
481 do_join(TARG, &PL_sv_no, MARK, SP);
489 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
490 /* well-formed exception supplied */
492 else if (SvROK(ERRSV)) {
494 if (sv_isobject(exsv)) {
495 HV * const stash = SvSTASH(SvRV(exsv));
496 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
498 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
499 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
506 call_sv(MUTABLE_SV(GvCV(gv)),
507 G_SCALAR|G_EVAL|G_KEEPERR);
508 exsv = sv_mortalcopy(*PL_stack_sp--);
512 else if (SvPV_const(ERRSV, len), len) {
513 exsv = sv_mortalcopy(ERRSV);
514 sv_catpvs(exsv, "\t...propagated");
517 exsv = newSVpvs_flags("Died", SVs_TEMP);
525 Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv,
526 const MAGIC *const mg, const U32 flags, U32 argc, ...)
531 PERL_ARGS_ASSERT_TIED_METHOD;
533 /* Ensure that our flag bits do not overlap. */
534 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
535 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
536 assert((TIED_METHOD_SAY & G_WANT) == 0);
538 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
539 PUSHSTACKi(PERLSI_MAGIC);
540 EXTEND(SP, argc+1); /* object + args */
542 PUSHs(SvTIED_obj(sv, mg));
543 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
544 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
548 const U32 mortalize_not_needed
549 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
551 va_start(args, argc);
553 SV *const arg = va_arg(args, SV *);
554 if(mortalize_not_needed)
563 ENTER_with_name("call_tied_method");
564 if (flags & TIED_METHOD_SAY) {
565 /* local $\ = "\n" */
566 SAVEGENERICSV(PL_ors_sv);
567 PL_ors_sv = newSVpvs("\n");
569 ret_args = call_method(methname, flags & G_WANT);
574 if (ret_args) { /* copy results back to original stack */
575 EXTEND(sp, ret_args);
576 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
580 LEAVE_with_name("call_tied_method");
584 #define tied_method0(a,b,c,d) \
585 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
586 #define tied_method1(a,b,c,d,e) \
587 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
588 #define tied_method2(a,b,c,d,e,f) \
589 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
602 GV * const gv = MUTABLE_GV(*++MARK);
604 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
605 DIE(aTHX_ PL_no_usym, "filehandle");
607 if ((io = GvIOp(gv))) {
609 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
612 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
613 "Opening dirhandle %"HEKf" also as a file",
614 HEKfARG(GvENAME_HEK(gv)));
616 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
618 /* Method's args are same as ours ... */
619 /* ... except handle is replaced by the object */
620 return Perl_tied_method(aTHX_ "OPEN", mark - 1, MUTABLE_SV(io), mg,
621 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
633 tmps = SvPV_const(sv, len);
634 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
637 PUSHi( (I32)PL_forkprocess );
638 else if (PL_forkprocess == 0) /* we are a new child */
649 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
655 IO * const io = GvIO(gv);
657 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
659 return tied_method0("CLOSE", SP, MUTABLE_SV(io), mg);
663 PUSHs(boolSV(do_close(gv, TRUE)));
676 GV * const wgv = MUTABLE_GV(POPs);
677 GV * const rgv = MUTABLE_GV(POPs);
682 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
683 DIE(aTHX_ PL_no_usym, "filehandle");
688 do_close(rgv, FALSE);
690 do_close(wgv, FALSE);
692 if (PerlProc_pipe(fd) < 0)
695 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
696 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
697 IoOFP(rstio) = IoIFP(rstio);
698 IoIFP(wstio) = IoOFP(wstio);
699 IoTYPE(rstio) = IoTYPE_RDONLY;
700 IoTYPE(wstio) = IoTYPE_WRONLY;
702 if (!IoIFP(rstio) || !IoOFP(wstio)) {
704 PerlIO_close(IoIFP(rstio));
706 PerlLIO_close(fd[0]);
708 PerlIO_close(IoOFP(wstio));
710 PerlLIO_close(fd[1]);
713 #if defined(HAS_FCNTL) && defined(F_SETFD)
714 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
715 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
722 DIE(aTHX_ PL_no_func, "pipe");
736 gv = MUTABLE_GV(POPs);
740 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
742 return tied_method0("FILENO", SP, MUTABLE_SV(io), mg);
745 if (!io || !(fp = IoIFP(io))) {
746 /* Can't do this because people seem to do things like
747 defined(fileno($foo)) to check whether $foo is a valid fh.
754 PUSHi(PerlIO_fileno(fp));
766 if (MAXARG < 1 || (!TOPs && !POPs)) {
767 anum = PerlLIO_umask(022);
768 /* setting it to 022 between the two calls to umask avoids
769 * to have a window where the umask is set to 0 -- meaning
770 * that another thread could create world-writeable files. */
772 (void)PerlLIO_umask(anum);
775 anum = PerlLIO_umask(POPi);
776 TAINT_PROPER("umask");
779 /* Only DIE if trying to restrict permissions on "user" (self).
780 * Otherwise it's harmless and more useful to just return undef
781 * since 'group' and 'other' concepts probably don't exist here. */
782 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
783 DIE(aTHX_ "umask not implemented");
784 XPUSHs(&PL_sv_undef);
803 gv = MUTABLE_GV(POPs);
807 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
809 /* This takes advantage of the implementation of the varargs
810 function, which I don't think that the optimiser will be able to
811 figure out. Although, as it's a static function, in theory it
813 return Perl_tied_method(aTHX_ "BINMODE", SP, MUTABLE_SV(io), mg,
814 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
815 discp ? 1 : 0, discp);
819 if (!io || !(fp = IoIFP(io))) {
821 SETERRNO(EBADF,RMS_IFI);
828 const char *d = NULL;
831 d = SvPV_const(discp, len);
832 mode = mode_from_discipline(d, len);
833 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
834 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
835 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
856 const I32 markoff = MARK - PL_stack_base;
857 const char *methname;
858 int how = PERL_MAGIC_tied;
862 switch(SvTYPE(varsv)) {
866 methname = "TIEHASH";
867 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
868 HvLAZYDEL_off(varsv);
869 hv_free_ent((HV *)varsv, entry);
871 HvEITER_set(MUTABLE_HV(varsv), 0);
875 methname = "TIEARRAY";
876 if (!AvREAL(varsv)) {
878 Perl_croak(aTHX_ "Cannot tie unreifiable array");
879 av_clear((AV *)varsv);
886 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
887 methname = "TIEHANDLE";
888 how = PERL_MAGIC_tiedscalar;
889 /* For tied filehandles, we apply tiedscalar magic to the IO
890 slot of the GP rather than the GV itself. AMS 20010812 */
892 GvIOp(varsv) = newIO();
893 varsv = MUTABLE_SV(GvIOp(varsv));
898 methname = "TIESCALAR";
899 how = PERL_MAGIC_tiedscalar;
903 if (sv_isobject(*MARK)) { /* Calls GET magic. */
904 ENTER_with_name("call_TIE");
905 PUSHSTACKi(PERLSI_MAGIC);
907 EXTEND(SP,(I32)items);
911 call_method(methname, G_SCALAR);
914 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
915 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
916 * wrong error message, and worse case, supreme action at a distance.
917 * (Sorry obfuscation writers. You're not going to be given this one.)
919 stash = gv_stashsv(*MARK, 0);
920 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
921 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
922 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
924 ENTER_with_name("call_TIE");
925 PUSHSTACKi(PERLSI_MAGIC);
927 EXTEND(SP,(I32)items);
931 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
937 if (sv_isobject(sv)) {
938 sv_unmagic(varsv, how);
939 /* Croak if a self-tie on an aggregate is attempted. */
940 if (varsv == SvRV(sv) &&
941 (SvTYPE(varsv) == SVt_PVAV ||
942 SvTYPE(varsv) == SVt_PVHV))
944 "Self-ties of arrays and hashes are not supported");
945 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
947 LEAVE_with_name("call_TIE");
948 SP = PL_stack_base + markoff;
958 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
959 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
961 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
964 if ((mg = SvTIED_mg(sv, how))) {
965 SV * const obj = SvRV(SvTIED_obj(sv, mg));
967 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
969 if (gv && isGV(gv) && (cv = GvCV(gv))) {
971 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
972 mXPUSHi(SvREFCNT(obj) - 1);
974 ENTER_with_name("call_UNTIE");
975 call_sv(MUTABLE_SV(cv), G_VOID);
976 LEAVE_with_name("call_UNTIE");
979 else if (mg && SvREFCNT(obj) > 1) {
980 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
981 "untie attempted while %"UVuf" inner references still exist",
982 (UV)SvREFCNT(obj) - 1 ) ;
986 sv_unmagic(sv, how) ;
996 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
997 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
999 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1002 if ((mg = SvTIED_mg(sv, how))) {
1003 PUSHs(SvTIED_obj(sv, mg));
1016 HV * const hv = MUTABLE_HV(POPs);
1017 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1018 stash = gv_stashsv(sv, 0);
1019 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1021 require_pv("AnyDBM_File.pm");
1023 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1024 DIE(aTHX_ "No dbm on this machine");
1034 mPUSHu(O_RDWR|O_CREAT);
1038 if (!SvOK(right)) right = &PL_sv_no;
1042 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1045 if (!sv_isobject(TOPs)) {
1053 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1057 if (sv_isobject(TOPs)) {
1058 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1059 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1076 struct timeval timebuf;
1077 struct timeval *tbuf = &timebuf;
1080 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1085 # if BYTEORDER & 0xf0000
1086 # define ORDERBYTE (0x88888888 - BYTEORDER)
1088 # define ORDERBYTE (0x4444 - BYTEORDER)
1094 for (i = 1; i <= 3; i++) {
1095 SV * const sv = SP[i];
1099 if (SvREADONLY(sv)) {
1101 sv_force_normal_flags(sv, 0);
1102 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1103 Perl_croak_no_modify();
1107 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1108 "Non-string passed as bitmask");
1109 SvPV_force_nomg_nolen(sv); /* force string conversion */
1116 /* little endians can use vecs directly */
1117 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1124 masksize = NFDBITS / NBBY;
1126 masksize = sizeof(long); /* documented int, everyone seems to use long */
1128 Zero(&fd_sets[0], 4, char*);
1131 # if SELECT_MIN_BITS == 1
1132 growsize = sizeof(fd_set);
1134 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1135 # undef SELECT_MIN_BITS
1136 # define SELECT_MIN_BITS __FD_SETSIZE
1138 /* If SELECT_MIN_BITS is greater than one we most probably will want
1139 * to align the sizes with SELECT_MIN_BITS/8 because for example
1140 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1141 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1142 * on (sets/tests/clears bits) is 32 bits. */
1143 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1151 timebuf.tv_sec = (long)value;
1152 value -= (NV)timebuf.tv_sec;
1153 timebuf.tv_usec = (long)(value * 1000000.0);
1158 for (i = 1; i <= 3; i++) {
1160 if (!SvOK(sv) || SvCUR(sv) == 0) {
1167 Sv_Grow(sv, growsize);
1171 while (++j <= growsize) {
1175 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1177 Newx(fd_sets[i], growsize, char);
1178 for (offset = 0; offset < growsize; offset += masksize) {
1179 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1180 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1183 fd_sets[i] = SvPVX(sv);
1187 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1188 /* Can't make just the (void*) conditional because that would be
1189 * cpp #if within cpp macro, and not all compilers like that. */
1190 nfound = PerlSock_select(
1192 (Select_fd_set_t) fd_sets[1],
1193 (Select_fd_set_t) fd_sets[2],
1194 (Select_fd_set_t) fd_sets[3],
1195 (void*) tbuf); /* Workaround for compiler bug. */
1197 nfound = PerlSock_select(
1199 (Select_fd_set_t) fd_sets[1],
1200 (Select_fd_set_t) fd_sets[2],
1201 (Select_fd_set_t) fd_sets[3],
1204 for (i = 1; i <= 3; i++) {
1207 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1209 for (offset = 0; offset < growsize; offset += masksize) {
1210 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1211 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1213 Safefree(fd_sets[i]);
1220 if (GIMME == G_ARRAY && tbuf) {
1221 value = (NV)(timebuf.tv_sec) +
1222 (NV)(timebuf.tv_usec) / 1000000.0;
1227 DIE(aTHX_ "select not implemented");
1232 =for apidoc setdefout
1234 Sets PL_defoutgv, the default file handle for output, to the passed in
1235 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1236 count of the passed in typeglob is increased by one, and the reference count
1237 of the typeglob that PL_defoutgv points to is decreased by one.
1243 Perl_setdefout(pTHX_ GV *gv)
1246 PERL_ARGS_ASSERT_SETDEFOUT;
1247 SvREFCNT_inc_simple_void_NN(gv);
1248 SvREFCNT_dec(PL_defoutgv);
1256 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1257 GV * egv = GvEGVx(PL_defoutgv);
1262 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1263 gvp = hv && HvENAME(hv)
1264 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1266 if (gvp && *gvp == egv) {
1267 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1271 mXPUSHs(newRV(MUTABLE_SV(egv)));
1275 if (!GvIO(newdefout))
1276 gv_IOadd(newdefout);
1277 setdefout(newdefout);
1287 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1288 IO *const io = GvIO(gv);
1294 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1296 const U32 gimme = GIMME_V;
1297 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1298 if (gimme == G_SCALAR) {
1300 SvSetMagicSV_nosteal(TARG, TOPs);
1305 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1306 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1308 SETERRNO(EBADF,RMS_IFI);
1312 sv_setpvs(TARG, " ");
1313 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1314 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1315 /* Find out how many bytes the char needs */
1316 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1319 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1320 SvCUR_set(TARG,1+len);
1329 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1333 const I32 gimme = GIMME_V;
1335 PERL_ARGS_ASSERT_DOFORM;
1337 if (cv && CvCLONE(cv))
1338 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1343 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1344 PUSHFORMAT(cx, retop);
1345 if (CvDEPTH(cv) >= 2) {
1346 PERL_STACK_OVERFLOW_CHECK();
1347 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1350 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1352 setdefout(gv); /* locally select filehandle so $% et al work */
1371 gv = MUTABLE_GV(POPs);
1388 tmpsv = sv_newmortal();
1389 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1390 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1392 IoFLAGS(io) &= ~IOf_DIDTOP;
1393 RETURNOP(doform(cv,gv,PL_op->op_next));
1399 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1400 IO * const io = GvIOp(gv);
1408 if (!io || !(ofp = IoOFP(io)))
1411 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1412 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1414 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1415 PL_formtarget != PL_toptarget)
1419 if (!IoTOP_GV(io)) {
1422 if (!IoTOP_NAME(io)) {
1424 if (!IoFMT_NAME(io))
1425 IoFMT_NAME(io) = savepv(GvNAME(gv));
1426 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1427 HEKfARG(GvNAME_HEK(gv))));
1428 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1429 if ((topgv && GvFORM(topgv)) ||
1430 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1431 IoTOP_NAME(io) = savesvpv(topname);
1433 IoTOP_NAME(io) = savepvs("top");
1435 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1436 if (!topgv || !GvFORM(topgv)) {
1437 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1440 IoTOP_GV(io) = topgv;
1442 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1443 I32 lines = IoLINES_LEFT(io);
1444 const char *s = SvPVX_const(PL_formtarget);
1445 if (lines <= 0) /* Yow, header didn't even fit!!! */
1447 while (lines-- > 0) {
1448 s = strchr(s, '\n');
1454 const STRLEN save = SvCUR(PL_formtarget);
1455 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1456 do_print(PL_formtarget, ofp);
1457 SvCUR_set(PL_formtarget, save);
1458 sv_chop(PL_formtarget, s);
1459 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1462 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1463 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1464 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1466 PL_formtarget = PL_toptarget;
1467 IoFLAGS(io) |= IOf_DIDTOP;
1470 DIE(aTHX_ "bad top format reference");
1473 SV * const sv = sv_newmortal();
1474 gv_efullname4(sv, fgv, NULL, FALSE);
1475 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1477 return doform(cv, gv, PL_op);
1481 POPBLOCK(cx,PL_curpm);
1483 retop = cx->blk_sub.retop;
1484 SP = newsp; /* ignore retval of formline */
1487 if (!io || !(fp = IoOFP(io))) {
1488 if (io && IoIFP(io))
1489 report_wrongway_fh(gv, '<');
1495 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1496 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1498 if (!do_print(PL_formtarget, fp))
1501 FmLINES(PL_formtarget) = 0;
1502 SvCUR_set(PL_formtarget, 0);
1503 *SvEND(PL_formtarget) = '\0';
1504 if (IoFLAGS(io) & IOf_FLUSH)
1505 (void)PerlIO_flush(fp);
1509 PL_formtarget = PL_bodytarget;
1510 PERL_UNUSED_VAR(gimme);
1516 dVAR; dSP; dMARK; dORIGMARK;
1520 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1521 IO *const io = GvIO(gv);
1523 /* Treat empty list as "" */
1524 if (MARK == SP) XPUSHs(&PL_sv_no);
1527 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1529 if (MARK == ORIGMARK) {
1532 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1535 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1537 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1544 SETERRNO(EBADF,RMS_IFI);
1547 else if (!(fp = IoOFP(io))) {
1549 report_wrongway_fh(gv, '<');
1550 else if (ckWARN(WARN_CLOSED))
1552 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1556 SV *sv = sv_newmortal();
1557 do_sprintf(sv, SP - MARK, MARK + 1);
1558 if (!do_print(sv, fp))
1561 if (IoFLAGS(io) & IOf_FLUSH)
1562 if (PerlIO_flush(fp) == EOF)
1571 PUSHs(&PL_sv_undef);
1579 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1580 const int mode = POPi;
1581 SV * const sv = POPs;
1582 GV * const gv = MUTABLE_GV(POPs);
1585 /* Need TIEHANDLE method ? */
1586 const char * const tmps = SvPV_const(sv, len);
1587 /* FIXME? do_open should do const */
1588 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1589 IoLINES(GvIOp(gv)) = 0;
1593 PUSHs(&PL_sv_undef);
1600 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1614 bool charstart = FALSE;
1615 STRLEN charskip = 0;
1618 GV * const gv = MUTABLE_GV(*++MARK);
1619 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1620 && gv && (io = GvIO(gv)) )
1622 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1624 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1625 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1634 sv_setpvs(bufsv, "");
1635 length = SvIVx(*++MARK);
1637 DIE(aTHX_ "Negative length");
1640 offset = SvIVx(*++MARK);
1644 if (!io || !IoIFP(io)) {
1646 SETERRNO(EBADF,RMS_IFI);
1649 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1650 buffer = SvPVutf8_force(bufsv, blen);
1651 /* UTF-8 may not have been set if they are all low bytes */
1656 buffer = SvPV_force(bufsv, blen);
1657 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1659 if (DO_UTF8(bufsv)) {
1660 blen = sv_len_utf8_nomg(bufsv);
1669 if (PL_op->op_type == OP_RECV) {
1670 Sock_size_t bufsize;
1671 char namebuf[MAXPATHLEN];
1672 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1673 bufsize = sizeof (struct sockaddr_in);
1675 bufsize = sizeof namebuf;
1677 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1681 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1682 /* 'offset' means 'flags' here */
1683 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1684 (struct sockaddr *)namebuf, &bufsize);
1687 /* MSG_TRUNC can give oversized count; quietly lose it */
1691 /* Bogus return without padding */
1692 bufsize = sizeof (struct sockaddr_in);
1694 SvCUR_set(bufsv, count);
1695 *SvEND(bufsv) = '\0';
1696 (void)SvPOK_only(bufsv);
1700 /* This should not be marked tainted if the fp is marked clean */
1701 if (!(IoFLAGS(io) & IOf_UNTAINT))
1702 SvTAINTED_on(bufsv);
1704 sv_setpvn(TARG, namebuf, bufsize);
1710 if (-offset > (SSize_t)blen)
1711 DIE(aTHX_ "Offset outside string");
1714 if (DO_UTF8(bufsv)) {
1715 /* convert offset-as-chars to offset-as-bytes */
1716 if (offset >= (SSize_t)blen)
1717 offset += SvCUR(bufsv) - blen;
1719 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1722 orig_size = SvCUR(bufsv);
1723 /* Allocating length + offset + 1 isn't perfect in the case of reading
1724 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1726 (should be 2 * length + offset + 1, or possibly something longer if
1727 PL_encoding is true) */
1728 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1729 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1730 Zero(buffer+orig_size, offset-orig_size, char);
1732 buffer = buffer + offset;
1734 read_target = bufsv;
1736 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1737 concatenate it to the current buffer. */
1739 /* Truncate the existing buffer to the start of where we will be
1741 SvCUR_set(bufsv, offset);
1743 read_target = sv_newmortal();
1744 SvUPGRADE(read_target, SVt_PV);
1745 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1748 if (PL_op->op_type == OP_SYSREAD) {
1749 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1750 if (IoTYPE(io) == IoTYPE_SOCKET) {
1751 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1757 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1762 #ifdef HAS_SOCKET__bad_code_maybe
1763 if (IoTYPE(io) == IoTYPE_SOCKET) {
1764 Sock_size_t bufsize;
1765 char namebuf[MAXPATHLEN];
1766 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1767 bufsize = sizeof (struct sockaddr_in);
1769 bufsize = sizeof namebuf;
1771 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1772 (struct sockaddr *)namebuf, &bufsize);
1777 count = PerlIO_read(IoIFP(io), buffer, length);
1778 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1779 if (count == 0 && PerlIO_error(IoIFP(io)))
1783 if (IoTYPE(io) == IoTYPE_WRONLY)
1784 report_wrongway_fh(gv, '>');
1787 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1788 *SvEND(read_target) = '\0';
1789 (void)SvPOK_only(read_target);
1790 if (fp_utf8 && !IN_BYTES) {
1791 /* Look at utf8 we got back and count the characters */
1792 const char *bend = buffer + count;
1793 while (buffer < bend) {
1795 skip = UTF8SKIP(buffer);
1798 if (buffer - charskip + skip > bend) {
1799 /* partial character - try for rest of it */
1800 length = skip - (bend-buffer);
1801 offset = bend - SvPVX_const(bufsv);
1813 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1814 provided amount read (count) was what was requested (length)
1816 if (got < wanted && count == length) {
1817 length = wanted - got;
1818 offset = bend - SvPVX_const(bufsv);
1821 /* return value is character count */
1825 else if (buffer_utf8) {
1826 /* Let svcatsv upgrade the bytes we read in to utf8.
1827 The buffer is a mortal so will be freed soon. */
1828 sv_catsv_nomg(bufsv, read_target);
1831 /* This should not be marked tainted if the fp is marked clean */
1832 if (!(IoFLAGS(io) & IOf_UNTAINT))
1833 SvTAINTED_on(bufsv);
1845 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1850 STRLEN orig_blen_bytes;
1851 const int op_type = PL_op->op_type;
1854 GV *const gv = MUTABLE_GV(*++MARK);
1855 IO *const io = GvIO(gv);
1857 if (op_type == OP_SYSWRITE && io) {
1858 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1860 if (MARK == SP - 1) {
1862 mXPUSHi(sv_len(sv));
1866 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1867 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1877 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1879 if (io && IoIFP(io))
1880 report_wrongway_fh(gv, '<');
1883 SETERRNO(EBADF,RMS_IFI);
1887 /* Do this first to trigger any overloading. */
1888 buffer = SvPV_const(bufsv, blen);
1889 orig_blen_bytes = blen;
1890 doing_utf8 = DO_UTF8(bufsv);
1892 if (PerlIO_isutf8(IoIFP(io))) {
1893 if (!SvUTF8(bufsv)) {
1894 /* We don't modify the original scalar. */
1895 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1896 buffer = (char *) tmpbuf;
1900 else if (doing_utf8) {
1901 STRLEN tmplen = blen;
1902 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1905 buffer = (char *) tmpbuf;
1909 assert((char *)result == buffer);
1910 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1915 if (op_type == OP_SEND) {
1916 const int flags = SvIVx(*++MARK);
1919 char * const sockbuf = SvPVx(*++MARK, mlen);
1920 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1921 flags, (struct sockaddr *)sockbuf, mlen);
1925 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1931 Size_t length = 0; /* This length is in characters. */
1937 /* The SV is bytes, and we've had to upgrade it. */
1938 blen_chars = orig_blen_bytes;
1940 /* The SV really is UTF-8. */
1941 /* Don't call sv_len_utf8 on a magical or overloaded
1942 scalar, as we might get back a different result. */
1943 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1950 length = blen_chars;
1952 #if Size_t_size > IVSIZE
1953 length = (Size_t)SvNVx(*++MARK);
1955 length = (Size_t)SvIVx(*++MARK);
1957 if ((SSize_t)length < 0) {
1959 DIE(aTHX_ "Negative length");
1964 offset = SvIVx(*++MARK);
1966 if (-offset > (IV)blen_chars) {
1968 DIE(aTHX_ "Offset outside string");
1970 offset += blen_chars;
1971 } else if (offset > (IV)blen_chars) {
1973 DIE(aTHX_ "Offset outside string");
1977 if (length > blen_chars - offset)
1978 length = blen_chars - offset;
1980 /* Here we convert length from characters to bytes. */
1981 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1982 /* Either we had to convert the SV, or the SV is magical, or
1983 the SV has overloading, in which case we can't or mustn't
1984 or mustn't call it again. */
1986 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1987 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1989 /* It's a real UTF-8 SV, and it's not going to change under
1990 us. Take advantage of any cache. */
1992 I32 len_I32 = length;
1994 /* Convert the start and end character positions to bytes.
1995 Remember that the second argument to sv_pos_u2b is relative
1997 sv_pos_u2b(bufsv, &start, &len_I32);
2004 buffer = buffer+offset;
2006 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2007 if (IoTYPE(io) == IoTYPE_SOCKET) {
2008 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2014 /* See the note at doio.c:do_print about filesize limits. --jhi */
2015 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2024 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2027 #if Size_t_size > IVSIZE
2047 * in Perl 5.12 and later, the additional parameter is a bitmask:
2050 * 2 = eof() <- ARGV magic
2052 * I'll rely on the compiler's trace flow analysis to decide whether to
2053 * actually assign this out here, or punt it into the only block where it is
2054 * used. Doing it out here is DRY on the condition logic.
2059 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2065 if (PL_op->op_flags & OPf_SPECIAL) {
2066 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2070 gv = PL_last_in_gv; /* eof */
2078 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2079 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2082 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2083 if (io && !IoIFP(io)) {
2084 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2086 IoFLAGS(io) &= ~IOf_START;
2087 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2089 sv_setpvs(GvSV(gv), "-");
2091 GvSV(gv) = newSVpvs("-");
2092 SvSETMAGIC(GvSV(gv));
2094 else if (!nextargv(gv))
2099 PUSHs(boolSV(do_eof(gv)));
2109 if (MAXARG != 0 && (TOPs || POPs))
2110 PL_last_in_gv = MUTABLE_GV(POPs);
2117 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2119 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2124 SETERRNO(EBADF,RMS_IFI);
2129 #if LSEEKSIZE > IVSIZE
2130 PUSHn( do_tell(gv) );
2132 PUSHi( do_tell(gv) );
2140 const int whence = POPi;
2141 #if LSEEKSIZE > IVSIZE
2142 const Off_t offset = (Off_t)SvNVx(POPs);
2144 const Off_t offset = (Off_t)SvIVx(POPs);
2147 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2148 IO *const io = GvIO(gv);
2151 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2153 #if LSEEKSIZE > IVSIZE
2154 SV *const offset_sv = newSVnv((NV) offset);
2156 SV *const offset_sv = newSViv(offset);
2159 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2164 if (PL_op->op_type == OP_SEEK)
2165 PUSHs(boolSV(do_seek(gv, offset, whence)));
2167 const Off_t sought = do_sysseek(gv, offset, whence);
2169 PUSHs(&PL_sv_undef);
2171 SV* const sv = sought ?
2172 #if LSEEKSIZE > IVSIZE
2177 : newSVpvn(zero_but_true, ZBTLEN);
2188 /* There seems to be no consensus on the length type of truncate()
2189 * and ftruncate(), both off_t and size_t have supporters. In
2190 * general one would think that when using large files, off_t is
2191 * at least as wide as size_t, so using an off_t should be okay. */
2192 /* XXX Configure probe for the length type of *truncate() needed XXX */
2195 #if Off_t_size > IVSIZE
2200 /* Checking for length < 0 is problematic as the type might or
2201 * might not be signed: if it is not, clever compilers will moan. */
2202 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2205 SV * const sv = POPs;
2210 if (PL_op->op_flags & OPf_SPECIAL
2211 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2212 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2219 TAINT_PROPER("truncate");
2220 if (!(fp = IoIFP(io))) {
2226 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2228 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2234 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2235 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2236 goto do_ftruncate_io;
2239 const char * const name = SvPV_nomg_const_nolen(sv);
2240 TAINT_PROPER("truncate");
2242 if (truncate(name, len) < 0)
2246 const int tmpfd = PerlLIO_open(name, O_RDWR);
2251 if (my_chsize(tmpfd, len) < 0)
2253 PerlLIO_close(tmpfd);
2262 SETERRNO(EBADF,RMS_IFI);
2270 SV * const argsv = POPs;
2271 const unsigned int func = POPu;
2272 const int optype = PL_op->op_type;
2273 GV * const gv = MUTABLE_GV(POPs);
2274 IO * const io = gv ? GvIOn(gv) : NULL;
2278 if (!io || !argsv || !IoIFP(io)) {
2280 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2284 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2287 s = SvPV_force(argsv, len);
2288 need = IOCPARM_LEN(func);
2290 s = Sv_Grow(argsv, need + 1);
2291 SvCUR_set(argsv, need);
2294 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2297 retval = SvIV(argsv);
2298 s = INT2PTR(char*,retval); /* ouch */
2301 TAINT_PROPER(PL_op_desc[optype]);
2303 if (optype == OP_IOCTL)
2305 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2307 DIE(aTHX_ "ioctl is not implemented");
2311 DIE(aTHX_ "fcntl is not implemented");
2313 #if defined(OS2) && defined(__EMX__)
2314 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2316 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2320 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2322 if (s[SvCUR(argsv)] != 17)
2323 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2325 s[SvCUR(argsv)] = 0; /* put our null back */
2326 SvSETMAGIC(argsv); /* Assume it has changed */
2335 PUSHp(zero_but_true, ZBTLEN);
2346 const int argtype = POPi;
2347 GV * const gv = MUTABLE_GV(POPs);
2348 IO *const io = GvIO(gv);
2349 PerlIO *const fp = io ? IoIFP(io) : NULL;
2351 /* XXX Looks to me like io is always NULL at this point */
2353 (void)PerlIO_flush(fp);
2354 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2359 SETERRNO(EBADF,RMS_IFI);
2364 DIE(aTHX_ PL_no_func, "flock()");
2375 const int protocol = POPi;
2376 const int type = POPi;
2377 const int domain = POPi;
2378 GV * const gv = MUTABLE_GV(POPs);
2379 IO * const io = gv ? GvIOn(gv) : NULL;
2384 if (io && IoIFP(io))
2385 do_close(gv, FALSE);
2386 SETERRNO(EBADF,LIB_INVARG);
2391 do_close(gv, FALSE);
2393 TAINT_PROPER("socket");
2394 fd = PerlSock_socket(domain, type, protocol);
2397 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2398 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2399 IoTYPE(io) = IoTYPE_SOCKET;
2400 if (!IoIFP(io) || !IoOFP(io)) {
2401 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2402 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2403 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2406 #if defined(HAS_FCNTL) && defined(F_SETFD)
2407 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2411 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2420 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2422 const int protocol = POPi;
2423 const int type = POPi;
2424 const int domain = POPi;
2425 GV * const gv2 = MUTABLE_GV(POPs);
2426 GV * const gv1 = MUTABLE_GV(POPs);
2427 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2428 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2432 report_evil_fh(gv1);
2434 report_evil_fh(gv2);
2436 if (io1 && IoIFP(io1))
2437 do_close(gv1, FALSE);
2438 if (io2 && IoIFP(io2))
2439 do_close(gv2, FALSE);
2444 TAINT_PROPER("socketpair");
2445 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2447 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2448 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2449 IoTYPE(io1) = IoTYPE_SOCKET;
2450 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2451 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2452 IoTYPE(io2) = IoTYPE_SOCKET;
2453 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2454 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2455 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2456 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2457 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2458 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2459 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2462 #if defined(HAS_FCNTL) && defined(F_SETFD)
2463 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2464 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2469 DIE(aTHX_ PL_no_sock_func, "socketpair");
2478 SV * const addrsv = POPs;
2479 /* OK, so on what platform does bind modify addr? */
2481 GV * const gv = MUTABLE_GV(POPs);
2482 IO * const io = GvIOn(gv);
2484 const int op_type = PL_op->op_type;
2486 if (!io || !IoIFP(io))
2489 addr = SvPV_const(addrsv, len);
2490 TAINT_PROPER(PL_op_desc[op_type]);
2491 if ((op_type == OP_BIND
2492 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2493 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2501 SETERRNO(EBADF,SS_IVCHAN);
2508 const int backlog = POPi;
2509 GV * const gv = MUTABLE_GV(POPs);
2510 IO * const io = gv ? GvIOn(gv) : NULL;
2512 if (!io || !IoIFP(io))
2515 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2522 SETERRNO(EBADF,SS_IVCHAN);
2531 char namebuf[MAXPATHLEN];
2532 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2533 Sock_size_t len = sizeof (struct sockaddr_in);
2535 Sock_size_t len = sizeof namebuf;
2537 GV * const ggv = MUTABLE_GV(POPs);
2538 GV * const ngv = MUTABLE_GV(POPs);
2547 if (!gstio || !IoIFP(gstio))
2551 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2554 /* Some platforms indicate zero length when an AF_UNIX client is
2555 * not bound. Simulate a non-zero-length sockaddr structure in
2557 namebuf[0] = 0; /* sun_len */
2558 namebuf[1] = AF_UNIX; /* sun_family */
2566 do_close(ngv, FALSE);
2567 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2568 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2569 IoTYPE(nstio) = IoTYPE_SOCKET;
2570 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2571 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2572 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2573 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2576 #if defined(HAS_FCNTL) && defined(F_SETFD)
2577 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2581 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2582 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2584 #ifdef __SCO_VERSION__
2585 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2588 PUSHp(namebuf, len);
2592 report_evil_fh(ggv);
2593 SETERRNO(EBADF,SS_IVCHAN);
2603 const int how = POPi;
2604 GV * const gv = MUTABLE_GV(POPs);
2605 IO * const io = GvIOn(gv);
2607 if (!io || !IoIFP(io))
2610 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2615 SETERRNO(EBADF,SS_IVCHAN);
2622 const int optype = PL_op->op_type;
2623 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2624 const unsigned int optname = (unsigned int) POPi;
2625 const unsigned int lvl = (unsigned int) POPi;
2626 GV * const gv = MUTABLE_GV(POPs);
2627 IO * const io = GvIOn(gv);
2631 if (!io || !IoIFP(io))
2634 fd = PerlIO_fileno(IoIFP(io));
2638 (void)SvPOK_only(sv);
2642 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2649 #if defined(__SYMBIAN32__)
2650 # define SETSOCKOPT_OPTION_VALUE_T void *
2652 # define SETSOCKOPT_OPTION_VALUE_T const char *
2654 /* XXX TODO: We need to have a proper type (a Configure probe,
2655 * etc.) for what the C headers think of the third argument of
2656 * setsockopt(), the option_value read-only buffer: is it
2657 * a "char *", or a "void *", const or not. Some compilers
2658 * don't take kindly to e.g. assuming that "char *" implicitly
2659 * promotes to a "void *", or to explicitly promoting/demoting
2660 * consts to non/vice versa. The "const void *" is the SUS
2661 * definition, but that does not fly everywhere for the above
2663 SETSOCKOPT_OPTION_VALUE_T buf;
2667 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2671 aint = (int)SvIV(sv);
2672 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2675 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2685 SETERRNO(EBADF,SS_IVCHAN);
2694 const int optype = PL_op->op_type;
2695 GV * const gv = MUTABLE_GV(POPs);
2696 IO * const io = GvIOn(gv);
2701 if (!io || !IoIFP(io))
2704 sv = sv_2mortal(newSV(257));
2705 (void)SvPOK_only(sv);
2709 fd = PerlIO_fileno(IoIFP(io));
2711 case OP_GETSOCKNAME:
2712 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2715 case OP_GETPEERNAME:
2716 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2718 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2720 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";
2721 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2722 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2723 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2724 sizeof(u_short) + sizeof(struct in_addr))) {
2731 #ifdef BOGUS_GETNAME_RETURN
2732 /* Interactive Unix, getpeername() and getsockname()
2733 does not return valid namelen */
2734 if (len == BOGUS_GETNAME_RETURN)
2735 len = sizeof(struct sockaddr);
2744 SETERRNO(EBADF,SS_IVCHAN);
2763 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2764 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2765 if (PL_op->op_type == OP_LSTAT) {
2766 if (gv != PL_defgv) {
2767 do_fstat_warning_check:
2768 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2769 "lstat() on filehandle%s%"SVf,
2772 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2774 } else if (PL_laststype != OP_LSTAT)
2775 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2776 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2779 if (gv != PL_defgv) {
2783 PL_laststype = OP_STAT;
2784 PL_statgv = gv ? gv : (GV *)io;
2785 sv_setpvs(PL_statname, "");
2792 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2794 } else if (IoDIRP(io)) {
2796 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2799 PL_laststatval = -1;
2802 else PL_laststatval = -1;
2803 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2806 if (PL_laststatval < 0) {
2811 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2812 io = MUTABLE_IO(SvRV(sv));
2813 if (PL_op->op_type == OP_LSTAT)
2814 goto do_fstat_warning_check;
2815 goto do_fstat_have_io;
2818 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2819 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2821 PL_laststype = PL_op->op_type;
2822 if (PL_op->op_type == OP_LSTAT)
2823 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2825 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2826 if (PL_laststatval < 0) {
2827 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2828 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2834 if (gimme != G_ARRAY) {
2835 if (gimme != G_VOID)
2836 XPUSHs(boolSV(max));
2842 mPUSHi(PL_statcache.st_dev);
2843 #if ST_INO_SIZE > IVSIZE
2844 mPUSHn(PL_statcache.st_ino);
2846 # if ST_INO_SIGN <= 0
2847 mPUSHi(PL_statcache.st_ino);
2849 mPUSHu(PL_statcache.st_ino);
2852 mPUSHu(PL_statcache.st_mode);
2853 mPUSHu(PL_statcache.st_nlink);
2854 #if Uid_t_size > IVSIZE
2855 mPUSHn(PL_statcache.st_uid);
2857 # if Uid_t_sign <= 0
2858 mPUSHi(PL_statcache.st_uid);
2860 mPUSHu(PL_statcache.st_uid);
2863 #if Gid_t_size > IVSIZE
2864 mPUSHn(PL_statcache.st_gid);
2866 # if Gid_t_sign <= 0
2867 mPUSHi(PL_statcache.st_gid);
2869 mPUSHu(PL_statcache.st_gid);
2872 #ifdef USE_STAT_RDEV
2873 mPUSHi(PL_statcache.st_rdev);
2875 PUSHs(newSVpvs_flags("", SVs_TEMP));
2877 #if Off_t_size > IVSIZE
2878 mPUSHn(PL_statcache.st_size);
2880 mPUSHi(PL_statcache.st_size);
2883 mPUSHn(PL_statcache.st_atime);
2884 mPUSHn(PL_statcache.st_mtime);
2885 mPUSHn(PL_statcache.st_ctime);
2887 mPUSHi(PL_statcache.st_atime);
2888 mPUSHi(PL_statcache.st_mtime);
2889 mPUSHi(PL_statcache.st_ctime);
2891 #ifdef USE_STAT_BLOCKS
2892 mPUSHu(PL_statcache.st_blksize);
2893 mPUSHu(PL_statcache.st_blocks);
2895 PUSHs(newSVpvs_flags("", SVs_TEMP));
2896 PUSHs(newSVpvs_flags("", SVs_TEMP));
2902 /* All filetest ops avoid manipulating the perl stack pointer in their main
2903 bodies (since commit d2c4d2d1e22d3125), and return using either
2904 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2905 the only two which manipulate the perl stack. To ensure that no stack
2906 manipulation macros are used, the filetest ops avoid defining a local copy
2907 of the stack pointer with dSP. */
2909 /* If the next filetest is stacked up with this one
2910 (PL_op->op_private & OPpFT_STACKING), we leave
2911 the original argument on the stack for success,
2912 and skip the stacked operators on failure.
2913 The next few macros/functions take care of this.
2917 S_ft_return_false(pTHX_ SV *ret) {
2921 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2925 if (PL_op->op_private & OPpFT_STACKING) {
2926 while (OP_IS_FILETEST(next->op_type)
2927 && next->op_private & OPpFT_STACKED)
2928 next = next->op_next;
2933 PERL_STATIC_INLINE OP *
2934 S_ft_return_true(pTHX_ SV *ret) {
2936 if (PL_op->op_flags & OPf_REF)
2937 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2938 else if (!(PL_op->op_private & OPpFT_STACKING))
2944 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2945 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2946 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2948 #define tryAMAGICftest_MG(chr) STMT_START { \
2949 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2950 && PL_op->op_flags & OPf_KIDS) { \
2951 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2952 if (next) return next; \
2957 S_try_amagic_ftest(pTHX_ char chr) {
2959 SV *const arg = *PL_stack_sp;
2962 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2966 const char tmpchr = chr;
2967 SV * const tmpsv = amagic_call(arg,
2968 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2969 ftest_amg, AMGf_unary);
2974 return SvTRUE(tmpsv)
2975 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2985 /* Not const, because things tweak this below. Not bool, because there's
2986 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2987 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2988 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2989 /* Giving some sort of initial value silences compilers. */
2991 int access_mode = R_OK;
2993 int access_mode = 0;
2996 /* access_mode is never used, but leaving use_access in makes the
2997 conditional compiling below much clearer. */
3000 Mode_t stat_mode = S_IRUSR;
3002 bool effective = FALSE;
3005 switch (PL_op->op_type) {
3006 case OP_FTRREAD: opchar = 'R'; break;
3007 case OP_FTRWRITE: opchar = 'W'; break;
3008 case OP_FTREXEC: opchar = 'X'; break;
3009 case OP_FTEREAD: opchar = 'r'; break;
3010 case OP_FTEWRITE: opchar = 'w'; break;
3011 case OP_FTEEXEC: opchar = 'x'; break;
3013 tryAMAGICftest_MG(opchar);
3015 switch (PL_op->op_type) {
3017 #if !(defined(HAS_ACCESS) && defined(R_OK))
3023 #if defined(HAS_ACCESS) && defined(W_OK)
3028 stat_mode = S_IWUSR;
3032 #if defined(HAS_ACCESS) && defined(X_OK)
3037 stat_mode = S_IXUSR;
3041 #ifdef PERL_EFF_ACCESS
3044 stat_mode = S_IWUSR;
3048 #ifndef PERL_EFF_ACCESS
3055 #ifdef PERL_EFF_ACCESS
3060 stat_mode = S_IXUSR;
3066 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3067 const char *name = SvPV_nolen(*PL_stack_sp);
3069 # ifdef PERL_EFF_ACCESS
3070 result = PERL_EFF_ACCESS(name, access_mode);
3072 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3078 result = access(name, access_mode);
3080 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3091 result = my_stat_flags(0);
3094 if (cando(stat_mode, effective, &PL_statcache))
3103 const int op_type = PL_op->op_type;
3107 case OP_FTIS: opchar = 'e'; break;
3108 case OP_FTSIZE: opchar = 's'; break;
3109 case OP_FTMTIME: opchar = 'M'; break;
3110 case OP_FTCTIME: opchar = 'C'; break;
3111 case OP_FTATIME: opchar = 'A'; break;
3113 tryAMAGICftest_MG(opchar);
3115 result = my_stat_flags(0);
3118 if (op_type == OP_FTIS)
3121 /* You can't dTARGET inside OP_FTIS, because you'll get
3122 "panic: pad_sv po" - the op is not flagged to have a target. */
3126 #if Off_t_size > IVSIZE
3127 sv_setnv(TARG, (NV)PL_statcache.st_size);
3129 sv_setiv(TARG, (IV)PL_statcache.st_size);
3134 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3138 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3142 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3146 return SvTRUE_nomg(TARG)
3147 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3157 switch (PL_op->op_type) {
3158 case OP_FTROWNED: opchar = 'O'; break;
3159 case OP_FTEOWNED: opchar = 'o'; break;
3160 case OP_FTZERO: opchar = 'z'; break;
3161 case OP_FTSOCK: opchar = 'S'; break;
3162 case OP_FTCHR: opchar = 'c'; break;
3163 case OP_FTBLK: opchar = 'b'; break;
3164 case OP_FTFILE: opchar = 'f'; break;
3165 case OP_FTDIR: opchar = 'd'; break;
3166 case OP_FTPIPE: opchar = 'p'; break;
3167 case OP_FTSUID: opchar = 'u'; break;
3168 case OP_FTSGID: opchar = 'g'; break;
3169 case OP_FTSVTX: opchar = 'k'; break;
3171 tryAMAGICftest_MG(opchar);
3173 /* I believe that all these three are likely to be defined on most every
3174 system these days. */
3176 if(PL_op->op_type == OP_FTSUID) {
3181 if(PL_op->op_type == OP_FTSGID) {
3186 if(PL_op->op_type == OP_FTSVTX) {
3191 result = my_stat_flags(0);
3194 switch (PL_op->op_type) {
3196 if (PL_statcache.st_uid == PerlProc_getuid())
3200 if (PL_statcache.st_uid == PerlProc_geteuid())
3204 if (PL_statcache.st_size == 0)
3208 if (S_ISSOCK(PL_statcache.st_mode))
3212 if (S_ISCHR(PL_statcache.st_mode))
3216 if (S_ISBLK(PL_statcache.st_mode))
3220 if (S_ISREG(PL_statcache.st_mode))
3224 if (S_ISDIR(PL_statcache.st_mode))
3228 if (S_ISFIFO(PL_statcache.st_mode))
3233 if (PL_statcache.st_mode & S_ISUID)
3239 if (PL_statcache.st_mode & S_ISGID)
3245 if (PL_statcache.st_mode & S_ISVTX)
3258 tryAMAGICftest_MG('l');
3259 result = my_lstat_flags(0);
3263 if (S_ISLNK(PL_statcache.st_mode))
3276 tryAMAGICftest_MG('t');
3278 if (PL_op->op_flags & OPf_REF)
3281 SV *tmpsv = *PL_stack_sp;
3282 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3283 name = SvPV_nomg(tmpsv, namelen);
3284 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3288 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3289 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3290 else if (name && isDIGIT(*name))
3294 if (PerlLIO_isatty(fd))
3312 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3314 if (PL_op->op_flags & OPf_REF)
3316 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3321 gv = MAYBE_DEREF_GV_nomg(sv);
3325 if (gv == PL_defgv) {
3327 io = SvTYPE(PL_statgv) == SVt_PVIO
3331 goto really_filename;
3336 sv_setpvs(PL_statname, "");
3337 io = GvIO(PL_statgv);
3339 PL_laststatval = -1;
3340 PL_laststype = OP_STAT;
3341 if (io && IoIFP(io)) {
3342 if (! PerlIO_has_base(IoIFP(io)))
3343 DIE(aTHX_ "-T and -B not implemented on filehandles");
3344 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3345 if (PL_laststatval < 0)
3347 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3348 if (PL_op->op_type == OP_FTTEXT)
3353 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3354 i = PerlIO_getc(IoIFP(io));
3356 (void)PerlIO_ungetc(IoIFP(io),i);
3358 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3360 len = PerlIO_get_bufsiz(IoIFP(io));
3361 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3362 /* sfio can have large buffers - limit to 512 */
3367 SETERRNO(EBADF,RMS_IFI);
3369 SETERRNO(EBADF,RMS_IFI);
3374 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3377 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3379 PL_laststatval = -1;
3380 PL_laststype = OP_STAT;
3382 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3384 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3387 PL_laststype = OP_STAT;
3388 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3389 if (PL_laststatval < 0) {
3390 (void)PerlIO_close(fp);
3393 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3394 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3395 (void)PerlIO_close(fp);
3397 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3398 FT_RETURNNO; /* special case NFS directories */
3399 FT_RETURNYES; /* null file is anything */
3404 /* now scan s to look for textiness */
3405 /* XXX ASCII dependent code */
3407 #if defined(DOSISH) || defined(USEMYBINMODE)
3408 /* ignore trailing ^Z on short files */
3409 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3413 for (i = 0; i < len; i++, s++) {
3414 if (!*s) { /* null never allowed in text */
3419 else if (!(isPRINT(*s) || isSPACE(*s)))
3422 else if (*s & 128) {
3424 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3427 /* utf8 characters don't count as odd */
3428 if (UTF8_IS_START(*s)) {
3429 int ulen = UTF8SKIP(s);
3430 if (ulen < len - i) {
3432 for (j = 1; j < ulen; j++) {
3433 if (!UTF8_IS_CONTINUATION(s[j]))
3436 --ulen; /* loop does extra increment */
3446 *s != '\n' && *s != '\r' && *s != '\b' &&
3447 *s != '\t' && *s != '\f' && *s != 27)
3452 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3463 const char *tmps = NULL;
3467 SV * const sv = POPs;
3468 if (PL_op->op_flags & OPf_SPECIAL) {
3469 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3471 else if (!(gv = MAYBE_DEREF_GV(sv)))
3472 tmps = SvPV_nomg_const_nolen(sv);
3475 if( !gv && (!tmps || !*tmps) ) {
3476 HV * const table = GvHVn(PL_envgv);
3479 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3480 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3482 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3487 deprecate("chdir('') or chdir(undef) as chdir()");
3488 tmps = SvPV_nolen_const(*svp);
3492 TAINT_PROPER("chdir");
3497 TAINT_PROPER("chdir");
3500 IO* const io = GvIO(gv);
3503 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3504 } else if (IoIFP(io)) {
3505 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3509 SETERRNO(EBADF, RMS_IFI);
3515 SETERRNO(EBADF,RMS_IFI);
3519 DIE(aTHX_ PL_no_func, "fchdir");
3523 PUSHi( PerlDir_chdir(tmps) >= 0 );
3525 /* Clear the DEFAULT element of ENV so we'll get the new value
3527 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3534 dVAR; dSP; dMARK; dTARGET;
3535 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3546 char * const tmps = POPpx;
3547 TAINT_PROPER("chroot");
3548 PUSHi( chroot(tmps) >= 0 );
3551 DIE(aTHX_ PL_no_func, "chroot");
3559 const char * const tmps2 = POPpconstx;
3560 const char * const tmps = SvPV_nolen_const(TOPs);
3561 TAINT_PROPER("rename");
3563 anum = PerlLIO_rename(tmps, tmps2);
3565 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3566 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3569 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3570 (void)UNLINK(tmps2);
3571 if (!(anum = link(tmps, tmps2)))
3572 anum = UNLINK(tmps);
3580 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3584 const int op_type = PL_op->op_type;
3588 if (op_type == OP_LINK)
3589 DIE(aTHX_ PL_no_func, "link");
3591 # ifndef HAS_SYMLINK
3592 if (op_type == OP_SYMLINK)
3593 DIE(aTHX_ PL_no_func, "symlink");
3597 const char * const tmps2 = POPpconstx;
3598 const char * const tmps = SvPV_nolen_const(TOPs);
3599 TAINT_PROPER(PL_op_desc[op_type]);
3601 # if defined(HAS_LINK)
3602 # if defined(HAS_SYMLINK)
3603 /* Both present - need to choose which. */
3604 (op_type == OP_LINK) ?
3605 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3607 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3608 PerlLIO_link(tmps, tmps2);
3611 # if defined(HAS_SYMLINK)
3612 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3613 symlink(tmps, tmps2);
3618 SETi( result >= 0 );
3625 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3636 char buf[MAXPATHLEN];
3639 #ifndef INCOMPLETE_TAINTS
3643 len = readlink(tmps, buf, sizeof(buf) - 1);
3650 RETSETUNDEF; /* just pretend it's a normal file */
3654 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3656 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3658 char * const save_filename = filename;
3663 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3665 PERL_ARGS_ASSERT_DOONELINER;
3667 Newx(cmdline, size, char);
3668 my_strlcpy(cmdline, cmd, size);
3669 my_strlcat(cmdline, " ", size);
3670 for (s = cmdline + strlen(cmdline); *filename; ) {
3674 if (s - cmdline < size)
3675 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3676 myfp = PerlProc_popen(cmdline, "r");
3680 SV * const tmpsv = sv_newmortal();
3681 /* Need to save/restore 'PL_rs' ?? */
3682 s = sv_gets(tmpsv, myfp, 0);
3683 (void)PerlProc_pclose(myfp);
3687 #ifdef HAS_SYS_ERRLIST
3692 /* you don't see this */
3693 const char * const errmsg =
3694 #ifdef HAS_SYS_ERRLIST
3702 if (instr(s, errmsg)) {
3709 #define EACCES EPERM
3711 if (instr(s, "cannot make"))
3712 SETERRNO(EEXIST,RMS_FEX);
3713 else if (instr(s, "existing file"))
3714 SETERRNO(EEXIST,RMS_FEX);
3715 else if (instr(s, "ile exists"))
3716 SETERRNO(EEXIST,RMS_FEX);
3717 else if (instr(s, "non-exist"))
3718 SETERRNO(ENOENT,RMS_FNF);
3719 else if (instr(s, "does not exist"))
3720 SETERRNO(ENOENT,RMS_FNF);
3721 else if (instr(s, "not empty"))
3722 SETERRNO(EBUSY,SS_DEVOFFLINE);
3723 else if (instr(s, "cannot access"))
3724 SETERRNO(EACCES,RMS_PRV);
3726 SETERRNO(EPERM,RMS_PRV);
3729 else { /* some mkdirs return no failure indication */
3730 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3731 if (PL_op->op_type == OP_RMDIR)
3736 SETERRNO(EACCES,RMS_PRV); /* a guess */
3745 /* This macro removes trailing slashes from a directory name.
3746 * Different operating and file systems take differently to
3747 * trailing slashes. According to POSIX 1003.1 1996 Edition
3748 * any number of trailing slashes should be allowed.
3749 * Thusly we snip them away so that even non-conforming
3750 * systems are happy.
3751 * We should probably do this "filtering" for all
3752 * the functions that expect (potentially) directory names:
3753 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3754 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3756 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3757 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3760 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3761 (tmps) = savepvn((tmps), (len)); \
3771 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3773 TRIMSLASHES(tmps,len,copy);
3775 TAINT_PROPER("mkdir");
3777 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3781 SETi( dooneliner("mkdir", tmps) );
3782 oldumask = PerlLIO_umask(0);
3783 PerlLIO_umask(oldumask);
3784 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3799 TRIMSLASHES(tmps,len,copy);
3800 TAINT_PROPER("rmdir");
3802 SETi( PerlDir_rmdir(tmps) >= 0 );
3804 SETi( dooneliner("rmdir", tmps) );
3811 /* Directory calls. */
3815 #if defined(Direntry_t) && defined(HAS_READDIR)
3817 const char * const dirname = POPpconstx;
3818 GV * const gv = MUTABLE_GV(POPs);
3819 IO * const io = GvIOn(gv);
3824 if ((IoIFP(io) || IoOFP(io)))
3825 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3826 "Opening filehandle %"HEKf" also as a directory",
3827 HEKfARG(GvENAME_HEK(gv)) );
3829 PerlDir_close(IoDIRP(io));
3830 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3836 SETERRNO(EBADF,RMS_DIR);
3839 DIE(aTHX_ PL_no_dir_func, "opendir");
3845 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3846 DIE(aTHX_ PL_no_dir_func, "readdir");
3848 #if !defined(I_DIRENT) && !defined(VMS)
3849 Direntry_t *readdir (DIR *);
3855 const I32 gimme = GIMME;
3856 GV * const gv = MUTABLE_GV(POPs);
3857 const Direntry_t *dp;
3858 IO * const io = GvIOn(gv);
3860 if (!io || !IoDIRP(io)) {
3861 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3862 "readdir() attempted on invalid dirhandle %"HEKf,
3863 HEKfARG(GvENAME_HEK(gv)));
3868 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3872 sv = newSVpvn(dp->d_name, dp->d_namlen);
3874 sv = newSVpv(dp->d_name, 0);
3876 #ifndef INCOMPLETE_TAINTS
3877 if (!(IoFLAGS(io) & IOf_UNTAINT))
3881 } while (gimme == G_ARRAY);
3883 if (!dp && gimme != G_ARRAY)
3890 SETERRNO(EBADF,RMS_ISI);
3891 if (GIMME == G_ARRAY)
3900 #if defined(HAS_TELLDIR) || defined(telldir)
3902 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3903 /* XXX netbsd still seemed to.
3904 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3905 --JHI 1999-Feb-02 */
3906 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3907 long telldir (DIR *);
3909 GV * const gv = MUTABLE_GV(POPs);
3910 IO * const io = GvIOn(gv);
3912 if (!io || !IoDIRP(io)) {
3913 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3914 "telldir() attempted on invalid dirhandle %"HEKf,
3915 HEKfARG(GvENAME_HEK(gv)));
3919 PUSHi( PerlDir_tell(IoDIRP(io)) );
3923 SETERRNO(EBADF,RMS_ISI);
3926 DIE(aTHX_ PL_no_dir_func, "telldir");
3932 #if defined(HAS_SEEKDIR) || defined(seekdir)
3934 const long along = POPl;
3935 GV * const gv = MUTABLE_GV(POPs);
3936 IO * const io = GvIOn(gv);
3938 if (!io || !IoDIRP(io)) {
3939 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3940 "seekdir() attempted on invalid dirhandle %"HEKf,
3941 HEKfARG(GvENAME_HEK(gv)));
3944 (void)PerlDir_seek(IoDIRP(io), along);
3949 SETERRNO(EBADF,RMS_ISI);
3952 DIE(aTHX_ PL_no_dir_func, "seekdir");
3958 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3960 GV * const gv = MUTABLE_GV(POPs);
3961 IO * const io = GvIOn(gv);
3963 if (!io || !IoDIRP(io)) {
3964 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3965 "rewinddir() attempted on invalid dirhandle %"HEKf,
3966 HEKfARG(GvENAME_HEK(gv)));
3969 (void)PerlDir_rewind(IoDIRP(io));
3973 SETERRNO(EBADF,RMS_ISI);
3976 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3982 #if defined(Direntry_t) && defined(HAS_READDIR)
3984 GV * const gv = MUTABLE_GV(POPs);
3985 IO * const io = GvIOn(gv);
3987 if (!io || !IoDIRP(io)) {
3988 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3989 "closedir() attempted on invalid dirhandle %"HEKf,
3990 HEKfARG(GvENAME_HEK(gv)));
3993 #ifdef VOID_CLOSEDIR
3994 PerlDir_close(IoDIRP(io));
3996 if (PerlDir_close(IoDIRP(io)) < 0) {
3997 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4006 SETERRNO(EBADF,RMS_IFI);
4009 DIE(aTHX_ PL_no_dir_func, "closedir");
4013 /* Process control. */
4020 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4021 sigset_t oldmask, newmask;
4025 PERL_FLUSHALL_FOR_CHILD;
4026 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4027 sigfillset(&newmask);
4028 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4030 childpid = PerlProc_fork();
4031 if (childpid == 0) {
4035 for (sig = 1; sig < SIG_SIZE; sig++)
4036 PL_psig_pend[sig] = 0;
4038 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4041 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4048 #ifdef PERL_USES_PL_PIDSTATUS
4049 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4055 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4060 PERL_FLUSHALL_FOR_CHILD;
4061 childpid = PerlProc_fork();
4067 DIE(aTHX_ PL_no_func, "fork");
4074 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4079 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4080 childpid = wait4pid(-1, &argflags, 0);
4082 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4087 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4088 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4089 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4091 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4096 DIE(aTHX_ PL_no_func, "wait");
4102 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4104 const int optype = POPi;
4105 const Pid_t pid = TOPi;
4109 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4110 result = wait4pid(pid, &argflags, optype);
4112 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4117 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4118 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4119 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4121 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4126 DIE(aTHX_ PL_no_func, "waitpid");
4132 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4133 #if defined(__LIBCATAMOUNT__)
4134 PL_statusvalue = -1;
4143 while (++MARK <= SP) {
4144 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4149 TAINT_PROPER("system");
4151 PERL_FLUSHALL_FOR_CHILD;
4152 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4157 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4158 sigset_t newset, oldset;
4161 if (PerlProc_pipe(pp) >= 0)
4163 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4164 sigemptyset(&newset);
4165 sigaddset(&newset, SIGCHLD);
4166 sigprocmask(SIG_BLOCK, &newset, &oldset);
4168 while ((childpid = PerlProc_fork()) == -1) {
4169 if (errno != EAGAIN) {
4174 PerlLIO_close(pp[0]);
4175 PerlLIO_close(pp[1]);
4177 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4178 sigprocmask(SIG_SETMASK, &oldset, NULL);
4185 Sigsave_t ihand,qhand; /* place to save signals during system() */
4189 PerlLIO_close(pp[1]);
4191 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4192 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4195 result = wait4pid(childpid, &status, 0);
4196 } while (result == -1 && errno == EINTR);
4198 #ifdef HAS_SIGPROCMASK
4199 sigprocmask(SIG_SETMASK, &oldset, NULL);
4201 (void)rsignal_restore(SIGINT, &ihand);
4202 (void)rsignal_restore(SIGQUIT, &qhand);
4204 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4205 do_execfree(); /* free any memory child malloced on fork */
4212 while (n < sizeof(int)) {
4213 n1 = PerlLIO_read(pp[0],
4214 (void*)(((char*)&errkid)+n),
4220 PerlLIO_close(pp[0]);
4221 if (n) { /* Error */
4222 if (n != sizeof(int))
4223 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4224 errno = errkid; /* Propagate errno from kid */
4225 STATUS_NATIVE_CHILD_SET(-1);
4228 XPUSHi(STATUS_CURRENT);
4231 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4232 sigprocmask(SIG_SETMASK, &oldset, NULL);
4235 PerlLIO_close(pp[0]);
4236 #if defined(HAS_FCNTL) && defined(F_SETFD)
4237 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4240 if (PL_op->op_flags & OPf_STACKED) {
4241 SV * const really = *++MARK;
4242 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4244 else if (SP - MARK != 1)
4245 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4247 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4251 #else /* ! FORK or VMS or OS/2 */
4254 if (PL_op->op_flags & OPf_STACKED) {
4255 SV * const really = *++MARK;
4256 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4257 value = (I32)do_aspawn(really, MARK, SP);
4259 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4262 else if (SP - MARK != 1) {
4263 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4264 value = (I32)do_aspawn(NULL, MARK, SP);
4266 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4270 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4272 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4274 STATUS_NATIVE_CHILD_SET(value);
4277 XPUSHi(result ? value : STATUS_CURRENT);
4278 #endif /* !FORK or VMS or OS/2 */
4285 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4290 while (++MARK <= SP) {
4291 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4296 TAINT_PROPER("exec");
4298 PERL_FLUSHALL_FOR_CHILD;
4299 if (PL_op->op_flags & OPf_STACKED) {
4300 SV * const really = *++MARK;
4301 value = (I32)do_aexec(really, MARK, SP);
4303 else if (SP - MARK != 1)
4305 value = (I32)vms_do_aexec(NULL, MARK, SP);
4307 value = (I32)do_aexec(NULL, MARK, SP);
4311 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4313 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4326 XPUSHi( getppid() );
4329 DIE(aTHX_ PL_no_func, "getppid");
4339 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4342 pgrp = (I32)BSD_GETPGRP(pid);
4344 if (pid != 0 && pid != PerlProc_getpid())
4345 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4351 DIE(aTHX_ PL_no_func, "getpgrp()");
4361 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4362 if (MAXARG > 0) pid = TOPs && TOPi;
4368 TAINT_PROPER("setpgrp");
4370 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4372 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4373 || (pid != 0 && pid != PerlProc_getpid()))
4375 DIE(aTHX_ "setpgrp can't take arguments");
4377 SETi( setpgrp() >= 0 );
4378 #endif /* USE_BSDPGRP */
4381 DIE(aTHX_ PL_no_func, "setpgrp()");
4385 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4386 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4388 # define PRIORITY_WHICH_T(which) which
4393 #ifdef HAS_GETPRIORITY
4395 const int who = POPi;
4396 const int which = TOPi;
4397 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4400 DIE(aTHX_ PL_no_func, "getpriority()");
4406 #ifdef HAS_SETPRIORITY
4408 const int niceval = POPi;
4409 const int who = POPi;
4410 const int which = TOPi;
4411 TAINT_PROPER("setpriority");
4412 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4415 DIE(aTHX_ PL_no_func, "setpriority()");
4419 #undef PRIORITY_WHICH_T
4427 XPUSHn( time(NULL) );
4429 XPUSHi( time(NULL) );
4441 (void)PerlProc_times(&PL_timesbuf);
4443 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4444 /* struct tms, though same data */
4448 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4449 if (GIMME == G_ARRAY) {
4450 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4451 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4452 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4460 if (GIMME == G_ARRAY) {
4467 DIE(aTHX_ "times not implemented");
4469 #endif /* HAS_TIMES */
4472 /* The 32 bit int year limits the times we can represent to these
4473 boundaries with a few days wiggle room to account for time zone
4476 /* Sat Jan 3 00:00:00 -2147481748 */
4477 #define TIME_LOWER_BOUND -67768100567755200.0
4478 /* Sun Dec 29 12:00:00 2147483647 */
4479 #define TIME_UPPER_BOUND 67767976233316800.0
4488 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4489 static const char * const dayname[] =
4490 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4491 static const char * const monname[] =
4492 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4493 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4495 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4498 when = (Time64_T)now;
4501 NV input = Perl_floor(POPn);
4502 when = (Time64_T)input;
4503 if (when != input) {
4504 /* diag_listed_as: gmtime(%f) too large */
4505 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4506 "%s(%.0" NVff ") too large", opname, input);
4510 if ( TIME_LOWER_BOUND > when ) {
4511 /* diag_listed_as: gmtime(%f) too small */
4512 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4513 "%s(%.0" NVff ") too small", opname, when);
4516 else if( when > TIME_UPPER_BOUND ) {
4517 /* diag_listed_as: gmtime(%f) too small */
4518 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4519 "%s(%.0" NVff ") too large", opname, when);
4523 if (PL_op->op_type == OP_LOCALTIME)
4524 err = S_localtime64_r(&when, &tmbuf);
4526 err = S_gmtime64_r(&when, &tmbuf);
4530 /* XXX %lld broken for quads */
4531 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4532 "%s(%.0" NVff ") failed", opname, when);
4535 if (GIMME != G_ARRAY) { /* scalar context */
4537 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4538 double year = (double)tmbuf.tm_year + 1900;
4545 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4546 dayname[tmbuf.tm_wday],
4547 monname[tmbuf.tm_mon],
4555 else { /* list context */
4561 mPUSHi(tmbuf.tm_sec);
4562 mPUSHi(tmbuf.tm_min);
4563 mPUSHi(tmbuf.tm_hour);
4564 mPUSHi(tmbuf.tm_mday);
4565 mPUSHi(tmbuf.tm_mon);
4566 mPUSHn(tmbuf.tm_year);
4567 mPUSHi(tmbuf.tm_wday);
4568 mPUSHi(tmbuf.tm_yday);
4569 mPUSHi(tmbuf.tm_isdst);
4580 anum = alarm((unsigned int)anum);
4586 DIE(aTHX_ PL_no_func, "alarm");
4597 (void)time(&lasttime);
4598 if (MAXARG < 1 || (!TOPs && !POPs))
4602 PerlProc_sleep((unsigned int)duration);
4605 XPUSHi(when - lasttime);
4609 /* Shared memory. */
4610 /* Merged with some message passing. */
4614 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4615 dVAR; dSP; dMARK; dTARGET;
4616 const int op_type = PL_op->op_type;
4621 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4624 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4627 value = (I32)(do_semop(MARK, SP) >= 0);
4630 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4638 return Perl_pp_semget(aTHX);
4646 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4647 dVAR; dSP; dMARK; dTARGET;
4648 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4655 DIE(aTHX_ "System V IPC is not implemented on this machine");
4661 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4662 dVAR; dSP; dMARK; dTARGET;
4663 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4671 PUSHp(zero_but_true, ZBTLEN);
4675 return Perl_pp_semget(aTHX);
4679 /* I can't const this further without getting warnings about the types of
4680 various arrays passed in from structures. */
4682 S_space_join_names_mortal(pTHX_ char *const *array)
4686 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4688 if (array && *array) {
4689 target = newSVpvs_flags("", SVs_TEMP);
4691 sv_catpv(target, *array);
4694 sv_catpvs(target, " ");
4697 target = sv_mortalcopy(&PL_sv_no);
4702 /* Get system info. */
4706 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4708 I32 which = PL_op->op_type;
4711 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4712 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4713 struct hostent *gethostbyname(Netdb_name_t);
4714 struct hostent *gethostent(void);
4716 struct hostent *hent = NULL;
4720 if (which == OP_GHBYNAME) {
4721 #ifdef HAS_GETHOSTBYNAME
4722 const char* const name = POPpbytex;
4723 hent = PerlSock_gethostbyname(name);
4725 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4728 else if (which == OP_GHBYADDR) {
4729 #ifdef HAS_GETHOSTBYADDR
4730 const int addrtype = POPi;
4731 SV * const addrsv = POPs;
4733 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4735 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4737 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4741 #ifdef HAS_GETHOSTENT
4742 hent = PerlSock_gethostent();
4744 DIE(aTHX_ PL_no_sock_func, "gethostent");
4747 #ifdef HOST_NOT_FOUND
4749 #ifdef USE_REENTRANT_API
4750 # ifdef USE_GETHOSTENT_ERRNO
4751 h_errno = PL_reentrant_buffer->_gethostent_errno;
4754 STATUS_UNIX_SET(h_errno);
4758 if (GIMME != G_ARRAY) {
4759 PUSHs(sv = sv_newmortal());
4761 if (which == OP_GHBYNAME) {
4763 sv_setpvn(sv, hent->h_addr, hent->h_length);
4766 sv_setpv(sv, (char*)hent->h_name);
4772 mPUSHs(newSVpv((char*)hent->h_name, 0));
4773 PUSHs(space_join_names_mortal(hent->h_aliases));
4774 mPUSHi(hent->h_addrtype);
4775 len = hent->h_length;
4778 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4779 mXPUSHp(*elem, len);
4783 mPUSHp(hent->h_addr, len);
4785 PUSHs(sv_mortalcopy(&PL_sv_no));
4790 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4796 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4798 I32 which = PL_op->op_type;
4800 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4801 struct netent *getnetbyaddr(Netdb_net_t, int);
4802 struct netent *getnetbyname(Netdb_name_t);
4803 struct netent *getnetent(void);
4805 struct netent *nent;
4807 if (which == OP_GNBYNAME){
4808 #ifdef HAS_GETNETBYNAME
4809 const char * const name = POPpbytex;
4810 nent = PerlSock_getnetbyname(name);
4812 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4815 else if (which == OP_GNBYADDR) {
4816 #ifdef HAS_GETNETBYADDR
4817 const int addrtype = POPi;
4818 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4819 nent = PerlSock_getnetbyaddr(addr, addrtype);
4821 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4825 #ifdef HAS_GETNETENT
4826 nent = PerlSock_getnetent();
4828 DIE(aTHX_ PL_no_sock_func, "getnetent");
4831 #ifdef HOST_NOT_FOUND
4833 #ifdef USE_REENTRANT_API
4834 # ifdef USE_GETNETENT_ERRNO
4835 h_errno = PL_reentrant_buffer->_getnetent_errno;
4838 STATUS_UNIX_SET(h_errno);
4843 if (GIMME != G_ARRAY) {
4844 PUSHs(sv = sv_newmortal());
4846 if (which == OP_GNBYNAME)
4847 sv_setiv(sv, (IV)nent->n_net);
4849 sv_setpv(sv, nent->n_name);
4855 mPUSHs(newSVpv(nent->n_name, 0));
4856 PUSHs(space_join_names_mortal(nent->n_aliases));
4857 mPUSHi(nent->n_addrtype);
4858 mPUSHi(nent->n_net);
4863 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4869 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4871 I32 which = PL_op->op_type;
4873 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4874 struct protoent *getprotobyname(Netdb_name_t);
4875 struct protoent *getprotobynumber(int);
4876 struct protoent *getprotoent(void);
4878 struct protoent *pent;
4880 if (which == OP_GPBYNAME) {
4881 #ifdef HAS_GETPROTOBYNAME
4882 const char* const name = POPpbytex;
4883 pent = PerlSock_getprotobyname(name);
4885 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4888 else if (which == OP_GPBYNUMBER) {
4889 #ifdef HAS_GETPROTOBYNUMBER
4890 const int number = POPi;
4891 pent = PerlSock_getprotobynumber(number);
4893 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4897 #ifdef HAS_GETPROTOENT
4898 pent = PerlSock_getprotoent();
4900 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4904 if (GIMME != G_ARRAY) {
4905 PUSHs(sv = sv_newmortal());
4907 if (which == OP_GPBYNAME)
4908 sv_setiv(sv, (IV)pent->p_proto);
4910 sv_setpv(sv, pent->p_name);
4916 mPUSHs(newSVpv(pent->p_name, 0));
4917 PUSHs(space_join_names_mortal(pent->p_aliases));
4918 mPUSHi(pent->p_proto);
4923 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4929 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4931 I32 which = PL_op->op_type;
4933 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4934 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4935 struct servent *getservbyport(int, Netdb_name_t);
4936 struct servent *getservent(void);
4938 struct servent *sent;
4940 if (which == OP_GSBYNAME) {
4941 #ifdef HAS_GETSERVBYNAME
4942 const char * const proto = POPpbytex;
4943 const char * const name = POPpbytex;
4944 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4946 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4949 else if (which == OP_GSBYPORT) {
4950 #ifdef HAS_GETSERVBYPORT
4951 const char * const proto = POPpbytex;
4952 unsigned short port = (unsigned short)POPu;
4954 port = PerlSock_htons(port);
4956 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4958 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4962 #ifdef HAS_GETSERVENT
4963 sent = PerlSock_getservent();
4965 DIE(aTHX_ PL_no_sock_func, "getservent");
4969 if (GIMME != G_ARRAY) {
4970 PUSHs(sv = sv_newmortal());
4972 if (which == OP_GSBYNAME) {
4974 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4976 sv_setiv(sv, (IV)(sent->s_port));
4980 sv_setpv(sv, sent->s_name);
4986 mPUSHs(newSVpv(sent->s_name, 0));
4987 PUSHs(space_join_names_mortal(sent->s_aliases));
4989 mPUSHi(PerlSock_ntohs(sent->s_port));
4991 mPUSHi(sent->s_port);
4993 mPUSHs(newSVpv(sent->s_proto, 0));
4998 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5005 const int stayopen = TOPi;
5006 switch(PL_op->op_type) {
5008 #ifdef HAS_SETHOSTENT
5009 PerlSock_sethostent(stayopen);
5011 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5014 #ifdef HAS_SETNETENT
5016 PerlSock_setnetent(stayopen);
5018 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5022 #ifdef HAS_SETPROTOENT
5023 PerlSock_setprotoent(stayopen);
5025 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5029 #ifdef HAS_SETSERVENT
5030 PerlSock_setservent(stayopen);
5032 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5042 switch(PL_op->op_type) {
5044 #ifdef HAS_ENDHOSTENT
5045 PerlSock_endhostent();
5047 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5051 #ifdef HAS_ENDNETENT
5052 PerlSock_endnetent();
5054 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5058 #ifdef HAS_ENDPROTOENT
5059 PerlSock_endprotoent();
5061 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5065 #ifdef HAS_ENDSERVENT
5066 PerlSock_endservent();
5068 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5072 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5075 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5079 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5082 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5086 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5089 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5093 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5096 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5108 I32 which = PL_op->op_type;
5110 struct passwd *pwent = NULL;
5112 * We currently support only the SysV getsp* shadow password interface.
5113 * The interface is declared in <shadow.h> and often one needs to link
5114 * with -lsecurity or some such.
5115 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5118 * AIX getpwnam() is clever enough to return the encrypted password
5119 * only if the caller (euid?) is root.
5121 * There are at least three other shadow password APIs. Many platforms
5122 * seem to contain more than one interface for accessing the shadow
5123 * password databases, possibly for compatibility reasons.
5124 * The getsp*() is by far he simplest one, the other two interfaces
5125 * are much more complicated, but also very similar to each other.
5130 * struct pr_passwd *getprpw*();
5131 * The password is in
5132 * char getprpw*(...).ufld.fd_encrypt[]
5133 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5138 * struct es_passwd *getespw*();
5139 * The password is in
5140 * char *(getespw*(...).ufld.fd_encrypt)
5141 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5144 * struct userpw *getuserpw();
5145 * The password is in
5146 * char *(getuserpw(...)).spw_upw_passwd
5147 * (but the de facto standard getpwnam() should work okay)
5149 * Mention I_PROT here so that Configure probes for it.
5151 * In HP-UX for getprpw*() the manual page claims that one should include
5152 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5153 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5154 * and pp_sys.c already includes <shadow.h> if there is such.
5156 * Note that <sys/security.h> is already probed for, but currently
5157 * it is only included in special cases.
5159 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5160 * be preferred interface, even though also the getprpw*() interface
5161 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5162 * One also needs to call set_auth_parameters() in main() before
5163 * doing anything else, whether one is using getespw*() or getprpw*().
5165 * Note that accessing the shadow databases can be magnitudes
5166 * slower than accessing the standard databases.
5171 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5172 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5173 * the pw_comment is left uninitialized. */
5174 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5180 const char* const name = POPpbytex;
5181 pwent = getpwnam(name);
5187 pwent = getpwuid(uid);
5191 # ifdef HAS_GETPWENT
5193 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5194 if (pwent) pwent = getpwnam(pwent->pw_name);
5197 DIE(aTHX_ PL_no_func, "getpwent");
5203 if (GIMME != G_ARRAY) {
5204 PUSHs(sv = sv_newmortal());
5206 if (which == OP_GPWNAM)
5207 # if Uid_t_sign <= 0
5208 sv_setiv(sv, (IV)pwent->pw_uid);
5210 sv_setuv(sv, (UV)pwent->pw_uid);
5213 sv_setpv(sv, pwent->pw_name);
5219 mPUSHs(newSVpv(pwent->pw_name, 0));
5223 /* If we have getspnam(), we try to dig up the shadow
5224 * password. If we are underprivileged, the shadow
5225 * interface will set the errno to EACCES or similar,
5226 * and return a null pointer. If this happens, we will
5227 * use the dummy password (usually "*" or "x") from the
5228 * standard password database.
5230 * In theory we could skip the shadow call completely
5231 * if euid != 0 but in practice we cannot know which
5232 * security measures are guarding the shadow databases
5233 * on a random platform.
5235 * Resist the urge to use additional shadow interfaces.
5236 * Divert the urge to writing an extension instead.
5239 /* Some AIX setups falsely(?) detect some getspnam(), which
5240 * has a different API than the Solaris/IRIX one. */
5241 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5244 const struct spwd * const spwent = getspnam(pwent->pw_name);
5245 /* Save and restore errno so that
5246 * underprivileged attempts seem
5247 * to have never made the unsuccessful
5248 * attempt to retrieve the shadow password. */
5250 if (spwent && spwent->sp_pwdp)
5251 sv_setpv(sv, spwent->sp_pwdp);
5255 if (!SvPOK(sv)) /* Use the standard password, then. */
5256 sv_setpv(sv, pwent->pw_passwd);
5259 # ifndef INCOMPLETE_TAINTS
5260 /* passwd is tainted because user himself can diddle with it.
5261 * admittedly not much and in a very limited way, but nevertheless. */
5265 # if Uid_t_sign <= 0
5266 mPUSHi(pwent->pw_uid);
5268 mPUSHu(pwent->pw_uid);
5271 # if Uid_t_sign <= 0
5272 mPUSHi(pwent->pw_gid);
5274 mPUSHu(pwent->pw_gid);
5276 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5277 * because of the poor interface of the Perl getpw*(),
5278 * not because there's some standard/convention saying so.
5279 * A better interface would have been to return a hash,
5280 * but we are accursed by our history, alas. --jhi. */
5282 mPUSHi(pwent->pw_change);
5285 mPUSHi(pwent->pw_quota);
5288 mPUSHs(newSVpv(pwent->pw_age, 0));
5290 /* I think that you can never get this compiled, but just in case. */
5291 PUSHs(sv_mortalcopy(&PL_sv_no));
5296 /* pw_class and pw_comment are mutually exclusive--.
5297 * see the above note for pw_change, pw_quota, and pw_age. */
5299 mPUSHs(newSVpv(pwent->pw_class, 0));
5302 mPUSHs(newSVpv(pwent->pw_comment, 0));
5304 /* I think that you can never get this compiled, but just in case. */
5305 PUSHs(sv_mortalcopy(&PL_sv_no));
5310 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5312 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5314 # ifndef INCOMPLETE_TAINTS
5315 /* pw_gecos is tainted because user himself can diddle with it. */
5319 mPUSHs(newSVpv(pwent->pw_dir, 0));
5321 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5322 # ifndef INCOMPLETE_TAINTS
5323 /* pw_shell is tainted because user himself can diddle with it. */
5328 mPUSHi(pwent->pw_expire);
5333 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5341 const I32 which = PL_op->op_type;
5342 const struct group *grent;
5344 if (which == OP_GGRNAM) {
5345 const char* const name = POPpbytex;
5346 grent = (const struct group *)getgrnam(name);
5348 else if (which == OP_GGRGID) {
5349 const Gid_t gid = POPi;
5350 grent = (const struct group *)getgrgid(gid);
5354 grent = (struct group *)getgrent();
5356 DIE(aTHX_ PL_no_func, "getgrent");
5360 if (GIMME != G_ARRAY) {
5361 SV * const sv = sv_newmortal();
5365 if (which == OP_GGRNAM)
5367 sv_setiv(sv, (IV)grent->gr_gid);
5369 sv_setuv(sv, (UV)grent->gr_gid);
5372 sv_setpv(sv, grent->gr_name);
5378 mPUSHs(newSVpv(grent->gr_name, 0));
5381 mPUSHs(newSVpv(grent->gr_passwd, 0));
5383 PUSHs(sv_mortalcopy(&PL_sv_no));
5387 mPUSHi(grent->gr_gid);
5389 mPUSHu(grent->gr_gid);
5392 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5393 /* In UNICOS/mk (_CRAYMPP) the multithreading
5394 * versions (getgrnam_r, getgrgid_r)
5395 * seem to return an illegal pointer
5396 * as the group members list, gr_mem.
5397 * getgrent() doesn't even have a _r version
5398 * but the gr_mem is poisonous anyway.
5399 * So yes, you cannot get the list of group
5400 * members if building multithreaded in UNICOS/mk. */
5401 PUSHs(space_join_names_mortal(grent->gr_mem));
5407 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5417 if (!(tmps = PerlProc_getlogin()))
5419 sv_setpv_mg(TARG, tmps);
5423 DIE(aTHX_ PL_no_func, "getlogin");
5427 /* Miscellaneous. */
5432 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5433 I32 items = SP - MARK;
5434 unsigned long a[20];
5439 while (++MARK <= SP) {
5440 if (SvTAINTED(*MARK)) {
5446 TAINT_PROPER("syscall");
5449 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5450 * or where sizeof(long) != sizeof(char*). But such machines will
5451 * not likely have syscall implemented either, so who cares?
5453 while (++MARK <= SP) {
5454 if (SvNIOK(*MARK) || !i)
5455 a[i++] = SvIV(*MARK);
5456 else if (*MARK == &PL_sv_undef)
5459 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5465 DIE(aTHX_ "Too many args to syscall");
5467 DIE(aTHX_ "Too few args to syscall");
5469 retval = syscall(a[0]);
5472 retval = syscall(a[0],a[1]);
5475 retval = syscall(a[0],a[1],a[2]);
5478 retval = syscall(a[0],a[1],a[2],a[3]);
5481 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5484 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5487 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5490 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5497 DIE(aTHX_ PL_no_func, "syscall");
5501 #ifdef FCNTL_EMULATE_FLOCK
5503 /* XXX Emulate flock() with fcntl().
5504 What's really needed is a good file locking module.
5508 fcntl_emulate_flock(int fd, int operation)
5513 switch (operation & ~LOCK_NB) {
5515 flock.l_type = F_RDLCK;
5518 flock.l_type = F_WRLCK;
5521 flock.l_type = F_UNLCK;
5527 flock.l_whence = SEEK_SET;
5528 flock.l_start = flock.l_len = (Off_t)0;
5530 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5531 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5532 errno = EWOULDBLOCK;
5536 #endif /* FCNTL_EMULATE_FLOCK */
5538 #ifdef LOCKF_EMULATE_FLOCK
5540 /* XXX Emulate flock() with lockf(). This is just to increase
5541 portability of scripts. The calls are not completely
5542 interchangeable. What's really needed is a good file
5546 /* The lockf() constants might have been defined in <unistd.h>.
5547 Unfortunately, <unistd.h> causes troubles on some mixed
5548 (BSD/POSIX) systems, such as SunOS 4.1.3.
5550 Further, the lockf() constants aren't POSIX, so they might not be
5551 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5552 just stick in the SVID values and be done with it. Sigh.
5556 # define F_ULOCK 0 /* Unlock a previously locked region */
5559 # define F_LOCK 1 /* Lock a region for exclusive use */
5562 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5565 # define F_TEST 3 /* Test a region for other processes locks */
5569 lockf_emulate_flock(int fd, int operation)
5575 /* flock locks entire file so for lockf we need to do the same */
5576 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5577 if (pos > 0) /* is seekable and needs to be repositioned */
5578 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5579 pos = -1; /* seek failed, so don't seek back afterwards */
5582 switch (operation) {
5584 /* LOCK_SH - get a shared lock */
5586 /* LOCK_EX - get an exclusive lock */
5588 i = lockf (fd, F_LOCK, 0);
5591 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5592 case LOCK_SH|LOCK_NB:
5593 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5594 case LOCK_EX|LOCK_NB:
5595 i = lockf (fd, F_TLOCK, 0);
5597 if ((errno == EAGAIN) || (errno == EACCES))
5598 errno = EWOULDBLOCK;
5601 /* LOCK_UN - unlock (non-blocking is a no-op) */
5603 case LOCK_UN|LOCK_NB:
5604 i = lockf (fd, F_ULOCK, 0);
5607 /* Default - can't decipher operation */
5614 if (pos > 0) /* need to restore position of the handle */
5615 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5620 #endif /* LOCKF_EMULATE_FLOCK */
5624 * c-indentation-style: bsd
5626 * indent-tabs-mode: nil
5629 * ex: set ts=8 sts=4 sw=4 et: