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(aTHX);
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;
1521 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1522 IO *const io = GvIO(gv);
1524 /* Treat empty list as "" */
1525 if (MARK == SP) XPUSHs(&PL_sv_no);
1528 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1530 if (MARK == ORIGMARK) {
1533 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1536 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1538 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1546 SETERRNO(EBADF,RMS_IFI);
1549 else if (!(fp = IoOFP(io))) {
1551 report_wrongway_fh(gv, '<');
1552 else if (ckWARN(WARN_CLOSED))
1554 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1558 do_sprintf(sv, SP - MARK, MARK + 1);
1559 if (!do_print(sv, fp))
1562 if (IoFLAGS(io) & IOf_FLUSH)
1563 if (PerlIO_flush(fp) == EOF)
1574 PUSHs(&PL_sv_undef);
1582 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1583 const int mode = POPi;
1584 SV * const sv = POPs;
1585 GV * const gv = MUTABLE_GV(POPs);
1588 /* Need TIEHANDLE method ? */
1589 const char * const tmps = SvPV_const(sv, len);
1590 /* FIXME? do_open should do const */
1591 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1592 IoLINES(GvIOp(gv)) = 0;
1596 PUSHs(&PL_sv_undef);
1603 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1617 bool charstart = FALSE;
1618 STRLEN charskip = 0;
1621 GV * const gv = MUTABLE_GV(*++MARK);
1622 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1623 && gv && (io = GvIO(gv)) )
1625 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1627 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1628 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1637 sv_setpvs(bufsv, "");
1638 length = SvIVx(*++MARK);
1640 DIE(aTHX_ "Negative length");
1643 offset = SvIVx(*++MARK);
1647 if (!io || !IoIFP(io)) {
1649 SETERRNO(EBADF,RMS_IFI);
1652 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1653 buffer = SvPVutf8_force(bufsv, blen);
1654 /* UTF-8 may not have been set if they are all low bytes */
1659 buffer = SvPV_force(bufsv, blen);
1660 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1662 if (DO_UTF8(bufsv)) {
1663 blen = sv_len_utf8_nomg(bufsv);
1672 if (PL_op->op_type == OP_RECV) {
1673 Sock_size_t bufsize;
1674 char namebuf[MAXPATHLEN];
1675 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1676 bufsize = sizeof (struct sockaddr_in);
1678 bufsize = sizeof namebuf;
1680 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1684 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1685 /* 'offset' means 'flags' here */
1686 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1687 (struct sockaddr *)namebuf, &bufsize);
1690 /* MSG_TRUNC can give oversized count; quietly lose it */
1694 /* Bogus return without padding */
1695 bufsize = sizeof (struct sockaddr_in);
1697 SvCUR_set(bufsv, count);
1698 *SvEND(bufsv) = '\0';
1699 (void)SvPOK_only(bufsv);
1703 /* This should not be marked tainted if the fp is marked clean */
1704 if (!(IoFLAGS(io) & IOf_UNTAINT))
1705 SvTAINTED_on(bufsv);
1707 sv_setpvn(TARG, namebuf, bufsize);
1713 if (-offset > (SSize_t)blen)
1714 DIE(aTHX_ "Offset outside string");
1717 if (DO_UTF8(bufsv)) {
1718 /* convert offset-as-chars to offset-as-bytes */
1719 if (offset >= (SSize_t)blen)
1720 offset += SvCUR(bufsv) - blen;
1722 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1725 orig_size = SvCUR(bufsv);
1726 /* Allocating length + offset + 1 isn't perfect in the case of reading
1727 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1729 (should be 2 * length + offset + 1, or possibly something longer if
1730 PL_encoding is true) */
1731 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1732 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1733 Zero(buffer+orig_size, offset-orig_size, char);
1735 buffer = buffer + offset;
1737 read_target = bufsv;
1739 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1740 concatenate it to the current buffer. */
1742 /* Truncate the existing buffer to the start of where we will be
1744 SvCUR_set(bufsv, offset);
1746 read_target = sv_newmortal();
1747 SvUPGRADE(read_target, SVt_PV);
1748 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1751 if (PL_op->op_type == OP_SYSREAD) {
1752 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1753 if (IoTYPE(io) == IoTYPE_SOCKET) {
1754 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1760 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1765 #ifdef HAS_SOCKET__bad_code_maybe
1766 if (IoTYPE(io) == IoTYPE_SOCKET) {
1767 Sock_size_t bufsize;
1768 char namebuf[MAXPATHLEN];
1769 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1770 bufsize = sizeof (struct sockaddr_in);
1772 bufsize = sizeof namebuf;
1774 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1775 (struct sockaddr *)namebuf, &bufsize);
1780 count = PerlIO_read(IoIFP(io), buffer, length);
1781 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1782 if (count == 0 && PerlIO_error(IoIFP(io)))
1786 if (IoTYPE(io) == IoTYPE_WRONLY)
1787 report_wrongway_fh(gv, '>');
1790 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1791 *SvEND(read_target) = '\0';
1792 (void)SvPOK_only(read_target);
1793 if (fp_utf8 && !IN_BYTES) {
1794 /* Look at utf8 we got back and count the characters */
1795 const char *bend = buffer + count;
1796 while (buffer < bend) {
1798 skip = UTF8SKIP(buffer);
1801 if (buffer - charskip + skip > bend) {
1802 /* partial character - try for rest of it */
1803 length = skip - (bend-buffer);
1804 offset = bend - SvPVX_const(bufsv);
1816 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1817 provided amount read (count) was what was requested (length)
1819 if (got < wanted && count == length) {
1820 length = wanted - got;
1821 offset = bend - SvPVX_const(bufsv);
1824 /* return value is character count */
1828 else if (buffer_utf8) {
1829 /* Let svcatsv upgrade the bytes we read in to utf8.
1830 The buffer is a mortal so will be freed soon. */
1831 sv_catsv_nomg(bufsv, read_target);
1834 /* This should not be marked tainted if the fp is marked clean */
1835 if (!(IoFLAGS(io) & IOf_UNTAINT))
1836 SvTAINTED_on(bufsv);
1848 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1853 STRLEN orig_blen_bytes;
1854 const int op_type = PL_op->op_type;
1857 GV *const gv = MUTABLE_GV(*++MARK);
1858 IO *const io = GvIO(gv);
1860 if (op_type == OP_SYSWRITE && io) {
1861 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1863 if (MARK == SP - 1) {
1865 mXPUSHi(sv_len(sv));
1869 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1870 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1880 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1882 if (io && IoIFP(io))
1883 report_wrongway_fh(gv, '<');
1886 SETERRNO(EBADF,RMS_IFI);
1890 /* Do this first to trigger any overloading. */
1891 buffer = SvPV_const(bufsv, blen);
1892 orig_blen_bytes = blen;
1893 doing_utf8 = DO_UTF8(bufsv);
1895 if (PerlIO_isutf8(IoIFP(io))) {
1896 if (!SvUTF8(bufsv)) {
1897 /* We don't modify the original scalar. */
1898 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1899 buffer = (char *) tmpbuf;
1903 else if (doing_utf8) {
1904 STRLEN tmplen = blen;
1905 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1908 buffer = (char *) tmpbuf;
1912 assert((char *)result == buffer);
1913 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1918 if (op_type == OP_SEND) {
1919 const int flags = SvIVx(*++MARK);
1922 char * const sockbuf = SvPVx(*++MARK, mlen);
1923 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1924 flags, (struct sockaddr *)sockbuf, mlen);
1928 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1934 Size_t length = 0; /* This length is in characters. */
1940 /* The SV is bytes, and we've had to upgrade it. */
1941 blen_chars = orig_blen_bytes;
1943 /* The SV really is UTF-8. */
1944 /* Don't call sv_len_utf8 on a magical or overloaded
1945 scalar, as we might get back a different result. */
1946 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1953 length = blen_chars;
1955 #if Size_t_size > IVSIZE
1956 length = (Size_t)SvNVx(*++MARK);
1958 length = (Size_t)SvIVx(*++MARK);
1960 if ((SSize_t)length < 0) {
1962 DIE(aTHX_ "Negative length");
1967 offset = SvIVx(*++MARK);
1969 if (-offset > (IV)blen_chars) {
1971 DIE(aTHX_ "Offset outside string");
1973 offset += blen_chars;
1974 } else if (offset > (IV)blen_chars) {
1976 DIE(aTHX_ "Offset outside string");
1980 if (length > blen_chars - offset)
1981 length = blen_chars - offset;
1983 /* Here we convert length from characters to bytes. */
1984 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1985 /* Either we had to convert the SV, or the SV is magical, or
1986 the SV has overloading, in which case we can't or mustn't
1987 or mustn't call it again. */
1989 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1990 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1992 /* It's a real UTF-8 SV, and it's not going to change under
1993 us. Take advantage of any cache. */
1995 I32 len_I32 = length;
1997 /* Convert the start and end character positions to bytes.
1998 Remember that the second argument to sv_pos_u2b is relative
2000 sv_pos_u2b(bufsv, &start, &len_I32);
2007 buffer = buffer+offset;
2009 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2010 if (IoTYPE(io) == IoTYPE_SOCKET) {
2011 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2017 /* See the note at doio.c:do_print about filesize limits. --jhi */
2018 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2027 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2030 #if Size_t_size > IVSIZE
2050 * in Perl 5.12 and later, the additional parameter is a bitmask:
2053 * 2 = eof() <- ARGV magic
2055 * I'll rely on the compiler's trace flow analysis to decide whether to
2056 * actually assign this out here, or punt it into the only block where it is
2057 * used. Doing it out here is DRY on the condition logic.
2062 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2068 if (PL_op->op_flags & OPf_SPECIAL) {
2069 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2073 gv = PL_last_in_gv; /* eof */
2081 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2082 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2085 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2086 if (io && !IoIFP(io)) {
2087 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2089 IoFLAGS(io) &= ~IOf_START;
2090 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2092 sv_setpvs(GvSV(gv), "-");
2094 GvSV(gv) = newSVpvs("-");
2095 SvSETMAGIC(GvSV(gv));
2097 else if (!nextargv(gv))
2102 PUSHs(boolSV(do_eof(gv)));
2112 if (MAXARG != 0 && (TOPs || POPs))
2113 PL_last_in_gv = MUTABLE_GV(POPs);
2120 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2122 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2127 SETERRNO(EBADF,RMS_IFI);
2132 #if LSEEKSIZE > IVSIZE
2133 PUSHn( do_tell(gv) );
2135 PUSHi( do_tell(gv) );
2143 const int whence = POPi;
2144 #if LSEEKSIZE > IVSIZE
2145 const Off_t offset = (Off_t)SvNVx(POPs);
2147 const Off_t offset = (Off_t)SvIVx(POPs);
2150 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2151 IO *const io = GvIO(gv);
2154 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2156 #if LSEEKSIZE > IVSIZE
2157 SV *const offset_sv = newSVnv((NV) offset);
2159 SV *const offset_sv = newSViv(offset);
2162 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2167 if (PL_op->op_type == OP_SEEK)
2168 PUSHs(boolSV(do_seek(gv, offset, whence)));
2170 const Off_t sought = do_sysseek(gv, offset, whence);
2172 PUSHs(&PL_sv_undef);
2174 SV* const sv = sought ?
2175 #if LSEEKSIZE > IVSIZE
2180 : newSVpvn(zero_but_true, ZBTLEN);
2191 /* There seems to be no consensus on the length type of truncate()
2192 * and ftruncate(), both off_t and size_t have supporters. In
2193 * general one would think that when using large files, off_t is
2194 * at least as wide as size_t, so using an off_t should be okay. */
2195 /* XXX Configure probe for the length type of *truncate() needed XXX */
2198 #if Off_t_size > IVSIZE
2203 /* Checking for length < 0 is problematic as the type might or
2204 * might not be signed: if it is not, clever compilers will moan. */
2205 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2208 SV * const sv = POPs;
2213 if (PL_op->op_flags & OPf_SPECIAL
2214 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2215 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2222 TAINT_PROPER("truncate");
2223 if (!(fp = IoIFP(io))) {
2229 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2231 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2237 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2238 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2239 goto do_ftruncate_io;
2242 const char * const name = SvPV_nomg_const_nolen(sv);
2243 TAINT_PROPER("truncate");
2245 if (truncate(name, len) < 0)
2249 const int tmpfd = PerlLIO_open(name, O_RDWR);
2254 if (my_chsize(tmpfd, len) < 0)
2256 PerlLIO_close(tmpfd);
2265 SETERRNO(EBADF,RMS_IFI);
2273 SV * const argsv = POPs;
2274 const unsigned int func = POPu;
2275 const int optype = PL_op->op_type;
2276 GV * const gv = MUTABLE_GV(POPs);
2277 IO * const io = gv ? GvIOn(gv) : NULL;
2281 if (!io || !argsv || !IoIFP(io)) {
2283 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2287 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2290 s = SvPV_force(argsv, len);
2291 need = IOCPARM_LEN(func);
2293 s = Sv_Grow(argsv, need + 1);
2294 SvCUR_set(argsv, need);
2297 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2300 retval = SvIV(argsv);
2301 s = INT2PTR(char*,retval); /* ouch */
2304 TAINT_PROPER(PL_op_desc[optype]);
2306 if (optype == OP_IOCTL)
2308 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2310 DIE(aTHX_ "ioctl is not implemented");
2314 DIE(aTHX_ "fcntl is not implemented");
2316 #if defined(OS2) && defined(__EMX__)
2317 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2319 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2323 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2325 if (s[SvCUR(argsv)] != 17)
2326 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2328 s[SvCUR(argsv)] = 0; /* put our null back */
2329 SvSETMAGIC(argsv); /* Assume it has changed */
2338 PUSHp(zero_but_true, ZBTLEN);
2349 const int argtype = POPi;
2350 GV * const gv = MUTABLE_GV(POPs);
2351 IO *const io = GvIO(gv);
2352 PerlIO *const fp = io ? IoIFP(io) : NULL;
2354 /* XXX Looks to me like io is always NULL at this point */
2356 (void)PerlIO_flush(fp);
2357 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2362 SETERRNO(EBADF,RMS_IFI);
2367 DIE(aTHX_ PL_no_func, "flock()");
2378 const int protocol = POPi;
2379 const int type = POPi;
2380 const int domain = POPi;
2381 GV * const gv = MUTABLE_GV(POPs);
2382 IO * const io = gv ? GvIOn(gv) : NULL;
2387 if (io && IoIFP(io))
2388 do_close(gv, FALSE);
2389 SETERRNO(EBADF,LIB_INVARG);
2394 do_close(gv, FALSE);
2396 TAINT_PROPER("socket");
2397 fd = PerlSock_socket(domain, type, protocol);
2400 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2401 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2402 IoTYPE(io) = IoTYPE_SOCKET;
2403 if (!IoIFP(io) || !IoOFP(io)) {
2404 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2405 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2406 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2409 #if defined(HAS_FCNTL) && defined(F_SETFD)
2410 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2414 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2423 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2425 const int protocol = POPi;
2426 const int type = POPi;
2427 const int domain = POPi;
2428 GV * const gv2 = MUTABLE_GV(POPs);
2429 GV * const gv1 = MUTABLE_GV(POPs);
2430 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2431 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2435 report_evil_fh(gv1);
2437 report_evil_fh(gv2);
2439 if (io1 && IoIFP(io1))
2440 do_close(gv1, FALSE);
2441 if (io2 && IoIFP(io2))
2442 do_close(gv2, FALSE);
2447 TAINT_PROPER("socketpair");
2448 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2450 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2451 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2452 IoTYPE(io1) = IoTYPE_SOCKET;
2453 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2454 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2455 IoTYPE(io2) = IoTYPE_SOCKET;
2456 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2457 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2458 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2459 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2460 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2461 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2462 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2465 #if defined(HAS_FCNTL) && defined(F_SETFD)
2466 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2467 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2472 DIE(aTHX_ PL_no_sock_func, "socketpair");
2481 SV * const addrsv = POPs;
2482 /* OK, so on what platform does bind modify addr? */
2484 GV * const gv = MUTABLE_GV(POPs);
2485 IO * const io = GvIOn(gv);
2487 const int op_type = PL_op->op_type;
2489 if (!io || !IoIFP(io))
2492 addr = SvPV_const(addrsv, len);
2493 TAINT_PROPER(PL_op_desc[op_type]);
2494 if ((op_type == OP_BIND
2495 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2496 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2504 SETERRNO(EBADF,SS_IVCHAN);
2511 const int backlog = POPi;
2512 GV * const gv = MUTABLE_GV(POPs);
2513 IO * const io = gv ? GvIOn(gv) : NULL;
2515 if (!io || !IoIFP(io))
2518 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2525 SETERRNO(EBADF,SS_IVCHAN);
2534 char namebuf[MAXPATHLEN];
2535 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2536 Sock_size_t len = sizeof (struct sockaddr_in);
2538 Sock_size_t len = sizeof namebuf;
2540 GV * const ggv = MUTABLE_GV(POPs);
2541 GV * const ngv = MUTABLE_GV(POPs);
2550 if (!gstio || !IoIFP(gstio))
2554 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2557 /* Some platforms indicate zero length when an AF_UNIX client is
2558 * not bound. Simulate a non-zero-length sockaddr structure in
2560 namebuf[0] = 0; /* sun_len */
2561 namebuf[1] = AF_UNIX; /* sun_family */
2569 do_close(ngv, FALSE);
2570 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2571 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2572 IoTYPE(nstio) = IoTYPE_SOCKET;
2573 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2574 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2575 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2576 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2579 #if defined(HAS_FCNTL) && defined(F_SETFD)
2580 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2584 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2585 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2587 #ifdef __SCO_VERSION__
2588 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2591 PUSHp(namebuf, len);
2595 report_evil_fh(ggv);
2596 SETERRNO(EBADF,SS_IVCHAN);
2606 const int how = POPi;
2607 GV * const gv = MUTABLE_GV(POPs);
2608 IO * const io = GvIOn(gv);
2610 if (!io || !IoIFP(io))
2613 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2618 SETERRNO(EBADF,SS_IVCHAN);
2625 const int optype = PL_op->op_type;
2626 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2627 const unsigned int optname = (unsigned int) POPi;
2628 const unsigned int lvl = (unsigned int) POPi;
2629 GV * const gv = MUTABLE_GV(POPs);
2630 IO * const io = GvIOn(gv);
2634 if (!io || !IoIFP(io))
2637 fd = PerlIO_fileno(IoIFP(io));
2641 (void)SvPOK_only(sv);
2645 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2652 #if defined(__SYMBIAN32__)
2653 # define SETSOCKOPT_OPTION_VALUE_T void *
2655 # define SETSOCKOPT_OPTION_VALUE_T const char *
2657 /* XXX TODO: We need to have a proper type (a Configure probe,
2658 * etc.) for what the C headers think of the third argument of
2659 * setsockopt(), the option_value read-only buffer: is it
2660 * a "char *", or a "void *", const or not. Some compilers
2661 * don't take kindly to e.g. assuming that "char *" implicitly
2662 * promotes to a "void *", or to explicitly promoting/demoting
2663 * consts to non/vice versa. The "const void *" is the SUS
2664 * definition, but that does not fly everywhere for the above
2666 SETSOCKOPT_OPTION_VALUE_T buf;
2670 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2674 aint = (int)SvIV(sv);
2675 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2678 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2688 SETERRNO(EBADF,SS_IVCHAN);
2697 const int optype = PL_op->op_type;
2698 GV * const gv = MUTABLE_GV(POPs);
2699 IO * const io = GvIOn(gv);
2704 if (!io || !IoIFP(io))
2707 sv = sv_2mortal(newSV(257));
2708 (void)SvPOK_only(sv);
2712 fd = PerlIO_fileno(IoIFP(io));
2714 case OP_GETSOCKNAME:
2715 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2718 case OP_GETPEERNAME:
2719 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2721 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2723 static const char nowhere[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
2724 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2725 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2726 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2727 sizeof(u_short) + sizeof(struct in_addr))) {
2734 #ifdef BOGUS_GETNAME_RETURN
2735 /* Interactive Unix, getpeername() and getsockname()
2736 does not return valid namelen */
2737 if (len == BOGUS_GETNAME_RETURN)
2738 len = sizeof(struct sockaddr);
2747 SETERRNO(EBADF,SS_IVCHAN);
2766 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2767 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2768 if (PL_op->op_type == OP_LSTAT) {
2769 if (gv != PL_defgv) {
2770 do_fstat_warning_check:
2771 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2772 "lstat() on filehandle%s%"SVf,
2775 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2777 } else if (PL_laststype != OP_LSTAT)
2778 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2779 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2782 if (gv != PL_defgv) {
2786 PL_laststype = OP_STAT;
2787 PL_statgv = gv ? gv : (GV *)io;
2788 sv_setpvs(PL_statname, "");
2795 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2797 } else if (IoDIRP(io)) {
2799 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2802 PL_laststatval = -1;
2805 else PL_laststatval = -1;
2806 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2809 if (PL_laststatval < 0) {
2814 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2815 io = MUTABLE_IO(SvRV(sv));
2816 if (PL_op->op_type == OP_LSTAT)
2817 goto do_fstat_warning_check;
2818 goto do_fstat_have_io;
2821 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2822 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2824 PL_laststype = PL_op->op_type;
2825 if (PL_op->op_type == OP_LSTAT)
2826 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2828 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2829 if (PL_laststatval < 0) {
2830 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2831 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2837 if (gimme != G_ARRAY) {
2838 if (gimme != G_VOID)
2839 XPUSHs(boolSV(max));
2845 mPUSHi(PL_statcache.st_dev);
2846 #if ST_INO_SIZE > IVSIZE
2847 mPUSHn(PL_statcache.st_ino);
2849 # if ST_INO_SIGN <= 0
2850 mPUSHi(PL_statcache.st_ino);
2852 mPUSHu(PL_statcache.st_ino);
2855 mPUSHu(PL_statcache.st_mode);
2856 mPUSHu(PL_statcache.st_nlink);
2857 #if Uid_t_size > IVSIZE
2858 mPUSHn(PL_statcache.st_uid);
2860 # if Uid_t_sign <= 0
2861 mPUSHi(PL_statcache.st_uid);
2863 mPUSHu(PL_statcache.st_uid);
2866 #if Gid_t_size > IVSIZE
2867 mPUSHn(PL_statcache.st_gid);
2869 # if Gid_t_sign <= 0
2870 mPUSHi(PL_statcache.st_gid);
2872 mPUSHu(PL_statcache.st_gid);
2875 #ifdef USE_STAT_RDEV
2876 mPUSHi(PL_statcache.st_rdev);
2878 PUSHs(newSVpvs_flags("", SVs_TEMP));
2880 #if Off_t_size > IVSIZE
2881 mPUSHn(PL_statcache.st_size);
2883 mPUSHi(PL_statcache.st_size);
2886 mPUSHn(PL_statcache.st_atime);
2887 mPUSHn(PL_statcache.st_mtime);
2888 mPUSHn(PL_statcache.st_ctime);
2890 mPUSHi(PL_statcache.st_atime);
2891 mPUSHi(PL_statcache.st_mtime);
2892 mPUSHi(PL_statcache.st_ctime);
2894 #ifdef USE_STAT_BLOCKS
2895 mPUSHu(PL_statcache.st_blksize);
2896 mPUSHu(PL_statcache.st_blocks);
2898 PUSHs(newSVpvs_flags("", SVs_TEMP));
2899 PUSHs(newSVpvs_flags("", SVs_TEMP));
2905 /* All filetest ops avoid manipulating the perl stack pointer in their main
2906 bodies (since commit d2c4d2d1e22d3125), and return using either
2907 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2908 the only two which manipulate the perl stack. To ensure that no stack
2909 manipulation macros are used, the filetest ops avoid defining a local copy
2910 of the stack pointer with dSP. */
2912 /* If the next filetest is stacked up with this one
2913 (PL_op->op_private & OPpFT_STACKING), we leave
2914 the original argument on the stack for success,
2915 and skip the stacked operators on failure.
2916 The next few macros/functions take care of this.
2920 S_ft_return_false(pTHX_ SV *ret) {
2924 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2928 if (PL_op->op_private & OPpFT_STACKING) {
2929 while (OP_IS_FILETEST(next->op_type)
2930 && next->op_private & OPpFT_STACKED)
2931 next = next->op_next;
2936 PERL_STATIC_INLINE OP *
2937 S_ft_return_true(pTHX_ SV *ret) {
2939 if (PL_op->op_flags & OPf_REF)
2940 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2941 else if (!(PL_op->op_private & OPpFT_STACKING))
2947 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2948 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2949 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2951 #define tryAMAGICftest_MG(chr) STMT_START { \
2952 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2953 && PL_op->op_flags & OPf_KIDS) { \
2954 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2955 if (next) return next; \
2960 S_try_amagic_ftest(pTHX_ char chr) {
2962 SV *const arg = *PL_stack_sp;
2965 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2969 const char tmpchr = chr;
2970 SV * const tmpsv = amagic_call(arg,
2971 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2972 ftest_amg, AMGf_unary);
2977 return SvTRUE(tmpsv)
2978 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2988 /* Not const, because things tweak this below. Not bool, because there's
2989 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2990 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2991 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2992 /* Giving some sort of initial value silences compilers. */
2994 int access_mode = R_OK;
2996 int access_mode = 0;
2999 /* access_mode is never used, but leaving use_access in makes the
3000 conditional compiling below much clearer. */
3003 Mode_t stat_mode = S_IRUSR;
3005 bool effective = FALSE;
3008 switch (PL_op->op_type) {
3009 case OP_FTRREAD: opchar = 'R'; break;
3010 case OP_FTRWRITE: opchar = 'W'; break;
3011 case OP_FTREXEC: opchar = 'X'; break;
3012 case OP_FTEREAD: opchar = 'r'; break;
3013 case OP_FTEWRITE: opchar = 'w'; break;
3014 case OP_FTEEXEC: opchar = 'x'; break;
3016 tryAMAGICftest_MG(opchar);
3018 switch (PL_op->op_type) {
3020 #if !(defined(HAS_ACCESS) && defined(R_OK))
3026 #if defined(HAS_ACCESS) && defined(W_OK)
3031 stat_mode = S_IWUSR;
3035 #if defined(HAS_ACCESS) && defined(X_OK)
3040 stat_mode = S_IXUSR;
3044 #ifdef PERL_EFF_ACCESS
3047 stat_mode = S_IWUSR;
3051 #ifndef PERL_EFF_ACCESS
3058 #ifdef PERL_EFF_ACCESS
3063 stat_mode = S_IXUSR;
3069 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3070 const char *name = SvPV_nolen(*PL_stack_sp);
3072 # ifdef PERL_EFF_ACCESS
3073 result = PERL_EFF_ACCESS(name, access_mode);
3075 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3081 result = access(name, access_mode);
3083 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3094 result = my_stat_flags(0);
3097 if (cando(stat_mode, effective, &PL_statcache))
3106 const int op_type = PL_op->op_type;
3110 case OP_FTIS: opchar = 'e'; break;
3111 case OP_FTSIZE: opchar = 's'; break;
3112 case OP_FTMTIME: opchar = 'M'; break;
3113 case OP_FTCTIME: opchar = 'C'; break;
3114 case OP_FTATIME: opchar = 'A'; break;
3116 tryAMAGICftest_MG(opchar);
3118 result = my_stat_flags(0);
3121 if (op_type == OP_FTIS)
3124 /* You can't dTARGET inside OP_FTIS, because you'll get
3125 "panic: pad_sv po" - the op is not flagged to have a target. */
3129 #if Off_t_size > IVSIZE
3130 sv_setnv(TARG, (NV)PL_statcache.st_size);
3132 sv_setiv(TARG, (IV)PL_statcache.st_size);
3137 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3141 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3145 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3149 return SvTRUE_nomg(TARG)
3150 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3160 switch (PL_op->op_type) {
3161 case OP_FTROWNED: opchar = 'O'; break;
3162 case OP_FTEOWNED: opchar = 'o'; break;
3163 case OP_FTZERO: opchar = 'z'; break;
3164 case OP_FTSOCK: opchar = 'S'; break;
3165 case OP_FTCHR: opchar = 'c'; break;
3166 case OP_FTBLK: opchar = 'b'; break;
3167 case OP_FTFILE: opchar = 'f'; break;
3168 case OP_FTDIR: opchar = 'd'; break;
3169 case OP_FTPIPE: opchar = 'p'; break;
3170 case OP_FTSUID: opchar = 'u'; break;
3171 case OP_FTSGID: opchar = 'g'; break;
3172 case OP_FTSVTX: opchar = 'k'; break;
3174 tryAMAGICftest_MG(opchar);
3176 /* I believe that all these three are likely to be defined on most every
3177 system these days. */
3179 if(PL_op->op_type == OP_FTSUID) {
3184 if(PL_op->op_type == OP_FTSGID) {
3189 if(PL_op->op_type == OP_FTSVTX) {
3194 result = my_stat_flags(0);
3197 switch (PL_op->op_type) {
3199 if (PL_statcache.st_uid == PerlProc_getuid())
3203 if (PL_statcache.st_uid == PerlProc_geteuid())
3207 if (PL_statcache.st_size == 0)
3211 if (S_ISSOCK(PL_statcache.st_mode))
3215 if (S_ISCHR(PL_statcache.st_mode))
3219 if (S_ISBLK(PL_statcache.st_mode))
3223 if (S_ISREG(PL_statcache.st_mode))
3227 if (S_ISDIR(PL_statcache.st_mode))
3231 if (S_ISFIFO(PL_statcache.st_mode))
3236 if (PL_statcache.st_mode & S_ISUID)
3242 if (PL_statcache.st_mode & S_ISGID)
3248 if (PL_statcache.st_mode & S_ISVTX)
3261 tryAMAGICftest_MG('l');
3262 result = my_lstat_flags(0);
3266 if (S_ISLNK(PL_statcache.st_mode))
3279 tryAMAGICftest_MG('t');
3281 if (PL_op->op_flags & OPf_REF)
3284 SV *tmpsv = *PL_stack_sp;
3285 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3286 name = SvPV_nomg(tmpsv, namelen);
3287 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3291 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3292 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3293 else if (name && isDIGIT(*name))
3297 if (PerlLIO_isatty(fd))
3315 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3317 if (PL_op->op_flags & OPf_REF)
3319 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3324 gv = MAYBE_DEREF_GV_nomg(sv);
3328 if (gv == PL_defgv) {
3330 io = SvTYPE(PL_statgv) == SVt_PVIO
3334 goto really_filename;
3339 sv_setpvs(PL_statname, "");
3340 io = GvIO(PL_statgv);
3342 PL_laststatval = -1;
3343 PL_laststype = OP_STAT;
3344 if (io && IoIFP(io)) {
3345 if (! PerlIO_has_base(IoIFP(io)))
3346 DIE(aTHX_ "-T and -B not implemented on filehandles");
3347 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3348 if (PL_laststatval < 0)
3350 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3351 if (PL_op->op_type == OP_FTTEXT)
3356 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3357 i = PerlIO_getc(IoIFP(io));
3359 (void)PerlIO_ungetc(IoIFP(io),i);
3361 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3363 len = PerlIO_get_bufsiz(IoIFP(io));
3364 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3365 /* sfio can have large buffers - limit to 512 */
3370 SETERRNO(EBADF,RMS_IFI);
3372 SETERRNO(EBADF,RMS_IFI);
3377 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3380 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3382 PL_laststatval = -1;
3383 PL_laststype = OP_STAT;
3385 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3387 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3390 PL_laststype = OP_STAT;
3391 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3392 if (PL_laststatval < 0) {
3393 (void)PerlIO_close(fp);
3396 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3397 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3398 (void)PerlIO_close(fp);
3400 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3401 FT_RETURNNO; /* special case NFS directories */
3402 FT_RETURNYES; /* null file is anything */
3407 /* now scan s to look for textiness */
3408 /* XXX ASCII dependent code */
3410 #if defined(DOSISH) || defined(USEMYBINMODE)
3411 /* ignore trailing ^Z on short files */
3412 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3416 for (i = 0; i < len; i++, s++) {
3417 if (!*s) { /* null never allowed in text */
3422 else if (!(isPRINT(*s) || isSPACE(*s)))
3425 else if (*s & 128) {
3427 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3430 /* utf8 characters don't count as odd */
3431 if (UTF8_IS_START(*s)) {
3432 int ulen = UTF8SKIP(s);
3433 if (ulen < len - i) {
3435 for (j = 1; j < ulen; j++) {
3436 if (!UTF8_IS_CONTINUATION(s[j]))
3439 --ulen; /* loop does extra increment */
3449 *s != '\n' && *s != '\r' && *s != '\b' &&
3450 *s != '\t' && *s != '\f' && *s != 27)
3455 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3466 const char *tmps = NULL;
3470 SV * const sv = POPs;
3471 if (PL_op->op_flags & OPf_SPECIAL) {
3472 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3474 else if (!(gv = MAYBE_DEREF_GV(sv)))
3475 tmps = SvPV_nomg_const_nolen(sv);
3478 if( !gv && (!tmps || !*tmps) ) {
3479 HV * const table = GvHVn(PL_envgv);
3482 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3483 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3485 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3490 deprecate("chdir('') or chdir(undef) as chdir()");
3491 tmps = SvPV_nolen_const(*svp);
3495 TAINT_PROPER("chdir");
3500 TAINT_PROPER("chdir");
3503 IO* const io = GvIO(gv);
3506 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3507 } else if (IoIFP(io)) {
3508 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3512 SETERRNO(EBADF, RMS_IFI);
3518 SETERRNO(EBADF,RMS_IFI);
3522 DIE(aTHX_ PL_no_func, "fchdir");
3526 PUSHi( PerlDir_chdir(tmps) >= 0 );
3528 /* Clear the DEFAULT element of ENV so we'll get the new value
3530 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3537 dVAR; dSP; dMARK; dTARGET;
3538 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3549 char * const tmps = POPpx;
3550 TAINT_PROPER("chroot");
3551 PUSHi( chroot(tmps) >= 0 );
3554 DIE(aTHX_ PL_no_func, "chroot");
3562 const char * const tmps2 = POPpconstx;
3563 const char * const tmps = SvPV_nolen_const(TOPs);
3564 TAINT_PROPER("rename");
3566 anum = PerlLIO_rename(tmps, tmps2);
3568 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3569 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3572 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3573 (void)UNLINK(tmps2);
3574 if (!(anum = link(tmps, tmps2)))
3575 anum = UNLINK(tmps);
3583 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3587 const int op_type = PL_op->op_type;
3591 if (op_type == OP_LINK)
3592 DIE(aTHX_ PL_no_func, "link");
3594 # ifndef HAS_SYMLINK
3595 if (op_type == OP_SYMLINK)
3596 DIE(aTHX_ PL_no_func, "symlink");
3600 const char * const tmps2 = POPpconstx;
3601 const char * const tmps = SvPV_nolen_const(TOPs);
3602 TAINT_PROPER(PL_op_desc[op_type]);
3604 # if defined(HAS_LINK)
3605 # if defined(HAS_SYMLINK)
3606 /* Both present - need to choose which. */
3607 (op_type == OP_LINK) ?
3608 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3610 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3611 PerlLIO_link(tmps, tmps2);
3614 # if defined(HAS_SYMLINK)
3615 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3616 symlink(tmps, tmps2);
3621 SETi( result >= 0 );
3628 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3639 char buf[MAXPATHLEN];
3642 #ifndef INCOMPLETE_TAINTS
3646 len = readlink(tmps, buf, sizeof(buf) - 1);
3653 RETSETUNDEF; /* just pretend it's a normal file */
3657 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3659 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3661 char * const save_filename = filename;
3666 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3668 PERL_ARGS_ASSERT_DOONELINER;
3670 Newx(cmdline, size, char);
3671 my_strlcpy(cmdline, cmd, size);
3672 my_strlcat(cmdline, " ", size);
3673 for (s = cmdline + strlen(cmdline); *filename; ) {
3677 if (s - cmdline < size)
3678 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3679 myfp = PerlProc_popen(cmdline, "r");
3683 SV * const tmpsv = sv_newmortal();
3684 /* Need to save/restore 'PL_rs' ?? */
3685 s = sv_gets(tmpsv, myfp, 0);
3686 (void)PerlProc_pclose(myfp);
3690 #ifdef HAS_SYS_ERRLIST
3695 /* you don't see this */
3696 const char * const errmsg =
3697 #ifdef HAS_SYS_ERRLIST
3705 if (instr(s, errmsg)) {
3712 #define EACCES EPERM
3714 if (instr(s, "cannot make"))
3715 SETERRNO(EEXIST,RMS_FEX);
3716 else if (instr(s, "existing file"))
3717 SETERRNO(EEXIST,RMS_FEX);
3718 else if (instr(s, "ile exists"))
3719 SETERRNO(EEXIST,RMS_FEX);
3720 else if (instr(s, "non-exist"))
3721 SETERRNO(ENOENT,RMS_FNF);
3722 else if (instr(s, "does not exist"))
3723 SETERRNO(ENOENT,RMS_FNF);
3724 else if (instr(s, "not empty"))
3725 SETERRNO(EBUSY,SS_DEVOFFLINE);
3726 else if (instr(s, "cannot access"))
3727 SETERRNO(EACCES,RMS_PRV);
3729 SETERRNO(EPERM,RMS_PRV);
3732 else { /* some mkdirs return no failure indication */
3733 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3734 if (PL_op->op_type == OP_RMDIR)
3739 SETERRNO(EACCES,RMS_PRV); /* a guess */
3748 /* This macro removes trailing slashes from a directory name.
3749 * Different operating and file systems take differently to
3750 * trailing slashes. According to POSIX 1003.1 1996 Edition
3751 * any number of trailing slashes should be allowed.
3752 * Thusly we snip them away so that even non-conforming
3753 * systems are happy.
3754 * We should probably do this "filtering" for all
3755 * the functions that expect (potentially) directory names:
3756 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3757 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3759 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3760 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3763 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3764 (tmps) = savepvn((tmps), (len)); \
3774 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3776 TRIMSLASHES(tmps,len,copy);
3778 TAINT_PROPER("mkdir");
3780 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3784 SETi( dooneliner("mkdir", tmps) );
3785 oldumask = PerlLIO_umask(0);
3786 PerlLIO_umask(oldumask);
3787 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3802 TRIMSLASHES(tmps,len,copy);
3803 TAINT_PROPER("rmdir");
3805 SETi( PerlDir_rmdir(tmps) >= 0 );
3807 SETi( dooneliner("rmdir", tmps) );
3814 /* Directory calls. */
3818 #if defined(Direntry_t) && defined(HAS_READDIR)
3820 const char * const dirname = POPpconstx;
3821 GV * const gv = MUTABLE_GV(POPs);
3822 IO * const io = GvIOn(gv);
3827 if ((IoIFP(io) || IoOFP(io)))
3828 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3829 "Opening filehandle %"HEKf" also as a directory",
3830 HEKfARG(GvENAME_HEK(gv)) );
3832 PerlDir_close(IoDIRP(io));
3833 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3839 SETERRNO(EBADF,RMS_DIR);
3842 DIE(aTHX_ PL_no_dir_func, "opendir");
3848 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3849 DIE(aTHX_ PL_no_dir_func, "readdir");
3851 #if !defined(I_DIRENT) && !defined(VMS)
3852 Direntry_t *readdir (DIR *);
3858 const I32 gimme = GIMME;
3859 GV * const gv = MUTABLE_GV(POPs);
3860 const Direntry_t *dp;
3861 IO * const io = GvIOn(gv);
3863 if (!io || !IoDIRP(io)) {
3864 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3865 "readdir() attempted on invalid dirhandle %"HEKf,
3866 HEKfARG(GvENAME_HEK(gv)));
3871 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3875 sv = newSVpvn(dp->d_name, dp->d_namlen);
3877 sv = newSVpv(dp->d_name, 0);
3879 #ifndef INCOMPLETE_TAINTS
3880 if (!(IoFLAGS(io) & IOf_UNTAINT))
3884 } while (gimme == G_ARRAY);
3886 if (!dp && gimme != G_ARRAY)
3893 SETERRNO(EBADF,RMS_ISI);
3894 if (GIMME == G_ARRAY)
3903 #if defined(HAS_TELLDIR) || defined(telldir)
3905 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3906 /* XXX netbsd still seemed to.
3907 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3908 --JHI 1999-Feb-02 */
3909 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3910 long telldir (DIR *);
3912 GV * const gv = MUTABLE_GV(POPs);
3913 IO * const io = GvIOn(gv);
3915 if (!io || !IoDIRP(io)) {
3916 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3917 "telldir() attempted on invalid dirhandle %"HEKf,
3918 HEKfARG(GvENAME_HEK(gv)));
3922 PUSHi( PerlDir_tell(IoDIRP(io)) );
3926 SETERRNO(EBADF,RMS_ISI);
3929 DIE(aTHX_ PL_no_dir_func, "telldir");
3935 #if defined(HAS_SEEKDIR) || defined(seekdir)
3937 const long along = POPl;
3938 GV * const gv = MUTABLE_GV(POPs);
3939 IO * const io = GvIOn(gv);
3941 if (!io || !IoDIRP(io)) {
3942 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3943 "seekdir() attempted on invalid dirhandle %"HEKf,
3944 HEKfARG(GvENAME_HEK(gv)));
3947 (void)PerlDir_seek(IoDIRP(io), along);
3952 SETERRNO(EBADF,RMS_ISI);
3955 DIE(aTHX_ PL_no_dir_func, "seekdir");
3961 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3963 GV * const gv = MUTABLE_GV(POPs);
3964 IO * const io = GvIOn(gv);
3966 if (!io || !IoDIRP(io)) {
3967 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3968 "rewinddir() attempted on invalid dirhandle %"HEKf,
3969 HEKfARG(GvENAME_HEK(gv)));
3972 (void)PerlDir_rewind(IoDIRP(io));
3976 SETERRNO(EBADF,RMS_ISI);
3979 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3985 #if defined(Direntry_t) && defined(HAS_READDIR)
3987 GV * const gv = MUTABLE_GV(POPs);
3988 IO * const io = GvIOn(gv);
3990 if (!io || !IoDIRP(io)) {
3991 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3992 "closedir() attempted on invalid dirhandle %"HEKf,
3993 HEKfARG(GvENAME_HEK(gv)));
3996 #ifdef VOID_CLOSEDIR
3997 PerlDir_close(IoDIRP(io));
3999 if (PerlDir_close(IoDIRP(io)) < 0) {
4000 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4009 SETERRNO(EBADF,RMS_IFI);
4012 DIE(aTHX_ PL_no_dir_func, "closedir");
4016 /* Process control. */
4023 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4024 sigset_t oldmask, newmask;
4028 PERL_FLUSHALL_FOR_CHILD;
4029 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4030 sigfillset(&newmask);
4031 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4033 childpid = PerlProc_fork();
4034 if (childpid == 0) {
4038 for (sig = 1; sig < SIG_SIZE; sig++)
4039 PL_psig_pend[sig] = 0;
4041 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4044 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4051 #ifdef PERL_USES_PL_PIDSTATUS
4052 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4058 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4063 PERL_FLUSHALL_FOR_CHILD;
4064 childpid = PerlProc_fork();
4070 DIE(aTHX_ PL_no_func, "fork");
4077 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4082 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4083 childpid = wait4pid(-1, &argflags, 0);
4085 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4090 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4091 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4092 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4094 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4099 DIE(aTHX_ PL_no_func, "wait");
4105 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4107 const int optype = POPi;
4108 const Pid_t pid = TOPi;
4112 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4113 result = wait4pid(pid, &argflags, optype);
4115 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4120 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4121 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4122 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4124 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4129 DIE(aTHX_ PL_no_func, "waitpid");
4135 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4136 #if defined(__LIBCATAMOUNT__)
4137 PL_statusvalue = -1;
4146 while (++MARK <= SP) {
4147 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4152 TAINT_PROPER("system");
4154 PERL_FLUSHALL_FOR_CHILD;
4155 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4160 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4161 sigset_t newset, oldset;
4164 if (PerlProc_pipe(pp) >= 0)
4166 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4167 sigemptyset(&newset);
4168 sigaddset(&newset, SIGCHLD);
4169 sigprocmask(SIG_BLOCK, &newset, &oldset);
4171 while ((childpid = PerlProc_fork()) == -1) {
4172 if (errno != EAGAIN) {
4177 PerlLIO_close(pp[0]);
4178 PerlLIO_close(pp[1]);
4180 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4181 sigprocmask(SIG_SETMASK, &oldset, NULL);
4188 Sigsave_t ihand,qhand; /* place to save signals during system() */
4192 PerlLIO_close(pp[1]);
4194 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4195 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4198 result = wait4pid(childpid, &status, 0);
4199 } while (result == -1 && errno == EINTR);
4201 #ifdef HAS_SIGPROCMASK
4202 sigprocmask(SIG_SETMASK, &oldset, NULL);
4204 (void)rsignal_restore(SIGINT, &ihand);
4205 (void)rsignal_restore(SIGQUIT, &qhand);
4207 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4208 do_execfree(); /* free any memory child malloced on fork */
4215 while (n < sizeof(int)) {
4216 n1 = PerlLIO_read(pp[0],
4217 (void*)(((char*)&errkid)+n),
4223 PerlLIO_close(pp[0]);
4224 if (n) { /* Error */
4225 if (n != sizeof(int))
4226 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4227 errno = errkid; /* Propagate errno from kid */
4228 STATUS_NATIVE_CHILD_SET(-1);
4231 XPUSHi(STATUS_CURRENT);
4234 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4235 sigprocmask(SIG_SETMASK, &oldset, NULL);
4238 PerlLIO_close(pp[0]);
4239 #if defined(HAS_FCNTL) && defined(F_SETFD)
4240 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4243 if (PL_op->op_flags & OPf_STACKED) {
4244 SV * const really = *++MARK;
4245 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4247 else if (SP - MARK != 1)
4248 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4250 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4254 #else /* ! FORK or VMS or OS/2 */
4257 if (PL_op->op_flags & OPf_STACKED) {
4258 SV * const really = *++MARK;
4259 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4260 value = (I32)do_aspawn(really, MARK, SP);
4262 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4265 else if (SP - MARK != 1) {
4266 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4267 value = (I32)do_aspawn(NULL, MARK, SP);
4269 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4273 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4275 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4277 STATUS_NATIVE_CHILD_SET(value);
4280 XPUSHi(result ? value : STATUS_CURRENT);
4281 #endif /* !FORK or VMS or OS/2 */
4288 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4293 while (++MARK <= SP) {
4294 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4299 TAINT_PROPER("exec");
4301 PERL_FLUSHALL_FOR_CHILD;
4302 if (PL_op->op_flags & OPf_STACKED) {
4303 SV * const really = *++MARK;
4304 value = (I32)do_aexec(really, MARK, SP);
4306 else if (SP - MARK != 1)
4308 value = (I32)vms_do_aexec(NULL, MARK, SP);
4310 value = (I32)do_aexec(NULL, MARK, SP);
4314 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4316 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4329 XPUSHi( getppid() );
4332 DIE(aTHX_ PL_no_func, "getppid");
4342 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4345 pgrp = (I32)BSD_GETPGRP(pid);
4347 if (pid != 0 && pid != PerlProc_getpid())
4348 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4354 DIE(aTHX_ PL_no_func, "getpgrp()");
4364 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4365 if (MAXARG > 0) pid = TOPs && TOPi;
4371 TAINT_PROPER("setpgrp");
4373 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4375 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4376 || (pid != 0 && pid != PerlProc_getpid()))
4378 DIE(aTHX_ "setpgrp can't take arguments");
4380 SETi( setpgrp() >= 0 );
4381 #endif /* USE_BSDPGRP */
4384 DIE(aTHX_ PL_no_func, "setpgrp()");
4388 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4389 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4391 # define PRIORITY_WHICH_T(which) which
4396 #ifdef HAS_GETPRIORITY
4398 const int who = POPi;
4399 const int which = TOPi;
4400 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4403 DIE(aTHX_ PL_no_func, "getpriority()");
4409 #ifdef HAS_SETPRIORITY
4411 const int niceval = POPi;
4412 const int who = POPi;
4413 const int which = TOPi;
4414 TAINT_PROPER("setpriority");
4415 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4418 DIE(aTHX_ PL_no_func, "setpriority()");
4422 #undef PRIORITY_WHICH_T
4430 XPUSHn( time(NULL) );
4432 XPUSHi( time(NULL) );
4444 (void)PerlProc_times(&PL_timesbuf);
4446 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4447 /* struct tms, though same data */
4451 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4452 if (GIMME == G_ARRAY) {
4453 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4454 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4455 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4463 if (GIMME == G_ARRAY) {
4470 DIE(aTHX_ "times not implemented");
4472 #endif /* HAS_TIMES */
4475 /* The 32 bit int year limits the times we can represent to these
4476 boundaries with a few days wiggle room to account for time zone
4479 /* Sat Jan 3 00:00:00 -2147481748 */
4480 #define TIME_LOWER_BOUND -67768100567755200.0
4481 /* Sun Dec 29 12:00:00 2147483647 */
4482 #define TIME_UPPER_BOUND 67767976233316800.0
4491 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4492 static const char * const dayname[] =
4493 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4494 static const char * const monname[] =
4495 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4496 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4498 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4501 when = (Time64_T)now;
4504 NV input = Perl_floor(POPn);
4505 when = (Time64_T)input;
4506 if (when != input) {
4507 /* diag_listed_as: gmtime(%f) too large */
4508 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4509 "%s(%.0" NVff ") too large", opname, input);
4513 if ( TIME_LOWER_BOUND > when ) {
4514 /* diag_listed_as: gmtime(%f) too small */
4515 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4516 "%s(%.0" NVff ") too small", opname, when);
4519 else if( when > TIME_UPPER_BOUND ) {
4520 /* diag_listed_as: gmtime(%f) too small */
4521 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4522 "%s(%.0" NVff ") too large", opname, when);
4526 if (PL_op->op_type == OP_LOCALTIME)
4527 err = S_localtime64_r(&when, &tmbuf);
4529 err = S_gmtime64_r(&when, &tmbuf);
4533 /* XXX %lld broken for quads */
4534 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4535 "%s(%.0" NVff ") failed", opname, when);
4538 if (GIMME != G_ARRAY) { /* scalar context */
4540 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4541 double year = (double)tmbuf.tm_year + 1900;
4548 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4549 dayname[tmbuf.tm_wday],
4550 monname[tmbuf.tm_mon],
4558 else { /* list context */
4564 mPUSHi(tmbuf.tm_sec);
4565 mPUSHi(tmbuf.tm_min);
4566 mPUSHi(tmbuf.tm_hour);
4567 mPUSHi(tmbuf.tm_mday);
4568 mPUSHi(tmbuf.tm_mon);
4569 mPUSHn(tmbuf.tm_year);
4570 mPUSHi(tmbuf.tm_wday);
4571 mPUSHi(tmbuf.tm_yday);
4572 mPUSHi(tmbuf.tm_isdst);
4583 anum = alarm((unsigned int)anum);
4589 DIE(aTHX_ PL_no_func, "alarm");
4600 (void)time(&lasttime);
4601 if (MAXARG < 1 || (!TOPs && !POPs))
4605 PerlProc_sleep((unsigned int)duration);
4608 XPUSHi(when - lasttime);
4612 /* Shared memory. */
4613 /* Merged with some message passing. */
4617 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4618 dVAR; dSP; dMARK; dTARGET;
4619 const int op_type = PL_op->op_type;
4624 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4627 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4630 value = (I32)(do_semop(MARK, SP) >= 0);
4633 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4641 return Perl_pp_semget(aTHX);
4649 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4650 dVAR; dSP; dMARK; dTARGET;
4651 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4658 DIE(aTHX_ "System V IPC is not implemented on this machine");
4664 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4665 dVAR; dSP; dMARK; dTARGET;
4666 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4674 PUSHp(zero_but_true, ZBTLEN);
4678 return Perl_pp_semget(aTHX);
4682 /* I can't const this further without getting warnings about the types of
4683 various arrays passed in from structures. */
4685 S_space_join_names_mortal(pTHX_ char *const *array)
4689 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4691 if (array && *array) {
4692 target = newSVpvs_flags("", SVs_TEMP);
4694 sv_catpv(target, *array);
4697 sv_catpvs(target, " ");
4700 target = sv_mortalcopy(&PL_sv_no);
4705 /* Get system info. */
4709 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4711 I32 which = PL_op->op_type;
4714 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4715 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4716 struct hostent *gethostbyname(Netdb_name_t);
4717 struct hostent *gethostent(void);
4719 struct hostent *hent = NULL;
4723 if (which == OP_GHBYNAME) {
4724 #ifdef HAS_GETHOSTBYNAME
4725 const char* const name = POPpbytex;
4726 hent = PerlSock_gethostbyname(name);
4728 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4731 else if (which == OP_GHBYADDR) {
4732 #ifdef HAS_GETHOSTBYADDR
4733 const int addrtype = POPi;
4734 SV * const addrsv = POPs;
4736 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4738 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4740 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4744 #ifdef HAS_GETHOSTENT
4745 hent = PerlSock_gethostent();
4747 DIE(aTHX_ PL_no_sock_func, "gethostent");
4750 #ifdef HOST_NOT_FOUND
4752 #ifdef USE_REENTRANT_API
4753 # ifdef USE_GETHOSTENT_ERRNO
4754 h_errno = PL_reentrant_buffer->_gethostent_errno;
4757 STATUS_UNIX_SET(h_errno);
4761 if (GIMME != G_ARRAY) {
4762 PUSHs(sv = sv_newmortal());
4764 if (which == OP_GHBYNAME) {
4766 sv_setpvn(sv, hent->h_addr, hent->h_length);
4769 sv_setpv(sv, (char*)hent->h_name);
4775 mPUSHs(newSVpv((char*)hent->h_name, 0));
4776 PUSHs(space_join_names_mortal(hent->h_aliases));
4777 mPUSHi(hent->h_addrtype);
4778 len = hent->h_length;
4781 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4782 mXPUSHp(*elem, len);
4786 mPUSHp(hent->h_addr, len);
4788 PUSHs(sv_mortalcopy(&PL_sv_no));
4793 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4799 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4801 I32 which = PL_op->op_type;
4803 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4804 struct netent *getnetbyaddr(Netdb_net_t, int);
4805 struct netent *getnetbyname(Netdb_name_t);
4806 struct netent *getnetent(void);
4808 struct netent *nent;
4810 if (which == OP_GNBYNAME){
4811 #ifdef HAS_GETNETBYNAME
4812 const char * const name = POPpbytex;
4813 nent = PerlSock_getnetbyname(name);
4815 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4818 else if (which == OP_GNBYADDR) {
4819 #ifdef HAS_GETNETBYADDR
4820 const int addrtype = POPi;
4821 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4822 nent = PerlSock_getnetbyaddr(addr, addrtype);
4824 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4828 #ifdef HAS_GETNETENT
4829 nent = PerlSock_getnetent();
4831 DIE(aTHX_ PL_no_sock_func, "getnetent");
4834 #ifdef HOST_NOT_FOUND
4836 #ifdef USE_REENTRANT_API
4837 # ifdef USE_GETNETENT_ERRNO
4838 h_errno = PL_reentrant_buffer->_getnetent_errno;
4841 STATUS_UNIX_SET(h_errno);
4846 if (GIMME != G_ARRAY) {
4847 PUSHs(sv = sv_newmortal());
4849 if (which == OP_GNBYNAME)
4850 sv_setiv(sv, (IV)nent->n_net);
4852 sv_setpv(sv, nent->n_name);
4858 mPUSHs(newSVpv(nent->n_name, 0));
4859 PUSHs(space_join_names_mortal(nent->n_aliases));
4860 mPUSHi(nent->n_addrtype);
4861 mPUSHi(nent->n_net);
4866 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4872 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4874 I32 which = PL_op->op_type;
4876 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4877 struct protoent *getprotobyname(Netdb_name_t);
4878 struct protoent *getprotobynumber(int);
4879 struct protoent *getprotoent(void);
4881 struct protoent *pent;
4883 if (which == OP_GPBYNAME) {
4884 #ifdef HAS_GETPROTOBYNAME
4885 const char* const name = POPpbytex;
4886 pent = PerlSock_getprotobyname(name);
4888 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4891 else if (which == OP_GPBYNUMBER) {
4892 #ifdef HAS_GETPROTOBYNUMBER
4893 const int number = POPi;
4894 pent = PerlSock_getprotobynumber(number);
4896 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4900 #ifdef HAS_GETPROTOENT
4901 pent = PerlSock_getprotoent();
4903 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4907 if (GIMME != G_ARRAY) {
4908 PUSHs(sv = sv_newmortal());
4910 if (which == OP_GPBYNAME)
4911 sv_setiv(sv, (IV)pent->p_proto);
4913 sv_setpv(sv, pent->p_name);
4919 mPUSHs(newSVpv(pent->p_name, 0));
4920 PUSHs(space_join_names_mortal(pent->p_aliases));
4921 mPUSHi(pent->p_proto);
4926 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4932 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4934 I32 which = PL_op->op_type;
4936 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4937 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4938 struct servent *getservbyport(int, Netdb_name_t);
4939 struct servent *getservent(void);
4941 struct servent *sent;
4943 if (which == OP_GSBYNAME) {
4944 #ifdef HAS_GETSERVBYNAME
4945 const char * const proto = POPpbytex;
4946 const char * const name = POPpbytex;
4947 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4949 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4952 else if (which == OP_GSBYPORT) {
4953 #ifdef HAS_GETSERVBYPORT
4954 const char * const proto = POPpbytex;
4955 unsigned short port = (unsigned short)POPu;
4957 port = PerlSock_htons(port);
4959 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4961 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4965 #ifdef HAS_GETSERVENT
4966 sent = PerlSock_getservent();
4968 DIE(aTHX_ PL_no_sock_func, "getservent");
4972 if (GIMME != G_ARRAY) {
4973 PUSHs(sv = sv_newmortal());
4975 if (which == OP_GSBYNAME) {
4977 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4979 sv_setiv(sv, (IV)(sent->s_port));
4983 sv_setpv(sv, sent->s_name);
4989 mPUSHs(newSVpv(sent->s_name, 0));
4990 PUSHs(space_join_names_mortal(sent->s_aliases));
4992 mPUSHi(PerlSock_ntohs(sent->s_port));
4994 mPUSHi(sent->s_port);
4996 mPUSHs(newSVpv(sent->s_proto, 0));
5001 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5008 const int stayopen = TOPi;
5009 switch(PL_op->op_type) {
5011 #ifdef HAS_SETHOSTENT
5012 PerlSock_sethostent(stayopen);
5014 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5017 #ifdef HAS_SETNETENT
5019 PerlSock_setnetent(stayopen);
5021 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5025 #ifdef HAS_SETPROTOENT
5026 PerlSock_setprotoent(stayopen);
5028 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5032 #ifdef HAS_SETSERVENT
5033 PerlSock_setservent(stayopen);
5035 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5045 switch(PL_op->op_type) {
5047 #ifdef HAS_ENDHOSTENT
5048 PerlSock_endhostent();
5050 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5054 #ifdef HAS_ENDNETENT
5055 PerlSock_endnetent();
5057 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5061 #ifdef HAS_ENDPROTOENT
5062 PerlSock_endprotoent();
5064 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5068 #ifdef HAS_ENDSERVENT
5069 PerlSock_endservent();
5071 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5075 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5078 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5082 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5085 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5089 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5092 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5096 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5099 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5111 I32 which = PL_op->op_type;
5113 struct passwd *pwent = NULL;
5115 * We currently support only the SysV getsp* shadow password interface.
5116 * The interface is declared in <shadow.h> and often one needs to link
5117 * with -lsecurity or some such.
5118 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5121 * AIX getpwnam() is clever enough to return the encrypted password
5122 * only if the caller (euid?) is root.
5124 * There are at least three other shadow password APIs. Many platforms
5125 * seem to contain more than one interface for accessing the shadow
5126 * password databases, possibly for compatibility reasons.
5127 * The getsp*() is by far he simplest one, the other two interfaces
5128 * are much more complicated, but also very similar to each other.
5133 * struct pr_passwd *getprpw*();
5134 * The password is in
5135 * char getprpw*(...).ufld.fd_encrypt[]
5136 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5141 * struct es_passwd *getespw*();
5142 * The password is in
5143 * char *(getespw*(...).ufld.fd_encrypt)
5144 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5147 * struct userpw *getuserpw();
5148 * The password is in
5149 * char *(getuserpw(...)).spw_upw_passwd
5150 * (but the de facto standard getpwnam() should work okay)
5152 * Mention I_PROT here so that Configure probes for it.
5154 * In HP-UX for getprpw*() the manual page claims that one should include
5155 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5156 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5157 * and pp_sys.c already includes <shadow.h> if there is such.
5159 * Note that <sys/security.h> is already probed for, but currently
5160 * it is only included in special cases.
5162 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5163 * be preferred interface, even though also the getprpw*() interface
5164 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5165 * One also needs to call set_auth_parameters() in main() before
5166 * doing anything else, whether one is using getespw*() or getprpw*().
5168 * Note that accessing the shadow databases can be magnitudes
5169 * slower than accessing the standard databases.
5174 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5175 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5176 * the pw_comment is left uninitialized. */
5177 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5183 const char* const name = POPpbytex;
5184 pwent = getpwnam(name);
5190 pwent = getpwuid(uid);
5194 # ifdef HAS_GETPWENT
5196 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5197 if (pwent) pwent = getpwnam(pwent->pw_name);
5200 DIE(aTHX_ PL_no_func, "getpwent");
5206 if (GIMME != G_ARRAY) {
5207 PUSHs(sv = sv_newmortal());
5209 if (which == OP_GPWNAM)
5210 # if Uid_t_sign <= 0
5211 sv_setiv(sv, (IV)pwent->pw_uid);
5213 sv_setuv(sv, (UV)pwent->pw_uid);
5216 sv_setpv(sv, pwent->pw_name);
5222 mPUSHs(newSVpv(pwent->pw_name, 0));
5226 /* If we have getspnam(), we try to dig up the shadow
5227 * password. If we are underprivileged, the shadow
5228 * interface will set the errno to EACCES or similar,
5229 * and return a null pointer. If this happens, we will
5230 * use the dummy password (usually "*" or "x") from the
5231 * standard password database.
5233 * In theory we could skip the shadow call completely
5234 * if euid != 0 but in practice we cannot know which
5235 * security measures are guarding the shadow databases
5236 * on a random platform.
5238 * Resist the urge to use additional shadow interfaces.
5239 * Divert the urge to writing an extension instead.
5242 /* Some AIX setups falsely(?) detect some getspnam(), which
5243 * has a different API than the Solaris/IRIX one. */
5244 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5247 const struct spwd * const spwent = getspnam(pwent->pw_name);
5248 /* Save and restore errno so that
5249 * underprivileged attempts seem
5250 * to have never made the unsuccessful
5251 * attempt to retrieve the shadow password. */
5253 if (spwent && spwent->sp_pwdp)
5254 sv_setpv(sv, spwent->sp_pwdp);
5258 if (!SvPOK(sv)) /* Use the standard password, then. */
5259 sv_setpv(sv, pwent->pw_passwd);
5262 # ifndef INCOMPLETE_TAINTS
5263 /* passwd is tainted because user himself can diddle with it.
5264 * admittedly not much and in a very limited way, but nevertheless. */
5268 # if Uid_t_sign <= 0
5269 mPUSHi(pwent->pw_uid);
5271 mPUSHu(pwent->pw_uid);
5274 # if Uid_t_sign <= 0
5275 mPUSHi(pwent->pw_gid);
5277 mPUSHu(pwent->pw_gid);
5279 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5280 * because of the poor interface of the Perl getpw*(),
5281 * not because there's some standard/convention saying so.
5282 * A better interface would have been to return a hash,
5283 * but we are accursed by our history, alas. --jhi. */
5285 mPUSHi(pwent->pw_change);
5288 mPUSHi(pwent->pw_quota);
5291 mPUSHs(newSVpv(pwent->pw_age, 0));
5293 /* I think that you can never get this compiled, but just in case. */
5294 PUSHs(sv_mortalcopy(&PL_sv_no));
5299 /* pw_class and pw_comment are mutually exclusive--.
5300 * see the above note for pw_change, pw_quota, and pw_age. */
5302 mPUSHs(newSVpv(pwent->pw_class, 0));
5305 mPUSHs(newSVpv(pwent->pw_comment, 0));
5307 /* I think that you can never get this compiled, but just in case. */
5308 PUSHs(sv_mortalcopy(&PL_sv_no));
5313 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5315 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5317 # ifndef INCOMPLETE_TAINTS
5318 /* pw_gecos is tainted because user himself can diddle with it. */
5322 mPUSHs(newSVpv(pwent->pw_dir, 0));
5324 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5325 # ifndef INCOMPLETE_TAINTS
5326 /* pw_shell is tainted because user himself can diddle with it. */
5331 mPUSHi(pwent->pw_expire);
5336 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5344 const I32 which = PL_op->op_type;
5345 const struct group *grent;
5347 if (which == OP_GGRNAM) {
5348 const char* const name = POPpbytex;
5349 grent = (const struct group *)getgrnam(name);
5351 else if (which == OP_GGRGID) {
5352 const Gid_t gid = POPi;
5353 grent = (const struct group *)getgrgid(gid);
5357 grent = (struct group *)getgrent();
5359 DIE(aTHX_ PL_no_func, "getgrent");
5363 if (GIMME != G_ARRAY) {
5364 SV * const sv = sv_newmortal();
5368 if (which == OP_GGRNAM)
5370 sv_setiv(sv, (IV)grent->gr_gid);
5372 sv_setuv(sv, (UV)grent->gr_gid);
5375 sv_setpv(sv, grent->gr_name);
5381 mPUSHs(newSVpv(grent->gr_name, 0));
5384 mPUSHs(newSVpv(grent->gr_passwd, 0));
5386 PUSHs(sv_mortalcopy(&PL_sv_no));
5390 mPUSHi(grent->gr_gid);
5392 mPUSHu(grent->gr_gid);
5395 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5396 /* In UNICOS/mk (_CRAYMPP) the multithreading
5397 * versions (getgrnam_r, getgrgid_r)
5398 * seem to return an illegal pointer
5399 * as the group members list, gr_mem.
5400 * getgrent() doesn't even have a _r version
5401 * but the gr_mem is poisonous anyway.
5402 * So yes, you cannot get the list of group
5403 * members if building multithreaded in UNICOS/mk. */
5404 PUSHs(space_join_names_mortal(grent->gr_mem));
5410 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5420 if (!(tmps = PerlProc_getlogin()))
5422 sv_setpv_mg(TARG, tmps);
5426 DIE(aTHX_ PL_no_func, "getlogin");
5430 /* Miscellaneous. */
5435 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5436 I32 items = SP - MARK;
5437 unsigned long a[20];
5442 while (++MARK <= SP) {
5443 if (SvTAINTED(*MARK)) {
5449 TAINT_PROPER("syscall");
5452 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5453 * or where sizeof(long) != sizeof(char*). But such machines will
5454 * not likely have syscall implemented either, so who cares?
5456 while (++MARK <= SP) {
5457 if (SvNIOK(*MARK) || !i)
5458 a[i++] = SvIV(*MARK);
5459 else if (*MARK == &PL_sv_undef)
5462 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5468 DIE(aTHX_ "Too many args to syscall");
5470 DIE(aTHX_ "Too few args to syscall");
5472 retval = syscall(a[0]);
5475 retval = syscall(a[0],a[1]);
5478 retval = syscall(a[0],a[1],a[2]);
5481 retval = syscall(a[0],a[1],a[2],a[3]);
5484 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5487 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5490 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5493 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5500 DIE(aTHX_ PL_no_func, "syscall");
5504 #ifdef FCNTL_EMULATE_FLOCK
5506 /* XXX Emulate flock() with fcntl().
5507 What's really needed is a good file locking module.
5511 fcntl_emulate_flock(int fd, int operation)
5516 switch (operation & ~LOCK_NB) {
5518 flock.l_type = F_RDLCK;
5521 flock.l_type = F_WRLCK;
5524 flock.l_type = F_UNLCK;
5530 flock.l_whence = SEEK_SET;
5531 flock.l_start = flock.l_len = (Off_t)0;
5533 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5534 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5535 errno = EWOULDBLOCK;
5539 #endif /* FCNTL_EMULATE_FLOCK */
5541 #ifdef LOCKF_EMULATE_FLOCK
5543 /* XXX Emulate flock() with lockf(). This is just to increase
5544 portability of scripts. The calls are not completely
5545 interchangeable. What's really needed is a good file
5549 /* The lockf() constants might have been defined in <unistd.h>.
5550 Unfortunately, <unistd.h> causes troubles on some mixed
5551 (BSD/POSIX) systems, such as SunOS 4.1.3.
5553 Further, the lockf() constants aren't POSIX, so they might not be
5554 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5555 just stick in the SVID values and be done with it. Sigh.
5559 # define F_ULOCK 0 /* Unlock a previously locked region */
5562 # define F_LOCK 1 /* Lock a region for exclusive use */
5565 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5568 # define F_TEST 3 /* Test a region for other processes locks */
5572 lockf_emulate_flock(int fd, int operation)
5578 /* flock locks entire file so for lockf we need to do the same */
5579 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5580 if (pos > 0) /* is seekable and needs to be repositioned */
5581 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5582 pos = -1; /* seek failed, so don't seek back afterwards */
5585 switch (operation) {
5587 /* LOCK_SH - get a shared lock */
5589 /* LOCK_EX - get an exclusive lock */
5591 i = lockf (fd, F_LOCK, 0);
5594 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5595 case LOCK_SH|LOCK_NB:
5596 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5597 case LOCK_EX|LOCK_NB:
5598 i = lockf (fd, F_TLOCK, 0);
5600 if ((errno == EAGAIN) || (errno == EACCES))
5601 errno = EWOULDBLOCK;
5604 /* LOCK_UN - unlock (non-blocking is a no-op) */
5606 case LOCK_UN|LOCK_NB:
5607 i = lockf (fd, F_ULOCK, 0);
5610 /* Default - can't decipher operation */
5617 if (pos > 0) /* need to restore position of the handle */
5618 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5623 #endif /* LOCKF_EMULATE_FLOCK */
5627 * c-indentation-style: bsd
5629 * indent-tabs-mode: nil
5632 * ex: set ts=8 sts=4 sw=4 et: