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)) {
864 methname = "TIEHASH";
865 HvEITER_set(MUTABLE_HV(varsv), 0);
868 methname = "TIEARRAY";
869 if (!AvREAL(varsv)) {
871 Perl_croak(aTHX_ "Cannot tie unreifiable array");
872 av_clear((AV *)varsv);
879 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
880 methname = "TIEHANDLE";
881 how = PERL_MAGIC_tiedscalar;
882 /* For tied filehandles, we apply tiedscalar magic to the IO
883 slot of the GP rather than the GV itself. AMS 20010812 */
885 GvIOp(varsv) = newIO();
886 varsv = MUTABLE_SV(GvIOp(varsv));
891 methname = "TIESCALAR";
892 how = PERL_MAGIC_tiedscalar;
896 if (sv_isobject(*MARK)) { /* Calls GET magic. */
897 ENTER_with_name("call_TIE");
898 PUSHSTACKi(PERLSI_MAGIC);
900 EXTEND(SP,(I32)items);
904 call_method(methname, G_SCALAR);
907 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
908 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
909 * wrong error message, and worse case, supreme action at a distance.
910 * (Sorry obfuscation writers. You're not going to be given this one.)
912 stash = gv_stashsv(*MARK, 0);
913 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
914 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
915 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
917 ENTER_with_name("call_TIE");
918 PUSHSTACKi(PERLSI_MAGIC);
920 EXTEND(SP,(I32)items);
924 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
930 if (sv_isobject(sv)) {
931 sv_unmagic(varsv, how);
932 /* Croak if a self-tie on an aggregate is attempted. */
933 if (varsv == SvRV(sv) &&
934 (SvTYPE(varsv) == SVt_PVAV ||
935 SvTYPE(varsv) == SVt_PVHV))
937 "Self-ties of arrays and hashes are not supported");
938 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
940 LEAVE_with_name("call_TIE");
941 SP = PL_stack_base + markoff;
951 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
952 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
954 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
957 if ((mg = SvTIED_mg(sv, how))) {
958 SV * const obj = SvRV(SvTIED_obj(sv, mg));
960 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
962 if (gv && isGV(gv) && (cv = GvCV(gv))) {
964 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
965 mXPUSHi(SvREFCNT(obj) - 1);
967 ENTER_with_name("call_UNTIE");
968 call_sv(MUTABLE_SV(cv), G_VOID);
969 LEAVE_with_name("call_UNTIE");
972 else if (mg && SvREFCNT(obj) > 1) {
973 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
974 "untie attempted while %"UVuf" inner references still exist",
975 (UV)SvREFCNT(obj) - 1 ) ;
979 sv_unmagic(sv, how) ;
989 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
990 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
992 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
995 if ((mg = SvTIED_mg(sv, how))) {
996 PUSHs(SvTIED_obj(sv, mg));
1009 HV * const hv = MUTABLE_HV(POPs);
1010 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1011 stash = gv_stashsv(sv, 0);
1012 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1014 require_pv("AnyDBM_File.pm");
1016 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1017 DIE(aTHX_ "No dbm on this machine");
1027 mPUSHu(O_RDWR|O_CREAT);
1031 if (!SvOK(right)) right = &PL_sv_no;
1035 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1038 if (!sv_isobject(TOPs)) {
1046 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1050 if (sv_isobject(TOPs)) {
1051 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1052 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1069 struct timeval timebuf;
1070 struct timeval *tbuf = &timebuf;
1073 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1078 # if BYTEORDER & 0xf0000
1079 # define ORDERBYTE (0x88888888 - BYTEORDER)
1081 # define ORDERBYTE (0x4444 - BYTEORDER)
1087 for (i = 1; i <= 3; i++) {
1088 SV * const sv = SP[i];
1092 if (SvREADONLY(sv)) {
1094 sv_force_normal_flags(sv, 0);
1095 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1096 Perl_croak_no_modify(aTHX);
1100 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1101 "Non-string passed as bitmask");
1102 SvPV_force_nomg_nolen(sv); /* force string conversion */
1109 /* little endians can use vecs directly */
1110 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1117 masksize = NFDBITS / NBBY;
1119 masksize = sizeof(long); /* documented int, everyone seems to use long */
1121 Zero(&fd_sets[0], 4, char*);
1124 # if SELECT_MIN_BITS == 1
1125 growsize = sizeof(fd_set);
1127 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1128 # undef SELECT_MIN_BITS
1129 # define SELECT_MIN_BITS __FD_SETSIZE
1131 /* If SELECT_MIN_BITS is greater than one we most probably will want
1132 * to align the sizes with SELECT_MIN_BITS/8 because for example
1133 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1134 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1135 * on (sets/tests/clears bits) is 32 bits. */
1136 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1144 timebuf.tv_sec = (long)value;
1145 value -= (NV)timebuf.tv_sec;
1146 timebuf.tv_usec = (long)(value * 1000000.0);
1151 for (i = 1; i <= 3; i++) {
1153 if (!SvOK(sv) || SvCUR(sv) == 0) {
1160 Sv_Grow(sv, growsize);
1164 while (++j <= growsize) {
1168 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1170 Newx(fd_sets[i], growsize, char);
1171 for (offset = 0; offset < growsize; offset += masksize) {
1172 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1173 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1176 fd_sets[i] = SvPVX(sv);
1180 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1181 /* Can't make just the (void*) conditional because that would be
1182 * cpp #if within cpp macro, and not all compilers like that. */
1183 nfound = PerlSock_select(
1185 (Select_fd_set_t) fd_sets[1],
1186 (Select_fd_set_t) fd_sets[2],
1187 (Select_fd_set_t) fd_sets[3],
1188 (void*) tbuf); /* Workaround for compiler bug. */
1190 nfound = PerlSock_select(
1192 (Select_fd_set_t) fd_sets[1],
1193 (Select_fd_set_t) fd_sets[2],
1194 (Select_fd_set_t) fd_sets[3],
1197 for (i = 1; i <= 3; i++) {
1200 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1202 for (offset = 0; offset < growsize; offset += masksize) {
1203 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1204 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1206 Safefree(fd_sets[i]);
1213 if (GIMME == G_ARRAY && tbuf) {
1214 value = (NV)(timebuf.tv_sec) +
1215 (NV)(timebuf.tv_usec) / 1000000.0;
1220 DIE(aTHX_ "select not implemented");
1225 =for apidoc setdefout
1227 Sets PL_defoutgv, the default file handle for output, to the passed in
1228 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1229 count of the passed in typeglob is increased by one, and the reference count
1230 of the typeglob that PL_defoutgv points to is decreased by one.
1236 Perl_setdefout(pTHX_ GV *gv)
1239 PERL_ARGS_ASSERT_SETDEFOUT;
1240 SvREFCNT_inc_simple_void_NN(gv);
1241 SvREFCNT_dec(PL_defoutgv);
1249 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1250 GV * egv = GvEGVx(PL_defoutgv);
1255 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1256 gvp = hv && HvENAME(hv)
1257 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1259 if (gvp && *gvp == egv) {
1260 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1264 mXPUSHs(newRV(MUTABLE_SV(egv)));
1268 if (!GvIO(newdefout))
1269 gv_IOadd(newdefout);
1270 setdefout(newdefout);
1280 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1281 IO *const io = GvIO(gv);
1287 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1289 const U32 gimme = GIMME_V;
1290 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1291 if (gimme == G_SCALAR) {
1293 SvSetMagicSV_nosteal(TARG, TOPs);
1298 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1299 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1301 SETERRNO(EBADF,RMS_IFI);
1305 sv_setpvs(TARG, " ");
1306 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1307 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1308 /* Find out how many bytes the char needs */
1309 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1312 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1313 SvCUR_set(TARG,1+len);
1322 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1325 register PERL_CONTEXT *cx;
1326 const I32 gimme = GIMME_V;
1328 PERL_ARGS_ASSERT_DOFORM;
1330 if (cv && CvCLONE(cv))
1331 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1336 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1337 PUSHFORMAT(cx, retop);
1339 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1341 setdefout(gv); /* locally select filehandle so $% et al work */
1360 gv = MUTABLE_GV(POPs);
1377 tmpsv = sv_newmortal();
1378 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1379 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1381 IoFLAGS(io) &= ~IOf_DIDTOP;
1382 RETURNOP(doform(cv,gv,PL_op->op_next));
1388 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1389 register IO * const io = GvIOp(gv);
1394 register PERL_CONTEXT *cx;
1397 /* I'm not sure why, but executing the format leaves an extra value on the
1398 * stack. There's probably a better place to be handling this (probably
1399 * by avoiding pushing it in the first place!) but I don't quite know
1400 * where to look. -doy */
1403 if (!io || !(ofp = IoOFP(io)))
1406 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1407 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1409 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1410 PL_formtarget != PL_toptarget)
1414 if (!IoTOP_GV(io)) {
1417 if (!IoTOP_NAME(io)) {
1419 if (!IoFMT_NAME(io))
1420 IoFMT_NAME(io) = savepv(GvNAME(gv));
1421 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1422 HEKfARG(GvNAME_HEK(gv))));
1423 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1424 if ((topgv && GvFORM(topgv)) ||
1425 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1426 IoTOP_NAME(io) = savesvpv(topname);
1428 IoTOP_NAME(io) = savepvs("top");
1430 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1431 if (!topgv || !GvFORM(topgv)) {
1432 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1435 IoTOP_GV(io) = topgv;
1437 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1438 I32 lines = IoLINES_LEFT(io);
1439 const char *s = SvPVX_const(PL_formtarget);
1440 if (lines <= 0) /* Yow, header didn't even fit!!! */
1442 while (lines-- > 0) {
1443 s = strchr(s, '\n');
1449 const STRLEN save = SvCUR(PL_formtarget);
1450 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1451 do_print(PL_formtarget, ofp);
1452 SvCUR_set(PL_formtarget, save);
1453 sv_chop(PL_formtarget, s);
1454 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1457 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1458 do_print(PL_formfeed, ofp);
1459 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1461 PL_formtarget = PL_toptarget;
1462 IoFLAGS(io) |= IOf_DIDTOP;
1465 DIE(aTHX_ "bad top format reference");
1468 SV * const sv = sv_newmortal();
1469 gv_efullname4(sv, fgv, NULL, FALSE);
1470 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1472 RETURNOP(doform(cv, gv, PL_op));
1476 POPBLOCK(cx,PL_curpm);
1478 retop = cx->blk_sub.retop;
1484 report_wrongway_fh(gv, '<');
1490 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1491 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1493 if (!do_print(PL_formtarget, fp))
1496 FmLINES(PL_formtarget) = 0;
1497 SvCUR_set(PL_formtarget, 0);
1498 *SvEND(PL_formtarget) = '\0';
1499 if (IoFLAGS(io) & IOf_FLUSH)
1500 (void)PerlIO_flush(fp);
1505 PL_formtarget = PL_bodytarget;
1506 PERL_UNUSED_VAR(newsp);
1507 PERL_UNUSED_VAR(gimme);
1513 dVAR; dSP; dMARK; dORIGMARK;
1518 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1519 IO *const io = GvIO(gv);
1522 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1524 if (MARK == ORIGMARK) {
1527 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1530 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1532 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1540 SETERRNO(EBADF,RMS_IFI);
1543 else if (!(fp = IoOFP(io))) {
1545 report_wrongway_fh(gv, '<');
1546 else if (ckWARN(WARN_CLOSED))
1548 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1552 do_sprintf(sv, SP - MARK, MARK + 1);
1553 if (!do_print(sv, fp))
1556 if (IoFLAGS(io) & IOf_FLUSH)
1557 if (PerlIO_flush(fp) == EOF)
1568 PUSHs(&PL_sv_undef);
1576 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1577 const int mode = POPi;
1578 SV * const sv = POPs;
1579 GV * const gv = MUTABLE_GV(POPs);
1582 /* Need TIEHANDLE method ? */
1583 const char * const tmps = SvPV_const(sv, len);
1584 /* FIXME? do_open should do const */
1585 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1586 IoLINES(GvIOp(gv)) = 0;
1590 PUSHs(&PL_sv_undef);
1597 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1611 bool charstart = FALSE;
1612 STRLEN charskip = 0;
1615 GV * const gv = MUTABLE_GV(*++MARK);
1616 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1617 && gv && (io = GvIO(gv)) )
1619 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1621 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1622 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1631 sv_setpvs(bufsv, "");
1632 length = SvIVx(*++MARK);
1635 offset = SvIVx(*++MARK);
1639 if (!io || !IoIFP(io)) {
1641 SETERRNO(EBADF,RMS_IFI);
1644 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1645 buffer = SvPVutf8_force(bufsv, blen);
1646 /* UTF-8 may not have been set if they are all low bytes */
1651 buffer = SvPV_force(bufsv, blen);
1652 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1655 DIE(aTHX_ "Negative length");
1663 if (PL_op->op_type == OP_RECV) {
1664 Sock_size_t bufsize;
1665 char namebuf[MAXPATHLEN];
1666 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1667 bufsize = sizeof (struct sockaddr_in);
1669 bufsize = sizeof namebuf;
1671 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1675 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1676 /* 'offset' means 'flags' here */
1677 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1678 (struct sockaddr *)namebuf, &bufsize);
1681 /* MSG_TRUNC can give oversized count; quietly lose it */
1685 /* Bogus return without padding */
1686 bufsize = sizeof (struct sockaddr_in);
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);
1703 if (DO_UTF8(bufsv)) {
1704 /* offset adjust in characters not bytes */
1705 blen = sv_len_utf8(bufsv);
1708 if (-offset > (SSize_t)blen)
1709 DIE(aTHX_ "Offset outside string");
1712 if (DO_UTF8(bufsv)) {
1713 /* convert offset-as-chars to offset-as-bytes */
1714 if (offset >= (int)blen)
1715 offset += SvCUR(bufsv) - blen;
1717 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1720 orig_size = SvCUR(bufsv);
1721 /* Allocating length + offset + 1 isn't perfect in the case of reading
1722 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1724 (should be 2 * length + offset + 1, or possibly something longer if
1725 PL_encoding is true) */
1726 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1727 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1728 Zero(buffer+orig_size, offset-orig_size, char);
1730 buffer = buffer + offset;
1732 read_target = bufsv;
1734 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1735 concatenate it to the current buffer. */
1737 /* Truncate the existing buffer to the start of where we will be
1739 SvCUR_set(bufsv, offset);
1741 read_target = sv_newmortal();
1742 SvUPGRADE(read_target, SVt_PV);
1743 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1746 if (PL_op->op_type == OP_SYSREAD) {
1747 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1748 if (IoTYPE(io) == IoTYPE_SOCKET) {
1749 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1755 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1760 #ifdef HAS_SOCKET__bad_code_maybe
1761 if (IoTYPE(io) == IoTYPE_SOCKET) {
1762 Sock_size_t bufsize;
1763 char namebuf[MAXPATHLEN];
1764 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1765 bufsize = sizeof (struct sockaddr_in);
1767 bufsize = sizeof namebuf;
1769 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1770 (struct sockaddr *)namebuf, &bufsize);
1775 count = PerlIO_read(IoIFP(io), buffer, length);
1776 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1777 if (count == 0 && PerlIO_error(IoIFP(io)))
1781 if (IoTYPE(io) == IoTYPE_WRONLY)
1782 report_wrongway_fh(gv, '>');
1785 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1786 *SvEND(read_target) = '\0';
1787 (void)SvPOK_only(read_target);
1788 if (fp_utf8 && !IN_BYTES) {
1789 /* Look at utf8 we got back and count the characters */
1790 const char *bend = buffer + count;
1791 while (buffer < bend) {
1793 skip = UTF8SKIP(buffer);
1796 if (buffer - charskip + skip > bend) {
1797 /* partial character - try for rest of it */
1798 length = skip - (bend-buffer);
1799 offset = bend - SvPVX_const(bufsv);
1811 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1812 provided amount read (count) was what was requested (length)
1814 if (got < wanted && count == length) {
1815 length = wanted - got;
1816 offset = bend - SvPVX_const(bufsv);
1819 /* return value is character count */
1823 else if (buffer_utf8) {
1824 /* Let svcatsv upgrade the bytes we read in to utf8.
1825 The buffer is a mortal so will be freed soon. */
1826 sv_catsv_nomg(bufsv, read_target);
1829 /* This should not be marked tainted if the fp is marked clean */
1830 if (!(IoFLAGS(io) & IOf_UNTAINT))
1831 SvTAINTED_on(bufsv);
1843 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1848 STRLEN orig_blen_bytes;
1849 const int op_type = PL_op->op_type;
1852 GV *const gv = MUTABLE_GV(*++MARK);
1853 IO *const io = GvIO(gv);
1855 if (op_type == OP_SYSWRITE && io) {
1856 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1858 if (MARK == SP - 1) {
1860 mXPUSHi(sv_len(sv));
1864 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1865 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1875 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1877 if (io && IoIFP(io))
1878 report_wrongway_fh(gv, '<');
1881 SETERRNO(EBADF,RMS_IFI);
1885 /* Do this first to trigger any overloading. */
1886 buffer = SvPV_const(bufsv, blen);
1887 orig_blen_bytes = blen;
1888 doing_utf8 = DO_UTF8(bufsv);
1890 if (PerlIO_isutf8(IoIFP(io))) {
1891 if (!SvUTF8(bufsv)) {
1892 /* We don't modify the original scalar. */
1893 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1894 buffer = (char *) tmpbuf;
1898 else if (doing_utf8) {
1899 STRLEN tmplen = blen;
1900 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1903 buffer = (char *) tmpbuf;
1907 assert((char *)result == buffer);
1908 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1913 if (op_type == OP_SEND) {
1914 const int flags = SvIVx(*++MARK);
1917 char * const sockbuf = SvPVx(*++MARK, mlen);
1918 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1919 flags, (struct sockaddr *)sockbuf, mlen);
1923 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1929 Size_t length = 0; /* This length is in characters. */
1935 /* The SV is bytes, and we've had to upgrade it. */
1936 blen_chars = orig_blen_bytes;
1938 /* The SV really is UTF-8. */
1939 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1940 /* Don't call sv_len_utf8 again because it will call magic
1941 or overloading a second time, and we might get back a
1942 different result. */
1943 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1945 /* It's safe, and it may well be cached. */
1946 blen_chars = sv_len_utf8(bufsv);
1954 length = blen_chars;
1956 #if Size_t_size > IVSIZE
1957 length = (Size_t)SvNVx(*++MARK);
1959 length = (Size_t)SvIVx(*++MARK);
1961 if ((SSize_t)length < 0) {
1963 DIE(aTHX_ "Negative length");
1968 offset = SvIVx(*++MARK);
1970 if (-offset > (IV)blen_chars) {
1972 DIE(aTHX_ "Offset outside string");
1974 offset += blen_chars;
1975 } else if (offset > (IV)blen_chars) {
1977 DIE(aTHX_ "Offset outside string");
1981 if (length > blen_chars - offset)
1982 length = blen_chars - offset;
1984 /* Here we convert length from characters to bytes. */
1985 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1986 /* Either we had to convert the SV, or the SV is magical, or
1987 the SV has overloading, in which case we can't or mustn't
1988 or mustn't call it again. */
1990 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1991 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1993 /* It's a real UTF-8 SV, and it's not going to change under
1994 us. Take advantage of any cache. */
1996 I32 len_I32 = length;
1998 /* Convert the start and end character positions to bytes.
1999 Remember that the second argument to sv_pos_u2b is relative
2001 sv_pos_u2b(bufsv, &start, &len_I32);
2008 buffer = buffer+offset;
2010 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2011 if (IoTYPE(io) == IoTYPE_SOCKET) {
2012 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2018 /* See the note at doio.c:do_print about filesize limits. --jhi */
2019 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2028 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2031 #if Size_t_size > IVSIZE
2051 * in Perl 5.12 and later, the additional parameter is a bitmask:
2054 * 2 = eof() <- ARGV magic
2056 * I'll rely on the compiler's trace flow analysis to decide whether to
2057 * actually assign this out here, or punt it into the only block where it is
2058 * used. Doing it out here is DRY on the condition logic.
2063 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2069 if (PL_op->op_flags & OPf_SPECIAL) {
2070 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2074 gv = PL_last_in_gv; /* eof */
2082 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2083 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2086 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2087 if (io && !IoIFP(io)) {
2088 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2090 IoFLAGS(io) &= ~IOf_START;
2091 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2093 sv_setpvs(GvSV(gv), "-");
2095 GvSV(gv) = newSVpvs("-");
2096 SvSETMAGIC(GvSV(gv));
2098 else if (!nextargv(gv))
2103 PUSHs(boolSV(do_eof(gv)));
2113 if (MAXARG != 0 && (TOPs || POPs))
2114 PL_last_in_gv = MUTABLE_GV(POPs);
2121 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2123 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2128 SETERRNO(EBADF,RMS_IFI);
2133 #if LSEEKSIZE > IVSIZE
2134 PUSHn( do_tell(gv) );
2136 PUSHi( do_tell(gv) );
2144 const int whence = POPi;
2145 #if LSEEKSIZE > IVSIZE
2146 const Off_t offset = (Off_t)SvNVx(POPs);
2148 const Off_t offset = (Off_t)SvIVx(POPs);
2151 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2152 IO *const io = GvIO(gv);
2155 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2157 #if LSEEKSIZE > IVSIZE
2158 SV *const offset_sv = newSVnv((NV) offset);
2160 SV *const offset_sv = newSViv(offset);
2163 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2168 if (PL_op->op_type == OP_SEEK)
2169 PUSHs(boolSV(do_seek(gv, offset, whence)));
2171 const Off_t sought = do_sysseek(gv, offset, whence);
2173 PUSHs(&PL_sv_undef);
2175 SV* const sv = sought ?
2176 #if LSEEKSIZE > IVSIZE
2181 : newSVpvn(zero_but_true, ZBTLEN);
2192 /* There seems to be no consensus on the length type of truncate()
2193 * and ftruncate(), both off_t and size_t have supporters. In
2194 * general one would think that when using large files, off_t is
2195 * at least as wide as size_t, so using an off_t should be okay. */
2196 /* XXX Configure probe for the length type of *truncate() needed XXX */
2199 #if Off_t_size > IVSIZE
2204 /* Checking for length < 0 is problematic as the type might or
2205 * might not be signed: if it is not, clever compilers will moan. */
2206 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2209 SV * const sv = POPs;
2214 if ((tmpgv = PL_op->op_flags & OPf_SPECIAL
2215 ? gv_fetchsv(sv, 0, SVt_PVIO)
2216 : MAYBE_DEREF_GV(sv) )) {
2223 TAINT_PROPER("truncate");
2224 if (!(fp = IoIFP(io))) {
2230 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2232 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2238 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2239 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2240 goto do_ftruncate_io;
2243 const char * const name = SvPV_nomg_const_nolen(sv);
2244 TAINT_PROPER("truncate");
2246 if (truncate(name, len) < 0)
2250 const int tmpfd = PerlLIO_open(name, O_RDWR);
2255 if (my_chsize(tmpfd, len) < 0)
2257 PerlLIO_close(tmpfd);
2266 SETERRNO(EBADF,RMS_IFI);
2274 SV * const argsv = POPs;
2275 const unsigned int func = POPu;
2276 const int optype = PL_op->op_type;
2277 GV * const gv = MUTABLE_GV(POPs);
2278 IO * const io = gv ? GvIOn(gv) : NULL;
2282 if (!io || !argsv || !IoIFP(io)) {
2284 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2288 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2291 s = SvPV_force(argsv, len);
2292 need = IOCPARM_LEN(func);
2294 s = Sv_Grow(argsv, need + 1);
2295 SvCUR_set(argsv, need);
2298 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2301 retval = SvIV(argsv);
2302 s = INT2PTR(char*,retval); /* ouch */
2305 TAINT_PROPER(PL_op_desc[optype]);
2307 if (optype == OP_IOCTL)
2309 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2311 DIE(aTHX_ "ioctl is not implemented");
2315 DIE(aTHX_ "fcntl is not implemented");
2317 #if defined(OS2) && defined(__EMX__)
2318 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2320 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2324 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2326 if (s[SvCUR(argsv)] != 17)
2327 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2329 s[SvCUR(argsv)] = 0; /* put our null back */
2330 SvSETMAGIC(argsv); /* Assume it has changed */
2339 PUSHp(zero_but_true, ZBTLEN);
2350 const int argtype = POPi;
2351 GV * const gv = MUTABLE_GV(POPs);
2352 IO *const io = GvIO(gv);
2353 PerlIO *const fp = io ? IoIFP(io) : NULL;
2355 /* XXX Looks to me like io is always NULL at this point */
2357 (void)PerlIO_flush(fp);
2358 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2363 SETERRNO(EBADF,RMS_IFI);
2368 DIE(aTHX_ PL_no_func, "flock()");
2379 const int protocol = POPi;
2380 const int type = POPi;
2381 const int domain = POPi;
2382 GV * const gv = MUTABLE_GV(POPs);
2383 register IO * const io = gv ? GvIOn(gv) : NULL;
2388 if (io && IoIFP(io))
2389 do_close(gv, FALSE);
2390 SETERRNO(EBADF,LIB_INVARG);
2395 do_close(gv, FALSE);
2397 TAINT_PROPER("socket");
2398 fd = PerlSock_socket(domain, type, protocol);
2401 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2402 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2403 IoTYPE(io) = IoTYPE_SOCKET;
2404 if (!IoIFP(io) || !IoOFP(io)) {
2405 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2406 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2407 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2410 #if defined(HAS_FCNTL) && defined(F_SETFD)
2411 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2415 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2424 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2426 const int protocol = POPi;
2427 const int type = POPi;
2428 const int domain = POPi;
2429 GV * const gv2 = MUTABLE_GV(POPs);
2430 GV * const gv1 = MUTABLE_GV(POPs);
2431 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2432 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2436 report_evil_fh(gv1);
2438 report_evil_fh(gv2);
2440 if (io1 && IoIFP(io1))
2441 do_close(gv1, FALSE);
2442 if (io2 && IoIFP(io2))
2443 do_close(gv2, FALSE);
2448 TAINT_PROPER("socketpair");
2449 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2451 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2452 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2453 IoTYPE(io1) = IoTYPE_SOCKET;
2454 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2455 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2456 IoTYPE(io2) = IoTYPE_SOCKET;
2457 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2458 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2459 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2460 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2461 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2462 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2463 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2466 #if defined(HAS_FCNTL) && defined(F_SETFD)
2467 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2468 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2473 DIE(aTHX_ PL_no_sock_func, "socketpair");
2482 SV * const addrsv = POPs;
2483 /* OK, so on what platform does bind modify addr? */
2485 GV * const gv = MUTABLE_GV(POPs);
2486 register IO * const io = GvIOn(gv);
2488 const int op_type = PL_op->op_type;
2490 if (!io || !IoIFP(io))
2493 addr = SvPV_const(addrsv, len);
2494 TAINT_PROPER(PL_op_desc[op_type]);
2495 if ((op_type == OP_BIND
2496 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2497 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2505 SETERRNO(EBADF,SS_IVCHAN);
2512 const int backlog = POPi;
2513 GV * const gv = MUTABLE_GV(POPs);
2514 register IO * const io = gv ? GvIOn(gv) : NULL;
2516 if (!io || !IoIFP(io))
2519 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2526 SETERRNO(EBADF,SS_IVCHAN);
2535 char namebuf[MAXPATHLEN];
2536 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2537 Sock_size_t len = sizeof (struct sockaddr_in);
2539 Sock_size_t len = sizeof namebuf;
2541 GV * const ggv = MUTABLE_GV(POPs);
2542 GV * const ngv = MUTABLE_GV(POPs);
2551 if (!gstio || !IoIFP(gstio))
2555 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2558 /* Some platforms indicate zero length when an AF_UNIX client is
2559 * not bound. Simulate a non-zero-length sockaddr structure in
2561 namebuf[0] = 0; /* sun_len */
2562 namebuf[1] = AF_UNIX; /* sun_family */
2570 do_close(ngv, FALSE);
2571 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2572 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2573 IoTYPE(nstio) = IoTYPE_SOCKET;
2574 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2575 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2576 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2577 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2580 #if defined(HAS_FCNTL) && defined(F_SETFD)
2581 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2585 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2586 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2588 #ifdef __SCO_VERSION__
2589 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2592 PUSHp(namebuf, len);
2596 report_evil_fh(ggv);
2597 SETERRNO(EBADF,SS_IVCHAN);
2607 const int how = POPi;
2608 GV * const gv = MUTABLE_GV(POPs);
2609 register IO * const io = GvIOn(gv);
2611 if (!io || !IoIFP(io))
2614 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2619 SETERRNO(EBADF,SS_IVCHAN);
2626 const int optype = PL_op->op_type;
2627 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2628 const unsigned int optname = (unsigned int) POPi;
2629 const unsigned int lvl = (unsigned int) POPi;
2630 GV * const gv = MUTABLE_GV(POPs);
2631 register IO * const io = GvIOn(gv);
2635 if (!io || !IoIFP(io))
2638 fd = PerlIO_fileno(IoIFP(io));
2642 (void)SvPOK_only(sv);
2646 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2653 #if defined(__SYMBIAN32__)
2654 # define SETSOCKOPT_OPTION_VALUE_T void *
2656 # define SETSOCKOPT_OPTION_VALUE_T const char *
2658 /* XXX TODO: We need to have a proper type (a Configure probe,
2659 * etc.) for what the C headers think of the third argument of
2660 * setsockopt(), the option_value read-only buffer: is it
2661 * a "char *", or a "void *", const or not. Some compilers
2662 * don't take kindly to e.g. assuming that "char *" implicitly
2663 * promotes to a "void *", or to explicitly promoting/demoting
2664 * consts to non/vice versa. The "const void *" is the SUS
2665 * definition, but that does not fly everywhere for the above
2667 SETSOCKOPT_OPTION_VALUE_T buf;
2671 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2675 aint = (int)SvIV(sv);
2676 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2679 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2689 SETERRNO(EBADF,SS_IVCHAN);
2698 const int optype = PL_op->op_type;
2699 GV * const gv = MUTABLE_GV(POPs);
2700 register IO * const io = GvIOn(gv);
2705 if (!io || !IoIFP(io))
2708 sv = sv_2mortal(newSV(257));
2709 (void)SvPOK_only(sv);
2713 fd = PerlIO_fileno(IoIFP(io));
2715 case OP_GETSOCKNAME:
2716 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2719 case OP_GETPEERNAME:
2720 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2722 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2724 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";
2725 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2726 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2727 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2728 sizeof(u_short) + sizeof(struct in_addr))) {
2735 #ifdef BOGUS_GETNAME_RETURN
2736 /* Interactive Unix, getpeername() and getsockname()
2737 does not return valid namelen */
2738 if (len == BOGUS_GETNAME_RETURN)
2739 len = sizeof(struct sockaddr);
2748 SETERRNO(EBADF,SS_IVCHAN);
2767 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2768 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2769 if (PL_op->op_type == OP_LSTAT) {
2770 if (gv != PL_defgv) {
2771 do_fstat_warning_check:
2772 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2773 "lstat() on filehandle%s%"SVf,
2776 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2778 } else if (PL_laststype != OP_LSTAT)
2779 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2780 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2783 if (gv != PL_defgv) {
2787 PL_laststype = OP_STAT;
2788 PL_statgv = gv ? gv : (GV *)io;
2789 sv_setpvs(PL_statname, "");
2796 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2798 } else if (IoDIRP(io)) {
2800 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2803 PL_laststatval = -1;
2806 else PL_laststatval = -1;
2807 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2810 if (PL_laststatval < 0) {
2815 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2816 io = MUTABLE_IO(SvRV(sv));
2817 if (PL_op->op_type == OP_LSTAT)
2818 goto do_fstat_warning_check;
2819 goto do_fstat_have_io;
2822 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2824 PL_laststype = PL_op->op_type;
2825 if (PL_op->op_type == OP_LSTAT)
2826 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2828 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2829 if (PL_laststatval < 0) {
2830 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2831 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2837 if (gimme != G_ARRAY) {
2838 if (gimme != G_VOID)
2839 XPUSHs(boolSV(max));
2845 mPUSHi(PL_statcache.st_dev);
2846 #if ST_INO_SIZE > IVSIZE
2847 mPUSHn(PL_statcache.st_ino);
2849 # if ST_INO_SIGN <= 0
2850 mPUSHi(PL_statcache.st_ino);
2852 mPUSHu(PL_statcache.st_ino);
2855 mPUSHu(PL_statcache.st_mode);
2856 mPUSHu(PL_statcache.st_nlink);
2857 #if Uid_t_size > IVSIZE
2858 mPUSHn(PL_statcache.st_uid);
2860 # if Uid_t_sign <= 0
2861 mPUSHi(PL_statcache.st_uid);
2863 mPUSHu(PL_statcache.st_uid);
2866 #if Gid_t_size > IVSIZE
2867 mPUSHn(PL_statcache.st_gid);
2869 # if Gid_t_sign <= 0
2870 mPUSHi(PL_statcache.st_gid);
2872 mPUSHu(PL_statcache.st_gid);
2875 #ifdef USE_STAT_RDEV
2876 mPUSHi(PL_statcache.st_rdev);
2878 PUSHs(newSVpvs_flags("", SVs_TEMP));
2880 #if Off_t_size > IVSIZE
2881 mPUSHn(PL_statcache.st_size);
2883 mPUSHi(PL_statcache.st_size);
2886 mPUSHn(PL_statcache.st_atime);
2887 mPUSHn(PL_statcache.st_mtime);
2888 mPUSHn(PL_statcache.st_ctime);
2890 mPUSHi(PL_statcache.st_atime);
2891 mPUSHi(PL_statcache.st_mtime);
2892 mPUSHi(PL_statcache.st_ctime);
2894 #ifdef USE_STAT_BLOCKS
2895 mPUSHu(PL_statcache.st_blksize);
2896 mPUSHu(PL_statcache.st_blocks);
2898 PUSHs(newSVpvs_flags("", SVs_TEMP));
2899 PUSHs(newSVpvs_flags("", SVs_TEMP));
2905 /* If the next filetest is stacked up with this one
2906 (PL_op->op_private & OPpFT_STACKING), we leave
2907 the original argument on the stack for success,
2908 and skip the stacked operators on failure.
2909 The next few macros/functions take care of this.
2913 S_ft_stacking_return_false(pTHX_ SV *ret) {
2916 while (OP_IS_FILETEST(next->op_type)
2917 && next->op_private & OPpFT_STACKED)
2918 next = next->op_next;
2919 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2925 #define FT_RETURN_FALSE(X) \
2927 if (PL_op->op_private & OPpFT_STACKING) \
2928 return S_ft_stacking_return_false(aTHX_ X); \
2929 RETURNX(PL_op->op_flags & OPf_REF ? XPUSHs(X) : SETs(X)); \
2931 #define FT_RETURN_TRUE(X) \
2933 PL_op->op_flags & OPf_REF \
2935 PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (X) \
2937 : (PL_op->op_private & OPpFT_STACKING || SETs(X)) \
2940 #define FT_RETURNNO FT_RETURN_FALSE(&PL_sv_no)
2941 #define FT_RETURNUNDEF FT_RETURN_FALSE(&PL_sv_undef)
2942 #define FT_RETURNYES FT_RETURN_TRUE(&PL_sv_yes)
2944 #define tryAMAGICftest_MG(chr) STMT_START { \
2945 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2946 && PL_op->op_flags & OPf_KIDS) { \
2947 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2948 if (next) return next; \
2953 S_try_amagic_ftest(pTHX_ char chr) {
2956 SV* const arg = TOPs;
2959 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2963 const char tmpchr = chr;
2964 SV * const tmpsv = amagic_call(arg,
2965 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2966 ftest_amg, AMGf_unary);
2971 if (SvTRUE(tmpsv)) FT_RETURN_TRUE(tmpsv);
2972 FT_RETURN_FALSE(tmpsv);
2982 /* Not const, because things tweak this below. Not bool, because there's
2983 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2984 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2985 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2986 /* Giving some sort of initial value silences compilers. */
2988 int access_mode = R_OK;
2990 int access_mode = 0;
2993 /* access_mode is never used, but leaving use_access in makes the
2994 conditional compiling below much clearer. */
2997 Mode_t stat_mode = S_IRUSR;
2999 bool effective = FALSE;
3003 switch (PL_op->op_type) {
3004 case OP_FTRREAD: opchar = 'R'; break;
3005 case OP_FTRWRITE: opchar = 'W'; break;
3006 case OP_FTREXEC: opchar = 'X'; break;
3007 case OP_FTEREAD: opchar = 'r'; break;
3008 case OP_FTEWRITE: opchar = 'w'; break;
3009 case OP_FTEEXEC: opchar = 'x'; break;
3011 tryAMAGICftest_MG(opchar);
3013 switch (PL_op->op_type) {
3015 #if !(defined(HAS_ACCESS) && defined(R_OK))
3021 #if defined(HAS_ACCESS) && defined(W_OK)
3026 stat_mode = S_IWUSR;
3030 #if defined(HAS_ACCESS) && defined(X_OK)
3035 stat_mode = S_IXUSR;
3039 #ifdef PERL_EFF_ACCESS
3042 stat_mode = S_IWUSR;
3046 #ifndef PERL_EFF_ACCESS
3053 #ifdef PERL_EFF_ACCESS
3058 stat_mode = S_IXUSR;
3064 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3065 const char *name = TOPpx;
3067 # ifdef PERL_EFF_ACCESS
3068 result = PERL_EFF_ACCESS(name, access_mode);
3070 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3076 result = access(name, access_mode);
3078 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3089 result = my_stat_flags(0);
3092 if (cando(stat_mode, effective, &PL_statcache))
3101 const int op_type = PL_op->op_type;
3106 case OP_FTIS: opchar = 'e'; break;
3107 case OP_FTSIZE: opchar = 's'; break;
3108 case OP_FTMTIME: opchar = 'M'; break;
3109 case OP_FTCTIME: opchar = 'C'; break;
3110 case OP_FTATIME: opchar = 'A'; break;
3112 tryAMAGICftest_MG(opchar);
3114 result = my_stat_flags(0);
3117 if (op_type == OP_FTIS)
3120 /* You can't dTARGET inside OP_FTIS, because you'll get
3121 "panic: pad_sv po" - the op is not flagged to have a target. */
3125 #if Off_t_size > IVSIZE
3126 sv_setnv(TARG, (NV)PL_statcache.st_size);
3128 sv_setiv(TARG, (IV)PL_statcache.st_size);
3133 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3137 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3141 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3145 if (SvTRUE_nomg(TARG)) FT_RETURN_TRUE(TARG);
3146 else FT_RETURN_FALSE(TARG);
3157 switch (PL_op->op_type) {
3158 case OP_FTROWNED: opchar = 'O'; break;
3159 case OP_FTEOWNED: opchar = 'o'; break;
3160 case OP_FTZERO: opchar = 'z'; break;
3161 case OP_FTSOCK: opchar = 'S'; break;
3162 case OP_FTCHR: opchar = 'c'; break;
3163 case OP_FTBLK: opchar = 'b'; break;
3164 case OP_FTFILE: opchar = 'f'; break;
3165 case OP_FTDIR: opchar = 'd'; break;
3166 case OP_FTPIPE: opchar = 'p'; break;
3167 case OP_FTSUID: opchar = 'u'; break;
3168 case OP_FTSGID: opchar = 'g'; break;
3169 case OP_FTSVTX: opchar = 'k'; break;
3171 tryAMAGICftest_MG(opchar);
3173 /* I believe that all these three are likely to be defined on most every
3174 system these days. */
3176 if(PL_op->op_type == OP_FTSUID) {
3181 if(PL_op->op_type == OP_FTSGID) {
3186 if(PL_op->op_type == OP_FTSVTX) {
3191 result = my_stat_flags(0);
3194 switch (PL_op->op_type) {
3196 if (PL_statcache.st_uid == PerlProc_getuid())
3200 if (PL_statcache.st_uid == PerlProc_geteuid())
3204 if (PL_statcache.st_size == 0)
3208 if (S_ISSOCK(PL_statcache.st_mode))
3212 if (S_ISCHR(PL_statcache.st_mode))
3216 if (S_ISBLK(PL_statcache.st_mode))
3220 if (S_ISREG(PL_statcache.st_mode))
3224 if (S_ISDIR(PL_statcache.st_mode))
3228 if (S_ISFIFO(PL_statcache.st_mode))
3233 if (PL_statcache.st_mode & S_ISUID)
3239 if (PL_statcache.st_mode & S_ISGID)
3245 if (PL_statcache.st_mode & S_ISVTX)
3259 tryAMAGICftest_MG('l');
3260 result = my_lstat_flags(0);
3264 if (S_ISLNK(PL_statcache.st_mode))
3278 tryAMAGICftest_MG('t');
3280 if (PL_op->op_flags & OPf_REF)
3284 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3285 name = SvPV_nomg(tmpsv, namelen);
3286 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3290 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3291 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3292 else if (name && isDIGIT(*name))
3296 if (PerlLIO_isatty(fd))
3301 #if defined(atarist) /* this will work with atariST. Configure will
3302 make guesses for other systems. */
3303 # define FILE_base(f) ((f)->_base)
3304 # define FILE_ptr(f) ((f)->_ptr)
3305 # define FILE_cnt(f) ((f)->_cnt)
3306 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3317 register STDCHAR *s;
3319 register SV *sv = NULL;
3323 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3325 if (PL_op->op_flags & OPf_REF)
3327 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3332 gv = MAYBE_DEREF_GV_nomg(sv);
3336 if (gv == PL_defgv) {
3338 io = SvTYPE(PL_statgv) == SVt_PVIO
3342 goto really_filename;
3347 sv_setpvs(PL_statname, "");
3348 io = GvIO(PL_statgv);
3350 PL_laststatval = -1;
3351 PL_laststype = OP_STAT;
3352 if (io && IoIFP(io)) {
3353 if (! PerlIO_has_base(IoIFP(io)))
3354 DIE(aTHX_ "-T and -B not implemented on filehandles");
3355 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3356 if (PL_laststatval < 0)
3358 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3359 if (PL_op->op_type == OP_FTTEXT)
3364 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3365 i = PerlIO_getc(IoIFP(io));
3367 (void)PerlIO_ungetc(IoIFP(io),i);
3369 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3371 len = PerlIO_get_bufsiz(IoIFP(io));
3372 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3373 /* sfio can have large buffers - limit to 512 */
3378 SETERRNO(EBADF,RMS_IFI);
3380 SETERRNO(EBADF,RMS_IFI);
3385 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3388 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3390 PL_laststatval = -1;
3391 PL_laststype = OP_STAT;
3393 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3395 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3398 PL_laststype = OP_STAT;
3399 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3400 if (PL_laststatval < 0) {
3401 (void)PerlIO_close(fp);
3404 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3405 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3406 (void)PerlIO_close(fp);
3408 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3409 FT_RETURNNO; /* special case NFS directories */
3410 FT_RETURNYES; /* null file is anything */
3415 /* now scan s to look for textiness */
3416 /* XXX ASCII dependent code */
3418 #if defined(DOSISH) || defined(USEMYBINMODE)
3419 /* ignore trailing ^Z on short files */
3420 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3424 for (i = 0; i < len; i++, s++) {
3425 if (!*s) { /* null never allowed in text */
3430 else if (!(isPRINT(*s) || isSPACE(*s)))
3433 else if (*s & 128) {
3435 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3438 /* utf8 characters don't count as odd */
3439 if (UTF8_IS_START(*s)) {
3440 int ulen = UTF8SKIP(s);
3441 if (ulen < len - i) {
3443 for (j = 1; j < ulen; j++) {
3444 if (!UTF8_IS_CONTINUATION(s[j]))
3447 --ulen; /* loop does extra increment */
3457 *s != '\n' && *s != '\r' && *s != '\b' &&
3458 *s != '\t' && *s != '\f' && *s != 27)
3463 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3474 const char *tmps = NULL;
3478 SV * const sv = POPs;
3479 if (PL_op->op_flags & OPf_SPECIAL) {
3480 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3482 else if (!(gv = MAYBE_DEREF_GV(sv)))
3483 tmps = SvPV_nomg_const_nolen(sv);
3486 if( !gv && (!tmps || !*tmps) ) {
3487 HV * const table = GvHVn(PL_envgv);
3490 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3491 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3493 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3498 deprecate("chdir('') or chdir(undef) as chdir()");
3499 tmps = SvPV_nolen_const(*svp);
3503 TAINT_PROPER("chdir");
3508 TAINT_PROPER("chdir");
3511 IO* const io = GvIO(gv);
3514 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3515 } else if (IoIFP(io)) {
3516 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3520 SETERRNO(EBADF, RMS_IFI);
3526 SETERRNO(EBADF,RMS_IFI);
3530 DIE(aTHX_ PL_no_func, "fchdir");
3534 PUSHi( PerlDir_chdir(tmps) >= 0 );
3536 /* Clear the DEFAULT element of ENV so we'll get the new value
3538 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3545 dVAR; dSP; dMARK; dTARGET;
3546 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3557 char * const tmps = POPpx;
3558 TAINT_PROPER("chroot");
3559 PUSHi( chroot(tmps) >= 0 );
3562 DIE(aTHX_ PL_no_func, "chroot");
3570 const char * const tmps2 = POPpconstx;
3571 const char * const tmps = SvPV_nolen_const(TOPs);
3572 TAINT_PROPER("rename");
3574 anum = PerlLIO_rename(tmps, tmps2);
3576 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3577 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3580 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3581 (void)UNLINK(tmps2);
3582 if (!(anum = link(tmps, tmps2)))
3583 anum = UNLINK(tmps);
3591 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3595 const int op_type = PL_op->op_type;
3599 if (op_type == OP_LINK)
3600 DIE(aTHX_ PL_no_func, "link");
3602 # ifndef HAS_SYMLINK
3603 if (op_type == OP_SYMLINK)
3604 DIE(aTHX_ PL_no_func, "symlink");
3608 const char * const tmps2 = POPpconstx;
3609 const char * const tmps = SvPV_nolen_const(TOPs);
3610 TAINT_PROPER(PL_op_desc[op_type]);
3612 # if defined(HAS_LINK)
3613 # if defined(HAS_SYMLINK)
3614 /* Both present - need to choose which. */
3615 (op_type == OP_LINK) ?
3616 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3618 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3619 PerlLIO_link(tmps, tmps2);
3622 # if defined(HAS_SYMLINK)
3623 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3624 symlink(tmps, tmps2);
3629 SETi( result >= 0 );
3636 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3647 char buf[MAXPATHLEN];
3650 #ifndef INCOMPLETE_TAINTS
3654 len = readlink(tmps, buf, sizeof(buf) - 1);
3661 RETSETUNDEF; /* just pretend it's a normal file */
3665 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3667 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3669 char * const save_filename = filename;
3674 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3676 PERL_ARGS_ASSERT_DOONELINER;
3678 Newx(cmdline, size, char);
3679 my_strlcpy(cmdline, cmd, size);
3680 my_strlcat(cmdline, " ", size);
3681 for (s = cmdline + strlen(cmdline); *filename; ) {
3685 if (s - cmdline < size)
3686 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3687 myfp = PerlProc_popen(cmdline, "r");
3691 SV * const tmpsv = sv_newmortal();
3692 /* Need to save/restore 'PL_rs' ?? */
3693 s = sv_gets(tmpsv, myfp, 0);
3694 (void)PerlProc_pclose(myfp);
3698 #ifdef HAS_SYS_ERRLIST
3703 /* you don't see this */
3704 const char * const errmsg =
3705 #ifdef HAS_SYS_ERRLIST
3713 if (instr(s, errmsg)) {
3720 #define EACCES EPERM
3722 if (instr(s, "cannot make"))
3723 SETERRNO(EEXIST,RMS_FEX);
3724 else if (instr(s, "existing file"))
3725 SETERRNO(EEXIST,RMS_FEX);
3726 else if (instr(s, "ile exists"))
3727 SETERRNO(EEXIST,RMS_FEX);
3728 else if (instr(s, "non-exist"))
3729 SETERRNO(ENOENT,RMS_FNF);
3730 else if (instr(s, "does not exist"))
3731 SETERRNO(ENOENT,RMS_FNF);
3732 else if (instr(s, "not empty"))
3733 SETERRNO(EBUSY,SS_DEVOFFLINE);
3734 else if (instr(s, "cannot access"))
3735 SETERRNO(EACCES,RMS_PRV);
3737 SETERRNO(EPERM,RMS_PRV);
3740 else { /* some mkdirs return no failure indication */
3741 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3742 if (PL_op->op_type == OP_RMDIR)
3747 SETERRNO(EACCES,RMS_PRV); /* a guess */
3756 /* This macro removes trailing slashes from a directory name.
3757 * Different operating and file systems take differently to
3758 * trailing slashes. According to POSIX 1003.1 1996 Edition
3759 * any number of trailing slashes should be allowed.
3760 * Thusly we snip them away so that even non-conforming
3761 * systems are happy.
3762 * We should probably do this "filtering" for all
3763 * the functions that expect (potentially) directory names:
3764 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3765 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3767 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3768 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3771 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3772 (tmps) = savepvn((tmps), (len)); \
3782 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3784 TRIMSLASHES(tmps,len,copy);
3786 TAINT_PROPER("mkdir");
3788 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3792 SETi( dooneliner("mkdir", tmps) );
3793 oldumask = PerlLIO_umask(0);
3794 PerlLIO_umask(oldumask);
3795 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3810 TRIMSLASHES(tmps,len,copy);
3811 TAINT_PROPER("rmdir");
3813 SETi( PerlDir_rmdir(tmps) >= 0 );
3815 SETi( dooneliner("rmdir", tmps) );
3822 /* Directory calls. */
3826 #if defined(Direntry_t) && defined(HAS_READDIR)
3828 const char * const dirname = POPpconstx;
3829 GV * const gv = MUTABLE_GV(POPs);
3830 register IO * const io = GvIOn(gv);
3835 if ((IoIFP(io) || IoOFP(io)))
3836 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3837 "Opening filehandle %"HEKf" also as a directory",
3838 HEKfARG(GvENAME_HEK(gv)) );
3840 PerlDir_close(IoDIRP(io));
3841 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3847 SETERRNO(EBADF,RMS_DIR);
3850 DIE(aTHX_ PL_no_dir_func, "opendir");
3856 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3857 DIE(aTHX_ PL_no_dir_func, "readdir");
3859 #if !defined(I_DIRENT) && !defined(VMS)
3860 Direntry_t *readdir (DIR *);
3866 const I32 gimme = GIMME;
3867 GV * const gv = MUTABLE_GV(POPs);
3868 register const Direntry_t *dp;
3869 register IO * const io = GvIOn(gv);
3871 if (!io || !IoDIRP(io)) {
3872 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3873 "readdir() attempted on invalid dirhandle %"HEKf,
3874 HEKfARG(GvENAME_HEK(gv)));
3879 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3883 sv = newSVpvn(dp->d_name, dp->d_namlen);
3885 sv = newSVpv(dp->d_name, 0);
3887 #ifndef INCOMPLETE_TAINTS
3888 if (!(IoFLAGS(io) & IOf_UNTAINT))
3892 } while (gimme == G_ARRAY);
3894 if (!dp && gimme != G_ARRAY)
3901 SETERRNO(EBADF,RMS_ISI);
3902 if (GIMME == G_ARRAY)
3911 #if defined(HAS_TELLDIR) || defined(telldir)
3913 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3914 /* XXX netbsd still seemed to.
3915 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3916 --JHI 1999-Feb-02 */
3917 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3918 long telldir (DIR *);
3920 GV * const gv = MUTABLE_GV(POPs);
3921 register IO * const io = GvIOn(gv);
3923 if (!io || !IoDIRP(io)) {
3924 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3925 "telldir() attempted on invalid dirhandle %"HEKf,
3926 HEKfARG(GvENAME_HEK(gv)));
3930 PUSHi( PerlDir_tell(IoDIRP(io)) );
3934 SETERRNO(EBADF,RMS_ISI);
3937 DIE(aTHX_ PL_no_dir_func, "telldir");
3943 #if defined(HAS_SEEKDIR) || defined(seekdir)
3945 const long along = POPl;
3946 GV * const gv = MUTABLE_GV(POPs);
3947 register IO * const io = GvIOn(gv);
3949 if (!io || !IoDIRP(io)) {
3950 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3951 "seekdir() attempted on invalid dirhandle %"HEKf,
3952 HEKfARG(GvENAME_HEK(gv)));
3955 (void)PerlDir_seek(IoDIRP(io), along);
3960 SETERRNO(EBADF,RMS_ISI);
3963 DIE(aTHX_ PL_no_dir_func, "seekdir");
3969 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3971 GV * const gv = MUTABLE_GV(POPs);
3972 register IO * const io = GvIOn(gv);
3974 if (!io || !IoDIRP(io)) {
3975 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3976 "rewinddir() attempted on invalid dirhandle %"HEKf,
3977 HEKfARG(GvENAME_HEK(gv)));
3980 (void)PerlDir_rewind(IoDIRP(io));
3984 SETERRNO(EBADF,RMS_ISI);
3987 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3993 #if defined(Direntry_t) && defined(HAS_READDIR)
3995 GV * const gv = MUTABLE_GV(POPs);
3996 register IO * const io = GvIOn(gv);
3998 if (!io || !IoDIRP(io)) {
3999 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4000 "closedir() attempted on invalid dirhandle %"HEKf,
4001 HEKfARG(GvENAME_HEK(gv)));
4004 #ifdef VOID_CLOSEDIR
4005 PerlDir_close(IoDIRP(io));
4007 if (PerlDir_close(IoDIRP(io)) < 0) {
4008 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4017 SETERRNO(EBADF,RMS_IFI);
4020 DIE(aTHX_ PL_no_dir_func, "closedir");
4024 /* Process control. */
4031 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4032 sigset_t oldmask, newmask;
4036 PERL_FLUSHALL_FOR_CHILD;
4037 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4038 sigfillset(&newmask);
4039 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4041 childpid = PerlProc_fork();
4042 if (childpid == 0) {
4046 for (sig = 1; sig < SIG_SIZE; sig++)
4047 PL_psig_pend[sig] = 0;
4049 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4052 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4059 #ifdef PERL_USES_PL_PIDSTATUS
4060 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4066 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4071 PERL_FLUSHALL_FOR_CHILD;
4072 childpid = PerlProc_fork();
4078 DIE(aTHX_ PL_no_func, "fork");
4085 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4090 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4091 childpid = wait4pid(-1, &argflags, 0);
4093 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4098 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4099 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4100 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4102 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4107 DIE(aTHX_ PL_no_func, "wait");
4113 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4115 const int optype = POPi;
4116 const Pid_t pid = TOPi;
4120 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4121 result = wait4pid(pid, &argflags, optype);
4123 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4128 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4129 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4130 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4132 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4137 DIE(aTHX_ PL_no_func, "waitpid");
4143 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4144 #if defined(__LIBCATAMOUNT__)
4145 PL_statusvalue = -1;
4154 while (++MARK <= SP) {
4155 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4160 TAINT_PROPER("system");
4162 PERL_FLUSHALL_FOR_CHILD;
4163 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4168 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4169 sigset_t newset, oldset;
4172 if (PerlProc_pipe(pp) >= 0)
4174 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4175 sigemptyset(&newset);
4176 sigaddset(&newset, SIGCHLD);
4177 sigprocmask(SIG_BLOCK, &newset, &oldset);
4179 while ((childpid = PerlProc_fork()) == -1) {
4180 if (errno != EAGAIN) {
4185 PerlLIO_close(pp[0]);
4186 PerlLIO_close(pp[1]);
4188 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4189 sigprocmask(SIG_SETMASK, &oldset, NULL);
4196 Sigsave_t ihand,qhand; /* place to save signals during system() */
4200 PerlLIO_close(pp[1]);
4202 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4203 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4206 result = wait4pid(childpid, &status, 0);
4207 } while (result == -1 && errno == EINTR);
4209 #ifdef HAS_SIGPROCMASK
4210 sigprocmask(SIG_SETMASK, &oldset, NULL);
4212 (void)rsignal_restore(SIGINT, &ihand);
4213 (void)rsignal_restore(SIGQUIT, &qhand);
4215 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4216 do_execfree(); /* free any memory child malloced on fork */
4223 while (n < sizeof(int)) {
4224 n1 = PerlLIO_read(pp[0],
4225 (void*)(((char*)&errkid)+n),
4231 PerlLIO_close(pp[0]);
4232 if (n) { /* Error */
4233 if (n != sizeof(int))
4234 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4235 errno = errkid; /* Propagate errno from kid */
4236 STATUS_NATIVE_CHILD_SET(-1);
4239 XPUSHi(STATUS_CURRENT);
4242 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4243 sigprocmask(SIG_SETMASK, &oldset, NULL);
4246 PerlLIO_close(pp[0]);
4247 #if defined(HAS_FCNTL) && defined(F_SETFD)
4248 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4251 if (PL_op->op_flags & OPf_STACKED) {
4252 SV * const really = *++MARK;
4253 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4255 else if (SP - MARK != 1)
4256 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4258 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4262 #else /* ! FORK or VMS or OS/2 */
4265 if (PL_op->op_flags & OPf_STACKED) {
4266 SV * const really = *++MARK;
4267 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4268 value = (I32)do_aspawn(really, MARK, SP);
4270 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4273 else if (SP - MARK != 1) {
4274 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4275 value = (I32)do_aspawn(NULL, MARK, SP);
4277 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4281 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4283 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4285 STATUS_NATIVE_CHILD_SET(value);
4288 XPUSHi(result ? value : STATUS_CURRENT);
4289 #endif /* !FORK or VMS or OS/2 */
4296 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4301 while (++MARK <= SP) {
4302 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4307 TAINT_PROPER("exec");
4309 PERL_FLUSHALL_FOR_CHILD;
4310 if (PL_op->op_flags & OPf_STACKED) {
4311 SV * const really = *++MARK;
4312 value = (I32)do_aexec(really, MARK, SP);
4314 else if (SP - MARK != 1)
4316 value = (I32)vms_do_aexec(NULL, MARK, SP);
4320 (void ) do_aspawn(NULL, MARK, SP);
4324 value = (I32)do_aexec(NULL, MARK, SP);
4329 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4332 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4335 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4349 XPUSHi( getppid() );
4352 DIE(aTHX_ PL_no_func, "getppid");
4362 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4365 pgrp = (I32)BSD_GETPGRP(pid);
4367 if (pid != 0 && pid != PerlProc_getpid())
4368 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4374 DIE(aTHX_ PL_no_func, "getpgrp()");
4384 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4385 if (MAXARG > 0) pid = TOPs && TOPi;
4391 TAINT_PROPER("setpgrp");
4393 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4395 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4396 || (pid != 0 && pid != PerlProc_getpid()))
4398 DIE(aTHX_ "setpgrp can't take arguments");
4400 SETi( setpgrp() >= 0 );
4401 #endif /* USE_BSDPGRP */
4404 DIE(aTHX_ PL_no_func, "setpgrp()");
4408 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4409 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4411 # define PRIORITY_WHICH_T(which) which
4416 #ifdef HAS_GETPRIORITY
4418 const int who = POPi;
4419 const int which = TOPi;
4420 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4423 DIE(aTHX_ PL_no_func, "getpriority()");
4429 #ifdef HAS_SETPRIORITY
4431 const int niceval = POPi;
4432 const int who = POPi;
4433 const int which = TOPi;
4434 TAINT_PROPER("setpriority");
4435 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4438 DIE(aTHX_ PL_no_func, "setpriority()");
4442 #undef PRIORITY_WHICH_T
4450 XPUSHn( time(NULL) );
4452 XPUSHi( time(NULL) );
4464 (void)PerlProc_times(&PL_timesbuf);
4466 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4467 /* struct tms, though same data */
4471 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4472 if (GIMME == G_ARRAY) {
4473 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4474 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4475 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4483 if (GIMME == G_ARRAY) {
4490 DIE(aTHX_ "times not implemented");
4492 #endif /* HAS_TIMES */
4495 /* The 32 bit int year limits the times we can represent to these
4496 boundaries with a few days wiggle room to account for time zone
4499 /* Sat Jan 3 00:00:00 -2147481748 */
4500 #define TIME_LOWER_BOUND -67768100567755200.0
4501 /* Sun Dec 29 12:00:00 2147483647 */
4502 #define TIME_UPPER_BOUND 67767976233316800.0
4511 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4512 static const char * const dayname[] =
4513 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4514 static const char * const monname[] =
4515 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4516 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4518 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4521 when = (Time64_T)now;
4524 NV input = Perl_floor(POPn);
4525 when = (Time64_T)input;
4526 if (when != input) {
4527 /* diag_listed_as: gmtime(%f) too large */
4528 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4529 "%s(%.0" NVff ") too large", opname, input);
4533 if ( TIME_LOWER_BOUND > when ) {
4534 /* diag_listed_as: gmtime(%f) too small */
4535 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4536 "%s(%.0" NVff ") too small", opname, when);
4539 else if( when > TIME_UPPER_BOUND ) {
4540 /* diag_listed_as: gmtime(%f) too small */
4541 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4542 "%s(%.0" NVff ") too large", opname, when);
4546 if (PL_op->op_type == OP_LOCALTIME)
4547 err = S_localtime64_r(&when, &tmbuf);
4549 err = S_gmtime64_r(&when, &tmbuf);
4553 /* XXX %lld broken for quads */
4554 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4555 "%s(%.0" NVff ") failed", opname, when);
4558 if (GIMME != G_ARRAY) { /* scalar context */
4560 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4561 double year = (double)tmbuf.tm_year + 1900;
4568 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4569 dayname[tmbuf.tm_wday],
4570 monname[tmbuf.tm_mon],
4578 else { /* list context */
4584 mPUSHi(tmbuf.tm_sec);
4585 mPUSHi(tmbuf.tm_min);
4586 mPUSHi(tmbuf.tm_hour);
4587 mPUSHi(tmbuf.tm_mday);
4588 mPUSHi(tmbuf.tm_mon);
4589 mPUSHn(tmbuf.tm_year);
4590 mPUSHi(tmbuf.tm_wday);
4591 mPUSHi(tmbuf.tm_yday);
4592 mPUSHi(tmbuf.tm_isdst);
4603 anum = alarm((unsigned int)anum);
4609 DIE(aTHX_ PL_no_func, "alarm");
4620 (void)time(&lasttime);
4621 if (MAXARG < 1 || (!TOPs && !POPs))
4625 PerlProc_sleep((unsigned int)duration);
4628 XPUSHi(when - lasttime);
4632 /* Shared memory. */
4633 /* Merged with some message passing. */
4637 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4638 dVAR; dSP; dMARK; dTARGET;
4639 const int op_type = PL_op->op_type;
4644 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4647 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4650 value = (I32)(do_semop(MARK, SP) >= 0);
4653 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4661 return Perl_pp_semget(aTHX);
4669 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4670 dVAR; dSP; dMARK; dTARGET;
4671 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4678 DIE(aTHX_ "System V IPC is not implemented on this machine");
4684 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4685 dVAR; dSP; dMARK; dTARGET;
4686 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4694 PUSHp(zero_but_true, ZBTLEN);
4698 return Perl_pp_semget(aTHX);
4702 /* I can't const this further without getting warnings about the types of
4703 various arrays passed in from structures. */
4705 S_space_join_names_mortal(pTHX_ char *const *array)
4709 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4711 if (array && *array) {
4712 target = newSVpvs_flags("", SVs_TEMP);
4714 sv_catpv(target, *array);
4717 sv_catpvs(target, " ");
4720 target = sv_mortalcopy(&PL_sv_no);
4725 /* Get system info. */
4729 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4731 I32 which = PL_op->op_type;
4732 register char **elem;
4734 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4735 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4736 struct hostent *gethostbyname(Netdb_name_t);
4737 struct hostent *gethostent(void);
4739 struct hostent *hent = NULL;
4743 if (which == OP_GHBYNAME) {
4744 #ifdef HAS_GETHOSTBYNAME
4745 const char* const name = POPpbytex;
4746 hent = PerlSock_gethostbyname(name);
4748 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4751 else if (which == OP_GHBYADDR) {
4752 #ifdef HAS_GETHOSTBYADDR
4753 const int addrtype = POPi;
4754 SV * const addrsv = POPs;
4756 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4758 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4760 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4764 #ifdef HAS_GETHOSTENT
4765 hent = PerlSock_gethostent();
4767 DIE(aTHX_ PL_no_sock_func, "gethostent");
4770 #ifdef HOST_NOT_FOUND
4772 #ifdef USE_REENTRANT_API
4773 # ifdef USE_GETHOSTENT_ERRNO
4774 h_errno = PL_reentrant_buffer->_gethostent_errno;
4777 STATUS_UNIX_SET(h_errno);
4781 if (GIMME != G_ARRAY) {
4782 PUSHs(sv = sv_newmortal());
4784 if (which == OP_GHBYNAME) {
4786 sv_setpvn(sv, hent->h_addr, hent->h_length);
4789 sv_setpv(sv, (char*)hent->h_name);
4795 mPUSHs(newSVpv((char*)hent->h_name, 0));
4796 PUSHs(space_join_names_mortal(hent->h_aliases));
4797 mPUSHi(hent->h_addrtype);
4798 len = hent->h_length;
4801 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4802 mXPUSHp(*elem, len);
4806 mPUSHp(hent->h_addr, len);
4808 PUSHs(sv_mortalcopy(&PL_sv_no));
4813 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4819 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4821 I32 which = PL_op->op_type;
4823 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4824 struct netent *getnetbyaddr(Netdb_net_t, int);
4825 struct netent *getnetbyname(Netdb_name_t);
4826 struct netent *getnetent(void);
4828 struct netent *nent;
4830 if (which == OP_GNBYNAME){
4831 #ifdef HAS_GETNETBYNAME
4832 const char * const name = POPpbytex;
4833 nent = PerlSock_getnetbyname(name);
4835 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4838 else if (which == OP_GNBYADDR) {
4839 #ifdef HAS_GETNETBYADDR
4840 const int addrtype = POPi;
4841 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4842 nent = PerlSock_getnetbyaddr(addr, addrtype);
4844 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4848 #ifdef HAS_GETNETENT
4849 nent = PerlSock_getnetent();
4851 DIE(aTHX_ PL_no_sock_func, "getnetent");
4854 #ifdef HOST_NOT_FOUND
4856 #ifdef USE_REENTRANT_API
4857 # ifdef USE_GETNETENT_ERRNO
4858 h_errno = PL_reentrant_buffer->_getnetent_errno;
4861 STATUS_UNIX_SET(h_errno);
4866 if (GIMME != G_ARRAY) {
4867 PUSHs(sv = sv_newmortal());
4869 if (which == OP_GNBYNAME)
4870 sv_setiv(sv, (IV)nent->n_net);
4872 sv_setpv(sv, nent->n_name);
4878 mPUSHs(newSVpv(nent->n_name, 0));
4879 PUSHs(space_join_names_mortal(nent->n_aliases));
4880 mPUSHi(nent->n_addrtype);
4881 mPUSHi(nent->n_net);
4886 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4892 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4894 I32 which = PL_op->op_type;
4896 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4897 struct protoent *getprotobyname(Netdb_name_t);
4898 struct protoent *getprotobynumber(int);
4899 struct protoent *getprotoent(void);
4901 struct protoent *pent;
4903 if (which == OP_GPBYNAME) {
4904 #ifdef HAS_GETPROTOBYNAME
4905 const char* const name = POPpbytex;
4906 pent = PerlSock_getprotobyname(name);
4908 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4911 else if (which == OP_GPBYNUMBER) {
4912 #ifdef HAS_GETPROTOBYNUMBER
4913 const int number = POPi;
4914 pent = PerlSock_getprotobynumber(number);
4916 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4920 #ifdef HAS_GETPROTOENT
4921 pent = PerlSock_getprotoent();
4923 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4927 if (GIMME != G_ARRAY) {
4928 PUSHs(sv = sv_newmortal());
4930 if (which == OP_GPBYNAME)
4931 sv_setiv(sv, (IV)pent->p_proto);
4933 sv_setpv(sv, pent->p_name);
4939 mPUSHs(newSVpv(pent->p_name, 0));
4940 PUSHs(space_join_names_mortal(pent->p_aliases));
4941 mPUSHi(pent->p_proto);
4946 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4952 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4954 I32 which = PL_op->op_type;
4956 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4957 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4958 struct servent *getservbyport(int, Netdb_name_t);
4959 struct servent *getservent(void);
4961 struct servent *sent;
4963 if (which == OP_GSBYNAME) {
4964 #ifdef HAS_GETSERVBYNAME
4965 const char * const proto = POPpbytex;
4966 const char * const name = POPpbytex;
4967 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4969 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4972 else if (which == OP_GSBYPORT) {
4973 #ifdef HAS_GETSERVBYPORT
4974 const char * const proto = POPpbytex;
4975 unsigned short port = (unsigned short)POPu;
4977 port = PerlSock_htons(port);
4979 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4981 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4985 #ifdef HAS_GETSERVENT
4986 sent = PerlSock_getservent();
4988 DIE(aTHX_ PL_no_sock_func, "getservent");
4992 if (GIMME != G_ARRAY) {
4993 PUSHs(sv = sv_newmortal());
4995 if (which == OP_GSBYNAME) {
4997 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4999 sv_setiv(sv, (IV)(sent->s_port));
5003 sv_setpv(sv, sent->s_name);
5009 mPUSHs(newSVpv(sent->s_name, 0));
5010 PUSHs(space_join_names_mortal(sent->s_aliases));
5012 mPUSHi(PerlSock_ntohs(sent->s_port));
5014 mPUSHi(sent->s_port);
5016 mPUSHs(newSVpv(sent->s_proto, 0));
5021 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5028 const int stayopen = TOPi;
5029 switch(PL_op->op_type) {
5031 #ifdef HAS_SETHOSTENT
5032 PerlSock_sethostent(stayopen);
5034 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5037 #ifdef HAS_SETNETENT
5039 PerlSock_setnetent(stayopen);
5041 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5045 #ifdef HAS_SETPROTOENT
5046 PerlSock_setprotoent(stayopen);
5048 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5052 #ifdef HAS_SETSERVENT
5053 PerlSock_setservent(stayopen);
5055 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5065 switch(PL_op->op_type) {
5067 #ifdef HAS_ENDHOSTENT
5068 PerlSock_endhostent();
5070 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5074 #ifdef HAS_ENDNETENT
5075 PerlSock_endnetent();
5077 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5081 #ifdef HAS_ENDPROTOENT
5082 PerlSock_endprotoent();
5084 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5088 #ifdef HAS_ENDSERVENT
5089 PerlSock_endservent();
5091 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5095 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5098 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5102 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5105 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5109 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5112 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5116 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5119 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5131 I32 which = PL_op->op_type;
5133 struct passwd *pwent = NULL;
5135 * We currently support only the SysV getsp* shadow password interface.
5136 * The interface is declared in <shadow.h> and often one needs to link
5137 * with -lsecurity or some such.
5138 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5141 * AIX getpwnam() is clever enough to return the encrypted password
5142 * only if the caller (euid?) is root.
5144 * There are at least three other shadow password APIs. Many platforms
5145 * seem to contain more than one interface for accessing the shadow
5146 * password databases, possibly for compatibility reasons.
5147 * The getsp*() is by far he simplest one, the other two interfaces
5148 * are much more complicated, but also very similar to each other.
5153 * struct pr_passwd *getprpw*();
5154 * The password is in
5155 * char getprpw*(...).ufld.fd_encrypt[]
5156 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5161 * struct es_passwd *getespw*();
5162 * The password is in
5163 * char *(getespw*(...).ufld.fd_encrypt)
5164 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5167 * struct userpw *getuserpw();
5168 * The password is in
5169 * char *(getuserpw(...)).spw_upw_passwd
5170 * (but the de facto standard getpwnam() should work okay)
5172 * Mention I_PROT here so that Configure probes for it.
5174 * In HP-UX for getprpw*() the manual page claims that one should include
5175 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5176 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5177 * and pp_sys.c already includes <shadow.h> if there is such.
5179 * Note that <sys/security.h> is already probed for, but currently
5180 * it is only included in special cases.
5182 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5183 * be preferred interface, even though also the getprpw*() interface
5184 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5185 * One also needs to call set_auth_parameters() in main() before
5186 * doing anything else, whether one is using getespw*() or getprpw*().
5188 * Note that accessing the shadow databases can be magnitudes
5189 * slower than accessing the standard databases.
5194 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5195 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5196 * the pw_comment is left uninitialized. */
5197 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5203 const char* const name = POPpbytex;
5204 pwent = getpwnam(name);
5210 pwent = getpwuid(uid);
5214 # ifdef HAS_GETPWENT
5216 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5217 if (pwent) pwent = getpwnam(pwent->pw_name);
5220 DIE(aTHX_ PL_no_func, "getpwent");
5226 if (GIMME != G_ARRAY) {
5227 PUSHs(sv = sv_newmortal());
5229 if (which == OP_GPWNAM)
5230 # if Uid_t_sign <= 0
5231 sv_setiv(sv, (IV)pwent->pw_uid);
5233 sv_setuv(sv, (UV)pwent->pw_uid);
5236 sv_setpv(sv, pwent->pw_name);
5242 mPUSHs(newSVpv(pwent->pw_name, 0));
5246 /* If we have getspnam(), we try to dig up the shadow
5247 * password. If we are underprivileged, the shadow
5248 * interface will set the errno to EACCES or similar,
5249 * and return a null pointer. If this happens, we will
5250 * use the dummy password (usually "*" or "x") from the
5251 * standard password database.
5253 * In theory we could skip the shadow call completely
5254 * if euid != 0 but in practice we cannot know which
5255 * security measures are guarding the shadow databases
5256 * on a random platform.
5258 * Resist the urge to use additional shadow interfaces.
5259 * Divert the urge to writing an extension instead.
5262 /* Some AIX setups falsely(?) detect some getspnam(), which
5263 * has a different API than the Solaris/IRIX one. */
5264 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5267 const struct spwd * const spwent = getspnam(pwent->pw_name);
5268 /* Save and restore errno so that
5269 * underprivileged attempts seem
5270 * to have never made the unsuccessful
5271 * attempt to retrieve the shadow password. */
5273 if (spwent && spwent->sp_pwdp)
5274 sv_setpv(sv, spwent->sp_pwdp);
5278 if (!SvPOK(sv)) /* Use the standard password, then. */
5279 sv_setpv(sv, pwent->pw_passwd);
5282 # ifndef INCOMPLETE_TAINTS
5283 /* passwd is tainted because user himself can diddle with it.
5284 * admittedly not much and in a very limited way, but nevertheless. */
5288 # if Uid_t_sign <= 0
5289 mPUSHi(pwent->pw_uid);
5291 mPUSHu(pwent->pw_uid);
5294 # if Uid_t_sign <= 0
5295 mPUSHi(pwent->pw_gid);
5297 mPUSHu(pwent->pw_gid);
5299 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5300 * because of the poor interface of the Perl getpw*(),
5301 * not because there's some standard/convention saying so.
5302 * A better interface would have been to return a hash,
5303 * but we are accursed by our history, alas. --jhi. */
5305 mPUSHi(pwent->pw_change);
5308 mPUSHi(pwent->pw_quota);
5311 mPUSHs(newSVpv(pwent->pw_age, 0));
5313 /* I think that you can never get this compiled, but just in case. */
5314 PUSHs(sv_mortalcopy(&PL_sv_no));
5319 /* pw_class and pw_comment are mutually exclusive--.
5320 * see the above note for pw_change, pw_quota, and pw_age. */
5322 mPUSHs(newSVpv(pwent->pw_class, 0));
5325 mPUSHs(newSVpv(pwent->pw_comment, 0));
5327 /* I think that you can never get this compiled, but just in case. */
5328 PUSHs(sv_mortalcopy(&PL_sv_no));
5333 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5335 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5337 # ifndef INCOMPLETE_TAINTS
5338 /* pw_gecos is tainted because user himself can diddle with it. */
5342 mPUSHs(newSVpv(pwent->pw_dir, 0));
5344 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5345 # ifndef INCOMPLETE_TAINTS
5346 /* pw_shell is tainted because user himself can diddle with it. */
5351 mPUSHi(pwent->pw_expire);
5356 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5364 const I32 which = PL_op->op_type;
5365 const struct group *grent;
5367 if (which == OP_GGRNAM) {
5368 const char* const name = POPpbytex;
5369 grent = (const struct group *)getgrnam(name);
5371 else if (which == OP_GGRGID) {
5372 const Gid_t gid = POPi;
5373 grent = (const struct group *)getgrgid(gid);
5377 grent = (struct group *)getgrent();
5379 DIE(aTHX_ PL_no_func, "getgrent");
5383 if (GIMME != G_ARRAY) {
5384 SV * const sv = sv_newmortal();
5388 if (which == OP_GGRNAM)
5390 sv_setiv(sv, (IV)grent->gr_gid);
5392 sv_setuv(sv, (UV)grent->gr_gid);
5395 sv_setpv(sv, grent->gr_name);
5401 mPUSHs(newSVpv(grent->gr_name, 0));
5404 mPUSHs(newSVpv(grent->gr_passwd, 0));
5406 PUSHs(sv_mortalcopy(&PL_sv_no));
5410 mPUSHi(grent->gr_gid);
5412 mPUSHu(grent->gr_gid);
5415 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5416 /* In UNICOS/mk (_CRAYMPP) the multithreading
5417 * versions (getgrnam_r, getgrgid_r)
5418 * seem to return an illegal pointer
5419 * as the group members list, gr_mem.
5420 * getgrent() doesn't even have a _r version
5421 * but the gr_mem is poisonous anyway.
5422 * So yes, you cannot get the list of group
5423 * members if building multithreaded in UNICOS/mk. */
5424 PUSHs(space_join_names_mortal(grent->gr_mem));
5430 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5440 if (!(tmps = PerlProc_getlogin()))
5442 sv_setpv_mg(TARG, tmps);
5446 DIE(aTHX_ PL_no_func, "getlogin");
5450 /* Miscellaneous. */
5455 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5456 register I32 items = SP - MARK;
5457 unsigned long a[20];
5462 while (++MARK <= SP) {
5463 if (SvTAINTED(*MARK)) {
5469 TAINT_PROPER("syscall");
5472 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5473 * or where sizeof(long) != sizeof(char*). But such machines will
5474 * not likely have syscall implemented either, so who cares?
5476 while (++MARK <= SP) {
5477 if (SvNIOK(*MARK) || !i)
5478 a[i++] = SvIV(*MARK);
5479 else if (*MARK == &PL_sv_undef)
5482 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5488 DIE(aTHX_ "Too many args to syscall");
5490 DIE(aTHX_ "Too few args to syscall");
5492 retval = syscall(a[0]);
5495 retval = syscall(a[0],a[1]);
5498 retval = syscall(a[0],a[1],a[2]);
5501 retval = syscall(a[0],a[1],a[2],a[3]);
5504 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5507 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5510 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5513 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5517 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5520 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5523 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5527 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5531 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5535 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5536 a[10],a[11],a[12],a[13]);
5538 #endif /* atarist */
5544 DIE(aTHX_ PL_no_func, "syscall");
5548 #ifdef FCNTL_EMULATE_FLOCK
5550 /* XXX Emulate flock() with fcntl().
5551 What's really needed is a good file locking module.
5555 fcntl_emulate_flock(int fd, int operation)
5560 switch (operation & ~LOCK_NB) {
5562 flock.l_type = F_RDLCK;
5565 flock.l_type = F_WRLCK;
5568 flock.l_type = F_UNLCK;
5574 flock.l_whence = SEEK_SET;
5575 flock.l_start = flock.l_len = (Off_t)0;
5577 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5578 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5579 errno = EWOULDBLOCK;
5583 #endif /* FCNTL_EMULATE_FLOCK */
5585 #ifdef LOCKF_EMULATE_FLOCK
5587 /* XXX Emulate flock() with lockf(). This is just to increase
5588 portability of scripts. The calls are not completely
5589 interchangeable. What's really needed is a good file
5593 /* The lockf() constants might have been defined in <unistd.h>.
5594 Unfortunately, <unistd.h> causes troubles on some mixed
5595 (BSD/POSIX) systems, such as SunOS 4.1.3.
5597 Further, the lockf() constants aren't POSIX, so they might not be
5598 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5599 just stick in the SVID values and be done with it. Sigh.
5603 # define F_ULOCK 0 /* Unlock a previously locked region */
5606 # define F_LOCK 1 /* Lock a region for exclusive use */
5609 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5612 # define F_TEST 3 /* Test a region for other processes locks */
5616 lockf_emulate_flock(int fd, int operation)
5622 /* flock locks entire file so for lockf we need to do the same */
5623 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5624 if (pos > 0) /* is seekable and needs to be repositioned */
5625 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5626 pos = -1; /* seek failed, so don't seek back afterwards */
5629 switch (operation) {
5631 /* LOCK_SH - get a shared lock */
5633 /* LOCK_EX - get an exclusive lock */
5635 i = lockf (fd, F_LOCK, 0);
5638 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5639 case LOCK_SH|LOCK_NB:
5640 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5641 case LOCK_EX|LOCK_NB:
5642 i = lockf (fd, F_TLOCK, 0);
5644 if ((errno == EAGAIN) || (errno == EACCES))
5645 errno = EWOULDBLOCK;
5648 /* LOCK_UN - unlock (non-blocking is a no-op) */
5650 case LOCK_UN|LOCK_NB:
5651 i = lockf (fd, F_ULOCK, 0);
5654 /* Default - can't decipher operation */
5661 if (pos > 0) /* need to restore position of the handle */
5662 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5667 #endif /* LOCKF_EMULATE_FLOCK */
5671 * c-indentation-style: bsd
5673 * indent-tabs-mode: nil
5676 * ex: set ts=8 sts=4 sw=4 et: