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 tryAMAGICunTARGET(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 return 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 if (!io || !(ofp = IoOFP(io)))
1400 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1401 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1403 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1404 PL_formtarget != PL_toptarget)
1408 if (!IoTOP_GV(io)) {
1411 if (!IoTOP_NAME(io)) {
1413 if (!IoFMT_NAME(io))
1414 IoFMT_NAME(io) = savepv(GvNAME(gv));
1415 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1416 HEKfARG(GvNAME_HEK(gv))));
1417 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1418 if ((topgv && GvFORM(topgv)) ||
1419 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1420 IoTOP_NAME(io) = savesvpv(topname);
1422 IoTOP_NAME(io) = savepvs("top");
1424 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1425 if (!topgv || !GvFORM(topgv)) {
1426 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1429 IoTOP_GV(io) = topgv;
1431 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1432 I32 lines = IoLINES_LEFT(io);
1433 const char *s = SvPVX_const(PL_formtarget);
1434 if (lines <= 0) /* Yow, header didn't even fit!!! */
1436 while (lines-- > 0) {
1437 s = strchr(s, '\n');
1443 const STRLEN save = SvCUR(PL_formtarget);
1444 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1445 do_print(PL_formtarget, ofp);
1446 SvCUR_set(PL_formtarget, save);
1447 sv_chop(PL_formtarget, s);
1448 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1451 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1452 do_print(PL_formfeed, ofp);
1453 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1455 PL_formtarget = PL_toptarget;
1456 IoFLAGS(io) |= IOf_DIDTOP;
1459 DIE(aTHX_ "bad top format reference");
1462 SV * const sv = sv_newmortal();
1463 gv_efullname4(sv, fgv, NULL, FALSE);
1464 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1466 return doform(cv, gv, PL_op);
1470 POPBLOCK(cx,PL_curpm);
1472 retop = cx->blk_sub.retop;
1478 report_wrongway_fh(gv, '<');
1484 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1485 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1487 if (!do_print(PL_formtarget, fp))
1490 FmLINES(PL_formtarget) = 0;
1491 SvCUR_set(PL_formtarget, 0);
1492 *SvEND(PL_formtarget) = '\0';
1493 if (IoFLAGS(io) & IOf_FLUSH)
1494 (void)PerlIO_flush(fp);
1499 PL_formtarget = PL_bodytarget;
1501 PERL_UNUSED_VAR(newsp);
1502 PERL_UNUSED_VAR(gimme);
1508 dVAR; dSP; dMARK; dORIGMARK;
1513 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1514 IO *const io = GvIO(gv);
1517 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1519 if (MARK == ORIGMARK) {
1522 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1525 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1527 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1535 SETERRNO(EBADF,RMS_IFI);
1538 else if (!(fp = IoOFP(io))) {
1540 report_wrongway_fh(gv, '<');
1541 else if (ckWARN(WARN_CLOSED))
1543 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1547 do_sprintf(sv, SP - MARK, MARK + 1);
1548 if (!do_print(sv, fp))
1551 if (IoFLAGS(io) & IOf_FLUSH)
1552 if (PerlIO_flush(fp) == EOF)
1563 PUSHs(&PL_sv_undef);
1571 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1572 const int mode = POPi;
1573 SV * const sv = POPs;
1574 GV * const gv = MUTABLE_GV(POPs);
1577 /* Need TIEHANDLE method ? */
1578 const char * const tmps = SvPV_const(sv, len);
1579 /* FIXME? do_open should do const */
1580 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1581 IoLINES(GvIOp(gv)) = 0;
1585 PUSHs(&PL_sv_undef);
1592 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1606 bool charstart = FALSE;
1607 STRLEN charskip = 0;
1610 GV * const gv = MUTABLE_GV(*++MARK);
1611 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1612 && gv && (io = GvIO(gv)) )
1614 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1616 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1617 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1626 sv_setpvs(bufsv, "");
1627 length = SvIVx(*++MARK);
1630 offset = SvIVx(*++MARK);
1634 if (!io || !IoIFP(io)) {
1636 SETERRNO(EBADF,RMS_IFI);
1639 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1640 buffer = SvPVutf8_force(bufsv, blen);
1641 /* UTF-8 may not have been set if they are all low bytes */
1646 buffer = SvPV_force(bufsv, blen);
1647 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1650 DIE(aTHX_ "Negative length");
1658 if (PL_op->op_type == OP_RECV) {
1659 Sock_size_t bufsize;
1660 char namebuf[MAXPATHLEN];
1661 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1662 bufsize = sizeof (struct sockaddr_in);
1664 bufsize = sizeof namebuf;
1666 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1670 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1671 /* 'offset' means 'flags' here */
1672 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1673 (struct sockaddr *)namebuf, &bufsize);
1676 /* MSG_TRUNC can give oversized count; quietly lose it */
1680 /* Bogus return without padding */
1681 bufsize = sizeof (struct sockaddr_in);
1683 SvCUR_set(bufsv, count);
1684 *SvEND(bufsv) = '\0';
1685 (void)SvPOK_only(bufsv);
1689 /* This should not be marked tainted if the fp is marked clean */
1690 if (!(IoFLAGS(io) & IOf_UNTAINT))
1691 SvTAINTED_on(bufsv);
1693 sv_setpvn(TARG, namebuf, bufsize);
1698 if (DO_UTF8(bufsv)) {
1699 /* offset adjust in characters not bytes */
1700 blen = sv_len_utf8(bufsv);
1703 if (-offset > (SSize_t)blen)
1704 DIE(aTHX_ "Offset outside string");
1707 if (DO_UTF8(bufsv)) {
1708 /* convert offset-as-chars to offset-as-bytes */
1709 if (offset >= (int)blen)
1710 offset += SvCUR(bufsv) - blen;
1712 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1715 orig_size = SvCUR(bufsv);
1716 /* Allocating length + offset + 1 isn't perfect in the case of reading
1717 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1719 (should be 2 * length + offset + 1, or possibly something longer if
1720 PL_encoding is true) */
1721 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1722 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1723 Zero(buffer+orig_size, offset-orig_size, char);
1725 buffer = buffer + offset;
1727 read_target = bufsv;
1729 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1730 concatenate it to the current buffer. */
1732 /* Truncate the existing buffer to the start of where we will be
1734 SvCUR_set(bufsv, offset);
1736 read_target = sv_newmortal();
1737 SvUPGRADE(read_target, SVt_PV);
1738 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1741 if (PL_op->op_type == OP_SYSREAD) {
1742 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1743 if (IoTYPE(io) == IoTYPE_SOCKET) {
1744 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1750 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1755 #ifdef HAS_SOCKET__bad_code_maybe
1756 if (IoTYPE(io) == IoTYPE_SOCKET) {
1757 Sock_size_t bufsize;
1758 char namebuf[MAXPATHLEN];
1759 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1760 bufsize = sizeof (struct sockaddr_in);
1762 bufsize = sizeof namebuf;
1764 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1765 (struct sockaddr *)namebuf, &bufsize);
1770 count = PerlIO_read(IoIFP(io), buffer, length);
1771 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1772 if (count == 0 && PerlIO_error(IoIFP(io)))
1776 if (IoTYPE(io) == IoTYPE_WRONLY)
1777 report_wrongway_fh(gv, '>');
1780 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1781 *SvEND(read_target) = '\0';
1782 (void)SvPOK_only(read_target);
1783 if (fp_utf8 && !IN_BYTES) {
1784 /* Look at utf8 we got back and count the characters */
1785 const char *bend = buffer + count;
1786 while (buffer < bend) {
1788 skip = UTF8SKIP(buffer);
1791 if (buffer - charskip + skip > bend) {
1792 /* partial character - try for rest of it */
1793 length = skip - (bend-buffer);
1794 offset = bend - SvPVX_const(bufsv);
1806 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1807 provided amount read (count) was what was requested (length)
1809 if (got < wanted && count == length) {
1810 length = wanted - got;
1811 offset = bend - SvPVX_const(bufsv);
1814 /* return value is character count */
1818 else if (buffer_utf8) {
1819 /* Let svcatsv upgrade the bytes we read in to utf8.
1820 The buffer is a mortal so will be freed soon. */
1821 sv_catsv_nomg(bufsv, read_target);
1824 /* This should not be marked tainted if the fp is marked clean */
1825 if (!(IoFLAGS(io) & IOf_UNTAINT))
1826 SvTAINTED_on(bufsv);
1838 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1843 STRLEN orig_blen_bytes;
1844 const int op_type = PL_op->op_type;
1847 GV *const gv = MUTABLE_GV(*++MARK);
1848 IO *const io = GvIO(gv);
1850 if (op_type == OP_SYSWRITE && io) {
1851 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1853 if (MARK == SP - 1) {
1855 mXPUSHi(sv_len(sv));
1859 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1860 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1870 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1872 if (io && IoIFP(io))
1873 report_wrongway_fh(gv, '<');
1876 SETERRNO(EBADF,RMS_IFI);
1880 /* Do this first to trigger any overloading. */
1881 buffer = SvPV_const(bufsv, blen);
1882 orig_blen_bytes = blen;
1883 doing_utf8 = DO_UTF8(bufsv);
1885 if (PerlIO_isutf8(IoIFP(io))) {
1886 if (!SvUTF8(bufsv)) {
1887 /* We don't modify the original scalar. */
1888 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1889 buffer = (char *) tmpbuf;
1893 else if (doing_utf8) {
1894 STRLEN tmplen = blen;
1895 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1898 buffer = (char *) tmpbuf;
1902 assert((char *)result == buffer);
1903 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1908 if (op_type == OP_SEND) {
1909 const int flags = SvIVx(*++MARK);
1912 char * const sockbuf = SvPVx(*++MARK, mlen);
1913 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1914 flags, (struct sockaddr *)sockbuf, mlen);
1918 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1924 Size_t length = 0; /* This length is in characters. */
1930 /* The SV is bytes, and we've had to upgrade it. */
1931 blen_chars = orig_blen_bytes;
1933 /* The SV really is UTF-8. */
1934 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1935 /* Don't call sv_len_utf8 again because it will call magic
1936 or overloading a second time, and we might get back a
1937 different result. */
1938 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1940 /* It's safe, and it may well be cached. */
1941 blen_chars = sv_len_utf8(bufsv);
1949 length = blen_chars;
1951 #if Size_t_size > IVSIZE
1952 length = (Size_t)SvNVx(*++MARK);
1954 length = (Size_t)SvIVx(*++MARK);
1956 if ((SSize_t)length < 0) {
1958 DIE(aTHX_ "Negative length");
1963 offset = SvIVx(*++MARK);
1965 if (-offset > (IV)blen_chars) {
1967 DIE(aTHX_ "Offset outside string");
1969 offset += blen_chars;
1970 } else if (offset > (IV)blen_chars) {
1972 DIE(aTHX_ "Offset outside string");
1976 if (length > blen_chars - offset)
1977 length = blen_chars - offset;
1979 /* Here we convert length from characters to bytes. */
1980 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1981 /* Either we had to convert the SV, or the SV is magical, or
1982 the SV has overloading, in which case we can't or mustn't
1983 or mustn't call it again. */
1985 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1986 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1988 /* It's a real UTF-8 SV, and it's not going to change under
1989 us. Take advantage of any cache. */
1991 I32 len_I32 = length;
1993 /* Convert the start and end character positions to bytes.
1994 Remember that the second argument to sv_pos_u2b is relative
1996 sv_pos_u2b(bufsv, &start, &len_I32);
2003 buffer = buffer+offset;
2005 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2006 if (IoTYPE(io) == IoTYPE_SOCKET) {
2007 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2013 /* See the note at doio.c:do_print about filesize limits. --jhi */
2014 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2023 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2026 #if Size_t_size > IVSIZE
2046 * in Perl 5.12 and later, the additional parameter is a bitmask:
2049 * 2 = eof() <- ARGV magic
2051 * I'll rely on the compiler's trace flow analysis to decide whether to
2052 * actually assign this out here, or punt it into the only block where it is
2053 * used. Doing it out here is DRY on the condition logic.
2058 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2064 if (PL_op->op_flags & OPf_SPECIAL) {
2065 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2069 gv = PL_last_in_gv; /* eof */
2077 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2078 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2081 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2082 if (io && !IoIFP(io)) {
2083 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2085 IoFLAGS(io) &= ~IOf_START;
2086 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2088 sv_setpvs(GvSV(gv), "-");
2090 GvSV(gv) = newSVpvs("-");
2091 SvSETMAGIC(GvSV(gv));
2093 else if (!nextargv(gv))
2098 PUSHs(boolSV(do_eof(gv)));
2108 if (MAXARG != 0 && (TOPs || POPs))
2109 PL_last_in_gv = MUTABLE_GV(POPs);
2116 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2118 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2123 SETERRNO(EBADF,RMS_IFI);
2128 #if LSEEKSIZE > IVSIZE
2129 PUSHn( do_tell(gv) );
2131 PUSHi( do_tell(gv) );
2139 const int whence = POPi;
2140 #if LSEEKSIZE > IVSIZE
2141 const Off_t offset = (Off_t)SvNVx(POPs);
2143 const Off_t offset = (Off_t)SvIVx(POPs);
2146 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2147 IO *const io = GvIO(gv);
2150 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2152 #if LSEEKSIZE > IVSIZE
2153 SV *const offset_sv = newSVnv((NV) offset);
2155 SV *const offset_sv = newSViv(offset);
2158 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2163 if (PL_op->op_type == OP_SEEK)
2164 PUSHs(boolSV(do_seek(gv, offset, whence)));
2166 const Off_t sought = do_sysseek(gv, offset, whence);
2168 PUSHs(&PL_sv_undef);
2170 SV* const sv = sought ?
2171 #if LSEEKSIZE > IVSIZE
2176 : newSVpvn(zero_but_true, ZBTLEN);
2187 /* There seems to be no consensus on the length type of truncate()
2188 * and ftruncate(), both off_t and size_t have supporters. In
2189 * general one would think that when using large files, off_t is
2190 * at least as wide as size_t, so using an off_t should be okay. */
2191 /* XXX Configure probe for the length type of *truncate() needed XXX */
2194 #if Off_t_size > IVSIZE
2199 /* Checking for length < 0 is problematic as the type might or
2200 * might not be signed: if it is not, clever compilers will moan. */
2201 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2204 SV * const sv = POPs;
2209 if ((tmpgv = PL_op->op_flags & OPf_SPECIAL
2210 ? gv_fetchsv(sv, 0, SVt_PVIO)
2211 : MAYBE_DEREF_GV(sv) )) {
2218 TAINT_PROPER("truncate");
2219 if (!(fp = IoIFP(io))) {
2225 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2227 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2233 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2234 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2235 goto do_ftruncate_io;
2238 const char * const name = SvPV_nomg_const_nolen(sv);
2239 TAINT_PROPER("truncate");
2241 if (truncate(name, len) < 0)
2245 const int tmpfd = PerlLIO_open(name, O_RDWR);
2250 if (my_chsize(tmpfd, len) < 0)
2252 PerlLIO_close(tmpfd);
2261 SETERRNO(EBADF,RMS_IFI);
2269 SV * const argsv = POPs;
2270 const unsigned int func = POPu;
2271 const int optype = PL_op->op_type;
2272 GV * const gv = MUTABLE_GV(POPs);
2273 IO * const io = gv ? GvIOn(gv) : NULL;
2277 if (!io || !argsv || !IoIFP(io)) {
2279 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2283 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2286 s = SvPV_force(argsv, len);
2287 need = IOCPARM_LEN(func);
2289 s = Sv_Grow(argsv, need + 1);
2290 SvCUR_set(argsv, need);
2293 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2296 retval = SvIV(argsv);
2297 s = INT2PTR(char*,retval); /* ouch */
2300 TAINT_PROPER(PL_op_desc[optype]);
2302 if (optype == OP_IOCTL)
2304 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2306 DIE(aTHX_ "ioctl is not implemented");
2310 DIE(aTHX_ "fcntl is not implemented");
2312 #if defined(OS2) && defined(__EMX__)
2313 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2315 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2319 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2321 if (s[SvCUR(argsv)] != 17)
2322 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2324 s[SvCUR(argsv)] = 0; /* put our null back */
2325 SvSETMAGIC(argsv); /* Assume it has changed */
2334 PUSHp(zero_but_true, ZBTLEN);
2345 const int argtype = POPi;
2346 GV * const gv = MUTABLE_GV(POPs);
2347 IO *const io = GvIO(gv);
2348 PerlIO *const fp = io ? IoIFP(io) : NULL;
2350 /* XXX Looks to me like io is always NULL at this point */
2352 (void)PerlIO_flush(fp);
2353 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2358 SETERRNO(EBADF,RMS_IFI);
2363 DIE(aTHX_ PL_no_func, "flock()");
2374 const int protocol = POPi;
2375 const int type = POPi;
2376 const int domain = POPi;
2377 GV * const gv = MUTABLE_GV(POPs);
2378 register IO * const io = gv ? GvIOn(gv) : NULL;
2383 if (io && IoIFP(io))
2384 do_close(gv, FALSE);
2385 SETERRNO(EBADF,LIB_INVARG);
2390 do_close(gv, FALSE);
2392 TAINT_PROPER("socket");
2393 fd = PerlSock_socket(domain, type, protocol);
2396 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2397 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2398 IoTYPE(io) = IoTYPE_SOCKET;
2399 if (!IoIFP(io) || !IoOFP(io)) {
2400 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2401 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2402 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2405 #if defined(HAS_FCNTL) && defined(F_SETFD)
2406 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2410 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2419 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2421 const int protocol = POPi;
2422 const int type = POPi;
2423 const int domain = POPi;
2424 GV * const gv2 = MUTABLE_GV(POPs);
2425 GV * const gv1 = MUTABLE_GV(POPs);
2426 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2427 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2431 report_evil_fh(gv1);
2433 report_evil_fh(gv2);
2435 if (io1 && IoIFP(io1))
2436 do_close(gv1, FALSE);
2437 if (io2 && IoIFP(io2))
2438 do_close(gv2, FALSE);
2443 TAINT_PROPER("socketpair");
2444 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2446 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2447 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2448 IoTYPE(io1) = IoTYPE_SOCKET;
2449 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2450 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2451 IoTYPE(io2) = IoTYPE_SOCKET;
2452 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2453 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2454 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2455 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2456 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2457 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2458 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2461 #if defined(HAS_FCNTL) && defined(F_SETFD)
2462 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2463 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2468 DIE(aTHX_ PL_no_sock_func, "socketpair");
2477 SV * const addrsv = POPs;
2478 /* OK, so on what platform does bind modify addr? */
2480 GV * const gv = MUTABLE_GV(POPs);
2481 register IO * const io = GvIOn(gv);
2483 const int op_type = PL_op->op_type;
2485 if (!io || !IoIFP(io))
2488 addr = SvPV_const(addrsv, len);
2489 TAINT_PROPER(PL_op_desc[op_type]);
2490 if ((op_type == OP_BIND
2491 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2492 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2500 SETERRNO(EBADF,SS_IVCHAN);
2507 const int backlog = POPi;
2508 GV * const gv = MUTABLE_GV(POPs);
2509 register IO * const io = gv ? GvIOn(gv) : NULL;
2511 if (!io || !IoIFP(io))
2514 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2521 SETERRNO(EBADF,SS_IVCHAN);
2530 char namebuf[MAXPATHLEN];
2531 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2532 Sock_size_t len = sizeof (struct sockaddr_in);
2534 Sock_size_t len = sizeof namebuf;
2536 GV * const ggv = MUTABLE_GV(POPs);
2537 GV * const ngv = MUTABLE_GV(POPs);
2546 if (!gstio || !IoIFP(gstio))
2550 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2553 /* Some platforms indicate zero length when an AF_UNIX client is
2554 * not bound. Simulate a non-zero-length sockaddr structure in
2556 namebuf[0] = 0; /* sun_len */
2557 namebuf[1] = AF_UNIX; /* sun_family */
2565 do_close(ngv, FALSE);
2566 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2567 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2568 IoTYPE(nstio) = IoTYPE_SOCKET;
2569 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2570 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2571 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2572 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2575 #if defined(HAS_FCNTL) && defined(F_SETFD)
2576 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2580 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2581 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2583 #ifdef __SCO_VERSION__
2584 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2587 PUSHp(namebuf, len);
2591 report_evil_fh(ggv);
2592 SETERRNO(EBADF,SS_IVCHAN);
2602 const int how = POPi;
2603 GV * const gv = MUTABLE_GV(POPs);
2604 register IO * const io = GvIOn(gv);
2606 if (!io || !IoIFP(io))
2609 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2614 SETERRNO(EBADF,SS_IVCHAN);
2621 const int optype = PL_op->op_type;
2622 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2623 const unsigned int optname = (unsigned int) POPi;
2624 const unsigned int lvl = (unsigned int) POPi;
2625 GV * const gv = MUTABLE_GV(POPs);
2626 register IO * const io = GvIOn(gv);
2630 if (!io || !IoIFP(io))
2633 fd = PerlIO_fileno(IoIFP(io));
2637 (void)SvPOK_only(sv);
2641 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2648 #if defined(__SYMBIAN32__)
2649 # define SETSOCKOPT_OPTION_VALUE_T void *
2651 # define SETSOCKOPT_OPTION_VALUE_T const char *
2653 /* XXX TODO: We need to have a proper type (a Configure probe,
2654 * etc.) for what the C headers think of the third argument of
2655 * setsockopt(), the option_value read-only buffer: is it
2656 * a "char *", or a "void *", const or not. Some compilers
2657 * don't take kindly to e.g. assuming that "char *" implicitly
2658 * promotes to a "void *", or to explicitly promoting/demoting
2659 * consts to non/vice versa. The "const void *" is the SUS
2660 * definition, but that does not fly everywhere for the above
2662 SETSOCKOPT_OPTION_VALUE_T buf;
2666 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2670 aint = (int)SvIV(sv);
2671 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2674 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2684 SETERRNO(EBADF,SS_IVCHAN);
2693 const int optype = PL_op->op_type;
2694 GV * const gv = MUTABLE_GV(POPs);
2695 register IO * const io = GvIOn(gv);
2700 if (!io || !IoIFP(io))
2703 sv = sv_2mortal(newSV(257));
2704 (void)SvPOK_only(sv);
2708 fd = PerlIO_fileno(IoIFP(io));
2710 case OP_GETSOCKNAME:
2711 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2714 case OP_GETPEERNAME:
2715 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2717 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2719 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";
2720 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2721 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2722 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2723 sizeof(u_short) + sizeof(struct in_addr))) {
2730 #ifdef BOGUS_GETNAME_RETURN
2731 /* Interactive Unix, getpeername() and getsockname()
2732 does not return valid namelen */
2733 if (len == BOGUS_GETNAME_RETURN)
2734 len = sizeof(struct sockaddr);
2743 SETERRNO(EBADF,SS_IVCHAN);
2762 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2763 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2764 if (PL_op->op_type == OP_LSTAT) {
2765 if (gv != PL_defgv) {
2766 do_fstat_warning_check:
2767 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2768 "lstat() on filehandle%s%"SVf,
2771 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2773 } else if (PL_laststype != OP_LSTAT)
2774 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2775 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2778 if (gv != PL_defgv) {
2782 PL_laststype = OP_STAT;
2783 PL_statgv = gv ? gv : (GV *)io;
2784 sv_setpvs(PL_statname, "");
2791 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2793 } else if (IoDIRP(io)) {
2795 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2798 PL_laststatval = -1;
2801 else PL_laststatval = -1;
2802 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2805 if (PL_laststatval < 0) {
2810 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2811 io = MUTABLE_IO(SvRV(sv));
2812 if (PL_op->op_type == OP_LSTAT)
2813 goto do_fstat_warning_check;
2814 goto do_fstat_have_io;
2817 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2819 PL_laststype = PL_op->op_type;
2820 if (PL_op->op_type == OP_LSTAT)
2821 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2823 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2824 if (PL_laststatval < 0) {
2825 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2826 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2832 if (gimme != G_ARRAY) {
2833 if (gimme != G_VOID)
2834 XPUSHs(boolSV(max));
2840 mPUSHi(PL_statcache.st_dev);
2841 #if ST_INO_SIZE > IVSIZE
2842 mPUSHn(PL_statcache.st_ino);
2844 # if ST_INO_SIGN <= 0
2845 mPUSHi(PL_statcache.st_ino);
2847 mPUSHu(PL_statcache.st_ino);
2850 mPUSHu(PL_statcache.st_mode);
2851 mPUSHu(PL_statcache.st_nlink);
2852 #if Uid_t_size > IVSIZE
2853 mPUSHn(PL_statcache.st_uid);
2855 # if Uid_t_sign <= 0
2856 mPUSHi(PL_statcache.st_uid);
2858 mPUSHu(PL_statcache.st_uid);
2861 #if Gid_t_size > IVSIZE
2862 mPUSHn(PL_statcache.st_gid);
2864 # if Gid_t_sign <= 0
2865 mPUSHi(PL_statcache.st_gid);
2867 mPUSHu(PL_statcache.st_gid);
2870 #ifdef USE_STAT_RDEV
2871 mPUSHi(PL_statcache.st_rdev);
2873 PUSHs(newSVpvs_flags("", SVs_TEMP));
2875 #if Off_t_size > IVSIZE
2876 mPUSHn(PL_statcache.st_size);
2878 mPUSHi(PL_statcache.st_size);
2881 mPUSHn(PL_statcache.st_atime);
2882 mPUSHn(PL_statcache.st_mtime);
2883 mPUSHn(PL_statcache.st_ctime);
2885 mPUSHi(PL_statcache.st_atime);
2886 mPUSHi(PL_statcache.st_mtime);
2887 mPUSHi(PL_statcache.st_ctime);
2889 #ifdef USE_STAT_BLOCKS
2890 mPUSHu(PL_statcache.st_blksize);
2891 mPUSHu(PL_statcache.st_blocks);
2893 PUSHs(newSVpvs_flags("", SVs_TEMP));
2894 PUSHs(newSVpvs_flags("", SVs_TEMP));
2900 /* If the next filetest is stacked up with this one
2901 (PL_op->op_private & OPpFT_STACKING), we leave
2902 the original argument on the stack for success,
2903 and skip the stacked operators on failure.
2904 The next few macros/functions take care of this.
2908 S_ft_stacking_return_false(pTHX_ SV *ret) {
2911 while (OP_IS_FILETEST(next->op_type)
2912 && next->op_private & OPpFT_STACKED)
2913 next = next->op_next;
2914 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2920 #define FT_RETURN_FALSE(X) \
2922 if (PL_op->op_private & OPpFT_STACKING) \
2923 return S_ft_stacking_return_false(aTHX_ X); \
2924 RETURNX(PL_op->op_flags & OPf_REF ? XPUSHs(X) : SETs(X)); \
2926 #define FT_RETURN_TRUE(X) \
2928 PL_op->op_flags & OPf_REF \
2930 PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (X) \
2932 : (PL_op->op_private & OPpFT_STACKING || SETs(X)) \
2935 #define FT_RETURNNO FT_RETURN_FALSE(&PL_sv_no)
2936 #define FT_RETURNUNDEF FT_RETURN_FALSE(&PL_sv_undef)
2937 #define FT_RETURNYES FT_RETURN_TRUE(&PL_sv_yes)
2939 #define tryAMAGICftest_MG(chr) STMT_START { \
2940 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2941 && PL_op->op_flags & OPf_KIDS) { \
2942 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2943 if (next) return next; \
2948 S_try_amagic_ftest(pTHX_ char chr) {
2951 SV* const arg = TOPs;
2954 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2958 const char tmpchr = chr;
2959 SV * const tmpsv = amagic_call(arg,
2960 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2961 ftest_amg, AMGf_unary);
2966 if (SvTRUE(tmpsv)) FT_RETURN_TRUE(tmpsv);
2967 FT_RETURN_FALSE(tmpsv);
2977 /* Not const, because things tweak this below. Not bool, because there's
2978 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2979 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2980 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2981 /* Giving some sort of initial value silences compilers. */
2983 int access_mode = R_OK;
2985 int access_mode = 0;
2988 /* access_mode is never used, but leaving use_access in makes the
2989 conditional compiling below much clearer. */
2992 Mode_t stat_mode = S_IRUSR;
2994 bool effective = FALSE;
2998 switch (PL_op->op_type) {
2999 case OP_FTRREAD: opchar = 'R'; break;
3000 case OP_FTRWRITE: opchar = 'W'; break;
3001 case OP_FTREXEC: opchar = 'X'; break;
3002 case OP_FTEREAD: opchar = 'r'; break;
3003 case OP_FTEWRITE: opchar = 'w'; break;
3004 case OP_FTEEXEC: opchar = 'x'; break;
3006 tryAMAGICftest_MG(opchar);
3008 switch (PL_op->op_type) {
3010 #if !(defined(HAS_ACCESS) && defined(R_OK))
3016 #if defined(HAS_ACCESS) && defined(W_OK)
3021 stat_mode = S_IWUSR;
3025 #if defined(HAS_ACCESS) && defined(X_OK)
3030 stat_mode = S_IXUSR;
3034 #ifdef PERL_EFF_ACCESS
3037 stat_mode = S_IWUSR;
3041 #ifndef PERL_EFF_ACCESS
3048 #ifdef PERL_EFF_ACCESS
3053 stat_mode = S_IXUSR;
3059 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3060 const char *name = TOPpx;
3062 # ifdef PERL_EFF_ACCESS
3063 result = PERL_EFF_ACCESS(name, access_mode);
3065 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3071 result = access(name, access_mode);
3073 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3084 result = my_stat_flags(0);
3087 if (cando(stat_mode, effective, &PL_statcache))
3096 const int op_type = PL_op->op_type;
3101 case OP_FTIS: opchar = 'e'; break;
3102 case OP_FTSIZE: opchar = 's'; break;
3103 case OP_FTMTIME: opchar = 'M'; break;
3104 case OP_FTCTIME: opchar = 'C'; break;
3105 case OP_FTATIME: opchar = 'A'; break;
3107 tryAMAGICftest_MG(opchar);
3109 result = my_stat_flags(0);
3112 if (op_type == OP_FTIS)
3115 /* You can't dTARGET inside OP_FTIS, because you'll get
3116 "panic: pad_sv po" - the op is not flagged to have a target. */
3120 #if Off_t_size > IVSIZE
3121 sv_setnv(TARG, (NV)PL_statcache.st_size);
3123 sv_setiv(TARG, (IV)PL_statcache.st_size);
3128 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3132 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3136 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3140 if (SvTRUE_nomg(TARG)) FT_RETURN_TRUE(TARG);
3141 else FT_RETURN_FALSE(TARG);
3152 switch (PL_op->op_type) {
3153 case OP_FTROWNED: opchar = 'O'; break;
3154 case OP_FTEOWNED: opchar = 'o'; break;
3155 case OP_FTZERO: opchar = 'z'; break;
3156 case OP_FTSOCK: opchar = 'S'; break;
3157 case OP_FTCHR: opchar = 'c'; break;
3158 case OP_FTBLK: opchar = 'b'; break;
3159 case OP_FTFILE: opchar = 'f'; break;
3160 case OP_FTDIR: opchar = 'd'; break;
3161 case OP_FTPIPE: opchar = 'p'; break;
3162 case OP_FTSUID: opchar = 'u'; break;
3163 case OP_FTSGID: opchar = 'g'; break;
3164 case OP_FTSVTX: opchar = 'k'; break;
3166 tryAMAGICftest_MG(opchar);
3168 /* I believe that all these three are likely to be defined on most every
3169 system these days. */
3171 if(PL_op->op_type == OP_FTSUID) {
3176 if(PL_op->op_type == OP_FTSGID) {
3181 if(PL_op->op_type == OP_FTSVTX) {
3186 result = my_stat_flags(0);
3189 switch (PL_op->op_type) {
3191 if (PL_statcache.st_uid == PerlProc_getuid())
3195 if (PL_statcache.st_uid == PerlProc_geteuid())
3199 if (PL_statcache.st_size == 0)
3203 if (S_ISSOCK(PL_statcache.st_mode))
3207 if (S_ISCHR(PL_statcache.st_mode))
3211 if (S_ISBLK(PL_statcache.st_mode))
3215 if (S_ISREG(PL_statcache.st_mode))
3219 if (S_ISDIR(PL_statcache.st_mode))
3223 if (S_ISFIFO(PL_statcache.st_mode))
3228 if (PL_statcache.st_mode & S_ISUID)
3234 if (PL_statcache.st_mode & S_ISGID)
3240 if (PL_statcache.st_mode & S_ISVTX)
3254 tryAMAGICftest_MG('l');
3255 result = my_lstat_flags(0);
3259 if (S_ISLNK(PL_statcache.st_mode))
3273 tryAMAGICftest_MG('t');
3275 if (PL_op->op_flags & OPf_REF)
3279 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3280 name = SvPV_nomg(tmpsv, namelen);
3281 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3285 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3286 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3287 else if (name && isDIGIT(*name))
3291 if (PerlLIO_isatty(fd))
3296 #if defined(atarist) /* this will work with atariST. Configure will
3297 make guesses for other systems. */
3298 # define FILE_base(f) ((f)->_base)
3299 # define FILE_ptr(f) ((f)->_ptr)
3300 # define FILE_cnt(f) ((f)->_cnt)
3301 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3312 register STDCHAR *s;
3314 register SV *sv = NULL;
3318 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3320 if (PL_op->op_flags & OPf_REF)
3322 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3327 gv = MAYBE_DEREF_GV_nomg(sv);
3331 if (gv == PL_defgv) {
3333 io = SvTYPE(PL_statgv) == SVt_PVIO
3337 goto really_filename;
3342 sv_setpvs(PL_statname, "");
3343 io = GvIO(PL_statgv);
3345 PL_laststatval = -1;
3346 PL_laststype = OP_STAT;
3347 if (io && IoIFP(io)) {
3348 if (! PerlIO_has_base(IoIFP(io)))
3349 DIE(aTHX_ "-T and -B not implemented on filehandles");
3350 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3351 if (PL_laststatval < 0)
3353 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3354 if (PL_op->op_type == OP_FTTEXT)
3359 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3360 i = PerlIO_getc(IoIFP(io));
3362 (void)PerlIO_ungetc(IoIFP(io),i);
3364 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3366 len = PerlIO_get_bufsiz(IoIFP(io));
3367 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3368 /* sfio can have large buffers - limit to 512 */
3373 SETERRNO(EBADF,RMS_IFI);
3375 SETERRNO(EBADF,RMS_IFI);
3380 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3383 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3385 PL_laststatval = -1;
3386 PL_laststype = OP_STAT;
3388 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3390 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3393 PL_laststype = OP_STAT;
3394 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3395 if (PL_laststatval < 0) {
3396 (void)PerlIO_close(fp);
3399 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3400 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3401 (void)PerlIO_close(fp);
3403 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3404 FT_RETURNNO; /* special case NFS directories */
3405 FT_RETURNYES; /* null file is anything */
3410 /* now scan s to look for textiness */
3411 /* XXX ASCII dependent code */
3413 #if defined(DOSISH) || defined(USEMYBINMODE)
3414 /* ignore trailing ^Z on short files */
3415 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3419 for (i = 0; i < len; i++, s++) {
3420 if (!*s) { /* null never allowed in text */
3425 else if (!(isPRINT(*s) || isSPACE(*s)))
3428 else if (*s & 128) {
3430 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3433 /* utf8 characters don't count as odd */
3434 if (UTF8_IS_START(*s)) {
3435 int ulen = UTF8SKIP(s);
3436 if (ulen < len - i) {
3438 for (j = 1; j < ulen; j++) {
3439 if (!UTF8_IS_CONTINUATION(s[j]))
3442 --ulen; /* loop does extra increment */
3452 *s != '\n' && *s != '\r' && *s != '\b' &&
3453 *s != '\t' && *s != '\f' && *s != 27)
3458 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3469 const char *tmps = NULL;
3473 SV * const sv = POPs;
3474 if (PL_op->op_flags & OPf_SPECIAL) {
3475 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3477 else if (!(gv = MAYBE_DEREF_GV(sv)))
3478 tmps = SvPV_nomg_const_nolen(sv);
3481 if( !gv && (!tmps || !*tmps) ) {
3482 HV * const table = GvHVn(PL_envgv);
3485 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3486 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3488 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3493 deprecate("chdir('') or chdir(undef) as chdir()");
3494 tmps = SvPV_nolen_const(*svp);
3498 TAINT_PROPER("chdir");
3503 TAINT_PROPER("chdir");
3506 IO* const io = GvIO(gv);
3509 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3510 } else if (IoIFP(io)) {
3511 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3515 SETERRNO(EBADF, RMS_IFI);
3521 SETERRNO(EBADF,RMS_IFI);
3525 DIE(aTHX_ PL_no_func, "fchdir");
3529 PUSHi( PerlDir_chdir(tmps) >= 0 );
3531 /* Clear the DEFAULT element of ENV so we'll get the new value
3533 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3540 dVAR; dSP; dMARK; dTARGET;
3541 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3552 char * const tmps = POPpx;
3553 TAINT_PROPER("chroot");
3554 PUSHi( chroot(tmps) >= 0 );
3557 DIE(aTHX_ PL_no_func, "chroot");
3565 const char * const tmps2 = POPpconstx;
3566 const char * const tmps = SvPV_nolen_const(TOPs);
3567 TAINT_PROPER("rename");
3569 anum = PerlLIO_rename(tmps, tmps2);
3571 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3572 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3575 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3576 (void)UNLINK(tmps2);
3577 if (!(anum = link(tmps, tmps2)))
3578 anum = UNLINK(tmps);
3586 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3590 const int op_type = PL_op->op_type;
3594 if (op_type == OP_LINK)
3595 DIE(aTHX_ PL_no_func, "link");
3597 # ifndef HAS_SYMLINK
3598 if (op_type == OP_SYMLINK)
3599 DIE(aTHX_ PL_no_func, "symlink");
3603 const char * const tmps2 = POPpconstx;
3604 const char * const tmps = SvPV_nolen_const(TOPs);
3605 TAINT_PROPER(PL_op_desc[op_type]);
3607 # if defined(HAS_LINK)
3608 # if defined(HAS_SYMLINK)
3609 /* Both present - need to choose which. */
3610 (op_type == OP_LINK) ?
3611 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3613 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3614 PerlLIO_link(tmps, tmps2);
3617 # if defined(HAS_SYMLINK)
3618 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3619 symlink(tmps, tmps2);
3624 SETi( result >= 0 );
3631 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3642 char buf[MAXPATHLEN];
3645 #ifndef INCOMPLETE_TAINTS
3649 len = readlink(tmps, buf, sizeof(buf) - 1);
3656 RETSETUNDEF; /* just pretend it's a normal file */
3660 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3662 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3664 char * const save_filename = filename;
3669 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3671 PERL_ARGS_ASSERT_DOONELINER;
3673 Newx(cmdline, size, char);
3674 my_strlcpy(cmdline, cmd, size);
3675 my_strlcat(cmdline, " ", size);
3676 for (s = cmdline + strlen(cmdline); *filename; ) {
3680 if (s - cmdline < size)
3681 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3682 myfp = PerlProc_popen(cmdline, "r");
3686 SV * const tmpsv = sv_newmortal();
3687 /* Need to save/restore 'PL_rs' ?? */
3688 s = sv_gets(tmpsv, myfp, 0);
3689 (void)PerlProc_pclose(myfp);
3693 #ifdef HAS_SYS_ERRLIST
3698 /* you don't see this */
3699 const char * const errmsg =
3700 #ifdef HAS_SYS_ERRLIST
3708 if (instr(s, errmsg)) {
3715 #define EACCES EPERM
3717 if (instr(s, "cannot make"))
3718 SETERRNO(EEXIST,RMS_FEX);
3719 else if (instr(s, "existing file"))
3720 SETERRNO(EEXIST,RMS_FEX);
3721 else if (instr(s, "ile exists"))
3722 SETERRNO(EEXIST,RMS_FEX);
3723 else if (instr(s, "non-exist"))
3724 SETERRNO(ENOENT,RMS_FNF);
3725 else if (instr(s, "does not exist"))
3726 SETERRNO(ENOENT,RMS_FNF);
3727 else if (instr(s, "not empty"))
3728 SETERRNO(EBUSY,SS_DEVOFFLINE);
3729 else if (instr(s, "cannot access"))
3730 SETERRNO(EACCES,RMS_PRV);
3732 SETERRNO(EPERM,RMS_PRV);
3735 else { /* some mkdirs return no failure indication */
3736 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3737 if (PL_op->op_type == OP_RMDIR)
3742 SETERRNO(EACCES,RMS_PRV); /* a guess */
3751 /* This macro removes trailing slashes from a directory name.
3752 * Different operating and file systems take differently to
3753 * trailing slashes. According to POSIX 1003.1 1996 Edition
3754 * any number of trailing slashes should be allowed.
3755 * Thusly we snip them away so that even non-conforming
3756 * systems are happy.
3757 * We should probably do this "filtering" for all
3758 * the functions that expect (potentially) directory names:
3759 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3760 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3762 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3763 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3766 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3767 (tmps) = savepvn((tmps), (len)); \
3777 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3779 TRIMSLASHES(tmps,len,copy);
3781 TAINT_PROPER("mkdir");
3783 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3787 SETi( dooneliner("mkdir", tmps) );
3788 oldumask = PerlLIO_umask(0);
3789 PerlLIO_umask(oldumask);
3790 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3805 TRIMSLASHES(tmps,len,copy);
3806 TAINT_PROPER("rmdir");
3808 SETi( PerlDir_rmdir(tmps) >= 0 );
3810 SETi( dooneliner("rmdir", tmps) );
3817 /* Directory calls. */
3821 #if defined(Direntry_t) && defined(HAS_READDIR)
3823 const char * const dirname = POPpconstx;
3824 GV * const gv = MUTABLE_GV(POPs);
3825 register IO * const io = GvIOn(gv);
3830 if ((IoIFP(io) || IoOFP(io)))
3831 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3832 "Opening filehandle %"HEKf" also as a directory",
3833 HEKfARG(GvENAME_HEK(gv)) );
3835 PerlDir_close(IoDIRP(io));
3836 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3842 SETERRNO(EBADF,RMS_DIR);
3845 DIE(aTHX_ PL_no_dir_func, "opendir");
3851 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3852 DIE(aTHX_ PL_no_dir_func, "readdir");
3854 #if !defined(I_DIRENT) && !defined(VMS)
3855 Direntry_t *readdir (DIR *);
3861 const I32 gimme = GIMME;
3862 GV * const gv = MUTABLE_GV(POPs);
3863 register const Direntry_t *dp;
3864 register IO * const io = GvIOn(gv);
3866 if (!io || !IoDIRP(io)) {
3867 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3868 "readdir() attempted on invalid dirhandle %"HEKf,
3869 HEKfARG(GvENAME_HEK(gv)));
3874 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3878 sv = newSVpvn(dp->d_name, dp->d_namlen);
3880 sv = newSVpv(dp->d_name, 0);
3882 #ifndef INCOMPLETE_TAINTS
3883 if (!(IoFLAGS(io) & IOf_UNTAINT))
3887 } while (gimme == G_ARRAY);
3889 if (!dp && gimme != G_ARRAY)
3896 SETERRNO(EBADF,RMS_ISI);
3897 if (GIMME == G_ARRAY)
3906 #if defined(HAS_TELLDIR) || defined(telldir)
3908 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3909 /* XXX netbsd still seemed to.
3910 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3911 --JHI 1999-Feb-02 */
3912 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3913 long telldir (DIR *);
3915 GV * const gv = MUTABLE_GV(POPs);
3916 register IO * const io = GvIOn(gv);
3918 if (!io || !IoDIRP(io)) {
3919 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3920 "telldir() attempted on invalid dirhandle %"HEKf,
3921 HEKfARG(GvENAME_HEK(gv)));
3925 PUSHi( PerlDir_tell(IoDIRP(io)) );
3929 SETERRNO(EBADF,RMS_ISI);
3932 DIE(aTHX_ PL_no_dir_func, "telldir");
3938 #if defined(HAS_SEEKDIR) || defined(seekdir)
3940 const long along = POPl;
3941 GV * const gv = MUTABLE_GV(POPs);
3942 register IO * const io = GvIOn(gv);
3944 if (!io || !IoDIRP(io)) {
3945 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3946 "seekdir() attempted on invalid dirhandle %"HEKf,
3947 HEKfARG(GvENAME_HEK(gv)));
3950 (void)PerlDir_seek(IoDIRP(io), along);
3955 SETERRNO(EBADF,RMS_ISI);
3958 DIE(aTHX_ PL_no_dir_func, "seekdir");
3964 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3966 GV * const gv = MUTABLE_GV(POPs);
3967 register IO * const io = GvIOn(gv);
3969 if (!io || !IoDIRP(io)) {
3970 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3971 "rewinddir() attempted on invalid dirhandle %"HEKf,
3972 HEKfARG(GvENAME_HEK(gv)));
3975 (void)PerlDir_rewind(IoDIRP(io));
3979 SETERRNO(EBADF,RMS_ISI);
3982 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3988 #if defined(Direntry_t) && defined(HAS_READDIR)
3990 GV * const gv = MUTABLE_GV(POPs);
3991 register IO * const io = GvIOn(gv);
3993 if (!io || !IoDIRP(io)) {
3994 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3995 "closedir() attempted on invalid dirhandle %"HEKf,
3996 HEKfARG(GvENAME_HEK(gv)));
3999 #ifdef VOID_CLOSEDIR
4000 PerlDir_close(IoDIRP(io));
4002 if (PerlDir_close(IoDIRP(io)) < 0) {
4003 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4012 SETERRNO(EBADF,RMS_IFI);
4015 DIE(aTHX_ PL_no_dir_func, "closedir");
4019 /* Process control. */
4026 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4027 sigset_t oldmask, newmask;
4031 PERL_FLUSHALL_FOR_CHILD;
4032 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4033 sigfillset(&newmask);
4034 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4036 childpid = PerlProc_fork();
4037 if (childpid == 0) {
4041 for (sig = 1; sig < SIG_SIZE; sig++)
4042 PL_psig_pend[sig] = 0;
4044 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4047 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4054 #ifdef PERL_USES_PL_PIDSTATUS
4055 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4061 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4066 PERL_FLUSHALL_FOR_CHILD;
4067 childpid = PerlProc_fork();
4073 DIE(aTHX_ PL_no_func, "fork");
4080 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4085 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4086 childpid = wait4pid(-1, &argflags, 0);
4088 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4093 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4094 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4095 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4097 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4102 DIE(aTHX_ PL_no_func, "wait");
4108 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4110 const int optype = POPi;
4111 const Pid_t pid = TOPi;
4115 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4116 result = wait4pid(pid, &argflags, optype);
4118 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4123 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4124 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4125 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4127 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4132 DIE(aTHX_ PL_no_func, "waitpid");
4138 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4139 #if defined(__LIBCATAMOUNT__)
4140 PL_statusvalue = -1;
4149 while (++MARK <= SP) {
4150 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4155 TAINT_PROPER("system");
4157 PERL_FLUSHALL_FOR_CHILD;
4158 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4163 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4164 sigset_t newset, oldset;
4167 if (PerlProc_pipe(pp) >= 0)
4169 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4170 sigemptyset(&newset);
4171 sigaddset(&newset, SIGCHLD);
4172 sigprocmask(SIG_BLOCK, &newset, &oldset);
4174 while ((childpid = PerlProc_fork()) == -1) {
4175 if (errno != EAGAIN) {
4180 PerlLIO_close(pp[0]);
4181 PerlLIO_close(pp[1]);
4183 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4184 sigprocmask(SIG_SETMASK, &oldset, NULL);
4191 Sigsave_t ihand,qhand; /* place to save signals during system() */
4195 PerlLIO_close(pp[1]);
4197 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4198 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4201 result = wait4pid(childpid, &status, 0);
4202 } while (result == -1 && errno == EINTR);
4204 #ifdef HAS_SIGPROCMASK
4205 sigprocmask(SIG_SETMASK, &oldset, NULL);
4207 (void)rsignal_restore(SIGINT, &ihand);
4208 (void)rsignal_restore(SIGQUIT, &qhand);
4210 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4211 do_execfree(); /* free any memory child malloced on fork */
4218 while (n < sizeof(int)) {
4219 n1 = PerlLIO_read(pp[0],
4220 (void*)(((char*)&errkid)+n),
4226 PerlLIO_close(pp[0]);
4227 if (n) { /* Error */
4228 if (n != sizeof(int))
4229 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4230 errno = errkid; /* Propagate errno from kid */
4231 STATUS_NATIVE_CHILD_SET(-1);
4234 XPUSHi(STATUS_CURRENT);
4237 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4238 sigprocmask(SIG_SETMASK, &oldset, NULL);
4241 PerlLIO_close(pp[0]);
4242 #if defined(HAS_FCNTL) && defined(F_SETFD)
4243 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4246 if (PL_op->op_flags & OPf_STACKED) {
4247 SV * const really = *++MARK;
4248 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4250 else if (SP - MARK != 1)
4251 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4253 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4257 #else /* ! FORK or VMS or OS/2 */
4260 if (PL_op->op_flags & OPf_STACKED) {
4261 SV * const really = *++MARK;
4262 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4263 value = (I32)do_aspawn(really, MARK, SP);
4265 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4268 else if (SP - MARK != 1) {
4269 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4270 value = (I32)do_aspawn(NULL, MARK, SP);
4272 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4276 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4278 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4280 STATUS_NATIVE_CHILD_SET(value);
4283 XPUSHi(result ? value : STATUS_CURRENT);
4284 #endif /* !FORK or VMS or OS/2 */
4291 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4296 while (++MARK <= SP) {
4297 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4302 TAINT_PROPER("exec");
4304 PERL_FLUSHALL_FOR_CHILD;
4305 if (PL_op->op_flags & OPf_STACKED) {
4306 SV * const really = *++MARK;
4307 value = (I32)do_aexec(really, MARK, SP);
4309 else if (SP - MARK != 1)
4311 value = (I32)vms_do_aexec(NULL, MARK, SP);
4315 (void ) do_aspawn(NULL, MARK, SP);
4319 value = (I32)do_aexec(NULL, MARK, SP);
4324 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4327 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4330 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4344 XPUSHi( getppid() );
4347 DIE(aTHX_ PL_no_func, "getppid");
4357 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4360 pgrp = (I32)BSD_GETPGRP(pid);
4362 if (pid != 0 && pid != PerlProc_getpid())
4363 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4369 DIE(aTHX_ PL_no_func, "getpgrp()");
4379 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4380 if (MAXARG > 0) pid = TOPs && TOPi;
4386 TAINT_PROPER("setpgrp");
4388 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4390 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4391 || (pid != 0 && pid != PerlProc_getpid()))
4393 DIE(aTHX_ "setpgrp can't take arguments");
4395 SETi( setpgrp() >= 0 );
4396 #endif /* USE_BSDPGRP */
4399 DIE(aTHX_ PL_no_func, "setpgrp()");
4403 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4404 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4406 # define PRIORITY_WHICH_T(which) which
4411 #ifdef HAS_GETPRIORITY
4413 const int who = POPi;
4414 const int which = TOPi;
4415 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4418 DIE(aTHX_ PL_no_func, "getpriority()");
4424 #ifdef HAS_SETPRIORITY
4426 const int niceval = POPi;
4427 const int who = POPi;
4428 const int which = TOPi;
4429 TAINT_PROPER("setpriority");
4430 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4433 DIE(aTHX_ PL_no_func, "setpriority()");
4437 #undef PRIORITY_WHICH_T
4445 XPUSHn( time(NULL) );
4447 XPUSHi( time(NULL) );
4459 (void)PerlProc_times(&PL_timesbuf);
4461 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4462 /* struct tms, though same data */
4466 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4467 if (GIMME == G_ARRAY) {
4468 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4469 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4470 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4478 if (GIMME == G_ARRAY) {
4485 DIE(aTHX_ "times not implemented");
4487 #endif /* HAS_TIMES */
4490 /* The 32 bit int year limits the times we can represent to these
4491 boundaries with a few days wiggle room to account for time zone
4494 /* Sat Jan 3 00:00:00 -2147481748 */
4495 #define TIME_LOWER_BOUND -67768100567755200.0
4496 /* Sun Dec 29 12:00:00 2147483647 */
4497 #define TIME_UPPER_BOUND 67767976233316800.0
4506 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4507 static const char * const dayname[] =
4508 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4509 static const char * const monname[] =
4510 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4511 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4513 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4516 when = (Time64_T)now;
4519 NV input = Perl_floor(POPn);
4520 when = (Time64_T)input;
4521 if (when != input) {
4522 /* diag_listed_as: gmtime(%f) too large */
4523 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4524 "%s(%.0" NVff ") too large", opname, input);
4528 if ( TIME_LOWER_BOUND > when ) {
4529 /* diag_listed_as: gmtime(%f) too small */
4530 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4531 "%s(%.0" NVff ") too small", opname, when);
4534 else if( when > TIME_UPPER_BOUND ) {
4535 /* diag_listed_as: gmtime(%f) too small */
4536 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4537 "%s(%.0" NVff ") too large", opname, when);
4541 if (PL_op->op_type == OP_LOCALTIME)
4542 err = S_localtime64_r(&when, &tmbuf);
4544 err = S_gmtime64_r(&when, &tmbuf);
4548 /* XXX %lld broken for quads */
4549 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4550 "%s(%.0" NVff ") failed", opname, when);
4553 if (GIMME != G_ARRAY) { /* scalar context */
4555 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4556 double year = (double)tmbuf.tm_year + 1900;
4563 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4564 dayname[tmbuf.tm_wday],
4565 monname[tmbuf.tm_mon],
4573 else { /* list context */
4579 mPUSHi(tmbuf.tm_sec);
4580 mPUSHi(tmbuf.tm_min);
4581 mPUSHi(tmbuf.tm_hour);
4582 mPUSHi(tmbuf.tm_mday);
4583 mPUSHi(tmbuf.tm_mon);
4584 mPUSHn(tmbuf.tm_year);
4585 mPUSHi(tmbuf.tm_wday);
4586 mPUSHi(tmbuf.tm_yday);
4587 mPUSHi(tmbuf.tm_isdst);
4598 anum = alarm((unsigned int)anum);
4604 DIE(aTHX_ PL_no_func, "alarm");
4615 (void)time(&lasttime);
4616 if (MAXARG < 1 || (!TOPs && !POPs))
4620 PerlProc_sleep((unsigned int)duration);
4623 XPUSHi(when - lasttime);
4627 /* Shared memory. */
4628 /* Merged with some message passing. */
4632 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4633 dVAR; dSP; dMARK; dTARGET;
4634 const int op_type = PL_op->op_type;
4639 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4642 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4645 value = (I32)(do_semop(MARK, SP) >= 0);
4648 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4656 return Perl_pp_semget(aTHX);
4664 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4665 dVAR; dSP; dMARK; dTARGET;
4666 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4673 DIE(aTHX_ "System V IPC is not implemented on this machine");
4679 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4680 dVAR; dSP; dMARK; dTARGET;
4681 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4689 PUSHp(zero_but_true, ZBTLEN);
4693 return Perl_pp_semget(aTHX);
4697 /* I can't const this further without getting warnings about the types of
4698 various arrays passed in from structures. */
4700 S_space_join_names_mortal(pTHX_ char *const *array)
4704 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4706 if (array && *array) {
4707 target = newSVpvs_flags("", SVs_TEMP);
4709 sv_catpv(target, *array);
4712 sv_catpvs(target, " ");
4715 target = sv_mortalcopy(&PL_sv_no);
4720 /* Get system info. */
4724 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4726 I32 which = PL_op->op_type;
4727 register char **elem;
4729 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4730 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4731 struct hostent *gethostbyname(Netdb_name_t);
4732 struct hostent *gethostent(void);
4734 struct hostent *hent = NULL;
4738 if (which == OP_GHBYNAME) {
4739 #ifdef HAS_GETHOSTBYNAME
4740 const char* const name = POPpbytex;
4741 hent = PerlSock_gethostbyname(name);
4743 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4746 else if (which == OP_GHBYADDR) {
4747 #ifdef HAS_GETHOSTBYADDR
4748 const int addrtype = POPi;
4749 SV * const addrsv = POPs;
4751 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4753 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4755 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4759 #ifdef HAS_GETHOSTENT
4760 hent = PerlSock_gethostent();
4762 DIE(aTHX_ PL_no_sock_func, "gethostent");
4765 #ifdef HOST_NOT_FOUND
4767 #ifdef USE_REENTRANT_API
4768 # ifdef USE_GETHOSTENT_ERRNO
4769 h_errno = PL_reentrant_buffer->_gethostent_errno;
4772 STATUS_UNIX_SET(h_errno);
4776 if (GIMME != G_ARRAY) {
4777 PUSHs(sv = sv_newmortal());
4779 if (which == OP_GHBYNAME) {
4781 sv_setpvn(sv, hent->h_addr, hent->h_length);
4784 sv_setpv(sv, (char*)hent->h_name);
4790 mPUSHs(newSVpv((char*)hent->h_name, 0));
4791 PUSHs(space_join_names_mortal(hent->h_aliases));
4792 mPUSHi(hent->h_addrtype);
4793 len = hent->h_length;
4796 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4797 mXPUSHp(*elem, len);
4801 mPUSHp(hent->h_addr, len);
4803 PUSHs(sv_mortalcopy(&PL_sv_no));
4808 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4814 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4816 I32 which = PL_op->op_type;
4818 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4819 struct netent *getnetbyaddr(Netdb_net_t, int);
4820 struct netent *getnetbyname(Netdb_name_t);
4821 struct netent *getnetent(void);
4823 struct netent *nent;
4825 if (which == OP_GNBYNAME){
4826 #ifdef HAS_GETNETBYNAME
4827 const char * const name = POPpbytex;
4828 nent = PerlSock_getnetbyname(name);
4830 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4833 else if (which == OP_GNBYADDR) {
4834 #ifdef HAS_GETNETBYADDR
4835 const int addrtype = POPi;
4836 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4837 nent = PerlSock_getnetbyaddr(addr, addrtype);
4839 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4843 #ifdef HAS_GETNETENT
4844 nent = PerlSock_getnetent();
4846 DIE(aTHX_ PL_no_sock_func, "getnetent");
4849 #ifdef HOST_NOT_FOUND
4851 #ifdef USE_REENTRANT_API
4852 # ifdef USE_GETNETENT_ERRNO
4853 h_errno = PL_reentrant_buffer->_getnetent_errno;
4856 STATUS_UNIX_SET(h_errno);
4861 if (GIMME != G_ARRAY) {
4862 PUSHs(sv = sv_newmortal());
4864 if (which == OP_GNBYNAME)
4865 sv_setiv(sv, (IV)nent->n_net);
4867 sv_setpv(sv, nent->n_name);
4873 mPUSHs(newSVpv(nent->n_name, 0));
4874 PUSHs(space_join_names_mortal(nent->n_aliases));
4875 mPUSHi(nent->n_addrtype);
4876 mPUSHi(nent->n_net);
4881 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4887 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4889 I32 which = PL_op->op_type;
4891 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4892 struct protoent *getprotobyname(Netdb_name_t);
4893 struct protoent *getprotobynumber(int);
4894 struct protoent *getprotoent(void);
4896 struct protoent *pent;
4898 if (which == OP_GPBYNAME) {
4899 #ifdef HAS_GETPROTOBYNAME
4900 const char* const name = POPpbytex;
4901 pent = PerlSock_getprotobyname(name);
4903 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4906 else if (which == OP_GPBYNUMBER) {
4907 #ifdef HAS_GETPROTOBYNUMBER
4908 const int number = POPi;
4909 pent = PerlSock_getprotobynumber(number);
4911 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4915 #ifdef HAS_GETPROTOENT
4916 pent = PerlSock_getprotoent();
4918 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4922 if (GIMME != G_ARRAY) {
4923 PUSHs(sv = sv_newmortal());
4925 if (which == OP_GPBYNAME)
4926 sv_setiv(sv, (IV)pent->p_proto);
4928 sv_setpv(sv, pent->p_name);
4934 mPUSHs(newSVpv(pent->p_name, 0));
4935 PUSHs(space_join_names_mortal(pent->p_aliases));
4936 mPUSHi(pent->p_proto);
4941 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4947 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4949 I32 which = PL_op->op_type;
4951 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4952 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4953 struct servent *getservbyport(int, Netdb_name_t);
4954 struct servent *getservent(void);
4956 struct servent *sent;
4958 if (which == OP_GSBYNAME) {
4959 #ifdef HAS_GETSERVBYNAME
4960 const char * const proto = POPpbytex;
4961 const char * const name = POPpbytex;
4962 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4964 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4967 else if (which == OP_GSBYPORT) {
4968 #ifdef HAS_GETSERVBYPORT
4969 const char * const proto = POPpbytex;
4970 unsigned short port = (unsigned short)POPu;
4972 port = PerlSock_htons(port);
4974 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4976 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4980 #ifdef HAS_GETSERVENT
4981 sent = PerlSock_getservent();
4983 DIE(aTHX_ PL_no_sock_func, "getservent");
4987 if (GIMME != G_ARRAY) {
4988 PUSHs(sv = sv_newmortal());
4990 if (which == OP_GSBYNAME) {
4992 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4994 sv_setiv(sv, (IV)(sent->s_port));
4998 sv_setpv(sv, sent->s_name);
5004 mPUSHs(newSVpv(sent->s_name, 0));
5005 PUSHs(space_join_names_mortal(sent->s_aliases));
5007 mPUSHi(PerlSock_ntohs(sent->s_port));
5009 mPUSHi(sent->s_port);
5011 mPUSHs(newSVpv(sent->s_proto, 0));
5016 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5023 const int stayopen = TOPi;
5024 switch(PL_op->op_type) {
5026 #ifdef HAS_SETHOSTENT
5027 PerlSock_sethostent(stayopen);
5029 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5032 #ifdef HAS_SETNETENT
5034 PerlSock_setnetent(stayopen);
5036 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5040 #ifdef HAS_SETPROTOENT
5041 PerlSock_setprotoent(stayopen);
5043 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5047 #ifdef HAS_SETSERVENT
5048 PerlSock_setservent(stayopen);
5050 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5060 switch(PL_op->op_type) {
5062 #ifdef HAS_ENDHOSTENT
5063 PerlSock_endhostent();
5065 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5069 #ifdef HAS_ENDNETENT
5070 PerlSock_endnetent();
5072 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5076 #ifdef HAS_ENDPROTOENT
5077 PerlSock_endprotoent();
5079 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5083 #ifdef HAS_ENDSERVENT
5084 PerlSock_endservent();
5086 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5090 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5093 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5097 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5100 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5104 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5107 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5111 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5114 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5126 I32 which = PL_op->op_type;
5128 struct passwd *pwent = NULL;
5130 * We currently support only the SysV getsp* shadow password interface.
5131 * The interface is declared in <shadow.h> and often one needs to link
5132 * with -lsecurity or some such.
5133 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5136 * AIX getpwnam() is clever enough to return the encrypted password
5137 * only if the caller (euid?) is root.
5139 * There are at least three other shadow password APIs. Many platforms
5140 * seem to contain more than one interface for accessing the shadow
5141 * password databases, possibly for compatibility reasons.
5142 * The getsp*() is by far he simplest one, the other two interfaces
5143 * are much more complicated, but also very similar to each other.
5148 * struct pr_passwd *getprpw*();
5149 * The password is in
5150 * char getprpw*(...).ufld.fd_encrypt[]
5151 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5156 * struct es_passwd *getespw*();
5157 * The password is in
5158 * char *(getespw*(...).ufld.fd_encrypt)
5159 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5162 * struct userpw *getuserpw();
5163 * The password is in
5164 * char *(getuserpw(...)).spw_upw_passwd
5165 * (but the de facto standard getpwnam() should work okay)
5167 * Mention I_PROT here so that Configure probes for it.
5169 * In HP-UX for getprpw*() the manual page claims that one should include
5170 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5171 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5172 * and pp_sys.c already includes <shadow.h> if there is such.
5174 * Note that <sys/security.h> is already probed for, but currently
5175 * it is only included in special cases.
5177 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5178 * be preferred interface, even though also the getprpw*() interface
5179 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5180 * One also needs to call set_auth_parameters() in main() before
5181 * doing anything else, whether one is using getespw*() or getprpw*().
5183 * Note that accessing the shadow databases can be magnitudes
5184 * slower than accessing the standard databases.
5189 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5190 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5191 * the pw_comment is left uninitialized. */
5192 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5198 const char* const name = POPpbytex;
5199 pwent = getpwnam(name);
5205 pwent = getpwuid(uid);
5209 # ifdef HAS_GETPWENT
5211 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5212 if (pwent) pwent = getpwnam(pwent->pw_name);
5215 DIE(aTHX_ PL_no_func, "getpwent");
5221 if (GIMME != G_ARRAY) {
5222 PUSHs(sv = sv_newmortal());
5224 if (which == OP_GPWNAM)
5225 # if Uid_t_sign <= 0
5226 sv_setiv(sv, (IV)pwent->pw_uid);
5228 sv_setuv(sv, (UV)pwent->pw_uid);
5231 sv_setpv(sv, pwent->pw_name);
5237 mPUSHs(newSVpv(pwent->pw_name, 0));
5241 /* If we have getspnam(), we try to dig up the shadow
5242 * password. If we are underprivileged, the shadow
5243 * interface will set the errno to EACCES or similar,
5244 * and return a null pointer. If this happens, we will
5245 * use the dummy password (usually "*" or "x") from the
5246 * standard password database.
5248 * In theory we could skip the shadow call completely
5249 * if euid != 0 but in practice we cannot know which
5250 * security measures are guarding the shadow databases
5251 * on a random platform.
5253 * Resist the urge to use additional shadow interfaces.
5254 * Divert the urge to writing an extension instead.
5257 /* Some AIX setups falsely(?) detect some getspnam(), which
5258 * has a different API than the Solaris/IRIX one. */
5259 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5262 const struct spwd * const spwent = getspnam(pwent->pw_name);
5263 /* Save and restore errno so that
5264 * underprivileged attempts seem
5265 * to have never made the unsuccessful
5266 * attempt to retrieve the shadow password. */
5268 if (spwent && spwent->sp_pwdp)
5269 sv_setpv(sv, spwent->sp_pwdp);
5273 if (!SvPOK(sv)) /* Use the standard password, then. */
5274 sv_setpv(sv, pwent->pw_passwd);
5277 # ifndef INCOMPLETE_TAINTS
5278 /* passwd is tainted because user himself can diddle with it.
5279 * admittedly not much and in a very limited way, but nevertheless. */
5283 # if Uid_t_sign <= 0
5284 mPUSHi(pwent->pw_uid);
5286 mPUSHu(pwent->pw_uid);
5289 # if Uid_t_sign <= 0
5290 mPUSHi(pwent->pw_gid);
5292 mPUSHu(pwent->pw_gid);
5294 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5295 * because of the poor interface of the Perl getpw*(),
5296 * not because there's some standard/convention saying so.
5297 * A better interface would have been to return a hash,
5298 * but we are accursed by our history, alas. --jhi. */
5300 mPUSHi(pwent->pw_change);
5303 mPUSHi(pwent->pw_quota);
5306 mPUSHs(newSVpv(pwent->pw_age, 0));
5308 /* I think that you can never get this compiled, but just in case. */
5309 PUSHs(sv_mortalcopy(&PL_sv_no));
5314 /* pw_class and pw_comment are mutually exclusive--.
5315 * see the above note for pw_change, pw_quota, and pw_age. */
5317 mPUSHs(newSVpv(pwent->pw_class, 0));
5320 mPUSHs(newSVpv(pwent->pw_comment, 0));
5322 /* I think that you can never get this compiled, but just in case. */
5323 PUSHs(sv_mortalcopy(&PL_sv_no));
5328 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5330 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5332 # ifndef INCOMPLETE_TAINTS
5333 /* pw_gecos is tainted because user himself can diddle with it. */
5337 mPUSHs(newSVpv(pwent->pw_dir, 0));
5339 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5340 # ifndef INCOMPLETE_TAINTS
5341 /* pw_shell is tainted because user himself can diddle with it. */
5346 mPUSHi(pwent->pw_expire);
5351 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5359 const I32 which = PL_op->op_type;
5360 const struct group *grent;
5362 if (which == OP_GGRNAM) {
5363 const char* const name = POPpbytex;
5364 grent = (const struct group *)getgrnam(name);
5366 else if (which == OP_GGRGID) {
5367 const Gid_t gid = POPi;
5368 grent = (const struct group *)getgrgid(gid);
5372 grent = (struct group *)getgrent();
5374 DIE(aTHX_ PL_no_func, "getgrent");
5378 if (GIMME != G_ARRAY) {
5379 SV * const sv = sv_newmortal();
5383 if (which == OP_GGRNAM)
5385 sv_setiv(sv, (IV)grent->gr_gid);
5387 sv_setuv(sv, (UV)grent->gr_gid);
5390 sv_setpv(sv, grent->gr_name);
5396 mPUSHs(newSVpv(grent->gr_name, 0));
5399 mPUSHs(newSVpv(grent->gr_passwd, 0));
5401 PUSHs(sv_mortalcopy(&PL_sv_no));
5405 mPUSHi(grent->gr_gid);
5407 mPUSHu(grent->gr_gid);
5410 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5411 /* In UNICOS/mk (_CRAYMPP) the multithreading
5412 * versions (getgrnam_r, getgrgid_r)
5413 * seem to return an illegal pointer
5414 * as the group members list, gr_mem.
5415 * getgrent() doesn't even have a _r version
5416 * but the gr_mem is poisonous anyway.
5417 * So yes, you cannot get the list of group
5418 * members if building multithreaded in UNICOS/mk. */
5419 PUSHs(space_join_names_mortal(grent->gr_mem));
5425 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5435 if (!(tmps = PerlProc_getlogin()))
5437 sv_setpv_mg(TARG, tmps);
5441 DIE(aTHX_ PL_no_func, "getlogin");
5445 /* Miscellaneous. */
5450 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5451 register I32 items = SP - MARK;
5452 unsigned long a[20];
5457 while (++MARK <= SP) {
5458 if (SvTAINTED(*MARK)) {
5464 TAINT_PROPER("syscall");
5467 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5468 * or where sizeof(long) != sizeof(char*). But such machines will
5469 * not likely have syscall implemented either, so who cares?
5471 while (++MARK <= SP) {
5472 if (SvNIOK(*MARK) || !i)
5473 a[i++] = SvIV(*MARK);
5474 else if (*MARK == &PL_sv_undef)
5477 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5483 DIE(aTHX_ "Too many args to syscall");
5485 DIE(aTHX_ "Too few args to syscall");
5487 retval = syscall(a[0]);
5490 retval = syscall(a[0],a[1]);
5493 retval = syscall(a[0],a[1],a[2]);
5496 retval = syscall(a[0],a[1],a[2],a[3]);
5499 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5502 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5505 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5508 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5512 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5515 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5518 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5522 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5526 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5530 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5531 a[10],a[11],a[12],a[13]);
5533 #endif /* atarist */
5539 DIE(aTHX_ PL_no_func, "syscall");
5543 #ifdef FCNTL_EMULATE_FLOCK
5545 /* XXX Emulate flock() with fcntl().
5546 What's really needed is a good file locking module.
5550 fcntl_emulate_flock(int fd, int operation)
5555 switch (operation & ~LOCK_NB) {
5557 flock.l_type = F_RDLCK;
5560 flock.l_type = F_WRLCK;
5563 flock.l_type = F_UNLCK;
5569 flock.l_whence = SEEK_SET;
5570 flock.l_start = flock.l_len = (Off_t)0;
5572 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5573 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5574 errno = EWOULDBLOCK;
5578 #endif /* FCNTL_EMULATE_FLOCK */
5580 #ifdef LOCKF_EMULATE_FLOCK
5582 /* XXX Emulate flock() with lockf(). This is just to increase
5583 portability of scripts. The calls are not completely
5584 interchangeable. What's really needed is a good file
5588 /* The lockf() constants might have been defined in <unistd.h>.
5589 Unfortunately, <unistd.h> causes troubles on some mixed
5590 (BSD/POSIX) systems, such as SunOS 4.1.3.
5592 Further, the lockf() constants aren't POSIX, so they might not be
5593 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5594 just stick in the SVID values and be done with it. Sigh.
5598 # define F_ULOCK 0 /* Unlock a previously locked region */
5601 # define F_LOCK 1 /* Lock a region for exclusive use */
5604 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5607 # define F_TEST 3 /* Test a region for other processes locks */
5611 lockf_emulate_flock(int fd, int operation)
5617 /* flock locks entire file so for lockf we need to do the same */
5618 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5619 if (pos > 0) /* is seekable and needs to be repositioned */
5620 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5621 pos = -1; /* seek failed, so don't seek back afterwards */
5624 switch (operation) {
5626 /* LOCK_SH - get a shared lock */
5628 /* LOCK_EX - get an exclusive lock */
5630 i = lockf (fd, F_LOCK, 0);
5633 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5634 case LOCK_SH|LOCK_NB:
5635 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5636 case LOCK_EX|LOCK_NB:
5637 i = lockf (fd, F_TLOCK, 0);
5639 if ((errno == EAGAIN) || (errno == EACCES))
5640 errno = EWOULDBLOCK;
5643 /* LOCK_UN - unlock (non-blocking is a no-op) */
5645 case LOCK_UN|LOCK_NB:
5646 i = lockf (fd, F_ULOCK, 0);
5649 /* Default - can't decipher operation */
5656 if (pos > 0) /* need to restore position of the handle */
5657 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5662 #endif /* LOCKF_EMULATE_FLOCK */
5666 * c-indentation-style: bsd
5668 * indent-tabs-mode: nil
5671 * ex: set ts=8 sts=4 sw=4 et: