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