This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Negation of "-e1" no more todo.
[perl5.git] / pp_sys.c
... / ...
CommitLineData
1/* pp_sys.c
2 *
3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5 *
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.
8 *
9 */
10
11/*
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.
16 *
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
18 */
19
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.
25 *
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
27 */
28
29#include "EXTERN.h"
30#define PERL_IN_PP_SYS_C
31#include "perl.h"
32#include "time64.h"
33#include "time64.c"
34
35#ifdef I_SHADOW
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.
39 *
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
42 *
43 * --jhi */
44# ifdef __hpux__
45/* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
47# undef MAXINT
48# endif
49# include <shadow.h>
50#endif
51
52#ifdef I_SYS_RESOURCE
53# include <sys/resource.h>
54#endif
55
56#ifdef NETWARE
57NETDB_DEFINE_CONTEXT
58#endif
59
60#ifdef HAS_SELECT
61# ifdef I_SYS_SELECT
62# include <sys/select.h>
63# endif
64#endif
65
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>.
72*/
73#if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
74extern int h_errno;
75#endif
76
77#ifdef HAS_PASSWD
78# ifdef I_PWD
79# include <pwd.h>
80# else
81# if !defined(VMS)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
84# endif
85# endif
86# ifdef HAS_GETPWENT
87#ifndef getpwent
88 struct passwd *getpwent (void);
89#elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
91#endif
92# endif
93#endif
94
95#ifdef HAS_GROUP
96# ifdef I_GRP
97# include <grp.h>
98# else
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
101# endif
102# ifdef HAS_GETGRENT
103#ifndef getgrent
104 struct group *getgrent (void);
105#endif
106# endif
107#endif
108
109#ifdef I_UTIME
110# if defined(_MSC_VER) || defined(__MINGW32__)
111# include <sys/utime.h>
112# else
113# include <utime.h>
114# endif
115#endif
116
117#ifdef HAS_CHSIZE
118# ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
119# undef my_chsize
120# endif
121# define my_chsize PerlLIO_chsize
122#else
123# ifdef HAS_TRUNCATE
124# define my_chsize PerlLIO_chsize
125# else
126I32 my_chsize(int fd, Off_t length);
127# endif
128#endif
129
130#ifdef HAS_FLOCK
131# define FLOCK flock
132#else /* no flock() */
133
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)
139# include <fcntl.h>
140# endif
141
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,...) */
146# ifdef HAS_LOCKF
147# define FLOCK lockf_emulate_flock
148# define LOCKF_EMULATE_FLOCK
149# endif /* lockf */
150# endif /* no flock() or fcntl(F_SETLK,...) */
151
152# ifdef FLOCK
153 static int FLOCK (int, int);
154
155 /*
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
158 */
159# ifndef LOCK_SH
160# define LOCK_SH 1
161# endif
162# ifndef LOCK_EX
163# define LOCK_EX 2
164# endif
165# ifndef LOCK_NB
166# define LOCK_NB 4
167# endif
168# ifndef LOCK_UN
169# define LOCK_UN 8
170# endif
171# endif /* emulating flock() */
172
173#endif /* no flock() */
174
175#define ZBTLEN 10
176static const char zero_but_true[ZBTLEN + 1] = "0 but true";
177
178#if defined(I_SYS_ACCESS) && !defined(R_OK)
179# include <sys/access.h>
180#endif
181
182#include "reentr.h"
183
184#ifdef __Lynx__
185/* Missing protos on LynxOS */
186void sethostent(int);
187void endhostent(void);
188void setnetent(int);
189void endnetent(void);
190void setprotoent(int);
191void endprotoent(void);
192void setservent(int);
193void endservent(void);
194#endif
195
196#undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
197
198/* F_OK unused: if stat() cannot find it... */
199
200#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
201 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
202# define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
203#endif
204
205#if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
206# ifdef I_SYS_SECURITY
207# include <sys/security.h>
208# endif
209# ifdef ACC_SELF
210 /* HP SecureWare */
211# define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
212# else
213 /* SCO */
214# define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
215# endif
216#endif
217
218#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
219 /* AIX */
220# define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
221#endif
222
223
224#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
225 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
226 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
227/* The Hard Way. */
228STATIC int
229S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
230{
231 const Uid_t ruid = getuid();
232 const Uid_t euid = geteuid();
233 const Gid_t rgid = getgid();
234 const Gid_t egid = getegid();
235 int res;
236
237#if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
238 Perl_croak(aTHX_ "switching effective uid is not implemented");
239#else
240#ifdef HAS_SETREUID
241 if (setreuid(euid, ruid))
242#else
243#ifdef HAS_SETRESUID
244 if (setresuid(euid, ruid, (Uid_t)-1))
245#endif
246#endif
247 /* diag_listed_as: entering effective %s failed */
248 Perl_croak(aTHX_ "entering effective uid failed");
249#endif
250
251#if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
252 Perl_croak(aTHX_ "switching effective gid is not implemented");
253#else
254#ifdef HAS_SETREGID
255 if (setregid(egid, rgid))
256#else
257#ifdef HAS_SETRESGID
258 if (setresgid(egid, rgid, (Gid_t)-1))
259#endif
260#endif
261 /* diag_listed_as: entering effective %s failed */
262 Perl_croak(aTHX_ "entering effective gid failed");
263#endif
264
265 res = access(path, mode);
266
267#ifdef HAS_SETREUID
268 if (setreuid(ruid, euid))
269#else
270#ifdef HAS_SETRESUID
271 if (setresuid(ruid, euid, (Uid_t)-1))
272#endif
273#endif
274 /* diag_listed_as: leaving effective %s failed */
275 Perl_croak(aTHX_ "leaving effective uid failed");
276
277#ifdef HAS_SETREGID
278 if (setregid(rgid, egid))
279#else
280#ifdef HAS_SETRESGID
281 if (setresgid(rgid, egid, (Gid_t)-1))
282#endif
283#endif
284 /* diag_listed_as: leaving effective %s failed */
285 Perl_croak(aTHX_ "leaving effective gid failed");
286
287 return res;
288}
289# define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
290#endif
291
292PP(pp_backtick)
293{
294 dSP; dTARGET;
295 PerlIO *fp;
296 const char * const tmps = POPpconstx;
297 const I32 gimme = GIMME_V;
298 const char *mode = "r";
299
300 TAINT_PROPER("``");
301 if (PL_op->op_private & OPpOPEN_IN_RAW)
302 mode = "rb";
303 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
304 mode = "rt";
305 fp = PerlProc_popen(tmps, mode);
306 if (fp) {
307 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
308 if (type && *type)
309 PerlIO_apply_layers(aTHX_ fp,mode,type);
310
311 if (gimme == G_VOID) {
312 char tmpbuf[256];
313 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
314 NOOP;
315 }
316 else if (gimme == G_SCALAR) {
317 ENTER_with_name("backtick");
318 SAVESPTR(PL_rs);
319 PL_rs = &PL_sv_undef;
320 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
321 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
322 NOOP;
323 LEAVE_with_name("backtick");
324 XPUSHs(TARG);
325 SvTAINTED_on(TARG);
326 }
327 else {
328 for (;;) {
329 SV * const sv = newSV(79);
330 if (sv_gets(sv, fp, 0) == NULL) {
331 SvREFCNT_dec(sv);
332 break;
333 }
334 mXPUSHs(sv);
335 if (SvLEN(sv) - SvCUR(sv) > 20) {
336 SvPV_shrink_to_cur(sv);
337 }
338 SvTAINTED_on(sv);
339 }
340 }
341 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
342 TAINT; /* "I believe that this is not gratuitous!" */
343 }
344 else {
345 STATUS_NATIVE_CHILD_SET(-1);
346 if (gimme == G_SCALAR)
347 RETPUSHUNDEF;
348 }
349
350 RETURN;
351}
352
353PP(pp_glob)
354{
355 OP *result;
356 dSP;
357 GV * const gv = (PL_op->op_flags & OPf_SPECIAL) ? NULL : (GV *)POPs;
358
359 PUTBACK;
360
361 /* make a copy of the pattern if it is gmagical, to ensure that magic
362 * is called once and only once */
363 if (SvGMAGICAL(TOPs)) TOPs = sv_2mortal(newSVsv(TOPs));
364
365 tryAMAGICunTARGETlist(iter_amg, (PL_op->op_flags & OPf_SPECIAL));
366
367 if (PL_op->op_flags & OPf_SPECIAL) {
368 /* call Perl-level glob function instead. Stack args are:
369 * MARK, wildcard
370 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
371 * */
372 return NORMAL;
373 }
374 if (PL_globhook) {
375 PL_globhook(aTHX);
376 return NORMAL;
377 }
378
379 /* Note that we only ever get here if File::Glob fails to load
380 * without at the same time croaking, for some reason, or if
381 * perl was built with PERL_EXTERNAL_GLOB */
382
383 ENTER_with_name("glob");
384
385#ifndef VMS
386 if (TAINTING_get) {
387 /*
388 * The external globbing program may use things we can't control,
389 * so for security reasons we must assume the worst.
390 */
391 TAINT;
392 taint_proper(PL_no_security, "glob");
393 }
394#endif /* !VMS */
395
396 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
397 PL_last_in_gv = gv;
398
399 SAVESPTR(PL_rs); /* This is not permanent, either. */
400 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
401#ifndef DOSISH
402#ifndef CSH
403 *SvPVX(PL_rs) = '\n';
404#endif /* !CSH */
405#endif /* !DOSISH */
406
407 result = do_readline();
408 LEAVE_with_name("glob");
409 return result;
410}
411
412PP(pp_rcatline)
413{
414 PL_last_in_gv = cGVOP_gv;
415 return do_readline();
416}
417
418PP(pp_warn)
419{
420 dSP; dMARK;
421 SV *exsv;
422 STRLEN len;
423 if (SP - MARK > 1) {
424 dTARGET;
425 do_join(TARG, &PL_sv_no, MARK, SP);
426 exsv = TARG;
427 SP = MARK + 1;
428 }
429 else if (SP == MARK) {
430 exsv = &PL_sv_no;
431 EXTEND(SP, 1);
432 SP = MARK + 1;
433 }
434 else {
435 exsv = TOPs;
436 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
437 }
438
439 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
440 /* well-formed exception supplied */
441 }
442 else {
443 SV * const errsv = ERRSV;
444 SvGETMAGIC(errsv);
445 if (SvROK(errsv)) {
446 if (SvGMAGICAL(errsv)) {
447 exsv = sv_newmortal();
448 sv_setsv_nomg(exsv, errsv);
449 }
450 else exsv = errsv;
451 }
452 else if (SvPOKp(errsv) ? SvCUR(errsv) : SvNIOKp(errsv)) {
453 exsv = sv_newmortal();
454 sv_setsv_nomg(exsv, errsv);
455 sv_catpvs(exsv, "\t...caught");
456 }
457 else {
458 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
459 }
460 }
461 if (SvROK(exsv) && !PL_warnhook)
462 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
463 else warn_sv(exsv);
464 RETSETYES;
465}
466
467PP(pp_die)
468{
469 dSP; dMARK;
470 SV *exsv;
471 STRLEN len;
472#ifdef VMS
473 VMSISH_HUSHED =
474 VMSISH_HUSHED || (PL_curcop->op_private & OPpHUSH_VMSISH);
475#endif
476 if (SP - MARK != 1) {
477 dTARGET;
478 do_join(TARG, &PL_sv_no, MARK, SP);
479 exsv = TARG;
480 SP = MARK + 1;
481 }
482 else {
483 exsv = TOPs;
484 }
485
486 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
487 /* well-formed exception supplied */
488 }
489 else {
490 SV * const errsv = ERRSV;
491 SvGETMAGIC(errsv);
492 if (SvROK(errsv)) {
493 exsv = errsv;
494 if (sv_isobject(exsv)) {
495 HV * const stash = SvSTASH(SvRV(exsv));
496 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
497 if (gv) {
498 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
499 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
500 EXTEND(SP, 3);
501 PUSHMARK(SP);
502 PUSHs(exsv);
503 PUSHs(file);
504 PUSHs(line);
505 PUTBACK;
506 call_sv(MUTABLE_SV(GvCV(gv)),
507 G_SCALAR|G_EVAL|G_KEEPERR);
508 exsv = sv_mortalcopy(*PL_stack_sp--);
509 }
510 }
511 }
512 else if (SvPOK(errsv) && SvCUR(errsv)) {
513 exsv = sv_mortalcopy(errsv);
514 sv_catpvs(exsv, "\t...propagated");
515 }
516 else {
517 exsv = newSVpvs_flags("Died", SVs_TEMP);
518 }
519 }
520 die_sv(exsv);
521 NOT_REACHED; /* NOTREACHED */
522 return NULL; /* avoid missing return from non-void function warning */
523}
524
525/* I/O. */
526
527OP *
528Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv,
529 const MAGIC *const mg, const U32 flags, U32 argc, ...)
530{
531 SV **orig_sp = sp;
532 I32 ret_args;
533
534 PERL_ARGS_ASSERT_TIED_METHOD;
535
536 /* Ensure that our flag bits do not overlap. */
537 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
538 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
539 assert((TIED_METHOD_SAY & G_WANT) == 0);
540
541 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
542 PUSHSTACKi(PERLSI_MAGIC);
543 EXTEND(SP, argc+1); /* object + args */
544 PUSHMARK(sp);
545 PUSHs(SvTIED_obj(sv, mg));
546 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
547 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
548 sp += argc;
549 }
550 else if (argc) {
551 const U32 mortalize_not_needed
552 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
553 va_list args;
554 va_start(args, argc);
555 do {
556 SV *const arg = va_arg(args, SV *);
557 if(mortalize_not_needed)
558 PUSHs(arg);
559 else
560 mPUSHs(arg);
561 } while (--argc);
562 va_end(args);
563 }
564
565 PUTBACK;
566 ENTER_with_name("call_tied_method");
567 if (flags & TIED_METHOD_SAY) {
568 /* local $\ = "\n" */
569 SAVEGENERICSV(PL_ors_sv);
570 PL_ors_sv = newSVpvs("\n");
571 }
572 ret_args = call_sv(methname, (flags & G_WANT)|G_METHOD_NAMED);
573 SPAGAIN;
574 orig_sp = sp;
575 POPSTACK;
576 SPAGAIN;
577 if (ret_args) { /* copy results back to original stack */
578 EXTEND(sp, ret_args);
579 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
580 sp += ret_args;
581 PUTBACK;
582 }
583 LEAVE_with_name("call_tied_method");
584 return NORMAL;
585}
586
587#define tied_method0(a,b,c,d) \
588 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
589#define tied_method1(a,b,c,d,e) \
590 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
591#define tied_method2(a,b,c,d,e,f) \
592 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
593
594PP(pp_open)
595{
596 dSP;
597 dMARK; dORIGMARK;
598 dTARGET;
599 SV *sv;
600 IO *io;
601 const char *tmps;
602 STRLEN len;
603 bool ok;
604
605 GV * const gv = MUTABLE_GV(*++MARK);
606
607 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
608 DIE(aTHX_ PL_no_usym, "filehandle");
609
610 if ((io = GvIOp(gv))) {
611 const MAGIC *mg;
612 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
613
614 if (IoDIRP(io))
615 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
616 "Opening dirhandle %"HEKf" also as a file",
617 HEKfARG(GvENAME_HEK(gv)));
618
619 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
620 if (mg) {
621 /* Method's args are same as ours ... */
622 /* ... except handle is replaced by the object */
623 return Perl_tied_method(aTHX_ SV_CONST(OPEN), mark - 1, MUTABLE_SV(io), mg,
624 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
625 sp - mark);
626 }
627 }
628
629 if (MARK < SP) {
630 sv = *++MARK;
631 }
632 else {
633 sv = GvSVn(gv);
634 }
635
636 tmps = SvPV_const(sv, len);
637 ok = do_open6(gv, tmps, len, NULL, MARK+1, (SP-MARK));
638 SP = ORIGMARK;
639 if (ok)
640 PUSHi( (I32)PL_forkprocess );
641 else if (PL_forkprocess == 0) /* we are a new child */
642 PUSHi(0);
643 else
644 RETPUSHUNDEF;
645 RETURN;
646}
647
648PP(pp_close)
649{
650 dSP;
651 GV * const gv =
652 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
653
654 if (MAXARG == 0)
655 EXTEND(SP, 1);
656
657 if (gv) {
658 IO * const io = GvIO(gv);
659 if (io) {
660 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
661 if (mg) {
662 return tied_method0(SV_CONST(CLOSE), SP, MUTABLE_SV(io), mg);
663 }
664 }
665 }
666 PUSHs(boolSV(do_close(gv, TRUE)));
667 RETURN;
668}
669
670PP(pp_pipe_op)
671{
672#ifdef HAS_PIPE
673 dSP;
674 IO *rstio;
675 IO *wstio;
676 int fd[2];
677
678 GV * const wgv = MUTABLE_GV(POPs);
679 GV * const rgv = MUTABLE_GV(POPs);
680
681 assert (isGV_with_GP(rgv));
682 assert (isGV_with_GP(wgv));
683 rstio = GvIOn(rgv);
684 if (IoIFP(rstio))
685 do_close(rgv, FALSE);
686
687 wstio = GvIOn(wgv);
688 if (IoIFP(wstio))
689 do_close(wgv, FALSE);
690
691 if (PerlProc_pipe(fd) < 0)
692 goto badexit;
693
694 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
695 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
696 IoOFP(rstio) = IoIFP(rstio);
697 IoIFP(wstio) = IoOFP(wstio);
698 IoTYPE(rstio) = IoTYPE_RDONLY;
699 IoTYPE(wstio) = IoTYPE_WRONLY;
700
701 if (!IoIFP(rstio) || !IoOFP(wstio)) {
702 if (IoIFP(rstio))
703 PerlIO_close(IoIFP(rstio));
704 else
705 PerlLIO_close(fd[0]);
706 if (IoOFP(wstio))
707 PerlIO_close(IoOFP(wstio));
708 else
709 PerlLIO_close(fd[1]);
710 goto badexit;
711 }
712#if defined(HAS_FCNTL) && defined(F_SETFD)
713 /* ensure close-on-exec */
714 if ((fcntl(fd[0], F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
715 (fcntl(fd[1], F_SETFD,fd[1] > PL_maxsysfd) < 0))
716 goto badexit;
717#endif
718 RETPUSHYES;
719
720badexit:
721 RETPUSHUNDEF;
722#else
723 DIE(aTHX_ PL_no_func, "pipe");
724#endif
725}
726
727PP(pp_fileno)
728{
729 dSP; dTARGET;
730 GV *gv;
731 IO *io;
732 PerlIO *fp;
733 const MAGIC *mg;
734
735 if (MAXARG < 1)
736 RETPUSHUNDEF;
737 gv = MUTABLE_GV(POPs);
738 io = GvIO(gv);
739
740 if (io
741 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
742 {
743 return tied_method0(SV_CONST(FILENO), SP, MUTABLE_SV(io), mg);
744 }
745
746 if (!io || !(fp = IoIFP(io))) {
747 /* Can't do this because people seem to do things like
748 defined(fileno($foo)) to check whether $foo is a valid fh.
749
750 report_evil_fh(gv);
751 */
752 RETPUSHUNDEF;
753 }
754
755 PUSHi(PerlIO_fileno(fp));
756 RETURN;
757}
758
759PP(pp_umask)
760{
761 dSP;
762#ifdef HAS_UMASK
763 dTARGET;
764 Mode_t anum;
765
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. */
771 if (anum != 022)
772 (void)PerlLIO_umask(anum);
773 }
774 else
775 anum = PerlLIO_umask(POPi);
776 TAINT_PROPER("umask");
777 XPUSHi(anum);
778#else
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);
785#endif
786 RETURN;
787}
788
789PP(pp_binmode)
790{
791 dSP;
792 GV *gv;
793 IO *io;
794 PerlIO *fp;
795 SV *discp = NULL;
796
797 if (MAXARG < 1)
798 RETPUSHUNDEF;
799 if (MAXARG > 1) {
800 discp = POPs;
801 }
802
803 gv = MUTABLE_GV(POPs);
804 io = GvIO(gv);
805
806 if (io) {
807 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
808 if (mg) {
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
812 could. */
813 return Perl_tied_method(aTHX_ SV_CONST(BINMODE), SP, MUTABLE_SV(io), mg,
814 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
815 discp ? 1 : 0, discp);
816 }
817 }
818
819 if (!io || !(fp = IoIFP(io))) {
820 report_evil_fh(gv);
821 SETERRNO(EBADF,RMS_IFI);
822 RETPUSHUNDEF;
823 }
824
825 PUTBACK;
826 {
827 STRLEN len = 0;
828 const char *d = NULL;
829 int mode;
830 if (discp)
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)) {
836 SPAGAIN;
837 RETPUSHUNDEF;
838 }
839 }
840 SPAGAIN;
841 RETPUSHYES;
842 }
843 else {
844 SPAGAIN;
845 RETPUSHUNDEF;
846 }
847 }
848}
849
850PP(pp_tie)
851{
852 dSP; dMARK;
853 HV* stash;
854 GV *gv = NULL;
855 SV *sv;
856 const I32 markoff = MARK - PL_stack_base;
857 const char *methname;
858 int how = PERL_MAGIC_tied;
859 U32 items;
860 SV *varsv = *++MARK;
861
862 switch(SvTYPE(varsv)) {
863 case SVt_PVHV:
864 {
865 HE *entry;
866 methname = "TIEHASH";
867 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
868 HvLAZYDEL_off(varsv);
869 hv_free_ent((HV *)varsv, entry);
870 }
871 HvEITER_set(MUTABLE_HV(varsv), 0);
872 break;
873 }
874 case SVt_PVAV:
875 methname = "TIEARRAY";
876 if (!AvREAL(varsv)) {
877 if (!AvREIFY(varsv))
878 Perl_croak(aTHX_ "Cannot tie unreifiable array");
879 av_clear((AV *)varsv);
880 AvREIFY_off(varsv);
881 AvREAL_on(varsv);
882 }
883 break;
884 case SVt_PVGV:
885 case SVt_PVLV:
886 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
887 methname = "TIEHANDLE";
888 how = PERL_MAGIC_tiedscalar;
889 /* For tied filehandles, we apply tiedscalar magic to the IO
890 slot of the GP rather than the GV itself. AMS 20010812 */
891 if (!GvIOp(varsv))
892 GvIOp(varsv) = newIO();
893 varsv = MUTABLE_SV(GvIOp(varsv));
894 break;
895 }
896 if (SvTYPE(varsv) == SVt_PVLV && LvTYPE(varsv) == 'y') {
897 vivify_defelem(varsv);
898 varsv = LvTARG(varsv);
899 }
900 /* FALLTHROUGH */
901 default:
902 methname = "TIESCALAR";
903 how = PERL_MAGIC_tiedscalar;
904 break;
905 }
906 items = SP - MARK++;
907 if (sv_isobject(*MARK)) { /* Calls GET magic. */
908 ENTER_with_name("call_TIE");
909 PUSHSTACKi(PERLSI_MAGIC);
910 PUSHMARK(SP);
911 EXTEND(SP,(I32)items);
912 while (items--)
913 PUSHs(*MARK++);
914 PUTBACK;
915 call_method(methname, G_SCALAR);
916 }
917 else {
918 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
919 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
920 * wrong error message, and worse case, supreme action at a distance.
921 * (Sorry obfuscation writers. You're not going to be given this one.)
922 */
923 stash = gv_stashsv(*MARK, 0);
924 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
925 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
926 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
927 }
928 ENTER_with_name("call_TIE");
929 PUSHSTACKi(PERLSI_MAGIC);
930 PUSHMARK(SP);
931 EXTEND(SP,(I32)items);
932 while (items--)
933 PUSHs(*MARK++);
934 PUTBACK;
935 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
936 }
937 SPAGAIN;
938
939 sv = TOPs;
940 POPSTACK;
941 if (sv_isobject(sv)) {
942 sv_unmagic(varsv, how);
943 /* Croak if a self-tie on an aggregate is attempted. */
944 if (varsv == SvRV(sv) &&
945 (SvTYPE(varsv) == SVt_PVAV ||
946 SvTYPE(varsv) == SVt_PVHV))
947 Perl_croak(aTHX_
948 "Self-ties of arrays and hashes are not supported");
949 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
950 }
951 LEAVE_with_name("call_TIE");
952 SP = PL_stack_base + markoff;
953 PUSHs(sv);
954 RETURN;
955}
956
957
958/* also used for: pp_dbmclose() */
959
960PP(pp_untie)
961{
962 dSP;
963 MAGIC *mg;
964 SV *sv = POPs;
965 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
966 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
967
968 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
969 RETPUSHYES;
970
971 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
972 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
973
974 if ((mg = SvTIED_mg(sv, how))) {
975 SV * const obj = SvRV(SvTIED_obj(sv, mg));
976 if (obj) {
977 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
978 CV *cv;
979 if (gv && isGV(gv) && (cv = GvCV(gv))) {
980 PUSHMARK(SP);
981 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
982 mXPUSHi(SvREFCNT(obj) - 1);
983 PUTBACK;
984 ENTER_with_name("call_UNTIE");
985 call_sv(MUTABLE_SV(cv), G_VOID);
986 LEAVE_with_name("call_UNTIE");
987 SPAGAIN;
988 }
989 else if (mg && SvREFCNT(obj) > 1) {
990 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
991 "untie attempted while %"UVuf" inner references still exist",
992 (UV)SvREFCNT(obj) - 1 ) ;
993 }
994 }
995 }
996 sv_unmagic(sv, how) ;
997 RETPUSHYES;
998}
999
1000PP(pp_tied)
1001{
1002 dSP;
1003 const MAGIC *mg;
1004 dTOPss;
1005 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1006 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1007
1008 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1009 goto ret_undef;
1010
1011 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1012 !(sv = defelem_target(sv, NULL))) goto ret_undef;
1013
1014 if ((mg = SvTIED_mg(sv, how))) {
1015 SETs(SvTIED_obj(sv, mg));
1016 return NORMAL; /* PUTBACK not needed, pp_tied never moves SP */
1017 }
1018 ret_undef:
1019 SETs(&PL_sv_undef);
1020 return NORMAL;
1021}
1022
1023PP(pp_dbmopen)
1024{
1025 dSP;
1026 dPOPPOPssrl;
1027 HV* stash;
1028 GV *gv = NULL;
1029
1030 HV * const hv = MUTABLE_HV(POPs);
1031 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1032 stash = gv_stashsv(sv, 0);
1033 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1034 PUTBACK;
1035 require_pv("AnyDBM_File.pm");
1036 SPAGAIN;
1037 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1038 DIE(aTHX_ "No dbm on this machine");
1039 }
1040
1041 ENTER;
1042 PUSHMARK(SP);
1043
1044 EXTEND(SP, 5);
1045 PUSHs(sv);
1046 PUSHs(left);
1047 if (SvIV(right))
1048 mPUSHu(O_RDWR|O_CREAT);
1049 else
1050 {
1051 mPUSHu(O_RDWR);
1052 if (!SvOK(right)) right = &PL_sv_no;
1053 }
1054 PUSHs(right);
1055 PUTBACK;
1056 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1057 SPAGAIN;
1058
1059 if (!sv_isobject(TOPs)) {
1060 SP--;
1061 PUSHMARK(SP);
1062 PUSHs(sv);
1063 PUSHs(left);
1064 mPUSHu(O_RDONLY);
1065 PUSHs(right);
1066 PUTBACK;
1067 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1068 SPAGAIN;
1069 }
1070
1071 if (sv_isobject(TOPs)) {
1072 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1073 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1074 }
1075 LEAVE;
1076 RETURN;
1077}
1078
1079PP(pp_sselect)
1080{
1081#ifdef HAS_SELECT
1082 dSP; dTARGET;
1083 I32 i;
1084 I32 j;
1085 char *s;
1086 SV *sv;
1087 NV value;
1088 I32 maxlen = 0;
1089 I32 nfound;
1090 struct timeval timebuf;
1091 struct timeval *tbuf = &timebuf;
1092 I32 growsize;
1093 char *fd_sets[4];
1094#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1095 I32 masksize;
1096 I32 offset;
1097 I32 k;
1098
1099# if BYTEORDER & 0xf0000
1100# define ORDERBYTE (0x88888888 - BYTEORDER)
1101# else
1102# define ORDERBYTE (0x4444 - BYTEORDER)
1103# endif
1104
1105#endif
1106
1107 SP -= 4;
1108 for (i = 1; i <= 3; i++) {
1109 SV * const sv = SP[i];
1110 SvGETMAGIC(sv);
1111 if (!SvOK(sv))
1112 continue;
1113 if (SvREADONLY(sv)) {
1114 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1115 Perl_croak_no_modify();
1116 }
1117 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1118 if (!SvPOK(sv)) {
1119 if (!SvPOKp(sv))
1120 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1121 "Non-string passed as bitmask");
1122 SvPV_force_nomg_nolen(sv); /* force string conversion */
1123 }
1124 j = SvCUR(sv);
1125 if (maxlen < j)
1126 maxlen = j;
1127 }
1128
1129/* little endians can use vecs directly */
1130#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1131# ifdef NFDBITS
1132
1133# ifndef NBBY
1134# define NBBY 8
1135# endif
1136
1137 masksize = NFDBITS / NBBY;
1138# else
1139 masksize = sizeof(long); /* documented int, everyone seems to use long */
1140# endif
1141 Zero(&fd_sets[0], 4, char*);
1142#endif
1143
1144# if SELECT_MIN_BITS == 1
1145 growsize = sizeof(fd_set);
1146# else
1147# if defined(__GLIBC__) && defined(__FD_SETSIZE)
1148# undef SELECT_MIN_BITS
1149# define SELECT_MIN_BITS __FD_SETSIZE
1150# endif
1151 /* If SELECT_MIN_BITS is greater than one we most probably will want
1152 * to align the sizes with SELECT_MIN_BITS/8 because for example
1153 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1154 * UNIX, Solaris, Darwin) the smallest quantum select() operates
1155 * on (sets/tests/clears bits) is 32 bits. */
1156 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1157# endif
1158
1159 sv = SP[4];
1160 SvGETMAGIC(sv);
1161 if (SvOK(sv)) {
1162 value = SvNV_nomg(sv);
1163 if (value < 0.0)
1164 value = 0.0;
1165 timebuf.tv_sec = (long)value;
1166 value -= (NV)timebuf.tv_sec;
1167 timebuf.tv_usec = (long)(value * 1000000.0);
1168 }
1169 else
1170 tbuf = NULL;
1171
1172 for (i = 1; i <= 3; i++) {
1173 sv = SP[i];
1174 if (!SvOK(sv) || SvCUR(sv) == 0) {
1175 fd_sets[i] = 0;
1176 continue;
1177 }
1178 assert(SvPOK(sv));
1179 j = SvLEN(sv);
1180 if (j < growsize) {
1181 Sv_Grow(sv, growsize);
1182 }
1183 j = SvCUR(sv);
1184 s = SvPVX(sv) + j;
1185 while (++j <= growsize) {
1186 *s++ = '\0';
1187 }
1188
1189#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1190 s = SvPVX(sv);
1191 Newx(fd_sets[i], growsize, char);
1192 for (offset = 0; offset < growsize; offset += masksize) {
1193 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1194 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1195 }
1196#else
1197 fd_sets[i] = SvPVX(sv);
1198#endif
1199 }
1200
1201#ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1202 /* Can't make just the (void*) conditional because that would be
1203 * cpp #if within cpp macro, and not all compilers like that. */
1204 nfound = PerlSock_select(
1205 maxlen * 8,
1206 (Select_fd_set_t) fd_sets[1],
1207 (Select_fd_set_t) fd_sets[2],
1208 (Select_fd_set_t) fd_sets[3],
1209 (void*) tbuf); /* Workaround for compiler bug. */
1210#else
1211 nfound = PerlSock_select(
1212 maxlen * 8,
1213 (Select_fd_set_t) fd_sets[1],
1214 (Select_fd_set_t) fd_sets[2],
1215 (Select_fd_set_t) fd_sets[3],
1216 tbuf);
1217#endif
1218 for (i = 1; i <= 3; i++) {
1219 if (fd_sets[i]) {
1220 sv = SP[i];
1221#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1222 s = SvPVX(sv);
1223 for (offset = 0; offset < growsize; offset += masksize) {
1224 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1225 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1226 }
1227 Safefree(fd_sets[i]);
1228#endif
1229 SvSETMAGIC(sv);
1230 }
1231 }
1232
1233 PUSHi(nfound);
1234 if (GIMME == G_ARRAY && tbuf) {
1235 value = (NV)(timebuf.tv_sec) +
1236 (NV)(timebuf.tv_usec) / 1000000.0;
1237 mPUSHn(value);
1238 }
1239 RETURN;
1240#else
1241 DIE(aTHX_ "select not implemented");
1242#endif
1243}
1244
1245/*
1246
1247=head1 GV Functions
1248
1249=for apidoc setdefout
1250
1251Sets PL_defoutgv, the default file handle for output, to the passed in
1252typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1253count of the passed in typeglob is increased by one, and the reference count
1254of the typeglob that PL_defoutgv points to is decreased by one.
1255
1256=cut
1257*/
1258
1259void
1260Perl_setdefout(pTHX_ GV *gv)
1261{
1262 PERL_ARGS_ASSERT_SETDEFOUT;
1263 SvREFCNT_inc_simple_void_NN(gv);
1264 SvREFCNT_dec(PL_defoutgv);
1265 PL_defoutgv = gv;
1266}
1267
1268PP(pp_select)
1269{
1270 dSP; dTARGET;
1271 HV *hv;
1272 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1273 GV * egv = GvEGVx(PL_defoutgv);
1274 GV * const *gvp;
1275
1276 if (!egv)
1277 egv = PL_defoutgv;
1278 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1279 gvp = hv && HvENAME(hv)
1280 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1281 : NULL;
1282 if (gvp && *gvp == egv) {
1283 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1284 XPUSHTARG;
1285 }
1286 else {
1287 mXPUSHs(newRV(MUTABLE_SV(egv)));
1288 }
1289
1290 if (newdefout) {
1291 if (!GvIO(newdefout))
1292 gv_IOadd(newdefout);
1293 setdefout(newdefout);
1294 }
1295
1296 RETURN;
1297}
1298
1299PP(pp_getc)
1300{
1301 dSP; dTARGET;
1302 GV * const gv =
1303 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1304 IO *const io = GvIO(gv);
1305
1306 if (MAXARG == 0)
1307 EXTEND(SP, 1);
1308
1309 if (io) {
1310 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1311 if (mg) {
1312 const U32 gimme = GIMME_V;
1313 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1314 if (gimme == G_SCALAR) {
1315 SPAGAIN;
1316 SvSetMagicSV_nosteal(TARG, TOPs);
1317 }
1318 return NORMAL;
1319 }
1320 }
1321 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1322 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1323 report_evil_fh(gv);
1324 SETERRNO(EBADF,RMS_IFI);
1325 RETPUSHUNDEF;
1326 }
1327 TAINT;
1328 sv_setpvs(TARG, " ");
1329 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1330 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1331 /* Find out how many bytes the char needs */
1332 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1333 if (len > 1) {
1334 SvGROW(TARG,len+1);
1335 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1336 SvCUR_set(TARG,1+len);
1337 }
1338 SvUTF8_on(TARG);
1339 }
1340 else SvUTF8_off(TARG);
1341 PUSHTARG;
1342 RETURN;
1343}
1344
1345STATIC OP *
1346S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1347{
1348 PERL_CONTEXT *cx;
1349 const I32 gimme = GIMME_V;
1350
1351 PERL_ARGS_ASSERT_DOFORM;
1352
1353 if (CvCLONE(cv))
1354 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1355
1356 ENTER;
1357 SAVETMPS;
1358
1359 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1360 PUSHFORMAT(cx, retop);
1361 if (CvDEPTH(cv) >= 2) {
1362 PERL_STACK_OVERFLOW_CHECK();
1363 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1364 }
1365 SAVECOMPPAD();
1366 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1367
1368 setdefout(gv); /* locally select filehandle so $% et al work */
1369 return CvSTART(cv);
1370}
1371
1372PP(pp_enterwrite)
1373{
1374 dSP;
1375 GV *gv;
1376 IO *io;
1377 GV *fgv;
1378 CV *cv = NULL;
1379 SV *tmpsv = NULL;
1380
1381 if (MAXARG == 0) {
1382 EXTEND(SP, 1);
1383 gv = PL_defoutgv;
1384 }
1385 else {
1386 gv = MUTABLE_GV(POPs);
1387 if (!gv)
1388 gv = PL_defoutgv;
1389 }
1390 io = GvIO(gv);
1391 if (!io) {
1392 RETPUSHNO;
1393 }
1394 if (IoFMT_GV(io))
1395 fgv = IoFMT_GV(io);
1396 else
1397 fgv = gv;
1398
1399 assert(fgv);
1400
1401 cv = GvFORM(fgv);
1402 if (!cv) {
1403 tmpsv = sv_newmortal();
1404 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1405 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1406 }
1407 IoFLAGS(io) &= ~IOf_DIDTOP;
1408 RETURNOP(doform(cv,gv,PL_op->op_next));
1409}
1410
1411PP(pp_leavewrite)
1412{
1413 dSP;
1414 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1415 IO * const io = GvIOp(gv);
1416 PerlIO *ofp;
1417 PerlIO *fp;
1418 SV **newsp;
1419 I32 gimme;
1420 PERL_CONTEXT *cx;
1421 OP *retop;
1422
1423 if (!io || !(ofp = IoOFP(io)))
1424 goto forget_top;
1425
1426 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1427 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1428
1429 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1430 PL_formtarget != PL_toptarget)
1431 {
1432 GV *fgv;
1433 CV *cv;
1434 if (!IoTOP_GV(io)) {
1435 GV *topgv;
1436
1437 if (!IoTOP_NAME(io)) {
1438 SV *topname;
1439 if (!IoFMT_NAME(io))
1440 IoFMT_NAME(io) = savepv(GvNAME(gv));
1441 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1442 HEKfARG(GvNAME_HEK(gv))));
1443 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1444 if ((topgv && GvFORM(topgv)) ||
1445 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1446 IoTOP_NAME(io) = savesvpv(topname);
1447 else
1448 IoTOP_NAME(io) = savepvs("top");
1449 }
1450 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1451 if (!topgv || !GvFORM(topgv)) {
1452 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1453 goto forget_top;
1454 }
1455 IoTOP_GV(io) = topgv;
1456 }
1457 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1458 I32 lines = IoLINES_LEFT(io);
1459 const char *s = SvPVX_const(PL_formtarget);
1460 if (lines <= 0) /* Yow, header didn't even fit!!! */
1461 goto forget_top;
1462 while (lines-- > 0) {
1463 s = strchr(s, '\n');
1464 if (!s)
1465 break;
1466 s++;
1467 }
1468 if (s) {
1469 const STRLEN save = SvCUR(PL_formtarget);
1470 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1471 do_print(PL_formtarget, ofp);
1472 SvCUR_set(PL_formtarget, save);
1473 sv_chop(PL_formtarget, s);
1474 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1475 }
1476 }
1477 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1478 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1479 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1480 IoPAGE(io)++;
1481 PL_formtarget = PL_toptarget;
1482 IoFLAGS(io) |= IOf_DIDTOP;
1483 fgv = IoTOP_GV(io);
1484 assert(fgv); /* IoTOP_GV(io) should have been set above */
1485 cv = GvFORM(fgv);
1486 if (!cv) {
1487 SV * const sv = sv_newmortal();
1488 gv_efullname4(sv, fgv, NULL, FALSE);
1489 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1490 }
1491 return doform(cv, gv, PL_op);
1492 }
1493
1494 forget_top:
1495 POPBLOCK(cx,PL_curpm);
1496 retop = cx->blk_sub.retop;
1497 POPFORMAT(cx);
1498 SP = newsp; /* ignore retval of formline */
1499 LEAVE;
1500
1501 if (!io || !(fp = IoOFP(io))) {
1502 if (io && IoIFP(io))
1503 report_wrongway_fh(gv, '<');
1504 else
1505 report_evil_fh(gv);
1506 PUSHs(&PL_sv_no);
1507 }
1508 else {
1509 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1510 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1511 }
1512 if (!do_print(PL_formtarget, fp))
1513 PUSHs(&PL_sv_no);
1514 else {
1515 FmLINES(PL_formtarget) = 0;
1516 SvCUR_set(PL_formtarget, 0);
1517 *SvEND(PL_formtarget) = '\0';
1518 if (IoFLAGS(io) & IOf_FLUSH)
1519 (void)PerlIO_flush(fp);
1520 PUSHs(&PL_sv_yes);
1521 }
1522 }
1523 PL_formtarget = PL_bodytarget;
1524 PERL_UNUSED_VAR(gimme);
1525 RETURNOP(retop);
1526}
1527
1528PP(pp_prtf)
1529{
1530 dSP; dMARK; dORIGMARK;
1531 PerlIO *fp;
1532
1533 GV * const gv
1534 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1535 IO *const io = GvIO(gv);
1536
1537 /* Treat empty list as "" */
1538 if (MARK == SP) XPUSHs(&PL_sv_no);
1539
1540 if (io) {
1541 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1542 if (mg) {
1543 if (MARK == ORIGMARK) {
1544 MEXTEND(SP, 1);
1545 ++MARK;
1546 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1547 ++SP;
1548 }
1549 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1550 mg,
1551 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1552 sp - mark);
1553 }
1554 }
1555
1556 if (!io) {
1557 report_evil_fh(gv);
1558 SETERRNO(EBADF,RMS_IFI);
1559 goto just_say_no;
1560 }
1561 else if (!(fp = IoOFP(io))) {
1562 if (IoIFP(io))
1563 report_wrongway_fh(gv, '<');
1564 else if (ckWARN(WARN_CLOSED))
1565 report_evil_fh(gv);
1566 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1567 goto just_say_no;
1568 }
1569 else {
1570 SV *sv = sv_newmortal();
1571 do_sprintf(sv, SP - MARK, MARK + 1);
1572 if (!do_print(sv, fp))
1573 goto just_say_no;
1574
1575 if (IoFLAGS(io) & IOf_FLUSH)
1576 if (PerlIO_flush(fp) == EOF)
1577 goto just_say_no;
1578 }
1579 SP = ORIGMARK;
1580 PUSHs(&PL_sv_yes);
1581 RETURN;
1582
1583 just_say_no:
1584 SP = ORIGMARK;
1585 PUSHs(&PL_sv_undef);
1586 RETURN;
1587}
1588
1589PP(pp_sysopen)
1590{
1591 dSP;
1592 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1593 const int mode = POPi;
1594 SV * const sv = POPs;
1595 GV * const gv = MUTABLE_GV(POPs);
1596 STRLEN len;
1597
1598 /* Need TIEHANDLE method ? */
1599 const char * const tmps = SvPV_const(sv, len);
1600 if (do_open_raw(gv, tmps, len, mode, perm)) {
1601 IoLINES(GvIOp(gv)) = 0;
1602 PUSHs(&PL_sv_yes);
1603 }
1604 else {
1605 PUSHs(&PL_sv_undef);
1606 }
1607 RETURN;
1608}
1609
1610
1611/* also used for: pp_read() and pp_recv() (where supported) */
1612
1613PP(pp_sysread)
1614{
1615 dSP; dMARK; dORIGMARK; dTARGET;
1616 SSize_t offset;
1617 IO *io;
1618 char *buffer;
1619 STRLEN orig_size;
1620 SSize_t length;
1621 SSize_t count;
1622 SV *bufsv;
1623 STRLEN blen;
1624 int fp_utf8;
1625 int buffer_utf8;
1626 SV *read_target;
1627 Size_t got = 0;
1628 Size_t wanted;
1629 bool charstart = FALSE;
1630 STRLEN charskip = 0;
1631 STRLEN skip = 0;
1632 GV * const gv = MUTABLE_GV(*++MARK);
1633 int fd;
1634
1635 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1636 && gv && (io = GvIO(gv)) )
1637 {
1638 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1639 if (mg) {
1640 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1641 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1642 sp - mark);
1643 }
1644 }
1645
1646 if (!gv)
1647 goto say_undef;
1648 bufsv = *++MARK;
1649 if (! SvOK(bufsv))
1650 sv_setpvs(bufsv, "");
1651 length = SvIVx(*++MARK);
1652 if (length < 0)
1653 DIE(aTHX_ "Negative length");
1654 SETERRNO(0,0);
1655 if (MARK < SP)
1656 offset = SvIVx(*++MARK);
1657 else
1658 offset = 0;
1659 io = GvIO(gv);
1660 if (!io || !IoIFP(io)) {
1661 report_evil_fh(gv);
1662 SETERRNO(EBADF,RMS_IFI);
1663 goto say_undef;
1664 }
1665
1666 /* Note that fd can here validly be -1, don't check it yet. */
1667 fd = PerlIO_fileno(IoIFP(io));
1668
1669 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1670 buffer = SvPVutf8_force(bufsv, blen);
1671 /* UTF-8 may not have been set if they are all low bytes */
1672 SvUTF8_on(bufsv);
1673 buffer_utf8 = 0;
1674 }
1675 else {
1676 buffer = SvPV_force(bufsv, blen);
1677 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1678 }
1679 if (DO_UTF8(bufsv)) {
1680 blen = sv_len_utf8_nomg(bufsv);
1681 }
1682
1683 charstart = TRUE;
1684 charskip = 0;
1685 skip = 0;
1686 wanted = length;
1687
1688#ifdef HAS_SOCKET
1689 if (PL_op->op_type == OP_RECV) {
1690 Sock_size_t bufsize;
1691 char namebuf[MAXPATHLEN];
1692 if (fd < 0) {
1693 SETERRNO(EBADF,SS_IVCHAN);
1694 RETPUSHUNDEF;
1695 }
1696#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1697 bufsize = sizeof (struct sockaddr_in);
1698#else
1699 bufsize = sizeof namebuf;
1700#endif
1701#ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1702 if (bufsize >= 256)
1703 bufsize = 255;
1704#endif
1705 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1706 /* 'offset' means 'flags' here */
1707 count = PerlSock_recvfrom(fd, buffer, length, offset,
1708 (struct sockaddr *)namebuf, &bufsize);
1709 if (count < 0)
1710 RETPUSHUNDEF;
1711 /* MSG_TRUNC can give oversized count; quietly lose it */
1712 if (count > length)
1713 count = length;
1714 SvCUR_set(bufsv, count);
1715 *SvEND(bufsv) = '\0';
1716 (void)SvPOK_only(bufsv);
1717 if (fp_utf8)
1718 SvUTF8_on(bufsv);
1719 SvSETMAGIC(bufsv);
1720 /* This should not be marked tainted if the fp is marked clean */
1721 if (!(IoFLAGS(io) & IOf_UNTAINT))
1722 SvTAINTED_on(bufsv);
1723 SP = ORIGMARK;
1724#if defined(__CYGWIN__)
1725 /* recvfrom() on cygwin doesn't set bufsize at all for
1726 connected sockets, leaving us with trash in the returned
1727 name, so use the same test as the Win32 code to check if it
1728 wasn't set, and set it [perl #118843] */
1729 if (bufsize == sizeof namebuf)
1730 bufsize = 0;
1731#endif
1732 sv_setpvn(TARG, namebuf, bufsize);
1733 PUSHs(TARG);
1734 RETURN;
1735 }
1736#endif
1737 if (offset < 0) {
1738 if (-offset > (SSize_t)blen)
1739 DIE(aTHX_ "Offset outside string");
1740 offset += blen;
1741 }
1742 if (DO_UTF8(bufsv)) {
1743 /* convert offset-as-chars to offset-as-bytes */
1744 if (offset >= (SSize_t)blen)
1745 offset += SvCUR(bufsv) - blen;
1746 else
1747 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1748 }
1749
1750 more_bytes:
1751 /* Reestablish the fd in case it shifted from underneath us. */
1752 fd = PerlIO_fileno(IoIFP(io));
1753
1754 orig_size = SvCUR(bufsv);
1755 /* Allocating length + offset + 1 isn't perfect in the case of reading
1756 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1757 unduly.
1758 (should be 2 * length + offset + 1, or possibly something longer if
1759 PL_encoding is true) */
1760 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1761 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1762 Zero(buffer+orig_size, offset-orig_size, char);
1763 }
1764 buffer = buffer + offset;
1765 if (!buffer_utf8) {
1766 read_target = bufsv;
1767 } else {
1768 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1769 concatenate it to the current buffer. */
1770
1771 /* Truncate the existing buffer to the start of where we will be
1772 reading to: */
1773 SvCUR_set(bufsv, offset);
1774
1775 read_target = sv_newmortal();
1776 SvUPGRADE(read_target, SVt_PV);
1777 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1778 }
1779
1780 if (PL_op->op_type == OP_SYSREAD) {
1781#ifdef PERL_SOCK_SYSREAD_IS_RECV
1782 if (IoTYPE(io) == IoTYPE_SOCKET) {
1783 if (fd < 0) {
1784 SETERRNO(EBADF,SS_IVCHAN);
1785 count = -1;
1786 }
1787 else
1788 count = PerlSock_recv(fd, buffer, length, 0);
1789 }
1790 else
1791#endif
1792 {
1793 if (fd < 0) {
1794 SETERRNO(EBADF,RMS_IFI);
1795 count = -1;
1796 }
1797 else
1798 count = PerlLIO_read(fd, buffer, length);
1799 }
1800 }
1801 else
1802 {
1803 count = PerlIO_read(IoIFP(io), buffer, length);
1804 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1805 if (count == 0 && PerlIO_error(IoIFP(io)))
1806 count = -1;
1807 }
1808 if (count < 0) {
1809 if (IoTYPE(io) == IoTYPE_WRONLY)
1810 report_wrongway_fh(gv, '>');
1811 goto say_undef;
1812 }
1813 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1814 *SvEND(read_target) = '\0';
1815 (void)SvPOK_only(read_target);
1816 if (fp_utf8 && !IN_BYTES) {
1817 /* Look at utf8 we got back and count the characters */
1818 const char *bend = buffer + count;
1819 while (buffer < bend) {
1820 if (charstart) {
1821 skip = UTF8SKIP(buffer);
1822 charskip = 0;
1823 }
1824 if (buffer - charskip + skip > bend) {
1825 /* partial character - try for rest of it */
1826 length = skip - (bend-buffer);
1827 offset = bend - SvPVX_const(bufsv);
1828 charstart = FALSE;
1829 charskip += count;
1830 goto more_bytes;
1831 }
1832 else {
1833 got++;
1834 buffer += skip;
1835 charstart = TRUE;
1836 charskip = 0;
1837 }
1838 }
1839 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1840 provided amount read (count) was what was requested (length)
1841 */
1842 if (got < wanted && count == length) {
1843 length = wanted - got;
1844 offset = bend - SvPVX_const(bufsv);
1845 goto more_bytes;
1846 }
1847 /* return value is character count */
1848 count = got;
1849 SvUTF8_on(bufsv);
1850 }
1851 else if (buffer_utf8) {
1852 /* Let svcatsv upgrade the bytes we read in to utf8.
1853 The buffer is a mortal so will be freed soon. */
1854 sv_catsv_nomg(bufsv, read_target);
1855 }
1856 SvSETMAGIC(bufsv);
1857 /* This should not be marked tainted if the fp is marked clean */
1858 if (!(IoFLAGS(io) & IOf_UNTAINT))
1859 SvTAINTED_on(bufsv);
1860 SP = ORIGMARK;
1861 PUSHi(count);
1862 RETURN;
1863
1864 say_undef:
1865 SP = ORIGMARK;
1866 RETPUSHUNDEF;
1867}
1868
1869
1870/* also used for: pp_send() where defined */
1871
1872PP(pp_syswrite)
1873{
1874 dSP; dMARK; dORIGMARK; dTARGET;
1875 SV *bufsv;
1876 const char *buffer;
1877 SSize_t retval;
1878 STRLEN blen;
1879 STRLEN orig_blen_bytes;
1880 const int op_type = PL_op->op_type;
1881 bool doing_utf8;
1882 U8 *tmpbuf = NULL;
1883 GV *const gv = MUTABLE_GV(*++MARK);
1884 IO *const io = GvIO(gv);
1885 int fd;
1886
1887 if (op_type == OP_SYSWRITE && io) {
1888 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1889 if (mg) {
1890 if (MARK == SP - 1) {
1891 SV *sv = *SP;
1892 mXPUSHi(sv_len(sv));
1893 PUTBACK;
1894 }
1895
1896 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1897 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1898 sp - mark);
1899 }
1900 }
1901 if (!gv)
1902 goto say_undef;
1903
1904 bufsv = *++MARK;
1905
1906 SETERRNO(0,0);
1907 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1908 retval = -1;
1909 if (io && IoIFP(io))
1910 report_wrongway_fh(gv, '<');
1911 else
1912 report_evil_fh(gv);
1913 SETERRNO(EBADF,RMS_IFI);
1914 goto say_undef;
1915 }
1916 fd = PerlIO_fileno(IoIFP(io));
1917 if (fd < 0) {
1918 SETERRNO(EBADF,SS_IVCHAN);
1919 retval = -1;
1920 goto say_undef;
1921 }
1922
1923 /* Do this first to trigger any overloading. */
1924 buffer = SvPV_const(bufsv, blen);
1925 orig_blen_bytes = blen;
1926 doing_utf8 = DO_UTF8(bufsv);
1927
1928 if (PerlIO_isutf8(IoIFP(io))) {
1929 if (!SvUTF8(bufsv)) {
1930 /* We don't modify the original scalar. */
1931 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1932 buffer = (char *) tmpbuf;
1933 doing_utf8 = TRUE;
1934 }
1935 }
1936 else if (doing_utf8) {
1937 STRLEN tmplen = blen;
1938 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1939 if (!doing_utf8) {
1940 tmpbuf = result;
1941 buffer = (char *) tmpbuf;
1942 blen = tmplen;
1943 }
1944 else {
1945 assert((char *)result == buffer);
1946 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1947 }
1948 }
1949
1950#ifdef HAS_SOCKET
1951 if (op_type == OP_SEND) {
1952 const int flags = SvIVx(*++MARK);
1953 if (SP > MARK) {
1954 STRLEN mlen;
1955 char * const sockbuf = SvPVx(*++MARK, mlen);
1956 retval = PerlSock_sendto(fd, buffer, blen,
1957 flags, (struct sockaddr *)sockbuf, mlen);
1958 }
1959 else {
1960 retval = PerlSock_send(fd, buffer, blen, flags);
1961 }
1962 }
1963 else
1964#endif
1965 {
1966 Size_t length = 0; /* This length is in characters. */
1967 STRLEN blen_chars;
1968 IV offset;
1969
1970 if (doing_utf8) {
1971 if (tmpbuf) {
1972 /* The SV is bytes, and we've had to upgrade it. */
1973 blen_chars = orig_blen_bytes;
1974 } else {
1975 /* The SV really is UTF-8. */
1976 /* Don't call sv_len_utf8 on a magical or overloaded
1977 scalar, as we might get back a different result. */
1978 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1979 }
1980 } else {
1981 blen_chars = blen;
1982 }
1983
1984 if (MARK >= SP) {
1985 length = blen_chars;
1986 } else {
1987#if Size_t_size > IVSIZE
1988 length = (Size_t)SvNVx(*++MARK);
1989#else
1990 length = (Size_t)SvIVx(*++MARK);
1991#endif
1992 if ((SSize_t)length < 0) {
1993 Safefree(tmpbuf);
1994 DIE(aTHX_ "Negative length");
1995 }
1996 }
1997
1998 if (MARK < SP) {
1999 offset = SvIVx(*++MARK);
2000 if (offset < 0) {
2001 if (-offset > (IV)blen_chars) {
2002 Safefree(tmpbuf);
2003 DIE(aTHX_ "Offset outside string");
2004 }
2005 offset += blen_chars;
2006 } else if (offset > (IV)blen_chars) {
2007 Safefree(tmpbuf);
2008 DIE(aTHX_ "Offset outside string");
2009 }
2010 } else
2011 offset = 0;
2012 if (length > blen_chars - offset)
2013 length = blen_chars - offset;
2014 if (doing_utf8) {
2015 /* Here we convert length from characters to bytes. */
2016 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
2017 /* Either we had to convert the SV, or the SV is magical, or
2018 the SV has overloading, in which case we can't or mustn't
2019 or mustn't call it again. */
2020
2021 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
2022 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
2023 } else {
2024 /* It's a real UTF-8 SV, and it's not going to change under
2025 us. Take advantage of any cache. */
2026 I32 start = offset;
2027 I32 len_I32 = length;
2028
2029 /* Convert the start and end character positions to bytes.
2030 Remember that the second argument to sv_pos_u2b is relative
2031 to the first. */
2032 sv_pos_u2b(bufsv, &start, &len_I32);
2033
2034 buffer += start;
2035 length = len_I32;
2036 }
2037 }
2038 else {
2039 buffer = buffer+offset;
2040 }
2041#ifdef PERL_SOCK_SYSWRITE_IS_SEND
2042 if (IoTYPE(io) == IoTYPE_SOCKET) {
2043 retval = PerlSock_send(fd, buffer, length, 0);
2044 }
2045 else
2046#endif
2047 {
2048 /* See the note at doio.c:do_print about filesize limits. --jhi */
2049 retval = PerlLIO_write(fd, buffer, length);
2050 }
2051 }
2052
2053 if (retval < 0)
2054 goto say_undef;
2055 SP = ORIGMARK;
2056 if (doing_utf8)
2057 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2058
2059 Safefree(tmpbuf);
2060#if Size_t_size > IVSIZE
2061 PUSHn(retval);
2062#else
2063 PUSHi(retval);
2064#endif
2065 RETURN;
2066
2067 say_undef:
2068 Safefree(tmpbuf);
2069 SP = ORIGMARK;
2070 RETPUSHUNDEF;
2071}
2072
2073PP(pp_eof)
2074{
2075 dSP;
2076 GV *gv;
2077 IO *io;
2078 const MAGIC *mg;
2079 /*
2080 * in Perl 5.12 and later, the additional parameter is a bitmask:
2081 * 0 = eof
2082 * 1 = eof(FH)
2083 * 2 = eof() <- ARGV magic
2084 *
2085 * I'll rely on the compiler's trace flow analysis to decide whether to
2086 * actually assign this out here, or punt it into the only block where it is
2087 * used. Doing it out here is DRY on the condition logic.
2088 */
2089 unsigned int which;
2090
2091 if (MAXARG) {
2092 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2093 which = 1;
2094 }
2095 else {
2096 EXTEND(SP, 1);
2097
2098 if (PL_op->op_flags & OPf_SPECIAL) {
2099 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2100 which = 2;
2101 }
2102 else {
2103 gv = PL_last_in_gv; /* eof */
2104 which = 0;
2105 }
2106 }
2107
2108 if (!gv)
2109 RETPUSHNO;
2110
2111 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2112 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2113 }
2114
2115 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2116 if (io && !IoIFP(io)) {
2117 if ((IoFLAGS(io) & IOf_START) && av_tindex(GvAVn(gv)) < 0) {
2118 IoLINES(io) = 0;
2119 IoFLAGS(io) &= ~IOf_START;
2120 do_open6(gv, "-", 1, NULL, NULL, 0);
2121 if (GvSV(gv))
2122 sv_setpvs(GvSV(gv), "-");
2123 else
2124 GvSV(gv) = newSVpvs("-");
2125 SvSETMAGIC(GvSV(gv));
2126 }
2127 else if (!nextargv(gv))
2128 RETPUSHYES;
2129 }
2130 }
2131
2132 PUSHs(boolSV(do_eof(gv)));
2133 RETURN;
2134}
2135
2136PP(pp_tell)
2137{
2138 dSP; dTARGET;
2139 GV *gv;
2140 IO *io;
2141
2142 if (MAXARG != 0 && (TOPs || POPs))
2143 PL_last_in_gv = MUTABLE_GV(POPs);
2144 else
2145 EXTEND(SP, 1);
2146 gv = PL_last_in_gv;
2147
2148 io = GvIO(gv);
2149 if (io) {
2150 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2151 if (mg) {
2152 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2153 }
2154 }
2155 else if (!gv) {
2156 if (!errno)
2157 SETERRNO(EBADF,RMS_IFI);
2158 PUSHi(-1);
2159 RETURN;
2160 }
2161
2162#if LSEEKSIZE > IVSIZE
2163 PUSHn( do_tell(gv) );
2164#else
2165 PUSHi( do_tell(gv) );
2166#endif
2167 RETURN;
2168}
2169
2170
2171/* also used for: pp_seek() */
2172
2173PP(pp_sysseek)
2174{
2175 dSP;
2176 const int whence = POPi;
2177#if LSEEKSIZE > IVSIZE
2178 const Off_t offset = (Off_t)SvNVx(POPs);
2179#else
2180 const Off_t offset = (Off_t)SvIVx(POPs);
2181#endif
2182
2183 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2184 IO *const io = GvIO(gv);
2185
2186 if (io) {
2187 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2188 if (mg) {
2189#if LSEEKSIZE > IVSIZE
2190 SV *const offset_sv = newSVnv((NV) offset);
2191#else
2192 SV *const offset_sv = newSViv(offset);
2193#endif
2194
2195 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2196 newSViv(whence));
2197 }
2198 }
2199
2200 if (PL_op->op_type == OP_SEEK)
2201 PUSHs(boolSV(do_seek(gv, offset, whence)));
2202 else {
2203 const Off_t sought = do_sysseek(gv, offset, whence);
2204 if (sought < 0)
2205 PUSHs(&PL_sv_undef);
2206 else {
2207 SV* const sv = sought ?
2208#if LSEEKSIZE > IVSIZE
2209 newSVnv((NV)sought)
2210#else
2211 newSViv(sought)
2212#endif
2213 : newSVpvn(zero_but_true, ZBTLEN);
2214 mPUSHs(sv);
2215 }
2216 }
2217 RETURN;
2218}
2219
2220PP(pp_truncate)
2221{
2222 dSP;
2223 /* There seems to be no consensus on the length type of truncate()
2224 * and ftruncate(), both off_t and size_t have supporters. In
2225 * general one would think that when using large files, off_t is
2226 * at least as wide as size_t, so using an off_t should be okay. */
2227 /* XXX Configure probe for the length type of *truncate() needed XXX */
2228 Off_t len;
2229
2230#if Off_t_size > IVSIZE
2231 len = (Off_t)POPn;
2232#else
2233 len = (Off_t)POPi;
2234#endif
2235 /* Checking for length < 0 is problematic as the type might or
2236 * might not be signed: if it is not, clever compilers will moan. */
2237 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2238 SETERRNO(0,0);
2239 {
2240 SV * const sv = POPs;
2241 int result = 1;
2242 GV *tmpgv;
2243 IO *io;
2244
2245 if (PL_op->op_flags & OPf_SPECIAL
2246 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2247 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2248 io = GvIO(tmpgv);
2249 if (!io)
2250 result = 0;
2251 else {
2252 PerlIO *fp;
2253 do_ftruncate_io:
2254 TAINT_PROPER("truncate");
2255 if (!(fp = IoIFP(io))) {
2256 result = 0;
2257 }
2258 else {
2259 int fd = PerlIO_fileno(fp);
2260 if (fd < 0) {
2261 SETERRNO(EBADF,RMS_IFI);
2262 result = 0;
2263 } else {
2264 PerlIO_flush(fp);
2265#ifdef HAS_TRUNCATE
2266 if (ftruncate(fd, len) < 0)
2267#else
2268 if (my_chsize(fd, len) < 0)
2269#endif
2270 result = 0;
2271 }
2272 }
2273 }
2274 }
2275 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2276 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2277 goto do_ftruncate_io;
2278 }
2279 else {
2280 const char * const name = SvPV_nomg_const_nolen(sv);
2281 TAINT_PROPER("truncate");
2282#ifdef HAS_TRUNCATE
2283 if (truncate(name, len) < 0)
2284 result = 0;
2285#else
2286 {
2287 const int tmpfd = PerlLIO_open(name, O_RDWR);
2288
2289 if (tmpfd < 0) {
2290 SETERRNO(EBADF,RMS_IFI);
2291 result = 0;
2292 } else {
2293 if (my_chsize(tmpfd, len) < 0)
2294 result = 0;
2295 PerlLIO_close(tmpfd);
2296 }
2297 }
2298#endif
2299 }
2300
2301 if (result)
2302 RETPUSHYES;
2303 if (!errno)
2304 SETERRNO(EBADF,RMS_IFI);
2305 RETPUSHUNDEF;
2306 }
2307}
2308
2309
2310/* also used for: pp_fcntl() */
2311
2312PP(pp_ioctl)
2313{
2314 dSP; dTARGET;
2315 SV * const argsv = POPs;
2316 const unsigned int func = POPu;
2317 int optype;
2318 GV * const gv = MUTABLE_GV(POPs);
2319 IO * const io = GvIOn(gv);
2320 char *s;
2321 IV retval;
2322
2323 if (!IoIFP(io)) {
2324 report_evil_fh(gv);
2325 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2326 RETPUSHUNDEF;
2327 }
2328
2329 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2330 STRLEN len;
2331 STRLEN need;
2332 s = SvPV_force(argsv, len);
2333 need = IOCPARM_LEN(func);
2334 if (len < need) {
2335 s = Sv_Grow(argsv, need + 1);
2336 SvCUR_set(argsv, need);
2337 }
2338
2339 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2340 }
2341 else {
2342 retval = SvIV(argsv);
2343 s = INT2PTR(char*,retval); /* ouch */
2344 }
2345
2346 optype = PL_op->op_type;
2347 TAINT_PROPER(PL_op_desc[optype]);
2348
2349 if (optype == OP_IOCTL)
2350#ifdef HAS_IOCTL
2351 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2352#else
2353 DIE(aTHX_ "ioctl is not implemented");
2354#endif
2355 else
2356#ifndef HAS_FCNTL
2357 DIE(aTHX_ "fcntl is not implemented");
2358#else
2359#if defined(OS2) && defined(__EMX__)
2360 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2361#else
2362 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2363#endif
2364#endif
2365
2366#if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2367 if (SvPOK(argsv)) {
2368 if (s[SvCUR(argsv)] != 17)
2369 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2370 OP_NAME(PL_op));
2371 s[SvCUR(argsv)] = 0; /* put our null back */
2372 SvSETMAGIC(argsv); /* Assume it has changed */
2373 }
2374
2375 if (retval == -1)
2376 RETPUSHUNDEF;
2377 if (retval != 0) {
2378 PUSHi(retval);
2379 }
2380 else {
2381 PUSHp(zero_but_true, ZBTLEN);
2382 }
2383#endif
2384 RETURN;
2385}
2386
2387PP(pp_flock)
2388{
2389#ifdef FLOCK
2390 dSP; dTARGET;
2391 I32 value;
2392 const int argtype = POPi;
2393 GV * const gv = MUTABLE_GV(POPs);
2394 IO *const io = GvIO(gv);
2395 PerlIO *const fp = io ? IoIFP(io) : NULL;
2396
2397 /* XXX Looks to me like io is always NULL at this point */
2398 if (fp) {
2399 (void)PerlIO_flush(fp);
2400 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2401 }
2402 else {
2403 report_evil_fh(gv);
2404 value = 0;
2405 SETERRNO(EBADF,RMS_IFI);
2406 }
2407 PUSHi(value);
2408 RETURN;
2409#else
2410 DIE(aTHX_ PL_no_func, "flock");
2411#endif
2412}
2413
2414/* Sockets. */
2415
2416#ifdef HAS_SOCKET
2417
2418PP(pp_socket)
2419{
2420 dSP;
2421 const int protocol = POPi;
2422 const int type = POPi;
2423 const int domain = POPi;
2424 GV * const gv = MUTABLE_GV(POPs);
2425 IO * const io = GvIOn(gv);
2426 int fd;
2427
2428 if (IoIFP(io))
2429 do_close(gv, FALSE);
2430
2431 TAINT_PROPER("socket");
2432 fd = PerlSock_socket(domain, type, protocol);
2433 if (fd < 0) {
2434 SETERRNO(EBADF,RMS_IFI);
2435 RETPUSHUNDEF;
2436 }
2437 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2438 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2439 IoTYPE(io) = IoTYPE_SOCKET;
2440 if (!IoIFP(io) || !IoOFP(io)) {
2441 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2442 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2443 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2444 RETPUSHUNDEF;
2445 }
2446#if defined(HAS_FCNTL) && defined(F_SETFD)
2447 if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
2448 RETPUSHUNDEF;
2449#endif
2450
2451 RETPUSHYES;
2452}
2453#endif
2454
2455PP(pp_sockpair)
2456{
2457#if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2458 dSP;
2459 int fd[2];
2460 const int protocol = POPi;
2461 const int type = POPi;
2462 const int domain = POPi;
2463
2464 GV * const gv2 = MUTABLE_GV(POPs);
2465 IO * const io2 = GvIOn(gv2);
2466 GV * const gv1 = MUTABLE_GV(POPs);
2467 IO * const io1 = GvIOn(gv1);
2468
2469 if (IoIFP(io1))
2470 do_close(gv1, FALSE);
2471 if (IoIFP(io2))
2472 do_close(gv2, FALSE);
2473
2474 TAINT_PROPER("socketpair");
2475 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2476 RETPUSHUNDEF;
2477 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2478 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2479 IoTYPE(io1) = IoTYPE_SOCKET;
2480 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2481 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2482 IoTYPE(io2) = IoTYPE_SOCKET;
2483 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2484 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2485 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2486 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2487 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2488 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2489 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2490 RETPUSHUNDEF;
2491 }
2492#if defined(HAS_FCNTL) && defined(F_SETFD)
2493 /* ensure close-on-exec */
2494 if ((fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
2495 (fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd) < 0))
2496 RETPUSHUNDEF;
2497#endif
2498
2499 RETPUSHYES;
2500#else
2501 DIE(aTHX_ PL_no_sock_func, "socketpair");
2502#endif
2503}
2504
2505#ifdef HAS_SOCKET
2506
2507/* also used for: pp_connect() */
2508
2509PP(pp_bind)
2510{
2511 dSP;
2512 SV * const addrsv = POPs;
2513 /* OK, so on what platform does bind modify addr? */
2514 const char *addr;
2515 GV * const gv = MUTABLE_GV(POPs);
2516 IO * const io = GvIOn(gv);
2517 STRLEN len;
2518 int op_type;
2519 int fd;
2520
2521 if (!IoIFP(io))
2522 goto nuts;
2523 fd = PerlIO_fileno(IoIFP(io));
2524 if (fd < 0)
2525 goto nuts;
2526
2527 addr = SvPV_const(addrsv, len);
2528 op_type = PL_op->op_type;
2529 TAINT_PROPER(PL_op_desc[op_type]);
2530 if ((op_type == OP_BIND
2531 ? PerlSock_bind(fd, (struct sockaddr *)addr, len)
2532 : PerlSock_connect(fd, (struct sockaddr *)addr, len))
2533 >= 0)
2534 RETPUSHYES;
2535 else
2536 RETPUSHUNDEF;
2537
2538nuts:
2539 report_evil_fh(gv);
2540 SETERRNO(EBADF,SS_IVCHAN);
2541 RETPUSHUNDEF;
2542}
2543
2544PP(pp_listen)
2545{
2546 dSP;
2547 const int backlog = POPi;
2548 GV * const gv = MUTABLE_GV(POPs);
2549 IO * const io = GvIOn(gv);
2550
2551 if (!IoIFP(io))
2552 goto nuts;
2553
2554 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2555 RETPUSHYES;
2556 else
2557 RETPUSHUNDEF;
2558
2559nuts:
2560 report_evil_fh(gv);
2561 SETERRNO(EBADF,SS_IVCHAN);
2562 RETPUSHUNDEF;
2563}
2564
2565PP(pp_accept)
2566{
2567 dSP; dTARGET;
2568 IO *nstio;
2569 char namebuf[MAXPATHLEN];
2570#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2571 Sock_size_t len = sizeof (struct sockaddr_in);
2572#else
2573 Sock_size_t len = sizeof namebuf;
2574#endif
2575 GV * const ggv = MUTABLE_GV(POPs);
2576 GV * const ngv = MUTABLE_GV(POPs);
2577 int fd;
2578
2579 IO * const gstio = GvIO(ggv);
2580 if (!gstio || !IoIFP(gstio))
2581 goto nuts;
2582
2583 nstio = GvIOn(ngv);
2584 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2585#if defined(OEMVS)
2586 if (len == 0) {
2587 /* Some platforms indicate zero length when an AF_UNIX client is
2588 * not bound. Simulate a non-zero-length sockaddr structure in
2589 * this case. */
2590 namebuf[0] = 0; /* sun_len */
2591 namebuf[1] = AF_UNIX; /* sun_family */
2592 len = 2;
2593 }
2594#endif
2595
2596 if (fd < 0)
2597 goto badexit;
2598 if (IoIFP(nstio))
2599 do_close(ngv, FALSE);
2600 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2601 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2602 IoTYPE(nstio) = IoTYPE_SOCKET;
2603 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2604 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2605 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2606 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2607 goto badexit;
2608 }
2609#if defined(HAS_FCNTL) && defined(F_SETFD)
2610 if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
2611 goto badexit;
2612#endif
2613
2614#ifdef __SCO_VERSION__
2615 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2616#endif
2617
2618 PUSHp(namebuf, len);
2619 RETURN;
2620
2621nuts:
2622 report_evil_fh(ggv);
2623 SETERRNO(EBADF,SS_IVCHAN);
2624
2625badexit:
2626 RETPUSHUNDEF;
2627
2628}
2629
2630PP(pp_shutdown)
2631{
2632 dSP; dTARGET;
2633 const int how = POPi;
2634 GV * const gv = MUTABLE_GV(POPs);
2635 IO * const io = GvIOn(gv);
2636
2637 if (!IoIFP(io))
2638 goto nuts;
2639
2640 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2641 RETURN;
2642
2643nuts:
2644 report_evil_fh(gv);
2645 SETERRNO(EBADF,SS_IVCHAN);
2646 RETPUSHUNDEF;
2647}
2648
2649
2650/* also used for: pp_gsockopt() */
2651
2652PP(pp_ssockopt)
2653{
2654 dSP;
2655 const int optype = PL_op->op_type;
2656 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2657 const unsigned int optname = (unsigned int) POPi;
2658 const unsigned int lvl = (unsigned int) POPi;
2659 GV * const gv = MUTABLE_GV(POPs);
2660 IO * const io = GvIOn(gv);
2661 int fd;
2662 Sock_size_t len;
2663
2664 if (!IoIFP(io))
2665 goto nuts;
2666
2667 fd = PerlIO_fileno(IoIFP(io));
2668 if (fd < 0)
2669 goto nuts;
2670 switch (optype) {
2671 case OP_GSOCKOPT:
2672 SvGROW(sv, 257);
2673 (void)SvPOK_only(sv);
2674 SvCUR_set(sv,256);
2675 *SvEND(sv) ='\0';
2676 len = SvCUR(sv);
2677 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2678 goto nuts2;
2679 SvCUR_set(sv, len);
2680 *SvEND(sv) ='\0';
2681 PUSHs(sv);
2682 break;
2683 case OP_SSOCKOPT: {
2684#if defined(__SYMBIAN32__)
2685# define SETSOCKOPT_OPTION_VALUE_T void *
2686#else
2687# define SETSOCKOPT_OPTION_VALUE_T const char *
2688#endif
2689 /* XXX TODO: We need to have a proper type (a Configure probe,
2690 * etc.) for what the C headers think of the third argument of
2691 * setsockopt(), the option_value read-only buffer: is it
2692 * a "char *", or a "void *", const or not. Some compilers
2693 * don't take kindly to e.g. assuming that "char *" implicitly
2694 * promotes to a "void *", or to explicitly promoting/demoting
2695 * consts to non/vice versa. The "const void *" is the SUS
2696 * definition, but that does not fly everywhere for the above
2697 * reasons. */
2698 SETSOCKOPT_OPTION_VALUE_T buf;
2699 int aint;
2700 if (SvPOKp(sv)) {
2701 STRLEN l;
2702 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2703 len = l;
2704 }
2705 else {
2706 aint = (int)SvIV(sv);
2707 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2708 len = sizeof(int);
2709 }
2710 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2711 goto nuts2;
2712 PUSHs(&PL_sv_yes);
2713 }
2714 break;
2715 }
2716 RETURN;
2717
2718nuts:
2719 report_evil_fh(gv);
2720 SETERRNO(EBADF,SS_IVCHAN);
2721nuts2:
2722 RETPUSHUNDEF;
2723
2724}
2725
2726
2727/* also used for: pp_getsockname() */
2728
2729PP(pp_getpeername)
2730{
2731 dSP;
2732 const int optype = PL_op->op_type;
2733 GV * const gv = MUTABLE_GV(POPs);
2734 IO * const io = GvIOn(gv);
2735 Sock_size_t len;
2736 SV *sv;
2737 int fd;
2738
2739 if (!IoIFP(io))
2740 goto nuts;
2741
2742 sv = sv_2mortal(newSV(257));
2743 (void)SvPOK_only(sv);
2744 len = 256;
2745 SvCUR_set(sv, len);
2746 *SvEND(sv) ='\0';
2747 fd = PerlIO_fileno(IoIFP(io));
2748 if (fd < 0)
2749 goto nuts;
2750 switch (optype) {
2751 case OP_GETSOCKNAME:
2752 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2753 goto nuts2;
2754 break;
2755 case OP_GETPEERNAME:
2756 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2757 goto nuts2;
2758#if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2759 {
2760 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";
2761 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2762 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2763 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2764 sizeof(u_short) + sizeof(struct in_addr))) {
2765 goto nuts2;
2766 }
2767 }
2768#endif
2769 break;
2770 }
2771#ifdef BOGUS_GETNAME_RETURN
2772 /* Interactive Unix, getpeername() and getsockname()
2773 does not return valid namelen */
2774 if (len == BOGUS_GETNAME_RETURN)
2775 len = sizeof(struct sockaddr);
2776#endif
2777 SvCUR_set(sv, len);
2778 *SvEND(sv) ='\0';
2779 PUSHs(sv);
2780 RETURN;
2781
2782nuts:
2783 report_evil_fh(gv);
2784 SETERRNO(EBADF,SS_IVCHAN);
2785nuts2:
2786 RETPUSHUNDEF;
2787}
2788
2789#endif
2790
2791/* Stat calls. */
2792
2793/* also used for: pp_lstat() */
2794
2795PP(pp_stat)
2796{
2797 dSP;
2798 GV *gv = NULL;
2799 IO *io = NULL;
2800 I32 gimme;
2801 I32 max = 13;
2802 SV* sv;
2803
2804 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2805 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2806 if (PL_op->op_type == OP_LSTAT) {
2807 if (gv != PL_defgv) {
2808 do_fstat_warning_check:
2809 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2810 "lstat() on filehandle%s%"SVf,
2811 gv ? " " : "",
2812 SVfARG(gv
2813 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2814 : &PL_sv_no));
2815 } else if (PL_laststype != OP_LSTAT)
2816 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2817 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2818 }
2819
2820 if (gv != PL_defgv) {
2821 bool havefp;
2822 do_fstat_have_io:
2823 havefp = FALSE;
2824 PL_laststype = OP_STAT;
2825 PL_statgv = gv ? gv : (GV *)io;
2826 sv_setpvs(PL_statname, "");
2827 if(gv) {
2828 io = GvIO(gv);
2829 }
2830 if (io) {
2831 if (IoIFP(io)) {
2832 int fd = PerlIO_fileno(IoIFP(io));
2833 if (fd < 0) {
2834 PL_laststatval = -1;
2835 SETERRNO(EBADF,RMS_IFI);
2836 } else {
2837 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
2838 havefp = TRUE;
2839 }
2840 } else if (IoDIRP(io)) {
2841 PL_laststatval =
2842 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2843 havefp = TRUE;
2844 } else {
2845 PL_laststatval = -1;
2846 }
2847 }
2848 else PL_laststatval = -1;
2849 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2850 }
2851
2852 if (PL_laststatval < 0) {
2853 max = 0;
2854 }
2855 }
2856 else {
2857 const char *file;
2858 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2859 io = MUTABLE_IO(SvRV(sv));
2860 if (PL_op->op_type == OP_LSTAT)
2861 goto do_fstat_warning_check;
2862 goto do_fstat_have_io;
2863 }
2864
2865 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2866 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2867 PL_statgv = NULL;
2868 PL_laststype = PL_op->op_type;
2869 file = SvPV_nolen_const(PL_statname);
2870 if (PL_op->op_type == OP_LSTAT)
2871 PL_laststatval = PerlLIO_lstat(file, &PL_statcache);
2872 else
2873 PL_laststatval = PerlLIO_stat(file, &PL_statcache);
2874 if (PL_laststatval < 0) {
2875 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
2876 /* PL_warn_nl is constant */
2877 GCC_DIAG_IGNORE(-Wformat-nonliteral);
2878 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2879 GCC_DIAG_RESTORE;
2880 }
2881 max = 0;
2882 }
2883 }
2884
2885 gimme = GIMME_V;
2886 if (gimme != G_ARRAY) {
2887 if (gimme != G_VOID)
2888 XPUSHs(boolSV(max));
2889 RETURN;
2890 }
2891 if (max) {
2892 EXTEND(SP, max);
2893 EXTEND_MORTAL(max);
2894 mPUSHi(PL_statcache.st_dev);
2895#if ST_INO_SIZE > IVSIZE
2896 mPUSHn(PL_statcache.st_ino);
2897#else
2898# if ST_INO_SIGN <= 0
2899 mPUSHi(PL_statcache.st_ino);
2900# else
2901 mPUSHu(PL_statcache.st_ino);
2902# endif
2903#endif
2904 mPUSHu(PL_statcache.st_mode);
2905 mPUSHu(PL_statcache.st_nlink);
2906
2907 sv_setuid(PUSHmortal, PL_statcache.st_uid);
2908 sv_setgid(PUSHmortal, PL_statcache.st_gid);
2909
2910#ifdef USE_STAT_RDEV
2911 mPUSHi(PL_statcache.st_rdev);
2912#else
2913 PUSHs(newSVpvs_flags("", SVs_TEMP));
2914#endif
2915#if Off_t_size > IVSIZE
2916 mPUSHn(PL_statcache.st_size);
2917#else
2918 mPUSHi(PL_statcache.st_size);
2919#endif
2920#ifdef BIG_TIME
2921 mPUSHn(PL_statcache.st_atime);
2922 mPUSHn(PL_statcache.st_mtime);
2923 mPUSHn(PL_statcache.st_ctime);
2924#else
2925 mPUSHi(PL_statcache.st_atime);
2926 mPUSHi(PL_statcache.st_mtime);
2927 mPUSHi(PL_statcache.st_ctime);
2928#endif
2929#ifdef USE_STAT_BLOCKS
2930 mPUSHu(PL_statcache.st_blksize);
2931 mPUSHu(PL_statcache.st_blocks);
2932#else
2933 PUSHs(newSVpvs_flags("", SVs_TEMP));
2934 PUSHs(newSVpvs_flags("", SVs_TEMP));
2935#endif
2936 }
2937 RETURN;
2938}
2939
2940/* All filetest ops avoid manipulating the perl stack pointer in their main
2941 bodies (since commit d2c4d2d1e22d3125), and return using either
2942 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2943 the only two which manipulate the perl stack. To ensure that no stack
2944 manipulation macros are used, the filetest ops avoid defining a local copy
2945 of the stack pointer with dSP. */
2946
2947/* If the next filetest is stacked up with this one
2948 (PL_op->op_private & OPpFT_STACKING), we leave
2949 the original argument on the stack for success,
2950 and skip the stacked operators on failure.
2951 The next few macros/functions take care of this.
2952*/
2953
2954static OP *
2955S_ft_return_false(pTHX_ SV *ret) {
2956 OP *next = NORMAL;
2957 dSP;
2958
2959 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2960 else SETs(ret);
2961 PUTBACK;
2962
2963 if (PL_op->op_private & OPpFT_STACKING) {
2964 while (OP_IS_FILETEST(next->op_type)
2965 && next->op_private & OPpFT_STACKED)
2966 next = next->op_next;
2967 }
2968 return next;
2969}
2970
2971PERL_STATIC_INLINE OP *
2972S_ft_return_true(pTHX_ SV *ret) {
2973 dSP;
2974 if (PL_op->op_flags & OPf_REF)
2975 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2976 else if (!(PL_op->op_private & OPpFT_STACKING))
2977 SETs(ret);
2978 PUTBACK;
2979 return NORMAL;
2980}
2981
2982#define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2983#define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2984#define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2985
2986#define tryAMAGICftest_MG(chr) STMT_START { \
2987 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2988 && PL_op->op_flags & OPf_KIDS) { \
2989 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2990 if (next) return next; \
2991 } \
2992 } STMT_END
2993
2994STATIC OP *
2995S_try_amagic_ftest(pTHX_ char chr) {
2996 SV *const arg = *PL_stack_sp;
2997
2998 assert(chr != '?');
2999 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
3000
3001 if (SvAMAGIC(arg))
3002 {
3003 const char tmpchr = chr;
3004 SV * const tmpsv = amagic_call(arg,
3005 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
3006 ftest_amg, AMGf_unary);
3007
3008 if (!tmpsv)
3009 return NULL;
3010
3011 return SvTRUE(tmpsv)
3012 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
3013 }
3014 return NULL;
3015}
3016
3017
3018/* also used for: pp_fteexec() pp_fteread() pp_ftewrite() pp_ftrexec()
3019 * pp_ftrwrite() */
3020
3021PP(pp_ftrread)
3022{
3023 I32 result;
3024 /* Not const, because things tweak this below. Not bool, because there's
3025 no guarantee that OPpFT_ACCESS is <= CHAR_MAX */
3026#if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3027 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3028 /* Giving some sort of initial value silences compilers. */
3029# ifdef R_OK
3030 int access_mode = R_OK;
3031# else
3032 int access_mode = 0;
3033# endif
3034#else
3035 /* access_mode is never used, but leaving use_access in makes the
3036 conditional compiling below much clearer. */
3037 I32 use_access = 0;
3038#endif
3039 Mode_t stat_mode = S_IRUSR;
3040
3041 bool effective = FALSE;
3042 char opchar = '?';
3043
3044 switch (PL_op->op_type) {
3045 case OP_FTRREAD: opchar = 'R'; break;
3046 case OP_FTRWRITE: opchar = 'W'; break;
3047 case OP_FTREXEC: opchar = 'X'; break;
3048 case OP_FTEREAD: opchar = 'r'; break;
3049 case OP_FTEWRITE: opchar = 'w'; break;
3050 case OP_FTEEXEC: opchar = 'x'; break;
3051 }
3052 tryAMAGICftest_MG(opchar);
3053
3054 switch (PL_op->op_type) {
3055 case OP_FTRREAD:
3056#if !(defined(HAS_ACCESS) && defined(R_OK))
3057 use_access = 0;
3058#endif
3059 break;
3060
3061 case OP_FTRWRITE:
3062#if defined(HAS_ACCESS) && defined(W_OK)
3063 access_mode = W_OK;
3064#else
3065 use_access = 0;
3066#endif
3067 stat_mode = S_IWUSR;
3068 break;
3069
3070 case OP_FTREXEC:
3071#if defined(HAS_ACCESS) && defined(X_OK)
3072 access_mode = X_OK;
3073#else
3074 use_access = 0;
3075#endif
3076 stat_mode = S_IXUSR;
3077 break;
3078
3079 case OP_FTEWRITE:
3080#ifdef PERL_EFF_ACCESS
3081 access_mode = W_OK;
3082#endif
3083 stat_mode = S_IWUSR;
3084 /* FALLTHROUGH */
3085
3086 case OP_FTEREAD:
3087#ifndef PERL_EFF_ACCESS
3088 use_access = 0;
3089#endif
3090 effective = TRUE;
3091 break;
3092
3093 case OP_FTEEXEC:
3094#ifdef PERL_EFF_ACCESS
3095 access_mode = X_OK;
3096#else
3097 use_access = 0;
3098#endif
3099 stat_mode = S_IXUSR;
3100 effective = TRUE;
3101 break;
3102 }
3103
3104 if (use_access) {
3105#if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3106 const char *name = SvPV_nolen(*PL_stack_sp);
3107 if (effective) {
3108# ifdef PERL_EFF_ACCESS
3109 result = PERL_EFF_ACCESS(name, access_mode);
3110# else
3111 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3112 OP_NAME(PL_op));
3113# endif
3114 }
3115 else {
3116# ifdef HAS_ACCESS
3117 result = access(name, access_mode);
3118# else
3119 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3120# endif
3121 }
3122 if (result == 0)
3123 FT_RETURNYES;
3124 if (result < 0)
3125 FT_RETURNUNDEF;
3126 FT_RETURNNO;
3127#endif
3128 }
3129
3130 result = my_stat_flags(0);
3131 if (result < 0)
3132 FT_RETURNUNDEF;
3133 if (cando(stat_mode, effective, &PL_statcache))
3134 FT_RETURNYES;
3135 FT_RETURNNO;
3136}
3137
3138
3139/* also used for: pp_ftatime() pp_ftctime() pp_ftmtime() pp_ftsize() */
3140
3141PP(pp_ftis)
3142{
3143 I32 result;
3144 const int op_type = PL_op->op_type;
3145 char opchar = '?';
3146
3147 switch (op_type) {
3148 case OP_FTIS: opchar = 'e'; break;
3149 case OP_FTSIZE: opchar = 's'; break;
3150 case OP_FTMTIME: opchar = 'M'; break;
3151 case OP_FTCTIME: opchar = 'C'; break;
3152 case OP_FTATIME: opchar = 'A'; break;
3153 }
3154 tryAMAGICftest_MG(opchar);
3155
3156 result = my_stat_flags(0);
3157 if (result < 0)
3158 FT_RETURNUNDEF;
3159 if (op_type == OP_FTIS)
3160 FT_RETURNYES;
3161 {
3162 /* You can't dTARGET inside OP_FTIS, because you'll get
3163 "panic: pad_sv po" - the op is not flagged to have a target. */
3164 dTARGET;
3165 switch (op_type) {
3166 case OP_FTSIZE:
3167#if Off_t_size > IVSIZE
3168 sv_setnv(TARG, (NV)PL_statcache.st_size);
3169#else
3170 sv_setiv(TARG, (IV)PL_statcache.st_size);
3171#endif
3172 break;
3173 case OP_FTMTIME:
3174 sv_setnv(TARG,
3175 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3176 break;
3177 case OP_FTATIME:
3178 sv_setnv(TARG,
3179 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3180 break;
3181 case OP_FTCTIME:
3182 sv_setnv(TARG,
3183 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3184 break;
3185 }
3186 SvSETMAGIC(TARG);
3187 return SvTRUE_nomg(TARG)
3188 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3189 }
3190}
3191
3192
3193/* also used for: pp_ftblk() pp_ftchr() pp_ftdir() pp_fteowned()
3194 * pp_ftfile() pp_ftpipe() pp_ftsgid() pp_ftsock()
3195 * pp_ftsuid() pp_ftsvtx() pp_ftzero() */
3196
3197PP(pp_ftrowned)
3198{
3199 I32 result;
3200 char opchar = '?';
3201
3202 switch (PL_op->op_type) {
3203 case OP_FTROWNED: opchar = 'O'; break;
3204 case OP_FTEOWNED: opchar = 'o'; break;
3205 case OP_FTZERO: opchar = 'z'; break;
3206 case OP_FTSOCK: opchar = 'S'; break;
3207 case OP_FTCHR: opchar = 'c'; break;
3208 case OP_FTBLK: opchar = 'b'; break;
3209 case OP_FTFILE: opchar = 'f'; break;
3210 case OP_FTDIR: opchar = 'd'; break;
3211 case OP_FTPIPE: opchar = 'p'; break;
3212 case OP_FTSUID: opchar = 'u'; break;
3213 case OP_FTSGID: opchar = 'g'; break;
3214 case OP_FTSVTX: opchar = 'k'; break;
3215 }
3216 tryAMAGICftest_MG(opchar);
3217
3218 /* I believe that all these three are likely to be defined on most every
3219 system these days. */
3220#ifndef S_ISUID
3221 if(PL_op->op_type == OP_FTSUID) {
3222 FT_RETURNNO;
3223 }
3224#endif
3225#ifndef S_ISGID
3226 if(PL_op->op_type == OP_FTSGID) {
3227 FT_RETURNNO;
3228 }
3229#endif
3230#ifndef S_ISVTX
3231 if(PL_op->op_type == OP_FTSVTX) {
3232 FT_RETURNNO;
3233 }
3234#endif
3235
3236 result = my_stat_flags(0);
3237 if (result < 0)
3238 FT_RETURNUNDEF;
3239 switch (PL_op->op_type) {
3240 case OP_FTROWNED:
3241 if (PL_statcache.st_uid == PerlProc_getuid())
3242 FT_RETURNYES;
3243 break;
3244 case OP_FTEOWNED:
3245 if (PL_statcache.st_uid == PerlProc_geteuid())
3246 FT_RETURNYES;
3247 break;
3248 case OP_FTZERO:
3249 if (PL_statcache.st_size == 0)
3250 FT_RETURNYES;
3251 break;
3252 case OP_FTSOCK:
3253 if (S_ISSOCK(PL_statcache.st_mode))
3254 FT_RETURNYES;
3255 break;
3256 case OP_FTCHR:
3257 if (S_ISCHR(PL_statcache.st_mode))
3258 FT_RETURNYES;
3259 break;
3260 case OP_FTBLK:
3261 if (S_ISBLK(PL_statcache.st_mode))
3262 FT_RETURNYES;
3263 break;
3264 case OP_FTFILE:
3265 if (S_ISREG(PL_statcache.st_mode))
3266 FT_RETURNYES;
3267 break;
3268 case OP_FTDIR:
3269 if (S_ISDIR(PL_statcache.st_mode))
3270 FT_RETURNYES;
3271 break;
3272 case OP_FTPIPE:
3273 if (S_ISFIFO(PL_statcache.st_mode))
3274 FT_RETURNYES;
3275 break;
3276#ifdef S_ISUID
3277 case OP_FTSUID:
3278 if (PL_statcache.st_mode & S_ISUID)
3279 FT_RETURNYES;
3280 break;
3281#endif
3282#ifdef S_ISGID
3283 case OP_FTSGID:
3284 if (PL_statcache.st_mode & S_ISGID)
3285 FT_RETURNYES;
3286 break;
3287#endif
3288#ifdef S_ISVTX
3289 case OP_FTSVTX:
3290 if (PL_statcache.st_mode & S_ISVTX)
3291 FT_RETURNYES;
3292 break;
3293#endif
3294 }
3295 FT_RETURNNO;
3296}
3297
3298PP(pp_ftlink)
3299{
3300 I32 result;
3301
3302 tryAMAGICftest_MG('l');
3303 result = my_lstat_flags(0);
3304
3305 if (result < 0)
3306 FT_RETURNUNDEF;
3307 if (S_ISLNK(PL_statcache.st_mode))
3308 FT_RETURNYES;
3309 FT_RETURNNO;
3310}
3311
3312PP(pp_fttty)
3313{
3314 int fd;
3315 GV *gv;
3316 char *name = NULL;
3317 STRLEN namelen;
3318
3319 tryAMAGICftest_MG('t');
3320
3321 if (PL_op->op_flags & OPf_REF)
3322 gv = cGVOP_gv;
3323 else {
3324 SV *tmpsv = *PL_stack_sp;
3325 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3326 name = SvPV_nomg(tmpsv, namelen);
3327 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3328 }
3329 }
3330
3331 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3332 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3333 else if (name && isDIGIT(*name))
3334 fd = grok_atou(name, NULL);
3335 else
3336 FT_RETURNUNDEF;
3337 if (fd < 0) {
3338 SETERRNO(EBADF,RMS_IFI);
3339 FT_RETURNUNDEF;
3340 }
3341 if (PerlLIO_isatty(fd))
3342 FT_RETURNYES;
3343 FT_RETURNNO;
3344}
3345
3346
3347/* also used for: pp_ftbinary() */
3348
3349PP(pp_fttext)
3350{
3351 I32 i;
3352 SSize_t len;
3353 I32 odd = 0;
3354 STDCHAR tbuf[512];
3355 STDCHAR *s;
3356 IO *io;
3357 SV *sv = NULL;
3358 GV *gv;
3359 PerlIO *fp;
3360
3361 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3362
3363 if (PL_op->op_flags & OPf_REF)
3364 gv = cGVOP_gv;
3365 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3366 == OPpFT_STACKED)
3367 gv = PL_defgv;
3368 else {
3369 sv = *PL_stack_sp;
3370 gv = MAYBE_DEREF_GV_nomg(sv);
3371 }
3372
3373 if (gv) {
3374 if (gv == PL_defgv) {
3375 if (PL_statgv)
3376 io = SvTYPE(PL_statgv) == SVt_PVIO
3377 ? (IO *)PL_statgv
3378 : GvIO(PL_statgv);
3379 else {
3380 goto really_filename;
3381 }
3382 }
3383 else {
3384 PL_statgv = gv;
3385 sv_setpvs(PL_statname, "");
3386 io = GvIO(PL_statgv);
3387 }
3388 PL_laststatval = -1;
3389 PL_laststype = OP_STAT;
3390 if (io && IoIFP(io)) {
3391 int fd;
3392 if (! PerlIO_has_base(IoIFP(io)))
3393 DIE(aTHX_ "-T and -B not implemented on filehandles");
3394 fd = PerlIO_fileno(IoIFP(io));
3395 if (fd < 0) {
3396 SETERRNO(EBADF,RMS_IFI);
3397 FT_RETURNUNDEF;
3398 }
3399 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3400 if (PL_laststatval < 0)
3401 FT_RETURNUNDEF;
3402 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3403 if (PL_op->op_type == OP_FTTEXT)
3404 FT_RETURNNO;
3405 else
3406 FT_RETURNYES;
3407 }
3408 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3409 i = PerlIO_getc(IoIFP(io));
3410 if (i != EOF)
3411 (void)PerlIO_ungetc(IoIFP(io),i);
3412 else
3413 /* null file is anything */
3414 FT_RETURNYES;
3415 }
3416 len = PerlIO_get_bufsiz(IoIFP(io));
3417 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3418 /* sfio can have large buffers - limit to 512 */
3419 if (len > 512)
3420 len = 512;
3421 }
3422 else {
3423 SETERRNO(EBADF,RMS_IFI);
3424 report_evil_fh(gv);
3425 SETERRNO(EBADF,RMS_IFI);
3426 FT_RETURNUNDEF;
3427 }
3428 }
3429 else {
3430 const char *file;
3431 int fd;
3432
3433 assert(sv);
3434 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3435 really_filename:
3436 file = SvPVX_const(PL_statname);
3437 PL_statgv = NULL;
3438 if (!(fp = PerlIO_open(file, "r"))) {
3439 if (!gv) {
3440 PL_laststatval = -1;
3441 PL_laststype = OP_STAT;
3442 }
3443 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
3444 /* PL_warn_nl is constant */
3445 GCC_DIAG_IGNORE(-Wformat-nonliteral);
3446 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3447 GCC_DIAG_RESTORE;
3448 }
3449 FT_RETURNUNDEF;
3450 }
3451 PL_laststype = OP_STAT;
3452 fd = PerlIO_fileno(fp);
3453 if (fd < 0) {
3454 (void)PerlIO_close(fp);
3455 SETERRNO(EBADF,RMS_IFI);
3456 FT_RETURNUNDEF;
3457 }
3458 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3459 if (PL_laststatval < 0) {
3460 (void)PerlIO_close(fp);
3461 SETERRNO(EBADF,RMS_IFI);
3462 FT_RETURNUNDEF;
3463 }
3464 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3465 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3466 (void)PerlIO_close(fp);
3467 if (len <= 0) {
3468 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3469 FT_RETURNNO; /* special case NFS directories */
3470 FT_RETURNYES; /* null file is anything */
3471 }
3472 s = tbuf;
3473 }
3474
3475 /* now scan s to look for textiness */
3476
3477#if defined(DOSISH) || defined(USEMYBINMODE)
3478 /* ignore trailing ^Z on short files */
3479 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3480 --len;
3481#endif
3482
3483 assert(len);
3484 if (! is_ascii_string((U8 *) s, len)) {
3485 const U8 *ep;
3486
3487 /* Here contains a non-ASCII. See if the entire string is UTF-8. But
3488 * the buffer may end in a partial character, so consider it UTF-8 if
3489 * the first non-UTF8 char is an ending partial */
3490 if (is_utf8_string_loc((U8 *) s, len, &ep)
3491 || ep + UTF8SKIP(ep) > (U8 *) (s + len))
3492 {
3493 if (PL_op->op_type == OP_FTTEXT) {
3494 FT_RETURNYES;
3495 }
3496 else {
3497 FT_RETURNNO;
3498 }
3499 }
3500 }
3501
3502 /* Here, is not UTF-8 or is entirely ASCII. Look through the buffer for
3503 * things that wouldn't be in ASCII text or rich ASCII text. Count these
3504 * in 'odd' */
3505 for (i = 0; i < len; i++, s++) {
3506 if (!*s) { /* null never allowed in text */
3507 odd += len;
3508 break;
3509 }
3510#ifdef USE_LOCALE_CTYPE
3511 if (IN_LC_RUNTIME(LC_CTYPE)) {
3512 if ( isPRINT_LC(*s) || isSPACE_LC(*s)) {
3513 continue;
3514 }
3515 }
3516 else
3517#endif
3518 if (isPRINT_A(*s)
3519 /* VT occurs so rarely in text, that we consider it odd */
3520 || (isSPACE_A(*s) && *s != VT_NATIVE)
3521
3522 /* But there is a fair amount of backspaces and escapes in
3523 * some text */
3524 || *s == '\b'
3525 || *s == ESC_NATIVE)
3526 {
3527 continue;
3528 }
3529 odd++;
3530 }
3531
3532 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3533 FT_RETURNNO;
3534 else
3535 FT_RETURNYES;
3536}
3537
3538/* File calls. */
3539
3540PP(pp_chdir)
3541{
3542 dSP; dTARGET;
3543 const char *tmps = NULL;
3544 GV *gv = NULL;
3545
3546 if( MAXARG == 1 ) {
3547 SV * const sv = POPs;
3548 if (PL_op->op_flags & OPf_SPECIAL) {
3549 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3550 }
3551 else if (!(gv = MAYBE_DEREF_GV(sv)))
3552 tmps = SvPV_nomg_const_nolen(sv);
3553 }
3554
3555 if( !gv && (!tmps || !*tmps) ) {
3556 HV * const table = GvHVn(PL_envgv);
3557 SV **svp;
3558
3559 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3560 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3561#ifdef VMS
3562 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3563#endif
3564 )
3565 {
3566 if( MAXARG == 1 )
3567 deprecate("chdir('') or chdir(undef) as chdir()");
3568 tmps = SvPV_nolen_const(*svp);
3569 }
3570 else {
3571 PUSHi(0);
3572 TAINT_PROPER("chdir");
3573 RETURN;
3574 }
3575 }
3576
3577 TAINT_PROPER("chdir");
3578 if (gv) {
3579#ifdef HAS_FCHDIR
3580 IO* const io = GvIO(gv);
3581 if (io) {
3582 if (IoDIRP(io)) {
3583 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3584 } else if (IoIFP(io)) {
3585 int fd = PerlIO_fileno(IoIFP(io));
3586 if (fd < 0) {
3587 goto nuts;
3588 }
3589 PUSHi(fchdir(fd) >= 0);
3590 }
3591 else {
3592 goto nuts;
3593 }
3594 } else {
3595 goto nuts;
3596 }
3597
3598#else
3599 DIE(aTHX_ PL_no_func, "fchdir");
3600#endif
3601 }
3602 else
3603 PUSHi( PerlDir_chdir(tmps) >= 0 );
3604#ifdef VMS
3605 /* Clear the DEFAULT element of ENV so we'll get the new value
3606 * in the future. */
3607 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3608#endif
3609 RETURN;
3610
3611 nuts:
3612 report_evil_fh(gv);
3613 SETERRNO(EBADF,RMS_IFI);
3614 PUSHi(0);
3615 RETURN;
3616}
3617
3618
3619/* also used for: pp_chmod() pp_kill() pp_unlink() pp_utime() */
3620
3621PP(pp_chown)
3622{
3623 dSP; dMARK; dTARGET;
3624 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3625
3626 SP = MARK;
3627 XPUSHi(value);
3628 RETURN;
3629}
3630
3631PP(pp_chroot)
3632{
3633#ifdef HAS_CHROOT
3634 dSP; dTARGET;
3635 char * const tmps = POPpx;
3636 TAINT_PROPER("chroot");
3637 PUSHi( chroot(tmps) >= 0 );
3638 RETURN;
3639#else
3640 DIE(aTHX_ PL_no_func, "chroot");
3641#endif
3642}
3643
3644PP(pp_rename)
3645{
3646 dSP; dTARGET;
3647 int anum;
3648 const char * const tmps2 = POPpconstx;
3649 const char * const tmps = SvPV_nolen_const(TOPs);
3650 TAINT_PROPER("rename");
3651#ifdef HAS_RENAME
3652 anum = PerlLIO_rename(tmps, tmps2);
3653#else
3654 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3655 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3656 anum = 1;
3657 else {
3658 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3659 (void)UNLINK(tmps2);
3660 if (!(anum = link(tmps, tmps2)))
3661 anum = UNLINK(tmps);
3662 }
3663 }
3664#endif
3665 SETi( anum >= 0 );
3666 RETURN;
3667}
3668
3669
3670/* also used for: pp_symlink() */
3671
3672#if defined(HAS_LINK) || defined(HAS_SYMLINK)
3673PP(pp_link)
3674{
3675 dSP; dTARGET;
3676 const int op_type = PL_op->op_type;
3677 int result;
3678
3679# ifndef HAS_LINK
3680 if (op_type == OP_LINK)
3681 DIE(aTHX_ PL_no_func, "link");
3682# endif
3683# ifndef HAS_SYMLINK
3684 if (op_type == OP_SYMLINK)
3685 DIE(aTHX_ PL_no_func, "symlink");
3686# endif
3687
3688 {
3689 const char * const tmps2 = POPpconstx;
3690 const char * const tmps = SvPV_nolen_const(TOPs);
3691 TAINT_PROPER(PL_op_desc[op_type]);
3692 result =
3693# if defined(HAS_LINK)
3694# if defined(HAS_SYMLINK)
3695 /* Both present - need to choose which. */
3696 (op_type == OP_LINK) ?
3697 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3698# else
3699 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3700 PerlLIO_link(tmps, tmps2);
3701# endif
3702# else
3703# if defined(HAS_SYMLINK)
3704 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3705 symlink(tmps, tmps2);
3706# endif
3707# endif
3708 }
3709
3710 SETi( result >= 0 );
3711 RETURN;
3712}
3713#else
3714
3715/* also used for: pp_symlink() */
3716
3717PP(pp_link)
3718{
3719 /* Have neither. */
3720 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3721}
3722#endif
3723
3724PP(pp_readlink)
3725{
3726 dSP;
3727#ifdef HAS_SYMLINK
3728 dTARGET;
3729 const char *tmps;
3730 char buf[MAXPATHLEN];
3731 SSize_t len;
3732
3733 TAINT;
3734 tmps = POPpconstx;
3735 /* NOTE: if the length returned by readlink() is sizeof(buf) - 1,
3736 * it is impossible to know whether the result was truncated. */
3737 len = readlink(tmps, buf, sizeof(buf) - 1);
3738 if (len < 0)
3739 RETPUSHUNDEF;
3740 if (len != -1)
3741 buf[len] = '\0';
3742 PUSHp(buf, len);
3743 RETURN;
3744#else
3745 EXTEND(SP, 1);
3746 RETSETUNDEF; /* just pretend it's a normal file */
3747#endif
3748}
3749
3750#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3751STATIC int
3752S_dooneliner(pTHX_ const char *cmd, const char *filename)
3753{
3754 char * const save_filename = filename;
3755 char *cmdline;
3756 char *s;
3757 PerlIO *myfp;
3758 int anum = 1;
3759 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3760
3761 PERL_ARGS_ASSERT_DOONELINER;
3762
3763 Newx(cmdline, size, char);
3764 my_strlcpy(cmdline, cmd, size);
3765 my_strlcat(cmdline, " ", size);
3766 for (s = cmdline + strlen(cmdline); *filename; ) {
3767 *s++ = '\\';
3768 *s++ = *filename++;
3769 }
3770 if (s - cmdline < size)
3771 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3772 myfp = PerlProc_popen(cmdline, "r");
3773 Safefree(cmdline);
3774
3775 if (myfp) {
3776 SV * const tmpsv = sv_newmortal();
3777 /* Need to save/restore 'PL_rs' ?? */
3778 s = sv_gets(tmpsv, myfp, 0);
3779 (void)PerlProc_pclose(myfp);
3780 if (s != NULL) {
3781 int e;
3782 for (e = 1;
3783#ifdef HAS_SYS_ERRLIST
3784 e <= sys_nerr
3785#endif
3786 ; e++)
3787 {
3788 /* you don't see this */
3789 const char * const errmsg = Strerror(e) ;
3790 if (!errmsg)
3791 break;
3792 if (instr(s, errmsg)) {
3793 SETERRNO(e,0);
3794 return 0;
3795 }
3796 }
3797 SETERRNO(0,0);
3798#ifndef EACCES
3799#define EACCES EPERM
3800#endif
3801 if (instr(s, "cannot make"))
3802 SETERRNO(EEXIST,RMS_FEX);
3803 else if (instr(s, "existing file"))
3804 SETERRNO(EEXIST,RMS_FEX);
3805 else if (instr(s, "ile exists"))
3806 SETERRNO(EEXIST,RMS_FEX);
3807 else if (instr(s, "non-exist"))
3808 SETERRNO(ENOENT,RMS_FNF);
3809 else if (instr(s, "does not exist"))
3810 SETERRNO(ENOENT,RMS_FNF);
3811 else if (instr(s, "not empty"))
3812 SETERRNO(EBUSY,SS_DEVOFFLINE);
3813 else if (instr(s, "cannot access"))
3814 SETERRNO(EACCES,RMS_PRV);
3815 else
3816 SETERRNO(EPERM,RMS_PRV);
3817 return 0;
3818 }
3819 else { /* some mkdirs return no failure indication */
3820 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3821 if (PL_op->op_type == OP_RMDIR)
3822 anum = !anum;
3823 if (anum)
3824 SETERRNO(0,0);
3825 else
3826 SETERRNO(EACCES,RMS_PRV); /* a guess */
3827 }
3828 return anum;
3829 }
3830 else
3831 return 0;
3832}
3833#endif
3834
3835/* This macro removes trailing slashes from a directory name.
3836 * Different operating and file systems take differently to
3837 * trailing slashes. According to POSIX 1003.1 1996 Edition
3838 * any number of trailing slashes should be allowed.
3839 * Thusly we snip them away so that even non-conforming
3840 * systems are happy.
3841 * We should probably do this "filtering" for all
3842 * the functions that expect (potentially) directory names:
3843 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3844 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3845
3846#define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3847 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3848 do { \
3849 (len)--; \
3850 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3851 (tmps) = savepvn((tmps), (len)); \
3852 (copy) = TRUE; \
3853 }
3854
3855PP(pp_mkdir)
3856{
3857 dSP; dTARGET;
3858 STRLEN len;
3859 const char *tmps;
3860 bool copy = FALSE;
3861 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3862
3863 TRIMSLASHES(tmps,len,copy);
3864
3865 TAINT_PROPER("mkdir");
3866#ifdef HAS_MKDIR
3867 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3868#else
3869 {
3870 int oldumask;
3871 SETi( dooneliner("mkdir", tmps) );
3872 oldumask = PerlLIO_umask(0);
3873 PerlLIO_umask(oldumask);
3874 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3875 }
3876#endif
3877 if (copy)
3878 Safefree(tmps);
3879 RETURN;
3880}
3881
3882PP(pp_rmdir)
3883{
3884 dSP; dTARGET;
3885 STRLEN len;
3886 const char *tmps;
3887 bool copy = FALSE;
3888
3889 TRIMSLASHES(tmps,len,copy);
3890 TAINT_PROPER("rmdir");
3891#ifdef HAS_RMDIR
3892 SETi( PerlDir_rmdir(tmps) >= 0 );
3893#else
3894 SETi( dooneliner("rmdir", tmps) );
3895#endif
3896 if (copy)
3897 Safefree(tmps);
3898 RETURN;
3899}
3900
3901/* Directory calls. */
3902
3903PP(pp_open_dir)
3904{
3905#if defined(Direntry_t) && defined(HAS_READDIR)
3906 dSP;
3907 const char * const dirname = POPpconstx;
3908 GV * const gv = MUTABLE_GV(POPs);
3909 IO * const io = GvIOn(gv);
3910
3911 if ((IoIFP(io) || IoOFP(io)))
3912 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3913 "Opening filehandle %"HEKf" also as a directory",
3914 HEKfARG(GvENAME_HEK(gv)) );
3915 if (IoDIRP(io))
3916 PerlDir_close(IoDIRP(io));
3917 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3918 goto nope;
3919
3920 RETPUSHYES;
3921nope:
3922 if (!errno)
3923 SETERRNO(EBADF,RMS_DIR);
3924 RETPUSHUNDEF;
3925#else
3926 DIE(aTHX_ PL_no_dir_func, "opendir");
3927#endif
3928}
3929
3930PP(pp_readdir)
3931{
3932#if !defined(Direntry_t) || !defined(HAS_READDIR)
3933 DIE(aTHX_ PL_no_dir_func, "readdir");
3934#else
3935#if !defined(I_DIRENT) && !defined(VMS)
3936 Direntry_t *readdir (DIR *);
3937#endif
3938 dSP;
3939
3940 SV *sv;
3941 const I32 gimme = GIMME;
3942 GV * const gv = MUTABLE_GV(POPs);
3943 const Direntry_t *dp;
3944 IO * const io = GvIOn(gv);
3945
3946 if (!IoDIRP(io)) {
3947 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3948 "readdir() attempted on invalid dirhandle %"HEKf,
3949 HEKfARG(GvENAME_HEK(gv)));
3950 goto nope;
3951 }
3952
3953 do {
3954 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3955 if (!dp)
3956 break;
3957#ifdef DIRNAMLEN
3958 sv = newSVpvn(dp->d_name, dp->d_namlen);
3959#else
3960 sv = newSVpv(dp->d_name, 0);
3961#endif
3962 if (!(IoFLAGS(io) & IOf_UNTAINT))
3963 SvTAINTED_on(sv);
3964 mXPUSHs(sv);
3965 } while (gimme == G_ARRAY);
3966
3967 if (!dp && gimme != G_ARRAY)
3968 RETPUSHUNDEF;
3969
3970 RETURN;
3971
3972nope:
3973 if (!errno)
3974 SETERRNO(EBADF,RMS_ISI);
3975 if (GIMME == G_ARRAY)
3976 RETURN;
3977 else
3978 RETPUSHUNDEF;
3979#endif
3980}
3981
3982PP(pp_telldir)
3983{
3984#if defined(HAS_TELLDIR) || defined(telldir)
3985 dSP; dTARGET;
3986 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3987 /* XXX netbsd still seemed to.
3988 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3989 --JHI 1999-Feb-02 */
3990# if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3991 long telldir (DIR *);
3992# endif
3993 GV * const gv = MUTABLE_GV(POPs);
3994 IO * const io = GvIOn(gv);
3995
3996 if (!IoDIRP(io)) {
3997 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3998 "telldir() attempted on invalid dirhandle %"HEKf,
3999 HEKfARG(GvENAME_HEK(gv)));
4000 goto nope;
4001 }
4002
4003 PUSHi( PerlDir_tell(IoDIRP(io)) );
4004 RETURN;
4005nope:
4006 if (!errno)
4007 SETERRNO(EBADF,RMS_ISI);
4008 RETPUSHUNDEF;
4009#else
4010 DIE(aTHX_ PL_no_dir_func, "telldir");
4011#endif
4012}
4013
4014PP(pp_seekdir)
4015{
4016#if defined(HAS_SEEKDIR) || defined(seekdir)
4017 dSP;
4018 const long along = POPl;
4019 GV * const gv = MUTABLE_GV(POPs);
4020 IO * const io = GvIOn(gv);
4021
4022 if (!IoDIRP(io)) {
4023 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4024 "seekdir() attempted on invalid dirhandle %"HEKf,
4025 HEKfARG(GvENAME_HEK(gv)));
4026 goto nope;
4027 }
4028 (void)PerlDir_seek(IoDIRP(io), along);
4029
4030 RETPUSHYES;
4031nope:
4032 if (!errno)
4033 SETERRNO(EBADF,RMS_ISI);
4034 RETPUSHUNDEF;
4035#else
4036 DIE(aTHX_ PL_no_dir_func, "seekdir");
4037#endif
4038}
4039
4040PP(pp_rewinddir)
4041{
4042#if defined(HAS_REWINDDIR) || defined(rewinddir)
4043 dSP;
4044 GV * const gv = MUTABLE_GV(POPs);
4045 IO * const io = GvIOn(gv);
4046
4047 if (!IoDIRP(io)) {
4048 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4049 "rewinddir() attempted on invalid dirhandle %"HEKf,
4050 HEKfARG(GvENAME_HEK(gv)));
4051 goto nope;
4052 }
4053 (void)PerlDir_rewind(IoDIRP(io));
4054 RETPUSHYES;
4055nope:
4056 if (!errno)
4057 SETERRNO(EBADF,RMS_ISI);
4058 RETPUSHUNDEF;
4059#else
4060 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4061#endif
4062}
4063
4064PP(pp_closedir)
4065{
4066#if defined(Direntry_t) && defined(HAS_READDIR)
4067 dSP;
4068 GV * const gv = MUTABLE_GV(POPs);
4069 IO * const io = GvIOn(gv);
4070
4071 if (!IoDIRP(io)) {
4072 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4073 "closedir() attempted on invalid dirhandle %"HEKf,
4074 HEKfARG(GvENAME_HEK(gv)));
4075 goto nope;
4076 }
4077#ifdef VOID_CLOSEDIR
4078 PerlDir_close(IoDIRP(io));
4079#else
4080 if (PerlDir_close(IoDIRP(io)) < 0) {
4081 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4082 goto nope;
4083 }
4084#endif
4085 IoDIRP(io) = 0;
4086
4087 RETPUSHYES;
4088nope:
4089 if (!errno)
4090 SETERRNO(EBADF,RMS_IFI);
4091 RETPUSHUNDEF;
4092#else
4093 DIE(aTHX_ PL_no_dir_func, "closedir");
4094#endif
4095}
4096
4097/* Process control. */
4098
4099PP(pp_fork)
4100{
4101#ifdef HAS_FORK
4102 dSP; dTARGET;
4103 Pid_t childpid;
4104#ifdef HAS_SIGPROCMASK
4105 sigset_t oldmask, newmask;
4106#endif
4107
4108 EXTEND(SP, 1);
4109 PERL_FLUSHALL_FOR_CHILD;
4110#ifdef HAS_SIGPROCMASK
4111 sigfillset(&newmask);
4112 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4113#endif
4114 childpid = PerlProc_fork();
4115 if (childpid == 0) {
4116 int sig;
4117 PL_sig_pending = 0;
4118 if (PL_psig_pend)
4119 for (sig = 1; sig < SIG_SIZE; sig++)
4120 PL_psig_pend[sig] = 0;
4121 }
4122#ifdef HAS_SIGPROCMASK
4123 {
4124 dSAVE_ERRNO;
4125 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4126 RESTORE_ERRNO;
4127 }
4128#endif
4129 if (childpid < 0)
4130 RETPUSHUNDEF;
4131 if (!childpid) {
4132#ifdef PERL_USES_PL_PIDSTATUS
4133 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4134#endif
4135 }
4136 PUSHi(childpid);
4137 RETURN;
4138#else
4139# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4140 dSP; dTARGET;
4141 Pid_t childpid;
4142
4143 EXTEND(SP, 1);
4144 PERL_FLUSHALL_FOR_CHILD;
4145 childpid = PerlProc_fork();
4146 if (childpid == -1)
4147 RETPUSHUNDEF;
4148 PUSHi(childpid);
4149 RETURN;
4150# else
4151 DIE(aTHX_ PL_no_func, "fork");
4152# endif
4153#endif
4154}
4155
4156PP(pp_wait)
4157{
4158#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4159 dSP; dTARGET;
4160 Pid_t childpid;
4161 int argflags;
4162
4163 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4164 childpid = wait4pid(-1, &argflags, 0);
4165 else {
4166 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4167 errno == EINTR) {
4168 PERL_ASYNC_CHECK();
4169 }
4170 }
4171# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4172 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4173 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4174# else
4175 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4176# endif
4177 XPUSHi(childpid);
4178 RETURN;
4179#else
4180 DIE(aTHX_ PL_no_func, "wait");
4181#endif
4182}
4183
4184PP(pp_waitpid)
4185{
4186#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4187 dSP; dTARGET;
4188 const int optype = POPi;
4189 const Pid_t pid = TOPi;
4190 Pid_t result;
4191 int argflags;
4192
4193 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4194 result = wait4pid(pid, &argflags, optype);
4195 else {
4196 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4197 errno == EINTR) {
4198 PERL_ASYNC_CHECK();
4199 }
4200 }
4201# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4202 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4203 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4204# else
4205 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4206# endif
4207 SETi(result);
4208 RETURN;
4209#else
4210 DIE(aTHX_ PL_no_func, "waitpid");
4211#endif
4212}
4213
4214PP(pp_system)
4215{
4216 dSP; dMARK; dORIGMARK; dTARGET;
4217#if defined(__LIBCATAMOUNT__)
4218 PL_statusvalue = -1;
4219 SP = ORIGMARK;
4220 XPUSHi(-1);
4221#else
4222 I32 value;
4223 int result;
4224
4225 if (TAINTING_get) {
4226 TAINT_ENV();
4227 while (++MARK <= SP) {
4228 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4229 if (TAINT_get)
4230 break;
4231 }
4232 MARK = ORIGMARK;
4233 TAINT_PROPER("system");
4234 }
4235 PERL_FLUSHALL_FOR_CHILD;
4236#if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4237 {
4238 Pid_t childpid;
4239 int pp[2];
4240 I32 did_pipes = 0;
4241#ifdef HAS_SIGPROCMASK
4242 sigset_t newset, oldset;
4243#endif
4244
4245 if (PerlProc_pipe(pp) >= 0)
4246 did_pipes = 1;
4247#ifdef HAS_SIGPROCMASK
4248 sigemptyset(&newset);
4249 sigaddset(&newset, SIGCHLD);
4250 sigprocmask(SIG_BLOCK, &newset, &oldset);
4251#endif
4252 while ((childpid = PerlProc_fork()) == -1) {
4253 if (errno != EAGAIN) {
4254 value = -1;
4255 SP = ORIGMARK;
4256 XPUSHi(value);
4257 if (did_pipes) {
4258 PerlLIO_close(pp[0]);
4259 PerlLIO_close(pp[1]);
4260 }
4261#ifdef HAS_SIGPROCMASK
4262 sigprocmask(SIG_SETMASK, &oldset, NULL);
4263#endif
4264 RETURN;
4265 }
4266 sleep(5);
4267 }
4268 if (childpid > 0) {
4269 Sigsave_t ihand,qhand; /* place to save signals during system() */
4270 int status;
4271
4272 if (did_pipes)
4273 PerlLIO_close(pp[1]);
4274#ifndef PERL_MICRO
4275 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4276 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4277#endif
4278 do {
4279 result = wait4pid(childpid, &status, 0);
4280 } while (result == -1 && errno == EINTR);
4281#ifndef PERL_MICRO
4282#ifdef HAS_SIGPROCMASK
4283 sigprocmask(SIG_SETMASK, &oldset, NULL);
4284#endif
4285 (void)rsignal_restore(SIGINT, &ihand);
4286 (void)rsignal_restore(SIGQUIT, &qhand);
4287#endif
4288 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4289 do_execfree(); /* free any memory child malloced on fork */
4290 SP = ORIGMARK;
4291 if (did_pipes) {
4292 int errkid;
4293 unsigned n = 0;
4294 SSize_t n1;
4295
4296 while (n < sizeof(int)) {
4297 n1 = PerlLIO_read(pp[0],
4298 (void*)(((char*)&errkid)+n),
4299 (sizeof(int)) - n);
4300 if (n1 <= 0)
4301 break;
4302 n += n1;
4303 }
4304 PerlLIO_close(pp[0]);
4305 if (n) { /* Error */
4306 if (n != sizeof(int))
4307 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4308 errno = errkid; /* Propagate errno from kid */
4309 STATUS_NATIVE_CHILD_SET(-1);
4310 }
4311 }
4312 XPUSHi(STATUS_CURRENT);
4313 RETURN;
4314 }
4315#ifdef HAS_SIGPROCMASK
4316 sigprocmask(SIG_SETMASK, &oldset, NULL);
4317#endif
4318 if (did_pipes) {
4319 PerlLIO_close(pp[0]);
4320#if defined(HAS_FCNTL) && defined(F_SETFD)
4321 if (fcntl(pp[1], F_SETFD, FD_CLOEXEC) < 0)
4322 RETPUSHUNDEF;
4323#endif
4324 }
4325 if (PL_op->op_flags & OPf_STACKED) {
4326 SV * const really = *++MARK;
4327 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4328 }
4329 else if (SP - MARK != 1)
4330 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4331 else {
4332 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4333 }
4334 PerlProc__exit(-1);
4335 }
4336#else /* ! FORK or VMS or OS/2 */
4337 PL_statusvalue = 0;
4338 result = 0;
4339 if (PL_op->op_flags & OPf_STACKED) {
4340 SV * const really = *++MARK;
4341# if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4342 value = (I32)do_aspawn(really, MARK, SP);
4343# else
4344 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4345# endif
4346 }
4347 else if (SP - MARK != 1) {
4348# if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4349 value = (I32)do_aspawn(NULL, MARK, SP);
4350# else
4351 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4352# endif
4353 }
4354 else {
4355 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4356 }
4357 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4358 result = 1;
4359 STATUS_NATIVE_CHILD_SET(value);
4360 do_execfree();
4361 SP = ORIGMARK;
4362 XPUSHi(result ? value : STATUS_CURRENT);
4363#endif /* !FORK or VMS or OS/2 */
4364#endif
4365 RETURN;
4366}
4367
4368PP(pp_exec)
4369{
4370 dSP; dMARK; dORIGMARK; dTARGET;
4371 I32 value;
4372
4373 if (TAINTING_get) {
4374 TAINT_ENV();
4375 while (++MARK <= SP) {
4376 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4377 if (TAINT_get)
4378 break;
4379 }
4380 MARK = ORIGMARK;
4381 TAINT_PROPER("exec");
4382 }
4383 PERL_FLUSHALL_FOR_CHILD;
4384 if (PL_op->op_flags & OPf_STACKED) {
4385 SV * const really = *++MARK;
4386 value = (I32)do_aexec(really, MARK, SP);
4387 }
4388 else if (SP - MARK != 1)
4389#ifdef VMS
4390 value = (I32)vms_do_aexec(NULL, MARK, SP);
4391#else
4392 value = (I32)do_aexec(NULL, MARK, SP);
4393#endif
4394 else {
4395#ifdef VMS
4396 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4397#else
4398 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4399#endif
4400 }
4401
4402 SP = ORIGMARK;
4403 XPUSHi(value);
4404 RETURN;
4405}
4406
4407PP(pp_getppid)
4408{
4409#ifdef HAS_GETPPID
4410 dSP; dTARGET;
4411 XPUSHi( getppid() );
4412 RETURN;
4413#else
4414 DIE(aTHX_ PL_no_func, "getppid");
4415#endif
4416}
4417
4418PP(pp_getpgrp)
4419{
4420#ifdef HAS_GETPGRP
4421 dSP; dTARGET;
4422 Pid_t pgrp;
4423 const Pid_t pid =
4424 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4425
4426#ifdef BSD_GETPGRP
4427 pgrp = (I32)BSD_GETPGRP(pid);
4428#else
4429 if (pid != 0 && pid != PerlProc_getpid())
4430 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4431 pgrp = getpgrp();
4432#endif
4433 XPUSHi(pgrp);
4434 RETURN;
4435#else
4436 DIE(aTHX_ PL_no_func, "getpgrp");
4437#endif
4438}
4439
4440PP(pp_setpgrp)
4441{
4442#ifdef HAS_SETPGRP
4443 dSP; dTARGET;
4444 Pid_t pgrp;
4445 Pid_t pid;
4446 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4447 if (MAXARG > 0) pid = TOPs && TOPi;
4448 else {
4449 pid = 0;
4450 XPUSHi(-1);
4451 }
4452
4453 TAINT_PROPER("setpgrp");
4454#ifdef BSD_SETPGRP
4455 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4456#else
4457 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4458 || (pid != 0 && pid != PerlProc_getpid()))
4459 {
4460 DIE(aTHX_ "setpgrp can't take arguments");
4461 }
4462 SETi( setpgrp() >= 0 );
4463#endif /* USE_BSDPGRP */
4464 RETURN;
4465#else
4466 DIE(aTHX_ PL_no_func, "setpgrp");
4467#endif
4468}
4469
4470#if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4471# define PRIORITY_WHICH_T(which) (__priority_which_t)which
4472#else
4473# define PRIORITY_WHICH_T(which) which
4474#endif
4475
4476PP(pp_getpriority)
4477{
4478#ifdef HAS_GETPRIORITY
4479 dSP; dTARGET;
4480 const int who = POPi;
4481 const int which = TOPi;
4482 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4483 RETURN;
4484#else
4485 DIE(aTHX_ PL_no_func, "getpriority");
4486#endif
4487}
4488
4489PP(pp_setpriority)
4490{
4491#ifdef HAS_SETPRIORITY
4492 dSP; dTARGET;
4493 const int niceval = POPi;
4494 const int who = POPi;
4495 const int which = TOPi;
4496 TAINT_PROPER("setpriority");
4497 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4498 RETURN;
4499#else
4500 DIE(aTHX_ PL_no_func, "setpriority");
4501#endif
4502}
4503
4504#undef PRIORITY_WHICH_T
4505
4506/* Time calls. */
4507
4508PP(pp_time)
4509{
4510 dSP; dTARGET;
4511#ifdef BIG_TIME
4512 XPUSHn( time(NULL) );
4513#else
4514 XPUSHi( time(NULL) );
4515#endif
4516 RETURN;
4517}
4518
4519PP(pp_tms)
4520{
4521#ifdef HAS_TIMES
4522 dSP;
4523 struct tms timesbuf;
4524
4525 EXTEND(SP, 4);
4526 (void)PerlProc_times(&timesbuf);
4527
4528 mPUSHn(((NV)timesbuf.tms_utime)/(NV)PL_clocktick);
4529 if (GIMME == G_ARRAY) {
4530 mPUSHn(((NV)timesbuf.tms_stime)/(NV)PL_clocktick);
4531 mPUSHn(((NV)timesbuf.tms_cutime)/(NV)PL_clocktick);
4532 mPUSHn(((NV)timesbuf.tms_cstime)/(NV)PL_clocktick);
4533 }
4534 RETURN;
4535#else
4536# ifdef PERL_MICRO
4537 dSP;
4538 mPUSHn(0.0);
4539 EXTEND(SP, 4);
4540 if (GIMME == G_ARRAY) {
4541 mPUSHn(0.0);
4542 mPUSHn(0.0);
4543 mPUSHn(0.0);
4544 }
4545 RETURN;
4546# else
4547 DIE(aTHX_ "times not implemented");
4548# endif
4549#endif /* HAS_TIMES */
4550}
4551
4552/* The 32 bit int year limits the times we can represent to these
4553 boundaries with a few days wiggle room to account for time zone
4554 offsets
4555*/
4556/* Sat Jan 3 00:00:00 -2147481748 */
4557#define TIME_LOWER_BOUND -67768100567755200.0
4558/* Sun Dec 29 12:00:00 2147483647 */
4559#define TIME_UPPER_BOUND 67767976233316800.0
4560
4561
4562/* also used for: pp_localtime() */
4563
4564PP(pp_gmtime)
4565{
4566 dSP;
4567 Time64_T when;
4568 struct TM tmbuf;
4569 struct TM *err;
4570 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4571 static const char * const dayname[] =
4572 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4573 static const char * const monname[] =
4574 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4575 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4576
4577 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4578 time_t now;
4579 (void)time(&now);
4580 when = (Time64_T)now;
4581 }
4582 else {
4583 NV input = Perl_floor(POPn);
4584 when = (Time64_T)input;
4585 if (when != input) {
4586 /* diag_listed_as: gmtime(%f) too large */
4587 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4588 "%s(%.0" NVff ") too large", opname, input);
4589 }
4590 }
4591
4592 if ( TIME_LOWER_BOUND > when ) {
4593 /* diag_listed_as: gmtime(%f) too small */
4594 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4595 "%s(%.0" NVff ") too small", opname, when);
4596 err = NULL;
4597 }
4598 else if( when > TIME_UPPER_BOUND ) {
4599 /* diag_listed_as: gmtime(%f) too small */
4600 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4601 "%s(%.0" NVff ") too large", opname, when);
4602 err = NULL;
4603 }
4604 else {
4605 if (PL_op->op_type == OP_LOCALTIME)
4606 err = S_localtime64_r(&when, &tmbuf);
4607 else
4608 err = S_gmtime64_r(&when, &tmbuf);
4609 }
4610
4611 if (err == NULL) {
4612 /* diag_listed_as: gmtime(%f) failed */
4613 /* XXX %lld broken for quads */
4614 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4615 "%s(%.0" NVff ") failed", opname, when);
4616 }
4617
4618 if (GIMME != G_ARRAY) { /* scalar context */
4619 EXTEND(SP, 1);
4620 EXTEND_MORTAL(1);
4621 if (err == NULL)
4622 RETPUSHUNDEF;
4623 else {
4624 mPUSHs(Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %"IVdf,
4625 dayname[tmbuf.tm_wday],
4626 monname[tmbuf.tm_mon],
4627 tmbuf.tm_mday,
4628 tmbuf.tm_hour,
4629 tmbuf.tm_min,
4630 tmbuf.tm_sec,
4631 (IV)tmbuf.tm_year + 1900));
4632 }
4633 }
4634 else { /* list context */
4635 if ( err == NULL )
4636 RETURN;
4637
4638 EXTEND(SP, 9);
4639 EXTEND_MORTAL(9);
4640 mPUSHi(tmbuf.tm_sec);
4641 mPUSHi(tmbuf.tm_min);
4642 mPUSHi(tmbuf.tm_hour);
4643 mPUSHi(tmbuf.tm_mday);
4644 mPUSHi(tmbuf.tm_mon);
4645 mPUSHn(tmbuf.tm_year);
4646 mPUSHi(tmbuf.tm_wday);
4647 mPUSHi(tmbuf.tm_yday);
4648 mPUSHi(tmbuf.tm_isdst);
4649 }
4650 RETURN;
4651}
4652
4653PP(pp_alarm)
4654{
4655#ifdef HAS_ALARM
4656 dSP; dTARGET;
4657 int anum;
4658 anum = POPi;
4659 anum = alarm((unsigned int)anum);
4660 if (anum < 0)
4661 RETPUSHUNDEF;
4662 PUSHi(anum);
4663 RETURN;
4664#else
4665 DIE(aTHX_ PL_no_func, "alarm");
4666#endif
4667}
4668
4669PP(pp_sleep)
4670{
4671 dSP; dTARGET;
4672 I32 duration;
4673 Time_t lasttime;
4674 Time_t when;
4675
4676 (void)time(&lasttime);
4677 if (MAXARG < 1 || (!TOPs && !POPs))
4678 PerlProc_pause();
4679 else {
4680 duration = POPi;
4681 PerlProc_sleep((unsigned int)duration);
4682 }
4683 (void)time(&when);
4684 XPUSHi(when - lasttime);
4685 RETURN;
4686}
4687
4688/* Shared memory. */
4689/* Merged with some message passing. */
4690
4691/* also used for: pp_msgrcv() pp_msgsnd() pp_semop() pp_shmread() */
4692
4693PP(pp_shmwrite)
4694{
4695#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4696 dSP; dMARK; dTARGET;
4697 const int op_type = PL_op->op_type;
4698 I32 value;
4699
4700 switch (op_type) {
4701 case OP_MSGSND:
4702 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4703 break;
4704 case OP_MSGRCV:
4705 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4706 break;
4707 case OP_SEMOP:
4708 value = (I32)(do_semop(MARK, SP) >= 0);
4709 break;
4710 default:
4711 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4712 break;
4713 }
4714
4715 SP = MARK;
4716 PUSHi(value);
4717 RETURN;
4718#else
4719 return Perl_pp_semget(aTHX);
4720#endif
4721}
4722
4723/* Semaphores. */
4724
4725/* also used for: pp_msgget() pp_shmget() */
4726
4727PP(pp_semget)
4728{
4729#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4730 dSP; dMARK; dTARGET;
4731 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4732 SP = MARK;
4733 if (anum == -1)
4734 RETPUSHUNDEF;
4735 PUSHi(anum);
4736 RETURN;
4737#else
4738 DIE(aTHX_ "System V IPC is not implemented on this machine");
4739#endif
4740}
4741
4742/* also used for: pp_msgctl() pp_shmctl() */
4743
4744PP(pp_semctl)
4745{
4746#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4747 dSP; dMARK; dTARGET;
4748 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4749 SP = MARK;
4750 if (anum == -1)
4751 RETSETUNDEF;
4752 if (anum != 0) {
4753 PUSHi(anum);
4754 }
4755 else {
4756 PUSHp(zero_but_true, ZBTLEN);
4757 }
4758 RETURN;
4759#else
4760 return Perl_pp_semget(aTHX);
4761#endif
4762}
4763
4764/* I can't const this further without getting warnings about the types of
4765 various arrays passed in from structures. */
4766static SV *
4767S_space_join_names_mortal(pTHX_ char *const *array)
4768{
4769 SV *target;
4770
4771 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4772
4773 if (array && *array) {
4774 target = newSVpvs_flags("", SVs_TEMP);
4775 while (1) {
4776 sv_catpv(target, *array);
4777 if (!*++array)
4778 break;
4779 sv_catpvs(target, " ");
4780 }
4781 } else {
4782 target = sv_mortalcopy(&PL_sv_no);
4783 }
4784 return target;
4785}
4786
4787/* Get system info. */
4788
4789/* also used for: pp_ghbyaddr() pp_ghbyname() */
4790
4791PP(pp_ghostent)
4792{
4793#if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4794 dSP;
4795 I32 which = PL_op->op_type;
4796 char **elem;
4797 SV *sv;
4798#ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4799 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4800 struct hostent *gethostbyname(Netdb_name_t);
4801 struct hostent *gethostent(void);
4802#endif
4803 struct hostent *hent = NULL;
4804 unsigned long len;
4805
4806 EXTEND(SP, 10);
4807 if (which == OP_GHBYNAME) {
4808#ifdef HAS_GETHOSTBYNAME
4809 const char* const name = POPpbytex;
4810 hent = PerlSock_gethostbyname(name);
4811#else
4812 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4813#endif
4814 }
4815 else if (which == OP_GHBYADDR) {
4816#ifdef HAS_GETHOSTBYADDR
4817 const int addrtype = POPi;
4818 SV * const addrsv = POPs;
4819 STRLEN addrlen;
4820 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4821
4822 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4823#else
4824 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4825#endif
4826 }
4827 else
4828#ifdef HAS_GETHOSTENT
4829 hent = PerlSock_gethostent();
4830#else
4831 DIE(aTHX_ PL_no_sock_func, "gethostent");
4832#endif
4833
4834#ifdef HOST_NOT_FOUND
4835 if (!hent) {
4836#ifdef USE_REENTRANT_API
4837# ifdef USE_GETHOSTENT_ERRNO
4838 h_errno = PL_reentrant_buffer->_gethostent_errno;
4839# endif
4840#endif
4841 STATUS_UNIX_SET(h_errno);
4842 }
4843#endif
4844
4845 if (GIMME != G_ARRAY) {
4846 PUSHs(sv = sv_newmortal());
4847 if (hent) {
4848 if (which == OP_GHBYNAME) {
4849 if (hent->h_addr)
4850 sv_setpvn(sv, hent->h_addr, hent->h_length);
4851 }
4852 else
4853 sv_setpv(sv, (char*)hent->h_name);
4854 }
4855 RETURN;
4856 }
4857
4858 if (hent) {
4859 mPUSHs(newSVpv((char*)hent->h_name, 0));
4860 PUSHs(space_join_names_mortal(hent->h_aliases));
4861 mPUSHi(hent->h_addrtype);
4862 len = hent->h_length;
4863 mPUSHi(len);
4864#ifdef h_addr
4865 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4866 mXPUSHp(*elem, len);
4867 }
4868#else
4869 if (hent->h_addr)
4870 mPUSHp(hent->h_addr, len);
4871 else
4872 PUSHs(sv_mortalcopy(&PL_sv_no));
4873#endif /* h_addr */
4874 }
4875 RETURN;
4876#else
4877 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4878#endif
4879}
4880
4881/* also used for: pp_gnbyaddr() pp_gnbyname() */
4882
4883PP(pp_gnetent)
4884{
4885#if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4886 dSP;
4887 I32 which = PL_op->op_type;
4888 SV *sv;
4889#ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4890 struct netent *getnetbyaddr(Netdb_net_t, int);
4891 struct netent *getnetbyname(Netdb_name_t);
4892 struct netent *getnetent(void);
4893#endif
4894 struct netent *nent;
4895
4896 if (which == OP_GNBYNAME){
4897#ifdef HAS_GETNETBYNAME
4898 const char * const name = POPpbytex;
4899 nent = PerlSock_getnetbyname(name);
4900#else
4901 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4902#endif
4903 }
4904 else if (which == OP_GNBYADDR) {
4905#ifdef HAS_GETNETBYADDR
4906 const int addrtype = POPi;
4907 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4908 nent = PerlSock_getnetbyaddr(addr, addrtype);
4909#else
4910 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4911#endif
4912 }
4913 else
4914#ifdef HAS_GETNETENT
4915 nent = PerlSock_getnetent();
4916#else
4917 DIE(aTHX_ PL_no_sock_func, "getnetent");
4918#endif
4919
4920#ifdef HOST_NOT_FOUND
4921 if (!nent) {
4922#ifdef USE_REENTRANT_API
4923# ifdef USE_GETNETENT_ERRNO
4924 h_errno = PL_reentrant_buffer->_getnetent_errno;
4925# endif
4926#endif
4927 STATUS_UNIX_SET(h_errno);
4928 }
4929#endif
4930
4931 EXTEND(SP, 4);
4932 if (GIMME != G_ARRAY) {
4933 PUSHs(sv = sv_newmortal());
4934 if (nent) {
4935 if (which == OP_GNBYNAME)
4936 sv_setiv(sv, (IV)nent->n_net);
4937 else
4938 sv_setpv(sv, nent->n_name);
4939 }
4940 RETURN;
4941 }
4942
4943 if (nent) {
4944 mPUSHs(newSVpv(nent->n_name, 0));
4945 PUSHs(space_join_names_mortal(nent->n_aliases));
4946 mPUSHi(nent->n_addrtype);
4947 mPUSHi(nent->n_net);
4948 }
4949
4950 RETURN;
4951#else
4952 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4953#endif
4954}
4955
4956
4957/* also used for: pp_gpbyname() pp_gpbynumber() */
4958
4959PP(pp_gprotoent)
4960{
4961#if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4962 dSP;
4963 I32 which = PL_op->op_type;
4964 SV *sv;
4965#ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4966 struct protoent *getprotobyname(Netdb_name_t);
4967 struct protoent *getprotobynumber(int);
4968 struct protoent *getprotoent(void);
4969#endif
4970 struct protoent *pent;
4971
4972 if (which == OP_GPBYNAME) {
4973#ifdef HAS_GETPROTOBYNAME
4974 const char* const name = POPpbytex;
4975 pent = PerlSock_getprotobyname(name);
4976#else
4977 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4978#endif
4979 }
4980 else if (which == OP_GPBYNUMBER) {
4981#ifdef HAS_GETPROTOBYNUMBER
4982 const int number = POPi;
4983 pent = PerlSock_getprotobynumber(number);
4984#else
4985 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4986#endif
4987 }
4988 else
4989#ifdef HAS_GETPROTOENT
4990 pent = PerlSock_getprotoent();
4991#else
4992 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4993#endif
4994
4995 EXTEND(SP, 3);
4996 if (GIMME != G_ARRAY) {
4997 PUSHs(sv = sv_newmortal());
4998 if (pent) {
4999 if (which == OP_GPBYNAME)
5000 sv_setiv(sv, (IV)pent->p_proto);
5001 else
5002 sv_setpv(sv, pent->p_name);
5003 }
5004 RETURN;
5005 }
5006
5007 if (pent) {
5008 mPUSHs(newSVpv(pent->p_name, 0));
5009 PUSHs(space_join_names_mortal(pent->p_aliases));
5010 mPUSHi(pent->p_proto);
5011 }
5012
5013 RETURN;
5014#else
5015 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5016#endif
5017}
5018
5019
5020/* also used for: pp_gsbyname() pp_gsbyport() */
5021
5022PP(pp_gservent)
5023{
5024#if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
5025 dSP;
5026 I32 which = PL_op->op_type;
5027 SV *sv;
5028#ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
5029 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
5030 struct servent *getservbyport(int, Netdb_name_t);
5031 struct servent *getservent(void);
5032#endif
5033 struct servent *sent;
5034
5035 if (which == OP_GSBYNAME) {
5036#ifdef HAS_GETSERVBYNAME
5037 const char * const proto = POPpbytex;
5038 const char * const name = POPpbytex;
5039 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
5040#else
5041 DIE(aTHX_ PL_no_sock_func, "getservbyname");
5042#endif
5043 }
5044 else if (which == OP_GSBYPORT) {
5045#ifdef HAS_GETSERVBYPORT
5046 const char * const proto = POPpbytex;
5047 unsigned short port = (unsigned short)POPu;
5048 port = PerlSock_htons(port);
5049 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
5050#else
5051 DIE(aTHX_ PL_no_sock_func, "getservbyport");
5052#endif
5053 }
5054 else
5055#ifdef HAS_GETSERVENT
5056 sent = PerlSock_getservent();
5057#else
5058 DIE(aTHX_ PL_no_sock_func, "getservent");
5059#endif
5060
5061 EXTEND(SP, 4);
5062 if (GIMME != G_ARRAY) {
5063 PUSHs(sv = sv_newmortal());
5064 if (sent) {
5065 if (which == OP_GSBYNAME) {
5066 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5067 }
5068 else
5069 sv_setpv(sv, sent->s_name);
5070 }
5071 RETURN;
5072 }
5073
5074 if (sent) {
5075 mPUSHs(newSVpv(sent->s_name, 0));
5076 PUSHs(space_join_names_mortal(sent->s_aliases));
5077 mPUSHi(PerlSock_ntohs(sent->s_port));
5078 mPUSHs(newSVpv(sent->s_proto, 0));
5079 }
5080
5081 RETURN;
5082#else
5083 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5084#endif
5085}
5086
5087
5088/* also used for: pp_snetent() pp_sprotoent() pp_sservent() */
5089
5090PP(pp_shostent)
5091{
5092 dSP;
5093 const int stayopen = TOPi;
5094 switch(PL_op->op_type) {
5095 case OP_SHOSTENT:
5096#ifdef HAS_SETHOSTENT
5097 PerlSock_sethostent(stayopen);
5098#else
5099 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5100#endif
5101 break;
5102#ifdef HAS_SETNETENT
5103 case OP_SNETENT:
5104 PerlSock_setnetent(stayopen);
5105#else
5106 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5107#endif
5108 break;
5109 case OP_SPROTOENT:
5110#ifdef HAS_SETPROTOENT
5111 PerlSock_setprotoent(stayopen);
5112#else
5113 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5114#endif
5115 break;
5116 case OP_SSERVENT:
5117#ifdef HAS_SETSERVENT
5118 PerlSock_setservent(stayopen);
5119#else
5120 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5121#endif
5122 break;
5123 }
5124 RETSETYES;
5125}
5126
5127
5128/* also used for: pp_egrent() pp_enetent() pp_eprotoent() pp_epwent()
5129 * pp_eservent() pp_sgrent() pp_spwent() */
5130
5131PP(pp_ehostent)
5132{
5133 dSP;
5134 switch(PL_op->op_type) {
5135 case OP_EHOSTENT:
5136#ifdef HAS_ENDHOSTENT
5137 PerlSock_endhostent();
5138#else
5139 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5140#endif
5141 break;
5142 case OP_ENETENT:
5143#ifdef HAS_ENDNETENT
5144 PerlSock_endnetent();
5145#else
5146 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5147#endif
5148 break;
5149 case OP_EPROTOENT:
5150#ifdef HAS_ENDPROTOENT
5151 PerlSock_endprotoent();
5152#else
5153 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5154#endif
5155 break;
5156 case OP_ESERVENT:
5157#ifdef HAS_ENDSERVENT
5158 PerlSock_endservent();
5159#else
5160 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5161#endif
5162 break;
5163 case OP_SGRENT:
5164#if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5165 setgrent();
5166#else
5167 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5168#endif
5169 break;
5170 case OP_EGRENT:
5171#if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5172 endgrent();
5173#else
5174 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5175#endif
5176 break;
5177 case OP_SPWENT:
5178#if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5179 setpwent();
5180#else
5181 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5182#endif
5183 break;
5184 case OP_EPWENT:
5185#if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5186 endpwent();
5187#else
5188 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5189#endif
5190 break;
5191 }
5192 EXTEND(SP,1);
5193 RETPUSHYES;
5194}
5195
5196
5197/* also used for: pp_gpwnam() pp_gpwuid() */
5198
5199PP(pp_gpwent)
5200{
5201#ifdef HAS_PASSWD
5202 dSP;
5203 I32 which = PL_op->op_type;
5204 SV *sv;
5205 struct passwd *pwent = NULL;
5206 /*
5207 * We currently support only the SysV getsp* shadow password interface.
5208 * The interface is declared in <shadow.h> and often one needs to link
5209 * with -lsecurity or some such.
5210 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5211 * (and SCO?)
5212 *
5213 * AIX getpwnam() is clever enough to return the encrypted password
5214 * only if the caller (euid?) is root.
5215 *
5216 * There are at least three other shadow password APIs. Many platforms
5217 * seem to contain more than one interface for accessing the shadow
5218 * password databases, possibly for compatibility reasons.
5219 * The getsp*() is by far he simplest one, the other two interfaces
5220 * are much more complicated, but also very similar to each other.
5221 *
5222 * <sys/types.h>
5223 * <sys/security.h>
5224 * <prot.h>
5225 * struct pr_passwd *getprpw*();
5226 * The password is in
5227 * char getprpw*(...).ufld.fd_encrypt[]
5228 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5229 *
5230 * <sys/types.h>
5231 * <sys/security.h>
5232 * <prot.h>
5233 * struct es_passwd *getespw*();
5234 * The password is in
5235 * char *(getespw*(...).ufld.fd_encrypt)
5236 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5237 *
5238 * <userpw.h> (AIX)
5239 * struct userpw *getuserpw();
5240 * The password is in
5241 * char *(getuserpw(...)).spw_upw_passwd
5242 * (but the de facto standard getpwnam() should work okay)
5243 *
5244 * Mention I_PROT here so that Configure probes for it.
5245 *
5246 * In HP-UX for getprpw*() the manual page claims that one should include
5247 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5248 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5249 * and pp_sys.c already includes <shadow.h> if there is such.
5250 *
5251 * Note that <sys/security.h> is already probed for, but currently
5252 * it is only included in special cases.
5253 *
5254 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5255 * be preferred interface, even though also the getprpw*() interface
5256 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5257 * One also needs to call set_auth_parameters() in main() before
5258 * doing anything else, whether one is using getespw*() or getprpw*().
5259 *
5260 * Note that accessing the shadow databases can be magnitudes
5261 * slower than accessing the standard databases.
5262 *
5263 * --jhi
5264 */
5265
5266# if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5267 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5268 * the pw_comment is left uninitialized. */
5269 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5270# endif
5271
5272 switch (which) {
5273 case OP_GPWNAM:
5274 {
5275 const char* const name = POPpbytex;
5276 pwent = getpwnam(name);
5277 }
5278 break;
5279 case OP_GPWUID:
5280 {
5281 Uid_t uid = POPi;
5282 pwent = getpwuid(uid);
5283 }
5284 break;
5285 case OP_GPWENT:
5286# ifdef HAS_GETPWENT
5287 pwent = getpwent();
5288#ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5289 if (pwent) pwent = getpwnam(pwent->pw_name);
5290#endif
5291# else
5292 DIE(aTHX_ PL_no_func, "getpwent");
5293# endif
5294 break;
5295 }
5296
5297 EXTEND(SP, 10);
5298 if (GIMME != G_ARRAY) {
5299 PUSHs(sv = sv_newmortal());
5300 if (pwent) {
5301 if (which == OP_GPWNAM)
5302 sv_setuid(sv, pwent->pw_uid);
5303 else
5304 sv_setpv(sv, pwent->pw_name);
5305 }
5306 RETURN;
5307 }
5308
5309 if (pwent) {
5310 mPUSHs(newSVpv(pwent->pw_name, 0));
5311
5312 sv = newSViv(0);
5313 mPUSHs(sv);
5314 /* If we have getspnam(), we try to dig up the shadow
5315 * password. If we are underprivileged, the shadow
5316 * interface will set the errno to EACCES or similar,
5317 * and return a null pointer. If this happens, we will
5318 * use the dummy password (usually "*" or "x") from the
5319 * standard password database.
5320 *
5321 * In theory we could skip the shadow call completely
5322 * if euid != 0 but in practice we cannot know which
5323 * security measures are guarding the shadow databases
5324 * on a random platform.
5325 *
5326 * Resist the urge to use additional shadow interfaces.
5327 * Divert the urge to writing an extension instead.
5328 *
5329 * --jhi */
5330 /* Some AIX setups falsely(?) detect some getspnam(), which
5331 * has a different API than the Solaris/IRIX one. */
5332# if defined(HAS_GETSPNAM) && !defined(_AIX)
5333 {
5334 dSAVE_ERRNO;
5335 const struct spwd * const spwent = getspnam(pwent->pw_name);
5336 /* Save and restore errno so that
5337 * underprivileged attempts seem
5338 * to have never made the unsuccessful
5339 * attempt to retrieve the shadow password. */
5340 RESTORE_ERRNO;
5341 if (spwent && spwent->sp_pwdp)
5342 sv_setpv(sv, spwent->sp_pwdp);
5343 }
5344# endif
5345# ifdef PWPASSWD
5346 if (!SvPOK(sv)) /* Use the standard password, then. */
5347 sv_setpv(sv, pwent->pw_passwd);
5348# endif
5349
5350 /* passwd is tainted because user himself can diddle with it.
5351 * admittedly not much and in a very limited way, but nevertheless. */
5352 SvTAINTED_on(sv);
5353
5354 sv_setuid(PUSHmortal, pwent->pw_uid);
5355 sv_setgid(PUSHmortal, pwent->pw_gid);
5356
5357 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5358 * because of the poor interface of the Perl getpw*(),
5359 * not because there's some standard/convention saying so.
5360 * A better interface would have been to return a hash,
5361 * but we are accursed by our history, alas. --jhi. */
5362# ifdef PWCHANGE
5363 mPUSHi(pwent->pw_change);
5364# else
5365# ifdef PWQUOTA
5366 mPUSHi(pwent->pw_quota);
5367# else
5368# ifdef PWAGE
5369 mPUSHs(newSVpv(pwent->pw_age, 0));
5370# else
5371 /* I think that you can never get this compiled, but just in case. */
5372 PUSHs(sv_mortalcopy(&PL_sv_no));
5373# endif
5374# endif
5375# endif
5376
5377 /* pw_class and pw_comment are mutually exclusive--.
5378 * see the above note for pw_change, pw_quota, and pw_age. */
5379# ifdef PWCLASS
5380 mPUSHs(newSVpv(pwent->pw_class, 0));
5381# else
5382# ifdef PWCOMMENT
5383 mPUSHs(newSVpv(pwent->pw_comment, 0));
5384# else
5385 /* I think that you can never get this compiled, but just in case. */
5386 PUSHs(sv_mortalcopy(&PL_sv_no));
5387# endif
5388# endif
5389
5390# ifdef PWGECOS
5391 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5392# else
5393 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5394# endif
5395 /* pw_gecos is tainted because user himself can diddle with it. */
5396 SvTAINTED_on(sv);
5397
5398 mPUSHs(newSVpv(pwent->pw_dir, 0));
5399
5400 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5401 /* pw_shell is tainted because user himself can diddle with it. */
5402 SvTAINTED_on(sv);
5403
5404# ifdef PWEXPIRE
5405 mPUSHi(pwent->pw_expire);
5406# endif
5407 }
5408 RETURN;
5409#else
5410 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5411#endif
5412}
5413
5414
5415/* also used for: pp_ggrgid() pp_ggrnam() */
5416
5417PP(pp_ggrent)
5418{
5419#ifdef HAS_GROUP
5420 dSP;
5421 const I32 which = PL_op->op_type;
5422 const struct group *grent;
5423
5424 if (which == OP_GGRNAM) {
5425 const char* const name = POPpbytex;
5426 grent = (const struct group *)getgrnam(name);
5427 }
5428 else if (which == OP_GGRGID) {
5429 const Gid_t gid = POPi;
5430 grent = (const struct group *)getgrgid(gid);
5431 }
5432 else
5433#ifdef HAS_GETGRENT
5434 grent = (struct group *)getgrent();
5435#else
5436 DIE(aTHX_ PL_no_func, "getgrent");
5437#endif
5438
5439 EXTEND(SP, 4);
5440 if (GIMME != G_ARRAY) {
5441 SV * const sv = sv_newmortal();
5442
5443 PUSHs(sv);
5444 if (grent) {
5445 if (which == OP_GGRNAM)
5446 sv_setgid(sv, grent->gr_gid);
5447 else
5448 sv_setpv(sv, grent->gr_name);
5449 }
5450 RETURN;
5451 }
5452
5453 if (grent) {
5454 mPUSHs(newSVpv(grent->gr_name, 0));
5455
5456#ifdef GRPASSWD
5457 mPUSHs(newSVpv(grent->gr_passwd, 0));
5458#else
5459 PUSHs(sv_mortalcopy(&PL_sv_no));
5460#endif
5461
5462 sv_setgid(PUSHmortal, grent->gr_gid);
5463
5464#if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5465 /* In UNICOS/mk (_CRAYMPP) the multithreading
5466 * versions (getgrnam_r, getgrgid_r)
5467 * seem to return an illegal pointer
5468 * as the group members list, gr_mem.
5469 * getgrent() doesn't even have a _r version
5470 * but the gr_mem is poisonous anyway.
5471 * So yes, you cannot get the list of group
5472 * members if building multithreaded in UNICOS/mk. */
5473 PUSHs(space_join_names_mortal(grent->gr_mem));
5474#endif
5475 }
5476
5477 RETURN;
5478#else
5479 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5480#endif
5481}
5482
5483PP(pp_getlogin)
5484{
5485#ifdef HAS_GETLOGIN
5486 dSP; dTARGET;
5487 char *tmps;
5488 EXTEND(SP, 1);
5489 if (!(tmps = PerlProc_getlogin()))
5490 RETPUSHUNDEF;
5491 sv_setpv_mg(TARG, tmps);
5492 PUSHs(TARG);
5493 RETURN;
5494#else
5495 DIE(aTHX_ PL_no_func, "getlogin");
5496#endif
5497}
5498
5499/* Miscellaneous. */
5500
5501PP(pp_syscall)
5502{
5503#ifdef HAS_SYSCALL
5504 dSP; dMARK; dORIGMARK; dTARGET;
5505 I32 items = SP - MARK;
5506 unsigned long a[20];
5507 I32 i = 0;
5508 IV retval = -1;
5509
5510 if (TAINTING_get) {
5511 while (++MARK <= SP) {
5512 if (SvTAINTED(*MARK)) {
5513 TAINT;
5514 break;
5515 }
5516 }
5517 MARK = ORIGMARK;
5518 TAINT_PROPER("syscall");
5519 }
5520
5521 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5522 * or where sizeof(long) != sizeof(char*). But such machines will
5523 * not likely have syscall implemented either, so who cares?
5524 */
5525 while (++MARK <= SP) {
5526 if (SvNIOK(*MARK) || !i)
5527 a[i++] = SvIV(*MARK);
5528 else if (*MARK == &PL_sv_undef)
5529 a[i++] = 0;
5530 else
5531 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5532 if (i > 15)
5533 break;
5534 }
5535 switch (items) {
5536 default:
5537 DIE(aTHX_ "Too many args to syscall");
5538 case 0:
5539 DIE(aTHX_ "Too few args to syscall");
5540 case 1:
5541 retval = syscall(a[0]);
5542 break;
5543 case 2:
5544 retval = syscall(a[0],a[1]);
5545 break;
5546 case 3:
5547 retval = syscall(a[0],a[1],a[2]);
5548 break;
5549 case 4:
5550 retval = syscall(a[0],a[1],a[2],a[3]);
5551 break;
5552 case 5:
5553 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5554 break;
5555 case 6:
5556 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5557 break;
5558 case 7:
5559 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5560 break;
5561 case 8:
5562 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5563 break;
5564 }
5565 SP = ORIGMARK;
5566 PUSHi(retval);
5567 RETURN;
5568#else
5569 DIE(aTHX_ PL_no_func, "syscall");
5570#endif
5571}
5572
5573#ifdef FCNTL_EMULATE_FLOCK
5574
5575/* XXX Emulate flock() with fcntl().
5576 What's really needed is a good file locking module.
5577*/
5578
5579static int
5580fcntl_emulate_flock(int fd, int operation)
5581{
5582 int res;
5583 struct flock flock;
5584
5585 switch (operation & ~LOCK_NB) {
5586 case LOCK_SH:
5587 flock.l_type = F_RDLCK;
5588 break;
5589 case LOCK_EX:
5590 flock.l_type = F_WRLCK;
5591 break;
5592 case LOCK_UN:
5593 flock.l_type = F_UNLCK;
5594 break;
5595 default:
5596 errno = EINVAL;
5597 return -1;
5598 }
5599 flock.l_whence = SEEK_SET;
5600 flock.l_start = flock.l_len = (Off_t)0;
5601
5602 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5603 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5604 errno = EWOULDBLOCK;
5605 return res;
5606}
5607
5608#endif /* FCNTL_EMULATE_FLOCK */
5609
5610#ifdef LOCKF_EMULATE_FLOCK
5611
5612/* XXX Emulate flock() with lockf(). This is just to increase
5613 portability of scripts. The calls are not completely
5614 interchangeable. What's really needed is a good file
5615 locking module.
5616*/
5617
5618/* The lockf() constants might have been defined in <unistd.h>.
5619 Unfortunately, <unistd.h> causes troubles on some mixed
5620 (BSD/POSIX) systems, such as SunOS 4.1.3.
5621
5622 Further, the lockf() constants aren't POSIX, so they might not be
5623 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5624 just stick in the SVID values and be done with it. Sigh.
5625*/
5626
5627# ifndef F_ULOCK
5628# define F_ULOCK 0 /* Unlock a previously locked region */
5629# endif
5630# ifndef F_LOCK
5631# define F_LOCK 1 /* Lock a region for exclusive use */
5632# endif
5633# ifndef F_TLOCK
5634# define F_TLOCK 2 /* Test and lock a region for exclusive use */
5635# endif
5636# ifndef F_TEST
5637# define F_TEST 3 /* Test a region for other processes locks */
5638# endif
5639
5640static int
5641lockf_emulate_flock(int fd, int operation)
5642{
5643 int i;
5644 Off_t pos;
5645 dSAVE_ERRNO;
5646
5647 /* flock locks entire file so for lockf we need to do the same */
5648 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5649 if (pos > 0) /* is seekable and needs to be repositioned */
5650 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5651 pos = -1; /* seek failed, so don't seek back afterwards */
5652 RESTORE_ERRNO;
5653
5654 switch (operation) {
5655
5656 /* LOCK_SH - get a shared lock */
5657 case LOCK_SH:
5658 /* LOCK_EX - get an exclusive lock */
5659 case LOCK_EX:
5660 i = lockf (fd, F_LOCK, 0);
5661 break;
5662
5663 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5664 case LOCK_SH|LOCK_NB:
5665 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5666 case LOCK_EX|LOCK_NB:
5667 i = lockf (fd, F_TLOCK, 0);
5668 if (i == -1)
5669 if ((errno == EAGAIN) || (errno == EACCES))
5670 errno = EWOULDBLOCK;
5671 break;
5672
5673 /* LOCK_UN - unlock (non-blocking is a no-op) */
5674 case LOCK_UN:
5675 case LOCK_UN|LOCK_NB:
5676 i = lockf (fd, F_ULOCK, 0);
5677 break;
5678
5679 /* Default - can't decipher operation */
5680 default:
5681 i = -1;
5682 errno = EINVAL;
5683 break;
5684 }
5685
5686 if (pos > 0) /* need to restore position of the handle */
5687 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5688
5689 return (i);
5690}
5691
5692#endif /* LOCKF_EMULATE_FLOCK */
5693
5694/*
5695 * Local variables:
5696 * c-indentation-style: bsd
5697 * c-basic-offset: 4
5698 * indent-tabs-mode: nil
5699 * End:
5700 *
5701 * ex: set ts=8 sts=4 sw=4 et:
5702 */