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