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];
1100 sv_force_normal_flags(sv, 0);
1101 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1102 Perl_croak_no_modify();
1105 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1106 "Non-string passed as bitmask");
1107 SvPV_force_nomg_nolen(sv); /* force string conversion */
1114 /* little endians can use vecs directly */
1115 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1122 masksize = NFDBITS / NBBY;
1124 masksize = sizeof(long); /* documented int, everyone seems to use long */
1126 Zero(&fd_sets[0], 4, char*);
1129 # if SELECT_MIN_BITS == 1
1130 growsize = sizeof(fd_set);
1132 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1133 # undef SELECT_MIN_BITS
1134 # define SELECT_MIN_BITS __FD_SETSIZE
1136 /* If SELECT_MIN_BITS is greater than one we most probably will want
1137 * to align the sizes with SELECT_MIN_BITS/8 because for example
1138 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1139 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1140 * on (sets/tests/clears bits) is 32 bits. */
1141 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1149 timebuf.tv_sec = (long)value;
1150 value -= (NV)timebuf.tv_sec;
1151 timebuf.tv_usec = (long)(value * 1000000.0);
1156 for (i = 1; i <= 3; i++) {
1158 if (!SvOK(sv) || SvCUR(sv) == 0) {
1165 Sv_Grow(sv, growsize);
1169 while (++j <= growsize) {
1173 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1175 Newx(fd_sets[i], growsize, char);
1176 for (offset = 0; offset < growsize; offset += masksize) {
1177 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1178 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1181 fd_sets[i] = SvPVX(sv);
1185 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1186 /* Can't make just the (void*) conditional because that would be
1187 * cpp #if within cpp macro, and not all compilers like that. */
1188 nfound = PerlSock_select(
1190 (Select_fd_set_t) fd_sets[1],
1191 (Select_fd_set_t) fd_sets[2],
1192 (Select_fd_set_t) fd_sets[3],
1193 (void*) tbuf); /* Workaround for compiler bug. */
1195 nfound = PerlSock_select(
1197 (Select_fd_set_t) fd_sets[1],
1198 (Select_fd_set_t) fd_sets[2],
1199 (Select_fd_set_t) fd_sets[3],
1202 for (i = 1; i <= 3; i++) {
1205 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1207 for (offset = 0; offset < growsize; offset += masksize) {
1208 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1209 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1211 Safefree(fd_sets[i]);
1218 if (GIMME == G_ARRAY && tbuf) {
1219 value = (NV)(timebuf.tv_sec) +
1220 (NV)(timebuf.tv_usec) / 1000000.0;
1225 DIE(aTHX_ "select not implemented");
1230 =for apidoc setdefout
1232 Sets PL_defoutgv, the default file handle for output, to the passed in
1233 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1234 count of the passed in typeglob is increased by one, and the reference count
1235 of the typeglob that PL_defoutgv points to is decreased by one.
1241 Perl_setdefout(pTHX_ GV *gv)
1244 PERL_ARGS_ASSERT_SETDEFOUT;
1245 SvREFCNT_inc_simple_void_NN(gv);
1246 SvREFCNT_dec(PL_defoutgv);
1254 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1255 GV * egv = GvEGVx(PL_defoutgv);
1260 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1261 gvp = hv && HvENAME(hv)
1262 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1264 if (gvp && *gvp == egv) {
1265 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1269 mXPUSHs(newRV(MUTABLE_SV(egv)));
1273 if (!GvIO(newdefout))
1274 gv_IOadd(newdefout);
1275 setdefout(newdefout);
1285 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1286 IO *const io = GvIO(gv);
1292 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1294 const U32 gimme = GIMME_V;
1295 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1296 if (gimme == G_SCALAR) {
1298 SvSetMagicSV_nosteal(TARG, TOPs);
1303 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1304 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1306 SETERRNO(EBADF,RMS_IFI);
1310 sv_setpvs(TARG, " ");
1311 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1312 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1313 /* Find out how many bytes the char needs */
1314 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1317 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1318 SvCUR_set(TARG,1+len);
1327 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1331 const I32 gimme = GIMME_V;
1333 PERL_ARGS_ASSERT_DOFORM;
1335 if (cv && CvCLONE(cv))
1336 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1341 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1342 PUSHFORMAT(cx, retop);
1343 if (CvDEPTH(cv) >= 2) {
1344 PERL_STACK_OVERFLOW_CHECK();
1345 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1348 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1350 setdefout(gv); /* locally select filehandle so $% et al work */
1369 gv = MUTABLE_GV(POPs);
1386 tmpsv = sv_newmortal();
1387 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1388 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1390 IoFLAGS(io) &= ~IOf_DIDTOP;
1391 RETURNOP(doform(cv,gv,PL_op->op_next));
1397 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1398 IO * const io = GvIOp(gv);
1406 if (!io || !(ofp = IoOFP(io)))
1409 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1410 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1412 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1413 PL_formtarget != PL_toptarget)
1417 if (!IoTOP_GV(io)) {
1420 if (!IoTOP_NAME(io)) {
1422 if (!IoFMT_NAME(io))
1423 IoFMT_NAME(io) = savepv(GvNAME(gv));
1424 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1425 HEKfARG(GvNAME_HEK(gv))));
1426 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1427 if ((topgv && GvFORM(topgv)) ||
1428 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1429 IoTOP_NAME(io) = savesvpv(topname);
1431 IoTOP_NAME(io) = savepvs("top");
1433 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1434 if (!topgv || !GvFORM(topgv)) {
1435 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1438 IoTOP_GV(io) = topgv;
1440 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1441 I32 lines = IoLINES_LEFT(io);
1442 const char *s = SvPVX_const(PL_formtarget);
1443 if (lines <= 0) /* Yow, header didn't even fit!!! */
1445 while (lines-- > 0) {
1446 s = strchr(s, '\n');
1452 const STRLEN save = SvCUR(PL_formtarget);
1453 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1454 do_print(PL_formtarget, ofp);
1455 SvCUR_set(PL_formtarget, save);
1456 sv_chop(PL_formtarget, s);
1457 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1460 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1461 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1462 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1464 PL_formtarget = PL_toptarget;
1465 IoFLAGS(io) |= IOf_DIDTOP;
1468 DIE(aTHX_ "bad top format reference");
1471 SV * const sv = sv_newmortal();
1472 gv_efullname4(sv, fgv, NULL, FALSE);
1473 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1475 return doform(cv, gv, PL_op);
1479 POPBLOCK(cx,PL_curpm);
1481 retop = cx->blk_sub.retop;
1482 SP = newsp; /* ignore retval of formline */
1485 if (!io || !(fp = IoOFP(io))) {
1486 if (io && IoIFP(io))
1487 report_wrongway_fh(gv, '<');
1493 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1494 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1496 if (!do_print(PL_formtarget, fp))
1499 FmLINES(PL_formtarget) = 0;
1500 SvCUR_set(PL_formtarget, 0);
1501 *SvEND(PL_formtarget) = '\0';
1502 if (IoFLAGS(io) & IOf_FLUSH)
1503 (void)PerlIO_flush(fp);
1507 PL_formtarget = PL_bodytarget;
1508 PERL_UNUSED_VAR(gimme);
1514 dVAR; dSP; dMARK; dORIGMARK;
1518 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1519 IO *const io = GvIO(gv);
1521 /* Treat empty list as "" */
1522 if (MARK == SP) XPUSHs(&PL_sv_no);
1525 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1527 if (MARK == ORIGMARK) {
1530 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1533 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1535 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1542 SETERRNO(EBADF,RMS_IFI);
1545 else if (!(fp = IoOFP(io))) {
1547 report_wrongway_fh(gv, '<');
1548 else if (ckWARN(WARN_CLOSED))
1550 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1554 SV *sv = sv_newmortal();
1555 do_sprintf(sv, SP - MARK, MARK + 1);
1556 if (!do_print(sv, fp))
1559 if (IoFLAGS(io) & IOf_FLUSH)
1560 if (PerlIO_flush(fp) == EOF)
1569 PUSHs(&PL_sv_undef);
1577 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1578 const int mode = POPi;
1579 SV * const sv = POPs;
1580 GV * const gv = MUTABLE_GV(POPs);
1583 /* Need TIEHANDLE method ? */
1584 const char * const tmps = SvPV_const(sv, len);
1585 /* FIXME? do_open should do const */
1586 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1587 IoLINES(GvIOp(gv)) = 0;
1591 PUSHs(&PL_sv_undef);
1598 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1612 bool charstart = FALSE;
1613 STRLEN charskip = 0;
1616 GV * const gv = MUTABLE_GV(*++MARK);
1617 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1618 && gv && (io = GvIO(gv)) )
1620 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1622 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1623 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1632 sv_setpvs(bufsv, "");
1633 length = SvIVx(*++MARK);
1635 DIE(aTHX_ "Negative length");
1638 offset = SvIVx(*++MARK);
1642 if (!io || !IoIFP(io)) {
1644 SETERRNO(EBADF,RMS_IFI);
1647 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1648 buffer = SvPVutf8_force(bufsv, blen);
1649 /* UTF-8 may not have been set if they are all low bytes */
1654 buffer = SvPV_force(bufsv, blen);
1655 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1657 if (DO_UTF8(bufsv)) {
1658 blen = sv_len_utf8_nomg(bufsv);
1667 if (PL_op->op_type == OP_RECV) {
1668 Sock_size_t bufsize;
1669 char namebuf[MAXPATHLEN];
1670 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1671 bufsize = sizeof (struct sockaddr_in);
1673 bufsize = sizeof namebuf;
1675 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1679 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1680 /* 'offset' means 'flags' here */
1681 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1682 (struct sockaddr *)namebuf, &bufsize);
1685 /* MSG_TRUNC can give oversized count; quietly lose it */
1688 SvCUR_set(bufsv, count);
1689 *SvEND(bufsv) = '\0';
1690 (void)SvPOK_only(bufsv);
1694 /* This should not be marked tainted if the fp is marked clean */
1695 if (!(IoFLAGS(io) & IOf_UNTAINT))
1696 SvTAINTED_on(bufsv);
1698 sv_setpvn(TARG, namebuf, bufsize);
1704 if (-offset > (SSize_t)blen)
1705 DIE(aTHX_ "Offset outside string");
1708 if (DO_UTF8(bufsv)) {
1709 /* convert offset-as-chars to offset-as-bytes */
1710 if (offset >= (SSize_t)blen)
1711 offset += SvCUR(bufsv) - blen;
1713 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1716 orig_size = SvCUR(bufsv);
1717 /* Allocating length + offset + 1 isn't perfect in the case of reading
1718 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1720 (should be 2 * length + offset + 1, or possibly something longer if
1721 PL_encoding is true) */
1722 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1723 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1724 Zero(buffer+orig_size, offset-orig_size, char);
1726 buffer = buffer + offset;
1728 read_target = bufsv;
1730 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1731 concatenate it to the current buffer. */
1733 /* Truncate the existing buffer to the start of where we will be
1735 SvCUR_set(bufsv, offset);
1737 read_target = sv_newmortal();
1738 SvUPGRADE(read_target, SVt_PV);
1739 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1742 if (PL_op->op_type == OP_SYSREAD) {
1743 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1744 if (IoTYPE(io) == IoTYPE_SOCKET) {
1745 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1751 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1756 #ifdef HAS_SOCKET__bad_code_maybe
1757 if (IoTYPE(io) == IoTYPE_SOCKET) {
1758 Sock_size_t bufsize;
1759 char namebuf[MAXPATHLEN];
1760 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1761 bufsize = sizeof (struct sockaddr_in);
1763 bufsize = sizeof namebuf;
1765 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1766 (struct sockaddr *)namebuf, &bufsize);
1771 count = PerlIO_read(IoIFP(io), buffer, length);
1772 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1773 if (count == 0 && PerlIO_error(IoIFP(io)))
1777 if (IoTYPE(io) == IoTYPE_WRONLY)
1778 report_wrongway_fh(gv, '>');
1781 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1782 *SvEND(read_target) = '\0';
1783 (void)SvPOK_only(read_target);
1784 if (fp_utf8 && !IN_BYTES) {
1785 /* Look at utf8 we got back and count the characters */
1786 const char *bend = buffer + count;
1787 while (buffer < bend) {
1789 skip = UTF8SKIP(buffer);
1792 if (buffer - charskip + skip > bend) {
1793 /* partial character - try for rest of it */
1794 length = skip - (bend-buffer);
1795 offset = bend - SvPVX_const(bufsv);
1807 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1808 provided amount read (count) was what was requested (length)
1810 if (got < wanted && count == length) {
1811 length = wanted - got;
1812 offset = bend - SvPVX_const(bufsv);
1815 /* return value is character count */
1819 else if (buffer_utf8) {
1820 /* Let svcatsv upgrade the bytes we read in to utf8.
1821 The buffer is a mortal so will be freed soon. */
1822 sv_catsv_nomg(bufsv, read_target);
1825 /* This should not be marked tainted if the fp is marked clean */
1826 if (!(IoFLAGS(io) & IOf_UNTAINT))
1827 SvTAINTED_on(bufsv);
1839 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1844 STRLEN orig_blen_bytes;
1845 const int op_type = PL_op->op_type;
1848 GV *const gv = MUTABLE_GV(*++MARK);
1849 IO *const io = GvIO(gv);
1851 if (op_type == OP_SYSWRITE && io) {
1852 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1854 if (MARK == SP - 1) {
1856 mXPUSHi(sv_len(sv));
1860 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1861 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1871 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1873 if (io && IoIFP(io))
1874 report_wrongway_fh(gv, '<');
1877 SETERRNO(EBADF,RMS_IFI);
1881 /* Do this first to trigger any overloading. */
1882 buffer = SvPV_const(bufsv, blen);
1883 orig_blen_bytes = blen;
1884 doing_utf8 = DO_UTF8(bufsv);
1886 if (PerlIO_isutf8(IoIFP(io))) {
1887 if (!SvUTF8(bufsv)) {
1888 /* We don't modify the original scalar. */
1889 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1890 buffer = (char *) tmpbuf;
1894 else if (doing_utf8) {
1895 STRLEN tmplen = blen;
1896 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1899 buffer = (char *) tmpbuf;
1903 assert((char *)result == buffer);
1904 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1909 if (op_type == OP_SEND) {
1910 const int flags = SvIVx(*++MARK);
1913 char * const sockbuf = SvPVx(*++MARK, mlen);
1914 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1915 flags, (struct sockaddr *)sockbuf, mlen);
1919 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1925 Size_t length = 0; /* This length is in characters. */
1931 /* The SV is bytes, and we've had to upgrade it. */
1932 blen_chars = orig_blen_bytes;
1934 /* The SV really is UTF-8. */
1935 /* Don't call sv_len_utf8 on a magical or overloaded
1936 scalar, as we might get back a different result. */
1937 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1944 length = blen_chars;
1946 #if Size_t_size > IVSIZE
1947 length = (Size_t)SvNVx(*++MARK);
1949 length = (Size_t)SvIVx(*++MARK);
1951 if ((SSize_t)length < 0) {
1953 DIE(aTHX_ "Negative length");
1958 offset = SvIVx(*++MARK);
1960 if (-offset > (IV)blen_chars) {
1962 DIE(aTHX_ "Offset outside string");
1964 offset += blen_chars;
1965 } else if (offset > (IV)blen_chars) {
1967 DIE(aTHX_ "Offset outside string");
1971 if (length > blen_chars - offset)
1972 length = blen_chars - offset;
1974 /* Here we convert length from characters to bytes. */
1975 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1976 /* Either we had to convert the SV, or the SV is magical, or
1977 the SV has overloading, in which case we can't or mustn't
1978 or mustn't call it again. */
1980 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1981 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1983 /* It's a real UTF-8 SV, and it's not going to change under
1984 us. Take advantage of any cache. */
1986 I32 len_I32 = length;
1988 /* Convert the start and end character positions to bytes.
1989 Remember that the second argument to sv_pos_u2b is relative
1991 sv_pos_u2b(bufsv, &start, &len_I32);
1998 buffer = buffer+offset;
2000 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2001 if (IoTYPE(io) == IoTYPE_SOCKET) {
2002 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2008 /* See the note at doio.c:do_print about filesize limits. --jhi */
2009 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2018 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2021 #if Size_t_size > IVSIZE
2041 * in Perl 5.12 and later, the additional parameter is a bitmask:
2044 * 2 = eof() <- ARGV magic
2046 * I'll rely on the compiler's trace flow analysis to decide whether to
2047 * actually assign this out here, or punt it into the only block where it is
2048 * used. Doing it out here is DRY on the condition logic.
2053 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2059 if (PL_op->op_flags & OPf_SPECIAL) {
2060 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2064 gv = PL_last_in_gv; /* eof */
2072 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2073 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2076 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2077 if (io && !IoIFP(io)) {
2078 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2080 IoFLAGS(io) &= ~IOf_START;
2081 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2083 sv_setpvs(GvSV(gv), "-");
2085 GvSV(gv) = newSVpvs("-");
2086 SvSETMAGIC(GvSV(gv));
2088 else if (!nextargv(gv))
2093 PUSHs(boolSV(do_eof(gv)));
2103 if (MAXARG != 0 && (TOPs || POPs))
2104 PL_last_in_gv = MUTABLE_GV(POPs);
2111 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2113 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2118 SETERRNO(EBADF,RMS_IFI);
2123 #if LSEEKSIZE > IVSIZE
2124 PUSHn( do_tell(gv) );
2126 PUSHi( do_tell(gv) );
2134 const int whence = POPi;
2135 #if LSEEKSIZE > IVSIZE
2136 const Off_t offset = (Off_t)SvNVx(POPs);
2138 const Off_t offset = (Off_t)SvIVx(POPs);
2141 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2142 IO *const io = GvIO(gv);
2145 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2147 #if LSEEKSIZE > IVSIZE
2148 SV *const offset_sv = newSVnv((NV) offset);
2150 SV *const offset_sv = newSViv(offset);
2153 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2158 if (PL_op->op_type == OP_SEEK)
2159 PUSHs(boolSV(do_seek(gv, offset, whence)));
2161 const Off_t sought = do_sysseek(gv, offset, whence);
2163 PUSHs(&PL_sv_undef);
2165 SV* const sv = sought ?
2166 #if LSEEKSIZE > IVSIZE
2171 : newSVpvn(zero_but_true, ZBTLEN);
2182 /* There seems to be no consensus on the length type of truncate()
2183 * and ftruncate(), both off_t and size_t have supporters. In
2184 * general one would think that when using large files, off_t is
2185 * at least as wide as size_t, so using an off_t should be okay. */
2186 /* XXX Configure probe for the length type of *truncate() needed XXX */
2189 #if Off_t_size > IVSIZE
2194 /* Checking for length < 0 is problematic as the type might or
2195 * might not be signed: if it is not, clever compilers will moan. */
2196 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2199 SV * const sv = POPs;
2204 if (PL_op->op_flags & OPf_SPECIAL
2205 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2206 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2213 TAINT_PROPER("truncate");
2214 if (!(fp = IoIFP(io))) {
2220 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2222 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2228 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2229 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2230 goto do_ftruncate_io;
2233 const char * const name = SvPV_nomg_const_nolen(sv);
2234 TAINT_PROPER("truncate");
2236 if (truncate(name, len) < 0)
2240 const int tmpfd = PerlLIO_open(name, O_RDWR);
2245 if (my_chsize(tmpfd, len) < 0)
2247 PerlLIO_close(tmpfd);
2256 SETERRNO(EBADF,RMS_IFI);
2264 SV * const argsv = POPs;
2265 const unsigned int func = POPu;
2266 const int optype = PL_op->op_type;
2267 GV * const gv = MUTABLE_GV(POPs);
2268 IO * const io = gv ? GvIOn(gv) : NULL;
2272 if (!io || !argsv || !IoIFP(io)) {
2274 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2278 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2281 s = SvPV_force(argsv, len);
2282 need = IOCPARM_LEN(func);
2284 s = Sv_Grow(argsv, need + 1);
2285 SvCUR_set(argsv, need);
2288 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2291 retval = SvIV(argsv);
2292 s = INT2PTR(char*,retval); /* ouch */
2295 TAINT_PROPER(PL_op_desc[optype]);
2297 if (optype == OP_IOCTL)
2299 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2301 DIE(aTHX_ "ioctl is not implemented");
2305 DIE(aTHX_ "fcntl is not implemented");
2307 #if defined(OS2) && defined(__EMX__)
2308 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2310 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2314 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2316 if (s[SvCUR(argsv)] != 17)
2317 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2319 s[SvCUR(argsv)] = 0; /* put our null back */
2320 SvSETMAGIC(argsv); /* Assume it has changed */
2329 PUSHp(zero_but_true, ZBTLEN);
2340 const int argtype = POPi;
2341 GV * const gv = MUTABLE_GV(POPs);
2342 IO *const io = GvIO(gv);
2343 PerlIO *const fp = io ? IoIFP(io) : NULL;
2345 /* XXX Looks to me like io is always NULL at this point */
2347 (void)PerlIO_flush(fp);
2348 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2353 SETERRNO(EBADF,RMS_IFI);
2358 DIE(aTHX_ PL_no_func, "flock()");
2369 const int protocol = POPi;
2370 const int type = POPi;
2371 const int domain = POPi;
2372 GV * const gv = MUTABLE_GV(POPs);
2373 IO * const io = gv ? GvIOn(gv) : NULL;
2378 if (io && IoIFP(io))
2379 do_close(gv, FALSE);
2380 SETERRNO(EBADF,LIB_INVARG);
2385 do_close(gv, FALSE);
2387 TAINT_PROPER("socket");
2388 fd = PerlSock_socket(domain, type, protocol);
2391 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2392 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2393 IoTYPE(io) = IoTYPE_SOCKET;
2394 if (!IoIFP(io) || !IoOFP(io)) {
2395 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2396 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2397 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2400 #if defined(HAS_FCNTL) && defined(F_SETFD)
2401 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2410 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2412 const int protocol = POPi;
2413 const int type = POPi;
2414 const int domain = POPi;
2415 GV * const gv2 = MUTABLE_GV(POPs);
2416 GV * const gv1 = MUTABLE_GV(POPs);
2417 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2418 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2422 report_evil_fh(gv1);
2424 report_evil_fh(gv2);
2426 if (io1 && IoIFP(io1))
2427 do_close(gv1, FALSE);
2428 if (io2 && IoIFP(io2))
2429 do_close(gv2, FALSE);
2434 TAINT_PROPER("socketpair");
2435 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2437 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2438 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2439 IoTYPE(io1) = IoTYPE_SOCKET;
2440 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2441 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2442 IoTYPE(io2) = IoTYPE_SOCKET;
2443 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2444 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2445 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2446 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2447 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2448 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2449 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2452 #if defined(HAS_FCNTL) && defined(F_SETFD)
2453 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2454 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2459 DIE(aTHX_ PL_no_sock_func, "socketpair");
2468 SV * const addrsv = POPs;
2469 /* OK, so on what platform does bind modify addr? */
2471 GV * const gv = MUTABLE_GV(POPs);
2472 IO * const io = GvIOn(gv);
2474 const int op_type = PL_op->op_type;
2476 if (!io || !IoIFP(io))
2479 addr = SvPV_const(addrsv, len);
2480 TAINT_PROPER(PL_op_desc[op_type]);
2481 if ((op_type == OP_BIND
2482 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2483 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2491 SETERRNO(EBADF,SS_IVCHAN);
2498 const int backlog = POPi;
2499 GV * const gv = MUTABLE_GV(POPs);
2500 IO * const io = gv ? GvIOn(gv) : NULL;
2502 if (!io || !IoIFP(io))
2505 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2512 SETERRNO(EBADF,SS_IVCHAN);
2521 char namebuf[MAXPATHLEN];
2522 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2523 Sock_size_t len = sizeof (struct sockaddr_in);
2525 Sock_size_t len = sizeof namebuf;
2527 GV * const ggv = MUTABLE_GV(POPs);
2528 GV * const ngv = MUTABLE_GV(POPs);
2537 if (!gstio || !IoIFP(gstio))
2541 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2544 /* Some platforms indicate zero length when an AF_UNIX client is
2545 * not bound. Simulate a non-zero-length sockaddr structure in
2547 namebuf[0] = 0; /* sun_len */
2548 namebuf[1] = AF_UNIX; /* sun_family */
2556 do_close(ngv, FALSE);
2557 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2558 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2559 IoTYPE(nstio) = IoTYPE_SOCKET;
2560 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2561 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2562 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2563 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2566 #if defined(HAS_FCNTL) && defined(F_SETFD)
2567 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2570 #ifdef __SCO_VERSION__
2571 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2574 PUSHp(namebuf, len);
2578 report_evil_fh(ggv);
2579 SETERRNO(EBADF,SS_IVCHAN);
2589 const int how = POPi;
2590 GV * const gv = MUTABLE_GV(POPs);
2591 IO * const io = GvIOn(gv);
2593 if (!io || !IoIFP(io))
2596 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2601 SETERRNO(EBADF,SS_IVCHAN);
2608 const int optype = PL_op->op_type;
2609 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2610 const unsigned int optname = (unsigned int) POPi;
2611 const unsigned int lvl = (unsigned int) POPi;
2612 GV * const gv = MUTABLE_GV(POPs);
2613 IO * const io = GvIOn(gv);
2617 if (!io || !IoIFP(io))
2620 fd = PerlIO_fileno(IoIFP(io));
2624 (void)SvPOK_only(sv);
2628 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2635 #if defined(__SYMBIAN32__)
2636 # define SETSOCKOPT_OPTION_VALUE_T void *
2638 # define SETSOCKOPT_OPTION_VALUE_T const char *
2640 /* XXX TODO: We need to have a proper type (a Configure probe,
2641 * etc.) for what the C headers think of the third argument of
2642 * setsockopt(), the option_value read-only buffer: is it
2643 * a "char *", or a "void *", const or not. Some compilers
2644 * don't take kindly to e.g. assuming that "char *" implicitly
2645 * promotes to a "void *", or to explicitly promoting/demoting
2646 * consts to non/vice versa. The "const void *" is the SUS
2647 * definition, but that does not fly everywhere for the above
2649 SETSOCKOPT_OPTION_VALUE_T buf;
2653 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2657 aint = (int)SvIV(sv);
2658 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2661 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2671 SETERRNO(EBADF,SS_IVCHAN);
2680 const int optype = PL_op->op_type;
2681 GV * const gv = MUTABLE_GV(POPs);
2682 IO * const io = GvIOn(gv);
2687 if (!io || !IoIFP(io))
2690 sv = sv_2mortal(newSV(257));
2691 (void)SvPOK_only(sv);
2695 fd = PerlIO_fileno(IoIFP(io));
2697 case OP_GETSOCKNAME:
2698 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2701 case OP_GETPEERNAME:
2702 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2704 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2706 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";
2707 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2708 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2709 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2710 sizeof(u_short) + sizeof(struct in_addr))) {
2717 #ifdef BOGUS_GETNAME_RETURN
2718 /* Interactive Unix, getpeername() and getsockname()
2719 does not return valid namelen */
2720 if (len == BOGUS_GETNAME_RETURN)
2721 len = sizeof(struct sockaddr);
2730 SETERRNO(EBADF,SS_IVCHAN);
2749 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2750 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2751 if (PL_op->op_type == OP_LSTAT) {
2752 if (gv != PL_defgv) {
2753 do_fstat_warning_check:
2754 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2755 "lstat() on filehandle%s%"SVf,
2758 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2760 } else if (PL_laststype != OP_LSTAT)
2761 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2762 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2765 if (gv != PL_defgv) {
2769 PL_laststype = OP_STAT;
2770 PL_statgv = gv ? gv : (GV *)io;
2771 sv_setpvs(PL_statname, "");
2778 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2780 } else if (IoDIRP(io)) {
2782 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2785 PL_laststatval = -1;
2788 else PL_laststatval = -1;
2789 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2792 if (PL_laststatval < 0) {
2797 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2798 io = MUTABLE_IO(SvRV(sv));
2799 if (PL_op->op_type == OP_LSTAT)
2800 goto do_fstat_warning_check;
2801 goto do_fstat_have_io;
2804 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2805 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2807 PL_laststype = PL_op->op_type;
2808 if (PL_op->op_type == OP_LSTAT)
2809 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2811 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2812 if (PL_laststatval < 0) {
2813 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2814 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2820 if (gimme != G_ARRAY) {
2821 if (gimme != G_VOID)
2822 XPUSHs(boolSV(max));
2828 mPUSHi(PL_statcache.st_dev);
2829 #if ST_INO_SIZE > IVSIZE
2830 mPUSHn(PL_statcache.st_ino);
2832 # if ST_INO_SIGN <= 0
2833 mPUSHi(PL_statcache.st_ino);
2835 mPUSHu(PL_statcache.st_ino);
2838 mPUSHu(PL_statcache.st_mode);
2839 mPUSHu(PL_statcache.st_nlink);
2840 #if Uid_t_size > IVSIZE
2841 mPUSHn(PL_statcache.st_uid);
2843 # if Uid_t_sign <= 0
2844 mPUSHi(PL_statcache.st_uid);
2846 mPUSHu(PL_statcache.st_uid);
2849 #if Gid_t_size > IVSIZE
2850 mPUSHn(PL_statcache.st_gid);
2852 # if Gid_t_sign <= 0
2853 mPUSHi(PL_statcache.st_gid);
2855 mPUSHu(PL_statcache.st_gid);
2858 #ifdef USE_STAT_RDEV
2859 mPUSHi(PL_statcache.st_rdev);
2861 PUSHs(newSVpvs_flags("", SVs_TEMP));
2863 #if Off_t_size > IVSIZE
2864 mPUSHn(PL_statcache.st_size);
2866 mPUSHi(PL_statcache.st_size);
2869 mPUSHn(PL_statcache.st_atime);
2870 mPUSHn(PL_statcache.st_mtime);
2871 mPUSHn(PL_statcache.st_ctime);
2873 mPUSHi(PL_statcache.st_atime);
2874 mPUSHi(PL_statcache.st_mtime);
2875 mPUSHi(PL_statcache.st_ctime);
2877 #ifdef USE_STAT_BLOCKS
2878 mPUSHu(PL_statcache.st_blksize);
2879 mPUSHu(PL_statcache.st_blocks);
2881 PUSHs(newSVpvs_flags("", SVs_TEMP));
2882 PUSHs(newSVpvs_flags("", SVs_TEMP));
2888 /* All filetest ops avoid manipulating the perl stack pointer in their main
2889 bodies (since commit d2c4d2d1e22d3125), and return using either
2890 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2891 the only two which manipulate the perl stack. To ensure that no stack
2892 manipulation macros are used, the filetest ops avoid defining a local copy
2893 of the stack pointer with dSP. */
2895 /* If the next filetest is stacked up with this one
2896 (PL_op->op_private & OPpFT_STACKING), we leave
2897 the original argument on the stack for success,
2898 and skip the stacked operators on failure.
2899 The next few macros/functions take care of this.
2903 S_ft_return_false(pTHX_ SV *ret) {
2907 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2911 if (PL_op->op_private & OPpFT_STACKING) {
2912 while (OP_IS_FILETEST(next->op_type)
2913 && next->op_private & OPpFT_STACKED)
2914 next = next->op_next;
2919 PERL_STATIC_INLINE OP *
2920 S_ft_return_true(pTHX_ SV *ret) {
2922 if (PL_op->op_flags & OPf_REF)
2923 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2924 else if (!(PL_op->op_private & OPpFT_STACKING))
2930 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2931 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2932 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2934 #define tryAMAGICftest_MG(chr) STMT_START { \
2935 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2936 && PL_op->op_flags & OPf_KIDS) { \
2937 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2938 if (next) return next; \
2943 S_try_amagic_ftest(pTHX_ char chr) {
2945 SV *const arg = *PL_stack_sp;
2948 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2952 const char tmpchr = chr;
2953 SV * const tmpsv = amagic_call(arg,
2954 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2955 ftest_amg, AMGf_unary);
2960 return SvTRUE(tmpsv)
2961 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2971 /* Not const, because things tweak this below. Not bool, because there's
2972 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2973 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2974 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2975 /* Giving some sort of initial value silences compilers. */
2977 int access_mode = R_OK;
2979 int access_mode = 0;
2982 /* access_mode is never used, but leaving use_access in makes the
2983 conditional compiling below much clearer. */
2986 Mode_t stat_mode = S_IRUSR;
2988 bool effective = FALSE;
2991 switch (PL_op->op_type) {
2992 case OP_FTRREAD: opchar = 'R'; break;
2993 case OP_FTRWRITE: opchar = 'W'; break;
2994 case OP_FTREXEC: opchar = 'X'; break;
2995 case OP_FTEREAD: opchar = 'r'; break;
2996 case OP_FTEWRITE: opchar = 'w'; break;
2997 case OP_FTEEXEC: opchar = 'x'; break;
2999 tryAMAGICftest_MG(opchar);
3001 switch (PL_op->op_type) {
3003 #if !(defined(HAS_ACCESS) && defined(R_OK))
3009 #if defined(HAS_ACCESS) && defined(W_OK)
3014 stat_mode = S_IWUSR;
3018 #if defined(HAS_ACCESS) && defined(X_OK)
3023 stat_mode = S_IXUSR;
3027 #ifdef PERL_EFF_ACCESS
3030 stat_mode = S_IWUSR;
3034 #ifndef PERL_EFF_ACCESS
3041 #ifdef PERL_EFF_ACCESS
3046 stat_mode = S_IXUSR;
3052 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3053 const char *name = SvPV_nolen(*PL_stack_sp);
3055 # ifdef PERL_EFF_ACCESS
3056 result = PERL_EFF_ACCESS(name, access_mode);
3058 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3064 result = access(name, access_mode);
3066 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3077 result = my_stat_flags(0);
3080 if (cando(stat_mode, effective, &PL_statcache))
3089 const int op_type = PL_op->op_type;
3093 case OP_FTIS: opchar = 'e'; break;
3094 case OP_FTSIZE: opchar = 's'; break;
3095 case OP_FTMTIME: opchar = 'M'; break;
3096 case OP_FTCTIME: opchar = 'C'; break;
3097 case OP_FTATIME: opchar = 'A'; break;
3099 tryAMAGICftest_MG(opchar);
3101 result = my_stat_flags(0);
3104 if (op_type == OP_FTIS)
3107 /* You can't dTARGET inside OP_FTIS, because you'll get
3108 "panic: pad_sv po" - the op is not flagged to have a target. */
3112 #if Off_t_size > IVSIZE
3113 sv_setnv(TARG, (NV)PL_statcache.st_size);
3115 sv_setiv(TARG, (IV)PL_statcache.st_size);
3120 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3124 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3128 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3132 return SvTRUE_nomg(TARG)
3133 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3143 switch (PL_op->op_type) {
3144 case OP_FTROWNED: opchar = 'O'; break;
3145 case OP_FTEOWNED: opchar = 'o'; break;
3146 case OP_FTZERO: opchar = 'z'; break;
3147 case OP_FTSOCK: opchar = 'S'; break;
3148 case OP_FTCHR: opchar = 'c'; break;
3149 case OP_FTBLK: opchar = 'b'; break;
3150 case OP_FTFILE: opchar = 'f'; break;
3151 case OP_FTDIR: opchar = 'd'; break;
3152 case OP_FTPIPE: opchar = 'p'; break;
3153 case OP_FTSUID: opchar = 'u'; break;
3154 case OP_FTSGID: opchar = 'g'; break;
3155 case OP_FTSVTX: opchar = 'k'; break;
3157 tryAMAGICftest_MG(opchar);
3159 /* I believe that all these three are likely to be defined on most every
3160 system these days. */
3162 if(PL_op->op_type == OP_FTSUID) {
3167 if(PL_op->op_type == OP_FTSGID) {
3172 if(PL_op->op_type == OP_FTSVTX) {
3177 result = my_stat_flags(0);
3180 switch (PL_op->op_type) {
3182 if (PL_statcache.st_uid == PerlProc_getuid())
3186 if (PL_statcache.st_uid == PerlProc_geteuid())
3190 if (PL_statcache.st_size == 0)
3194 if (S_ISSOCK(PL_statcache.st_mode))
3198 if (S_ISCHR(PL_statcache.st_mode))
3202 if (S_ISBLK(PL_statcache.st_mode))
3206 if (S_ISREG(PL_statcache.st_mode))
3210 if (S_ISDIR(PL_statcache.st_mode))
3214 if (S_ISFIFO(PL_statcache.st_mode))
3219 if (PL_statcache.st_mode & S_ISUID)
3225 if (PL_statcache.st_mode & S_ISGID)
3231 if (PL_statcache.st_mode & S_ISVTX)
3244 tryAMAGICftest_MG('l');
3245 result = my_lstat_flags(0);
3249 if (S_ISLNK(PL_statcache.st_mode))
3262 tryAMAGICftest_MG('t');
3264 if (PL_op->op_flags & OPf_REF)
3267 SV *tmpsv = *PL_stack_sp;
3268 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3269 name = SvPV_nomg(tmpsv, namelen);
3270 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3274 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3275 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3276 else if (name && isDIGIT(*name))
3280 if (PerlLIO_isatty(fd))
3298 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3300 if (PL_op->op_flags & OPf_REF)
3302 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3307 gv = MAYBE_DEREF_GV_nomg(sv);
3311 if (gv == PL_defgv) {
3313 io = SvTYPE(PL_statgv) == SVt_PVIO
3317 goto really_filename;
3322 sv_setpvs(PL_statname, "");
3323 io = GvIO(PL_statgv);
3325 PL_laststatval = -1;
3326 PL_laststype = OP_STAT;
3327 if (io && IoIFP(io)) {
3328 if (! PerlIO_has_base(IoIFP(io)))
3329 DIE(aTHX_ "-T and -B not implemented on filehandles");
3330 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3331 if (PL_laststatval < 0)
3333 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3334 if (PL_op->op_type == OP_FTTEXT)
3339 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3340 i = PerlIO_getc(IoIFP(io));
3342 (void)PerlIO_ungetc(IoIFP(io),i);
3344 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3346 len = PerlIO_get_bufsiz(IoIFP(io));
3347 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3348 /* sfio can have large buffers - limit to 512 */
3353 SETERRNO(EBADF,RMS_IFI);
3355 SETERRNO(EBADF,RMS_IFI);
3360 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3363 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3365 PL_laststatval = -1;
3366 PL_laststype = OP_STAT;
3368 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3370 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3373 PL_laststype = OP_STAT;
3374 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3375 if (PL_laststatval < 0) {
3376 (void)PerlIO_close(fp);
3379 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3380 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3381 (void)PerlIO_close(fp);
3383 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3384 FT_RETURNNO; /* special case NFS directories */
3385 FT_RETURNYES; /* null file is anything */
3390 /* now scan s to look for textiness */
3391 /* XXX ASCII dependent code */
3393 #if defined(DOSISH) || defined(USEMYBINMODE)
3394 /* ignore trailing ^Z on short files */
3395 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3399 for (i = 0; i < len; i++, s++) {
3400 if (!*s) { /* null never allowed in text */
3405 else if (!(isPRINT(*s) || isSPACE(*s)))
3408 else if (*s & 128) {
3410 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3413 /* utf8 characters don't count as odd */
3414 if (UTF8_IS_START(*s)) {
3415 int ulen = UTF8SKIP(s);
3416 if (ulen < len - i) {
3418 for (j = 1; j < ulen; j++) {
3419 if (!UTF8_IS_CONTINUATION(s[j]))
3422 --ulen; /* loop does extra increment */
3432 *s != '\n' && *s != '\r' && *s != '\b' &&
3433 *s != '\t' && *s != '\f' && *s != 27)
3438 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3449 const char *tmps = NULL;
3453 SV * const sv = POPs;
3454 if (PL_op->op_flags & OPf_SPECIAL) {
3455 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3457 else if (!(gv = MAYBE_DEREF_GV(sv)))
3458 tmps = SvPV_nomg_const_nolen(sv);
3461 if( !gv && (!tmps || !*tmps) ) {
3462 HV * const table = GvHVn(PL_envgv);
3465 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3466 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3468 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3473 deprecate("chdir('') or chdir(undef) as chdir()");
3474 tmps = SvPV_nolen_const(*svp);
3478 TAINT_PROPER("chdir");
3483 TAINT_PROPER("chdir");
3486 IO* const io = GvIO(gv);
3489 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3490 } else if (IoIFP(io)) {
3491 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3495 SETERRNO(EBADF, RMS_IFI);
3501 SETERRNO(EBADF,RMS_IFI);
3505 DIE(aTHX_ PL_no_func, "fchdir");
3509 PUSHi( PerlDir_chdir(tmps) >= 0 );
3511 /* Clear the DEFAULT element of ENV so we'll get the new value
3513 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3520 dVAR; dSP; dMARK; dTARGET;
3521 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3532 char * const tmps = POPpx;
3533 TAINT_PROPER("chroot");
3534 PUSHi( chroot(tmps) >= 0 );
3537 DIE(aTHX_ PL_no_func, "chroot");
3545 const char * const tmps2 = POPpconstx;
3546 const char * const tmps = SvPV_nolen_const(TOPs);
3547 TAINT_PROPER("rename");
3549 anum = PerlLIO_rename(tmps, tmps2);
3551 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3552 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3555 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3556 (void)UNLINK(tmps2);
3557 if (!(anum = link(tmps, tmps2)))
3558 anum = UNLINK(tmps);
3566 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3570 const int op_type = PL_op->op_type;
3574 if (op_type == OP_LINK)
3575 DIE(aTHX_ PL_no_func, "link");
3577 # ifndef HAS_SYMLINK
3578 if (op_type == OP_SYMLINK)
3579 DIE(aTHX_ PL_no_func, "symlink");
3583 const char * const tmps2 = POPpconstx;
3584 const char * const tmps = SvPV_nolen_const(TOPs);
3585 TAINT_PROPER(PL_op_desc[op_type]);
3587 # if defined(HAS_LINK)
3588 # if defined(HAS_SYMLINK)
3589 /* Both present - need to choose which. */
3590 (op_type == OP_LINK) ?
3591 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3593 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3594 PerlLIO_link(tmps, tmps2);
3597 # if defined(HAS_SYMLINK)
3598 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3599 symlink(tmps, tmps2);
3604 SETi( result >= 0 );
3611 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3622 char buf[MAXPATHLEN];
3625 #ifndef INCOMPLETE_TAINTS
3629 len = readlink(tmps, buf, sizeof(buf) - 1);
3636 RETSETUNDEF; /* just pretend it's a normal file */
3640 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3642 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3644 char * const save_filename = filename;
3649 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3651 PERL_ARGS_ASSERT_DOONELINER;
3653 Newx(cmdline, size, char);
3654 my_strlcpy(cmdline, cmd, size);
3655 my_strlcat(cmdline, " ", size);
3656 for (s = cmdline + strlen(cmdline); *filename; ) {
3660 if (s - cmdline < size)
3661 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3662 myfp = PerlProc_popen(cmdline, "r");
3666 SV * const tmpsv = sv_newmortal();
3667 /* Need to save/restore 'PL_rs' ?? */
3668 s = sv_gets(tmpsv, myfp, 0);
3669 (void)PerlProc_pclose(myfp);
3673 #ifdef HAS_SYS_ERRLIST
3678 /* you don't see this */
3679 const char * const errmsg =
3680 #ifdef HAS_SYS_ERRLIST
3688 if (instr(s, errmsg)) {
3695 #define EACCES EPERM
3697 if (instr(s, "cannot make"))
3698 SETERRNO(EEXIST,RMS_FEX);
3699 else if (instr(s, "existing file"))
3700 SETERRNO(EEXIST,RMS_FEX);
3701 else if (instr(s, "ile exists"))
3702 SETERRNO(EEXIST,RMS_FEX);
3703 else if (instr(s, "non-exist"))
3704 SETERRNO(ENOENT,RMS_FNF);
3705 else if (instr(s, "does not exist"))
3706 SETERRNO(ENOENT,RMS_FNF);
3707 else if (instr(s, "not empty"))
3708 SETERRNO(EBUSY,SS_DEVOFFLINE);
3709 else if (instr(s, "cannot access"))
3710 SETERRNO(EACCES,RMS_PRV);
3712 SETERRNO(EPERM,RMS_PRV);
3715 else { /* some mkdirs return no failure indication */
3716 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3717 if (PL_op->op_type == OP_RMDIR)
3722 SETERRNO(EACCES,RMS_PRV); /* a guess */
3731 /* This macro removes trailing slashes from a directory name.
3732 * Different operating and file systems take differently to
3733 * trailing slashes. According to POSIX 1003.1 1996 Edition
3734 * any number of trailing slashes should be allowed.
3735 * Thusly we snip them away so that even non-conforming
3736 * systems are happy.
3737 * We should probably do this "filtering" for all
3738 * the functions that expect (potentially) directory names:
3739 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3740 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3742 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3743 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3746 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3747 (tmps) = savepvn((tmps), (len)); \
3757 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3759 TRIMSLASHES(tmps,len,copy);
3761 TAINT_PROPER("mkdir");
3763 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3767 SETi( dooneliner("mkdir", tmps) );
3768 oldumask = PerlLIO_umask(0);
3769 PerlLIO_umask(oldumask);
3770 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3785 TRIMSLASHES(tmps,len,copy);
3786 TAINT_PROPER("rmdir");
3788 SETi( PerlDir_rmdir(tmps) >= 0 );
3790 SETi( dooneliner("rmdir", tmps) );
3797 /* Directory calls. */
3801 #if defined(Direntry_t) && defined(HAS_READDIR)
3803 const char * const dirname = POPpconstx;
3804 GV * const gv = MUTABLE_GV(POPs);
3805 IO * const io = GvIOn(gv);
3810 if ((IoIFP(io) || IoOFP(io)))
3811 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3812 "Opening filehandle %"HEKf" also as a directory",
3813 HEKfARG(GvENAME_HEK(gv)) );
3815 PerlDir_close(IoDIRP(io));
3816 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3822 SETERRNO(EBADF,RMS_DIR);
3825 DIE(aTHX_ PL_no_dir_func, "opendir");
3831 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3832 DIE(aTHX_ PL_no_dir_func, "readdir");
3834 #if !defined(I_DIRENT) && !defined(VMS)
3835 Direntry_t *readdir (DIR *);
3841 const I32 gimme = GIMME;
3842 GV * const gv = MUTABLE_GV(POPs);
3843 const Direntry_t *dp;
3844 IO * const io = GvIOn(gv);
3846 if (!io || !IoDIRP(io)) {
3847 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3848 "readdir() attempted on invalid dirhandle %"HEKf,
3849 HEKfARG(GvENAME_HEK(gv)));
3854 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3858 sv = newSVpvn(dp->d_name, dp->d_namlen);
3860 sv = newSVpv(dp->d_name, 0);
3862 #ifndef INCOMPLETE_TAINTS
3863 if (!(IoFLAGS(io) & IOf_UNTAINT))
3867 } while (gimme == G_ARRAY);
3869 if (!dp && gimme != G_ARRAY)
3876 SETERRNO(EBADF,RMS_ISI);
3877 if (GIMME == G_ARRAY)
3886 #if defined(HAS_TELLDIR) || defined(telldir)
3888 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3889 /* XXX netbsd still seemed to.
3890 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3891 --JHI 1999-Feb-02 */
3892 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3893 long telldir (DIR *);
3895 GV * const gv = MUTABLE_GV(POPs);
3896 IO * const io = GvIOn(gv);
3898 if (!io || !IoDIRP(io)) {
3899 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3900 "telldir() attempted on invalid dirhandle %"HEKf,
3901 HEKfARG(GvENAME_HEK(gv)));
3905 PUSHi( PerlDir_tell(IoDIRP(io)) );
3909 SETERRNO(EBADF,RMS_ISI);
3912 DIE(aTHX_ PL_no_dir_func, "telldir");
3918 #if defined(HAS_SEEKDIR) || defined(seekdir)
3920 const long along = POPl;
3921 GV * const gv = MUTABLE_GV(POPs);
3922 IO * const io = GvIOn(gv);
3924 if (!io || !IoDIRP(io)) {
3925 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3926 "seekdir() attempted on invalid dirhandle %"HEKf,
3927 HEKfARG(GvENAME_HEK(gv)));
3930 (void)PerlDir_seek(IoDIRP(io), along);
3935 SETERRNO(EBADF,RMS_ISI);
3938 DIE(aTHX_ PL_no_dir_func, "seekdir");
3944 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3946 GV * const gv = MUTABLE_GV(POPs);
3947 IO * const io = GvIOn(gv);
3949 if (!io || !IoDIRP(io)) {
3950 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3951 "rewinddir() attempted on invalid dirhandle %"HEKf,
3952 HEKfARG(GvENAME_HEK(gv)));
3955 (void)PerlDir_rewind(IoDIRP(io));
3959 SETERRNO(EBADF,RMS_ISI);
3962 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3968 #if defined(Direntry_t) && defined(HAS_READDIR)
3970 GV * const gv = MUTABLE_GV(POPs);
3971 IO * const io = GvIOn(gv);
3973 if (!io || !IoDIRP(io)) {
3974 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3975 "closedir() attempted on invalid dirhandle %"HEKf,
3976 HEKfARG(GvENAME_HEK(gv)));
3979 #ifdef VOID_CLOSEDIR
3980 PerlDir_close(IoDIRP(io));
3982 if (PerlDir_close(IoDIRP(io)) < 0) {
3983 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3992 SETERRNO(EBADF,RMS_IFI);
3995 DIE(aTHX_ PL_no_dir_func, "closedir");
3999 /* Process control. */
4006 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4007 sigset_t oldmask, newmask;
4011 PERL_FLUSHALL_FOR_CHILD;
4012 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4013 sigfillset(&newmask);
4014 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4016 childpid = PerlProc_fork();
4017 if (childpid == 0) {
4021 for (sig = 1; sig < SIG_SIZE; sig++)
4022 PL_psig_pend[sig] = 0;
4024 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4027 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4034 #ifdef PERL_USES_PL_PIDSTATUS
4035 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4041 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4046 PERL_FLUSHALL_FOR_CHILD;
4047 childpid = PerlProc_fork();
4053 DIE(aTHX_ PL_no_func, "fork");
4060 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4065 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4066 childpid = wait4pid(-1, &argflags, 0);
4068 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4073 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4074 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4075 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4077 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4082 DIE(aTHX_ PL_no_func, "wait");
4088 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4090 const int optype = POPi;
4091 const Pid_t pid = TOPi;
4095 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4096 result = wait4pid(pid, &argflags, optype);
4098 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4103 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4104 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4105 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4107 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4112 DIE(aTHX_ PL_no_func, "waitpid");
4118 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4119 #if defined(__LIBCATAMOUNT__)
4120 PL_statusvalue = -1;
4129 while (++MARK <= SP) {
4130 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4135 TAINT_PROPER("system");
4137 PERL_FLUSHALL_FOR_CHILD;
4138 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4143 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4144 sigset_t newset, oldset;
4147 if (PerlProc_pipe(pp) >= 0)
4149 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4150 sigemptyset(&newset);
4151 sigaddset(&newset, SIGCHLD);
4152 sigprocmask(SIG_BLOCK, &newset, &oldset);
4154 while ((childpid = PerlProc_fork()) == -1) {
4155 if (errno != EAGAIN) {
4160 PerlLIO_close(pp[0]);
4161 PerlLIO_close(pp[1]);
4163 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4164 sigprocmask(SIG_SETMASK, &oldset, NULL);
4171 Sigsave_t ihand,qhand; /* place to save signals during system() */
4175 PerlLIO_close(pp[1]);
4177 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4178 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4181 result = wait4pid(childpid, &status, 0);
4182 } while (result == -1 && errno == EINTR);
4184 #ifdef HAS_SIGPROCMASK
4185 sigprocmask(SIG_SETMASK, &oldset, NULL);
4187 (void)rsignal_restore(SIGINT, &ihand);
4188 (void)rsignal_restore(SIGQUIT, &qhand);
4190 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4191 do_execfree(); /* free any memory child malloced on fork */
4198 while (n < sizeof(int)) {
4199 n1 = PerlLIO_read(pp[0],
4200 (void*)(((char*)&errkid)+n),
4206 PerlLIO_close(pp[0]);
4207 if (n) { /* Error */
4208 if (n != sizeof(int))
4209 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4210 errno = errkid; /* Propagate errno from kid */
4211 STATUS_NATIVE_CHILD_SET(-1);
4214 XPUSHi(STATUS_CURRENT);
4217 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4218 sigprocmask(SIG_SETMASK, &oldset, NULL);
4221 PerlLIO_close(pp[0]);
4222 #if defined(HAS_FCNTL) && defined(F_SETFD)
4223 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4226 if (PL_op->op_flags & OPf_STACKED) {
4227 SV * const really = *++MARK;
4228 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4230 else if (SP - MARK != 1)
4231 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4233 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4237 #else /* ! FORK or VMS or OS/2 */
4240 if (PL_op->op_flags & OPf_STACKED) {
4241 SV * const really = *++MARK;
4242 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4243 value = (I32)do_aspawn(really, MARK, SP);
4245 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4248 else if (SP - MARK != 1) {
4249 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4250 value = (I32)do_aspawn(NULL, MARK, SP);
4252 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4256 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4258 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4260 STATUS_NATIVE_CHILD_SET(value);
4263 XPUSHi(result ? value : STATUS_CURRENT);
4264 #endif /* !FORK or VMS or OS/2 */
4271 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4276 while (++MARK <= SP) {
4277 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4282 TAINT_PROPER("exec");
4284 PERL_FLUSHALL_FOR_CHILD;
4285 if (PL_op->op_flags & OPf_STACKED) {
4286 SV * const really = *++MARK;
4287 value = (I32)do_aexec(really, MARK, SP);
4289 else if (SP - MARK != 1)
4291 value = (I32)vms_do_aexec(NULL, MARK, SP);
4293 value = (I32)do_aexec(NULL, MARK, SP);
4297 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4299 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4312 XPUSHi( getppid() );
4315 DIE(aTHX_ PL_no_func, "getppid");
4325 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4328 pgrp = (I32)BSD_GETPGRP(pid);
4330 if (pid != 0 && pid != PerlProc_getpid())
4331 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4337 DIE(aTHX_ PL_no_func, "getpgrp()");
4347 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4348 if (MAXARG > 0) pid = TOPs && TOPi;
4354 TAINT_PROPER("setpgrp");
4356 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4358 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4359 || (pid != 0 && pid != PerlProc_getpid()))
4361 DIE(aTHX_ "setpgrp can't take arguments");
4363 SETi( setpgrp() >= 0 );
4364 #endif /* USE_BSDPGRP */
4367 DIE(aTHX_ PL_no_func, "setpgrp()");
4371 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4372 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4374 # define PRIORITY_WHICH_T(which) which
4379 #ifdef HAS_GETPRIORITY
4381 const int who = POPi;
4382 const int which = TOPi;
4383 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4386 DIE(aTHX_ PL_no_func, "getpriority()");
4392 #ifdef HAS_SETPRIORITY
4394 const int niceval = POPi;
4395 const int who = POPi;
4396 const int which = TOPi;
4397 TAINT_PROPER("setpriority");
4398 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4401 DIE(aTHX_ PL_no_func, "setpriority()");
4405 #undef PRIORITY_WHICH_T
4413 XPUSHn( time(NULL) );
4415 XPUSHi( time(NULL) );
4427 (void)PerlProc_times(&PL_timesbuf);
4429 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4430 /* struct tms, though same data */
4434 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4435 if (GIMME == G_ARRAY) {
4436 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4437 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4438 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4446 if (GIMME == G_ARRAY) {
4453 DIE(aTHX_ "times not implemented");
4455 #endif /* HAS_TIMES */
4458 /* The 32 bit int year limits the times we can represent to these
4459 boundaries with a few days wiggle room to account for time zone
4462 /* Sat Jan 3 00:00:00 -2147481748 */
4463 #define TIME_LOWER_BOUND -67768100567755200.0
4464 /* Sun Dec 29 12:00:00 2147483647 */
4465 #define TIME_UPPER_BOUND 67767976233316800.0
4474 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4475 static const char * const dayname[] =
4476 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4477 static const char * const monname[] =
4478 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4479 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4481 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4484 when = (Time64_T)now;
4487 NV input = Perl_floor(POPn);
4488 when = (Time64_T)input;
4489 if (when != input) {
4490 /* diag_listed_as: gmtime(%f) too large */
4491 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4492 "%s(%.0" NVff ") too large", opname, input);
4496 if ( TIME_LOWER_BOUND > when ) {
4497 /* diag_listed_as: gmtime(%f) too small */
4498 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4499 "%s(%.0" NVff ") too small", opname, when);
4502 else if( when > TIME_UPPER_BOUND ) {
4503 /* diag_listed_as: gmtime(%f) too small */
4504 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4505 "%s(%.0" NVff ") too large", opname, when);
4509 if (PL_op->op_type == OP_LOCALTIME)
4510 err = S_localtime64_r(&when, &tmbuf);
4512 err = S_gmtime64_r(&when, &tmbuf);
4516 /* XXX %lld broken for quads */
4517 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4518 "%s(%.0" NVff ") failed", opname, when);
4521 if (GIMME != G_ARRAY) { /* scalar context */
4523 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4524 double year = (double)tmbuf.tm_year + 1900;
4531 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4532 dayname[tmbuf.tm_wday],
4533 monname[tmbuf.tm_mon],
4541 else { /* list context */
4547 mPUSHi(tmbuf.tm_sec);
4548 mPUSHi(tmbuf.tm_min);
4549 mPUSHi(tmbuf.tm_hour);
4550 mPUSHi(tmbuf.tm_mday);
4551 mPUSHi(tmbuf.tm_mon);
4552 mPUSHn(tmbuf.tm_year);
4553 mPUSHi(tmbuf.tm_wday);
4554 mPUSHi(tmbuf.tm_yday);
4555 mPUSHi(tmbuf.tm_isdst);
4566 anum = alarm((unsigned int)anum);
4572 DIE(aTHX_ PL_no_func, "alarm");
4583 (void)time(&lasttime);
4584 if (MAXARG < 1 || (!TOPs && !POPs))
4588 PerlProc_sleep((unsigned int)duration);
4591 XPUSHi(when - lasttime);
4595 /* Shared memory. */
4596 /* Merged with some message passing. */
4600 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4601 dVAR; dSP; dMARK; dTARGET;
4602 const int op_type = PL_op->op_type;
4607 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4610 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4613 value = (I32)(do_semop(MARK, SP) >= 0);
4616 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4624 return Perl_pp_semget(aTHX);
4632 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4633 dVAR; dSP; dMARK; dTARGET;
4634 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4641 DIE(aTHX_ "System V IPC is not implemented on this machine");
4647 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4648 dVAR; dSP; dMARK; dTARGET;
4649 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4657 PUSHp(zero_but_true, ZBTLEN);
4661 return Perl_pp_semget(aTHX);
4665 /* I can't const this further without getting warnings about the types of
4666 various arrays passed in from structures. */
4668 S_space_join_names_mortal(pTHX_ char *const *array)
4672 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4674 if (array && *array) {
4675 target = newSVpvs_flags("", SVs_TEMP);
4677 sv_catpv(target, *array);
4680 sv_catpvs(target, " ");
4683 target = sv_mortalcopy(&PL_sv_no);
4688 /* Get system info. */
4692 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4694 I32 which = PL_op->op_type;
4697 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4698 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4699 struct hostent *gethostbyname(Netdb_name_t);
4700 struct hostent *gethostent(void);
4702 struct hostent *hent = NULL;
4706 if (which == OP_GHBYNAME) {
4707 #ifdef HAS_GETHOSTBYNAME
4708 const char* const name = POPpbytex;
4709 hent = PerlSock_gethostbyname(name);
4711 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4714 else if (which == OP_GHBYADDR) {
4715 #ifdef HAS_GETHOSTBYADDR
4716 const int addrtype = POPi;
4717 SV * const addrsv = POPs;
4719 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4721 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4723 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4727 #ifdef HAS_GETHOSTENT
4728 hent = PerlSock_gethostent();
4730 DIE(aTHX_ PL_no_sock_func, "gethostent");
4733 #ifdef HOST_NOT_FOUND
4735 #ifdef USE_REENTRANT_API
4736 # ifdef USE_GETHOSTENT_ERRNO
4737 h_errno = PL_reentrant_buffer->_gethostent_errno;
4740 STATUS_UNIX_SET(h_errno);
4744 if (GIMME != G_ARRAY) {
4745 PUSHs(sv = sv_newmortal());
4747 if (which == OP_GHBYNAME) {
4749 sv_setpvn(sv, hent->h_addr, hent->h_length);
4752 sv_setpv(sv, (char*)hent->h_name);
4758 mPUSHs(newSVpv((char*)hent->h_name, 0));
4759 PUSHs(space_join_names_mortal(hent->h_aliases));
4760 mPUSHi(hent->h_addrtype);
4761 len = hent->h_length;
4764 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4765 mXPUSHp(*elem, len);
4769 mPUSHp(hent->h_addr, len);
4771 PUSHs(sv_mortalcopy(&PL_sv_no));
4776 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4782 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4784 I32 which = PL_op->op_type;
4786 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4787 struct netent *getnetbyaddr(Netdb_net_t, int);
4788 struct netent *getnetbyname(Netdb_name_t);
4789 struct netent *getnetent(void);
4791 struct netent *nent;
4793 if (which == OP_GNBYNAME){
4794 #ifdef HAS_GETNETBYNAME
4795 const char * const name = POPpbytex;
4796 nent = PerlSock_getnetbyname(name);
4798 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4801 else if (which == OP_GNBYADDR) {
4802 #ifdef HAS_GETNETBYADDR
4803 const int addrtype = POPi;
4804 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4805 nent = PerlSock_getnetbyaddr(addr, addrtype);
4807 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4811 #ifdef HAS_GETNETENT
4812 nent = PerlSock_getnetent();
4814 DIE(aTHX_ PL_no_sock_func, "getnetent");
4817 #ifdef HOST_NOT_FOUND
4819 #ifdef USE_REENTRANT_API
4820 # ifdef USE_GETNETENT_ERRNO
4821 h_errno = PL_reentrant_buffer->_getnetent_errno;
4824 STATUS_UNIX_SET(h_errno);
4829 if (GIMME != G_ARRAY) {
4830 PUSHs(sv = sv_newmortal());
4832 if (which == OP_GNBYNAME)
4833 sv_setiv(sv, (IV)nent->n_net);
4835 sv_setpv(sv, nent->n_name);
4841 mPUSHs(newSVpv(nent->n_name, 0));
4842 PUSHs(space_join_names_mortal(nent->n_aliases));
4843 mPUSHi(nent->n_addrtype);
4844 mPUSHi(nent->n_net);
4849 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4855 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4857 I32 which = PL_op->op_type;
4859 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4860 struct protoent *getprotobyname(Netdb_name_t);
4861 struct protoent *getprotobynumber(int);
4862 struct protoent *getprotoent(void);
4864 struct protoent *pent;
4866 if (which == OP_GPBYNAME) {
4867 #ifdef HAS_GETPROTOBYNAME
4868 const char* const name = POPpbytex;
4869 pent = PerlSock_getprotobyname(name);
4871 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4874 else if (which == OP_GPBYNUMBER) {
4875 #ifdef HAS_GETPROTOBYNUMBER
4876 const int number = POPi;
4877 pent = PerlSock_getprotobynumber(number);
4879 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4883 #ifdef HAS_GETPROTOENT
4884 pent = PerlSock_getprotoent();
4886 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4890 if (GIMME != G_ARRAY) {
4891 PUSHs(sv = sv_newmortal());
4893 if (which == OP_GPBYNAME)
4894 sv_setiv(sv, (IV)pent->p_proto);
4896 sv_setpv(sv, pent->p_name);
4902 mPUSHs(newSVpv(pent->p_name, 0));
4903 PUSHs(space_join_names_mortal(pent->p_aliases));
4904 mPUSHi(pent->p_proto);
4909 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4915 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4917 I32 which = PL_op->op_type;
4919 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4920 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4921 struct servent *getservbyport(int, Netdb_name_t);
4922 struct servent *getservent(void);
4924 struct servent *sent;
4926 if (which == OP_GSBYNAME) {
4927 #ifdef HAS_GETSERVBYNAME
4928 const char * const proto = POPpbytex;
4929 const char * const name = POPpbytex;
4930 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4932 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4935 else if (which == OP_GSBYPORT) {
4936 #ifdef HAS_GETSERVBYPORT
4937 const char * const proto = POPpbytex;
4938 unsigned short port = (unsigned short)POPu;
4940 port = PerlSock_htons(port);
4942 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4944 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4948 #ifdef HAS_GETSERVENT
4949 sent = PerlSock_getservent();
4951 DIE(aTHX_ PL_no_sock_func, "getservent");
4955 if (GIMME != G_ARRAY) {
4956 PUSHs(sv = sv_newmortal());
4958 if (which == OP_GSBYNAME) {
4960 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4962 sv_setiv(sv, (IV)(sent->s_port));
4966 sv_setpv(sv, sent->s_name);
4972 mPUSHs(newSVpv(sent->s_name, 0));
4973 PUSHs(space_join_names_mortal(sent->s_aliases));
4975 mPUSHi(PerlSock_ntohs(sent->s_port));
4977 mPUSHi(sent->s_port);
4979 mPUSHs(newSVpv(sent->s_proto, 0));
4984 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4991 const int stayopen = TOPi;
4992 switch(PL_op->op_type) {
4994 #ifdef HAS_SETHOSTENT
4995 PerlSock_sethostent(stayopen);
4997 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5000 #ifdef HAS_SETNETENT
5002 PerlSock_setnetent(stayopen);
5004 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5008 #ifdef HAS_SETPROTOENT
5009 PerlSock_setprotoent(stayopen);
5011 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5015 #ifdef HAS_SETSERVENT
5016 PerlSock_setservent(stayopen);
5018 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5028 switch(PL_op->op_type) {
5030 #ifdef HAS_ENDHOSTENT
5031 PerlSock_endhostent();
5033 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5037 #ifdef HAS_ENDNETENT
5038 PerlSock_endnetent();
5040 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5044 #ifdef HAS_ENDPROTOENT
5045 PerlSock_endprotoent();
5047 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5051 #ifdef HAS_ENDSERVENT
5052 PerlSock_endservent();
5054 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5058 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5061 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5065 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5068 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5072 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5075 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5079 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5082 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5094 I32 which = PL_op->op_type;
5096 struct passwd *pwent = NULL;
5098 * We currently support only the SysV getsp* shadow password interface.
5099 * The interface is declared in <shadow.h> and often one needs to link
5100 * with -lsecurity or some such.
5101 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5104 * AIX getpwnam() is clever enough to return the encrypted password
5105 * only if the caller (euid?) is root.
5107 * There are at least three other shadow password APIs. Many platforms
5108 * seem to contain more than one interface for accessing the shadow
5109 * password databases, possibly for compatibility reasons.
5110 * The getsp*() is by far he simplest one, the other two interfaces
5111 * are much more complicated, but also very similar to each other.
5116 * struct pr_passwd *getprpw*();
5117 * The password is in
5118 * char getprpw*(...).ufld.fd_encrypt[]
5119 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5124 * struct es_passwd *getespw*();
5125 * The password is in
5126 * char *(getespw*(...).ufld.fd_encrypt)
5127 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5130 * struct userpw *getuserpw();
5131 * The password is in
5132 * char *(getuserpw(...)).spw_upw_passwd
5133 * (but the de facto standard getpwnam() should work okay)
5135 * Mention I_PROT here so that Configure probes for it.
5137 * In HP-UX for getprpw*() the manual page claims that one should include
5138 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5139 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5140 * and pp_sys.c already includes <shadow.h> if there is such.
5142 * Note that <sys/security.h> is already probed for, but currently
5143 * it is only included in special cases.
5145 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5146 * be preferred interface, even though also the getprpw*() interface
5147 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5148 * One also needs to call set_auth_parameters() in main() before
5149 * doing anything else, whether one is using getespw*() or getprpw*().
5151 * Note that accessing the shadow databases can be magnitudes
5152 * slower than accessing the standard databases.
5157 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5158 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5159 * the pw_comment is left uninitialized. */
5160 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5166 const char* const name = POPpbytex;
5167 pwent = getpwnam(name);
5173 pwent = getpwuid(uid);
5177 # ifdef HAS_GETPWENT
5179 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5180 if (pwent) pwent = getpwnam(pwent->pw_name);
5183 DIE(aTHX_ PL_no_func, "getpwent");
5189 if (GIMME != G_ARRAY) {
5190 PUSHs(sv = sv_newmortal());
5192 if (which == OP_GPWNAM)
5193 # if Uid_t_sign <= 0
5194 sv_setiv(sv, (IV)pwent->pw_uid);
5196 sv_setuv(sv, (UV)pwent->pw_uid);
5199 sv_setpv(sv, pwent->pw_name);
5205 mPUSHs(newSVpv(pwent->pw_name, 0));
5209 /* If we have getspnam(), we try to dig up the shadow
5210 * password. If we are underprivileged, the shadow
5211 * interface will set the errno to EACCES or similar,
5212 * and return a null pointer. If this happens, we will
5213 * use the dummy password (usually "*" or "x") from the
5214 * standard password database.
5216 * In theory we could skip the shadow call completely
5217 * if euid != 0 but in practice we cannot know which
5218 * security measures are guarding the shadow databases
5219 * on a random platform.
5221 * Resist the urge to use additional shadow interfaces.
5222 * Divert the urge to writing an extension instead.
5225 /* Some AIX setups falsely(?) detect some getspnam(), which
5226 * has a different API than the Solaris/IRIX one. */
5227 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5230 const struct spwd * const spwent = getspnam(pwent->pw_name);
5231 /* Save and restore errno so that
5232 * underprivileged attempts seem
5233 * to have never made the unsuccessful
5234 * attempt to retrieve the shadow password. */
5236 if (spwent && spwent->sp_pwdp)
5237 sv_setpv(sv, spwent->sp_pwdp);
5241 if (!SvPOK(sv)) /* Use the standard password, then. */
5242 sv_setpv(sv, pwent->pw_passwd);
5245 # ifndef INCOMPLETE_TAINTS
5246 /* passwd is tainted because user himself can diddle with it.
5247 * admittedly not much and in a very limited way, but nevertheless. */
5251 # if Uid_t_sign <= 0
5252 mPUSHi(pwent->pw_uid);
5254 mPUSHu(pwent->pw_uid);
5257 # if Uid_t_sign <= 0
5258 mPUSHi(pwent->pw_gid);
5260 mPUSHu(pwent->pw_gid);
5262 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5263 * because of the poor interface of the Perl getpw*(),
5264 * not because there's some standard/convention saying so.
5265 * A better interface would have been to return a hash,
5266 * but we are accursed by our history, alas. --jhi. */
5268 mPUSHi(pwent->pw_change);
5271 mPUSHi(pwent->pw_quota);
5274 mPUSHs(newSVpv(pwent->pw_age, 0));
5276 /* I think that you can never get this compiled, but just in case. */
5277 PUSHs(sv_mortalcopy(&PL_sv_no));
5282 /* pw_class and pw_comment are mutually exclusive--.
5283 * see the above note for pw_change, pw_quota, and pw_age. */
5285 mPUSHs(newSVpv(pwent->pw_class, 0));
5288 mPUSHs(newSVpv(pwent->pw_comment, 0));
5290 /* I think that you can never get this compiled, but just in case. */
5291 PUSHs(sv_mortalcopy(&PL_sv_no));
5296 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5298 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5300 # ifndef INCOMPLETE_TAINTS
5301 /* pw_gecos is tainted because user himself can diddle with it. */
5305 mPUSHs(newSVpv(pwent->pw_dir, 0));
5307 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5308 # ifndef INCOMPLETE_TAINTS
5309 /* pw_shell is tainted because user himself can diddle with it. */
5314 mPUSHi(pwent->pw_expire);
5319 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5327 const I32 which = PL_op->op_type;
5328 const struct group *grent;
5330 if (which == OP_GGRNAM) {
5331 const char* const name = POPpbytex;
5332 grent = (const struct group *)getgrnam(name);
5334 else if (which == OP_GGRGID) {
5335 const Gid_t gid = POPi;
5336 grent = (const struct group *)getgrgid(gid);
5340 grent = (struct group *)getgrent();
5342 DIE(aTHX_ PL_no_func, "getgrent");
5346 if (GIMME != G_ARRAY) {
5347 SV * const sv = sv_newmortal();
5351 if (which == OP_GGRNAM)
5353 sv_setiv(sv, (IV)grent->gr_gid);
5355 sv_setuv(sv, (UV)grent->gr_gid);
5358 sv_setpv(sv, grent->gr_name);
5364 mPUSHs(newSVpv(grent->gr_name, 0));
5367 mPUSHs(newSVpv(grent->gr_passwd, 0));
5369 PUSHs(sv_mortalcopy(&PL_sv_no));
5373 mPUSHi(grent->gr_gid);
5375 mPUSHu(grent->gr_gid);
5378 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5379 /* In UNICOS/mk (_CRAYMPP) the multithreading
5380 * versions (getgrnam_r, getgrgid_r)
5381 * seem to return an illegal pointer
5382 * as the group members list, gr_mem.
5383 * getgrent() doesn't even have a _r version
5384 * but the gr_mem is poisonous anyway.
5385 * So yes, you cannot get the list of group
5386 * members if building multithreaded in UNICOS/mk. */
5387 PUSHs(space_join_names_mortal(grent->gr_mem));
5393 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5403 if (!(tmps = PerlProc_getlogin()))
5405 sv_setpv_mg(TARG, tmps);
5409 DIE(aTHX_ PL_no_func, "getlogin");
5413 /* Miscellaneous. */
5418 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5419 I32 items = SP - MARK;
5420 unsigned long a[20];
5425 while (++MARK <= SP) {
5426 if (SvTAINTED(*MARK)) {
5432 TAINT_PROPER("syscall");
5435 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5436 * or where sizeof(long) != sizeof(char*). But such machines will
5437 * not likely have syscall implemented either, so who cares?
5439 while (++MARK <= SP) {
5440 if (SvNIOK(*MARK) || !i)
5441 a[i++] = SvIV(*MARK);
5442 else if (*MARK == &PL_sv_undef)
5445 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5451 DIE(aTHX_ "Too many args to syscall");
5453 DIE(aTHX_ "Too few args to syscall");
5455 retval = syscall(a[0]);
5458 retval = syscall(a[0],a[1]);
5461 retval = syscall(a[0],a[1],a[2]);
5464 retval = syscall(a[0],a[1],a[2],a[3]);
5467 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5470 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5473 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5476 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5483 DIE(aTHX_ PL_no_func, "syscall");
5487 #ifdef FCNTL_EMULATE_FLOCK
5489 /* XXX Emulate flock() with fcntl().
5490 What's really needed is a good file locking module.
5494 fcntl_emulate_flock(int fd, int operation)
5499 switch (operation & ~LOCK_NB) {
5501 flock.l_type = F_RDLCK;
5504 flock.l_type = F_WRLCK;
5507 flock.l_type = F_UNLCK;
5513 flock.l_whence = SEEK_SET;
5514 flock.l_start = flock.l_len = (Off_t)0;
5516 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5517 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5518 errno = EWOULDBLOCK;
5522 #endif /* FCNTL_EMULATE_FLOCK */
5524 #ifdef LOCKF_EMULATE_FLOCK
5526 /* XXX Emulate flock() with lockf(). This is just to increase
5527 portability of scripts. The calls are not completely
5528 interchangeable. What's really needed is a good file
5532 /* The lockf() constants might have been defined in <unistd.h>.
5533 Unfortunately, <unistd.h> causes troubles on some mixed
5534 (BSD/POSIX) systems, such as SunOS 4.1.3.
5536 Further, the lockf() constants aren't POSIX, so they might not be
5537 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5538 just stick in the SVID values and be done with it. Sigh.
5542 # define F_ULOCK 0 /* Unlock a previously locked region */
5545 # define F_LOCK 1 /* Lock a region for exclusive use */
5548 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5551 # define F_TEST 3 /* Test a region for other processes locks */
5555 lockf_emulate_flock(int fd, int operation)
5561 /* flock locks entire file so for lockf we need to do the same */
5562 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5563 if (pos > 0) /* is seekable and needs to be repositioned */
5564 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5565 pos = -1; /* seek failed, so don't seek back afterwards */
5568 switch (operation) {
5570 /* LOCK_SH - get a shared lock */
5572 /* LOCK_EX - get an exclusive lock */
5574 i = lockf (fd, F_LOCK, 0);
5577 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5578 case LOCK_SH|LOCK_NB:
5579 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5580 case LOCK_EX|LOCK_NB:
5581 i = lockf (fd, F_TLOCK, 0);
5583 if ((errno == EAGAIN) || (errno == EACCES))
5584 errno = EWOULDBLOCK;
5587 /* LOCK_UN - unlock (non-blocking is a no-op) */
5589 case LOCK_UN|LOCK_NB:
5590 i = lockf (fd, F_ULOCK, 0);
5593 /* Default - can't decipher operation */
5600 if (pos > 0) /* need to restore position of the handle */
5601 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5606 #endif /* LOCKF_EMULATE_FLOCK */
5610 * c-indentation-style: bsd
5612 * indent-tabs-mode: nil
5615 * ex: set ts=8 sts=4 sw=4 et: