3 * Copyright (c) 1991-1994, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * But only a short way ahead its floor and the walls on either side were
12 * cloven by a great fissure, out of which the red glare came, now leaping
13 * up, now dying down into darkness; and all the while far below there was
14 * a rumour and a trouble as of great engines throbbing and labouring.
20 /* Omit this -- it causes too much grief on mixed systems.
26 /* Put this after #includes because fork and vfork prototypes may
33 #if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
34 # include <sys/socket.h>
38 # include <net/errno.h>
46 #include <sys/select.h>
59 struct passwd *getpwnam _((char *));
60 struct passwd *getpwuid _((Uid_t));
62 struct passwd *getpwent _((void));
69 struct group *getgrnam _((char *));
70 struct group *getgrgid _((Gid_t));
72 struct group *getgrent _((void));
86 # define getpgrp getpgrp2
90 # define setpgrp setpgrp2
93 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
94 static int dooneliner _((char *cmd, char *filename));
104 fp = my_popen(tmps, "r");
106 sv_setpv(TARG, ""); /* note that this preserves previous buffer */
107 if (GIMME == G_SCALAR) {
108 while (sv_gets(TARG, fp, SvCUR(TARG)) != Nullch)
118 if (sv_gets(sv, fp, 0) == Nullch) {
122 XPUSHs(sv_2mortal(sv));
123 if (SvLEN(sv) - SvCUR(sv) > 20) {
124 SvLEN_set(sv, SvCUR(sv)+1);
125 Renew(SvPVX(sv), SvLEN(sv), char);
129 statusvalue = my_pclose(fp);
133 if (GIMME == G_SCALAR)
147 SAVESPTR(last_in_gv); /* We don't want this to be permanent. */
148 last_in_gv = (GV*)*stack_sp--;
160 result = do_readline();
167 last_in_gv = gv_fetchpv(SvPVx(GvSV((GV*)(*stack_sp--)), na), TRUE,SVt_PVIO);
168 return do_readline();
173 last_in_gv = cGVOP->op_gv;
174 return do_readline();
181 if (SP - MARK != 1) {
183 do_join(TARG, &sv_no, MARK, SP);
184 tmps = SvPV(TARG, na);
188 tmps = SvPV(TOPs, na);
190 if (!tmps || !*tmps) {
191 SV *error = GvSV(gv_fetchpv("@", TRUE, SVt_PV));
192 (void)SvUPGRADE(error, SVt_PV);
193 if (SvPOK(error) && SvCUR(error))
194 sv_catpv(error, "\t...caught");
195 tmps = SvPV(error, na);
198 tmps = "Warning: something's wrong";
207 if (SP - MARK != 1) {
209 do_join(TARG, &sv_no, MARK, SP);
210 tmps = SvPV(TARG, na);
214 tmps = SvPV(TOPs, na);
216 if (!tmps || !*tmps) {
217 SV *error = GvSV(gv_fetchpv("@", TRUE, SVt_PV));
218 (void)SvUPGRADE(error, SVt_PV);
219 if (SvPOK(error) && SvCUR(error))
220 sv_catpv(error, "\t...propagated");
221 tmps = SvPV(error, na);
243 tmps = SvPV(sv, len);
244 if (do_open(gv, tmps, len,Nullfp)) {
245 IoLINES(GvIOp(gv)) = 0;
246 PUSHi( (I32)forkprocess );
248 else if (forkprocess == 0) /* we are a new child */
265 PUSHs( do_close(gv, TRUE) ? &sv_yes : &sv_no );
289 do_close(rgv, FALSE);
291 do_close(wgv, FALSE);
296 IoIFP(rstio) = fdopen(fd[0], "r");
297 IoOFP(wstio) = fdopen(fd[1], "w");
298 IoIFP(wstio) = IoOFP(wstio);
302 if (!IoIFP(rstio) || !IoOFP(wstio)) {
303 if (IoIFP(rstio)) fclose(IoIFP(rstio));
305 if (IoOFP(wstio)) fclose(IoOFP(wstio));
315 DIE(no_func, "pipe");
328 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io)))
346 TAINT_PROPER("umask");
349 DIE(no_func, "Unsupported function umask");
367 if (!(io = GvIO(gv)) || !(fp = IoIFP(io)))
372 if (!fflush(fp) && (fp->_flag |= _IOBIN))
377 if (setmode(fileno(fp), OP_BINARY) != -1)
395 SV **mark = stack_base + ++*markstack_ptr; /* reuse in entersub */
396 I32 markoff = mark - stack_base - 1;
400 if (SvTYPE(varsv) == SVt_PVHV)
401 methname = "TIEHASH";
402 else if (SvTYPE(varsv) == SVt_PVAV)
403 methname = "TIEARRAY";
404 else if (SvTYPE(varsv) == SVt_PVGV)
405 methname = "TIEHANDLE";
407 methname = "TIESCALAR";
409 stash = gv_stashsv(mark[1], FALSE);
410 if (!stash || !(gv = gv_fetchmethod(stash, methname)) || !GvCV(gv))
411 DIE("Can't locate object method \"%s\" via package \"%s\"",
412 methname, SvPV(mark[1],na));
414 Zero(&myop, 1, BINOP);
415 myop.op_last = (OP *) &myop;
416 myop.op_next = Nullop;
417 myop.op_flags = OPf_KNOW|OPf_STACKED;
426 if (op = pp_entersub())
431 if (sv_isobject(sv)) {
432 if (SvTYPE(varsv) == SVt_PVHV || SvTYPE(varsv) == SVt_PVAV) {
433 sv_unmagic(varsv, 'P');
434 sv_magic(varsv, sv, 'P', Nullch, 0);
437 sv_unmagic(varsv, 'q');
438 sv_magic(varsv, sv, 'q', Nullch, 0);
442 SP = stack_base + markoff;
450 if (SvTYPE(TOPs) == SVt_PVHV || SvTYPE(TOPs) == SVt_PVAV)
451 sv_unmagic(TOPs, 'P');
453 sv_unmagic(TOPs, 'q');
469 sv = sv_mortalcopy(&sv_no);
470 sv_setpv(sv, "AnyDBM_File");
471 stash = gv_stashsv(sv, FALSE);
472 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")) || !GvCV(gv)) {
474 perl_requirepv("AnyDBM_File.pm");
476 if (!(gv = gv_fetchmethod(stash, "TIEHASH")) || !GvCV(gv))
477 DIE("No dbm on this machine");
480 Zero(&myop, 1, BINOP);
481 myop.op_last = (OP *) &myop;
482 myop.op_next = Nullop;
483 myop.op_flags = OPf_KNOW|OPf_STACKED;
495 PUSHs(sv_2mortal(newSViv(O_RDWR|O_CREAT)));
497 PUSHs(sv_2mortal(newSViv(O_RDWR)));
502 if (op = pp_entersub())
506 if (!sv_isobject(TOPs)) {
514 PUSHs(sv_2mortal(newSViv(O_RDONLY)));
519 if (op = pp_entersub())
524 if (sv_isobject(TOPs))
525 sv_magic((SV*)hv, TOPs, 'P', Nullch, 0);
532 return pp_untie(ARGS);
546 struct timeval timebuf;
547 struct timeval *tbuf = &timebuf;
550 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
555 # if BYTEORDER & 0xf0000
556 # define ORDERBYTE (0x88888888 - BYTEORDER)
558 # define ORDERBYTE (0x4444 - BYTEORDER)
564 for (i = 1; i <= 3; i++) {
572 #if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678
573 growsize = maxlen; /* little endians can use vecs directly */
581 masksize = NFDBITS / NBBY;
583 masksize = sizeof(long); /* documented int, everyone seems to use long */
585 growsize = maxlen + (masksize - (maxlen % masksize));
586 Zero(&fd_sets[0], 4, char*);
594 timebuf.tv_sec = (long)value;
595 value -= (double)timebuf.tv_sec;
596 timebuf.tv_usec = (long)(value * 1000000.0);
599 tbuf = Null(struct timeval*);
601 for (i = 1; i <= 3; i++) {
608 SvPV_force(sv,na); /* force string conversion */
611 Sv_Grow(sv, growsize);
613 while (++j <= growsize) {
617 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
619 New(403, fd_sets[i], growsize, char);
620 for (offset = 0; offset < growsize; offset += masksize) {
621 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
622 fd_sets[i][j+offset] = s[(k % masksize) + offset];
625 fd_sets[i] = SvPVX(sv);
631 (Select_fd_set_t) fd_sets[1],
632 (Select_fd_set_t) fd_sets[2],
633 (Select_fd_set_t) fd_sets[3],
635 for (i = 1; i <= 3; i++) {
638 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
640 for (offset = 0; offset < growsize; offset += masksize) {
641 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
642 s[(k % masksize) + offset] = fd_sets[i][j+offset];
644 Safefree(fd_sets[i]);
651 if (GIMME == G_ARRAY && tbuf) {
652 value = (double)(timebuf.tv_sec) +
653 (double)(timebuf.tv_usec) / 1000000.0;
654 PUSHs(sv = sv_mortalcopy(&sv_no));
659 DIE("select not implemented");
666 GV *oldgv = defoutgv;
667 if (op->op_private > 0) {
668 defoutgv = (GV*)POPs;
672 gv_efullname(TARG, oldgv);
688 if (!gv || do_eof(gv)) /* make sure we have fp with something */
692 *SvPVX(TARG) = getc(IoIFP(GvIOp(gv))); /* should never be EOF */
699 return pp_sysread(ARGS);
708 register CONTEXT *cx;
710 AV* padlist = CvPADLIST(cv);
711 SV** svp = AvARRAY(padlist);
717 PUSHBLOCK(cx, CXt_SUB, stack_sp);
720 curpad = AvARRAY((AV*)svp[1]);
722 defoutgv = gv; /* locally select filehandle so $% et al work */
755 SV *tmpsv = sv_newmortal();
756 gv_efullname(tmpsv, gv);
757 DIE("Undefined format \"%s\" called",SvPVX(tmpsv));
759 DIE("Not a format reference");
761 IoFLAGS(io) &= ~IOf_DIDTOP;
763 return doform(cv,gv,op->op_next);
769 GV *gv = cxstack[cxstack_ix].blk_sub.gv;
770 register IO *io = GvIOp(gv);
771 FILE *ofp = IoOFP(io);
775 register CONTEXT *cx;
777 DEBUG_f(fprintf(stderr,"left=%ld, todo=%ld\n",
778 (long)IoLINES_LEFT(io), (long)FmLINES(formtarget)));
779 if (IoLINES_LEFT(io) < FmLINES(formtarget) &&
780 formtarget != toptarget)
786 if (!IoTOP_NAME(io)) {
788 IoFMT_NAME(io) = savepv(GvNAME(gv));
789 sprintf(tmpbuf, "%s_TOP", IoFMT_NAME(io));
790 topgv = gv_fetchpv(tmpbuf,FALSE, SVt_PVFM);
791 if ((topgv && GvFORM(topgv)) ||
792 !gv_fetchpv("top",FALSE,SVt_PVFM))
793 IoTOP_NAME(io) = savepv(tmpbuf);
795 IoTOP_NAME(io) = savepv("top");
797 topgv = gv_fetchpv(IoTOP_NAME(io),FALSE, SVt_PVFM);
798 if (!topgv || !GvFORM(topgv)) {
799 IoLINES_LEFT(io) = 100000000;
802 IoTOP_GV(io) = topgv;
804 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
805 I32 lines = IoLINES_LEFT(io);
806 char *s = SvPVX(formtarget);
807 while (lines-- > 0) {
814 fwrite1(SvPVX(formtarget), s - SvPVX(formtarget), 1, ofp);
815 sv_chop(formtarget, s);
816 FmLINES(formtarget) -= IoLINES_LEFT(io);
819 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
820 fwrite1(SvPVX(formfeed), SvCUR(formfeed), 1, ofp);
821 IoLINES_LEFT(io) = IoPAGE_LEN(io);
823 formtarget = toptarget;
824 IoFLAGS(io) |= IOf_DIDTOP;
825 return doform(GvFORM(IoTOP_GV(io)),gv,op);
837 warn("Filehandle only opened for input");
839 warn("Write on closed filehandle");
844 if ((IoLINES_LEFT(io) -= FmLINES(formtarget)) < 0) {
846 warn("page overflow");
848 if (!fwrite1(SvPVX(formtarget), 1, SvCUR(formtarget), ofp) ||
852 FmLINES(formtarget) = 0;
853 SvCUR_set(formtarget, 0);
854 *SvEND(formtarget) = '\0';
855 if (IoFLAGS(io) & IOf_FLUSH)
860 formtarget = bodytarget;
867 dSP; dMARK; dORIGMARK;
873 if (op->op_flags & OPf_STACKED)
877 if (!(io = GvIO(gv))) {
880 warn("Filehandle %s never opened", SvPV(sv,na));
882 SETERRNO(EBADF,RMS$_IFI);
885 else if (!(fp = IoOFP(io))) {
889 warn("Filehandle %s opened only for input", SvPV(sv,na));
891 warn("printf on closed filehandle %s", SvPV(sv,na));
893 SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
897 do_sprintf(sv, SP - MARK, MARK + 1);
898 if (!do_print(sv, fp))
901 if (IoFLAGS(io) & IOf_FLUSH)
902 if (fflush(fp) == EOF)
919 dSP; dMARK; dORIGMARK; dTARGET;
933 buffer = SvPV_force(bufsv, blen);
934 length = SvIVx(*++MARK);
936 DIE("Negative length");
939 offset = SvIVx(*++MARK);
943 if (!io || !IoIFP(io))
946 if (op->op_type == OP_RECV) {
947 bufsize = sizeof buf;
948 buffer = SvGROW(bufsv, length+1);
949 length = recvfrom(fileno(IoIFP(io)), buffer, length, offset,
950 (struct sockaddr *)buf, &bufsize);
953 SvCUR_set(bufsv, length);
954 *SvEND(bufsv) = '\0';
955 (void)SvPOK_only(bufsv);
958 sv_magic(bufsv, Nullsv, 't', Nullch, 0);
960 sv_setpvn(TARG, buf, bufsize);
965 if (op->op_type == OP_RECV)
966 DIE(no_sock_func, "recv");
968 buffer = SvGROW(bufsv, length+offset+1);
969 if (op->op_type == OP_SYSREAD) {
970 length = read(fileno(IoIFP(io)), buffer+offset, length);
973 #ifdef HAS_SOCKET__bad_code_maybe
974 if (IoTYPE(io) == 's') {
975 bufsize = sizeof buf;
976 length = recvfrom(fileno(IoIFP(io)), buffer+offset, length, 0,
977 (struct sockaddr *)buf, &bufsize);
981 length = fread(buffer+offset, 1, length, IoIFP(io));
984 SvCUR_set(bufsv, length+offset);
985 *SvEND(bufsv) = '\0';
986 (void)SvPOK_only(bufsv);
989 sv_magic(bufsv, Nullsv, 't', Nullch, 0);
1001 return pp_send(ARGS);
1006 dSP; dMARK; dORIGMARK; dTARGET;
1019 buffer = SvPV(bufsv, blen);
1020 length = SvIVx(*++MARK);
1022 DIE("Negative length");
1025 if (!io || !IoIFP(io)) {
1028 if (op->op_type == OP_SYSWRITE)
1029 warn("Syswrite on closed filehandle");
1031 warn("Send on closed socket");
1034 else if (op->op_type == OP_SYSWRITE) {
1036 offset = SvIVx(*++MARK);
1039 if (length > blen - offset)
1040 length = blen - offset;
1041 length = write(fileno(IoIFP(io)), buffer+offset, length);
1044 else if (SP > MARK) {
1047 sockbuf = SvPVx(*++MARK, mlen);
1048 length = sendto(fileno(IoIFP(io)), buffer, blen, length,
1049 (struct sockaddr *)sockbuf, mlen);
1052 length = send(fileno(IoIFP(io)), buffer, blen, length);
1055 DIE(no_sock_func, "send");
1070 return pp_sysread(ARGS);
1081 gv = last_in_gv = (GV*)POPs;
1082 PUSHs(!gv || do_eof(gv) ? &sv_yes : &sv_no);
1094 gv = last_in_gv = (GV*)POPs;
1095 PUSHi( do_tell(gv) );
1106 gv = last_in_gv = (GV*)POPs;
1107 PUSHs( do_seek(gv, offset, whence) ? &sv_yes : &sv_no );
1114 Off_t len = (Off_t)POPn;
1119 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE)
1121 if (op->op_flags & OPf_SPECIAL) {
1122 tmpgv = gv_fetchpv(POPp,FALSE, SVt_PVIO);
1123 if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv)) ||
1124 ftruncate(fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
1127 else if (truncate(POPp, len) < 0)
1130 if (op->op_flags & OPf_SPECIAL) {
1131 tmpgv = gv_fetchpv(POPp,FALSE, SVt_PVIO);
1132 if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv)) ||
1133 chsize(fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
1139 if ((tmpfd = open(POPp, 0)) < 0)
1142 if (chsize(tmpfd, len) < 0)
1152 SETERRNO(EBADF,RMS$_IFI);
1155 DIE("truncate not implemented");
1161 return pp_ioctl(ARGS);
1168 unsigned int func = U_I(POPn);
1169 int optype = op->op_type;
1175 if (!io || !argsv || !IoIFP(io)) {
1176 SETERRNO(EBADF,RMS$_IFI); /* well, sort of... */
1180 if (SvPOK(argsv) || !SvNIOK(argsv)) {
1182 s = SvPV_force(argsv, len);
1183 retval = IOCPARM_LEN(func);
1185 s = Sv_Grow(argsv, retval+1);
1186 SvCUR_set(argsv, retval);
1189 s[SvCUR(argsv)] = 17; /* a little sanity check here */
1192 retval = SvIV(argsv);
1194 s = (char*)(long)retval; /* ouch */
1196 s = (char*)retval; /* ouch */
1200 TAINT_PROPER(optype == OP_IOCTL ? "ioctl" : "fcntl");
1202 if (optype == OP_IOCTL)
1204 retval = ioctl(fileno(IoIFP(io)), func, s);
1206 DIE("ioctl is not implemented");
1210 DIE("fcntl is not implemented");
1213 retval = fcntl(fileno(IoIFP(io)), func, s);
1215 DIE("fcntl is not implemented");
1220 if (s[SvCUR(argsv)] != 17)
1221 DIE("Possible memory corruption: %s overflowed 3rd argument",
1223 s[SvCUR(argsv)] = 0; /* put our null back */
1224 SvSETMAGIC(argsv); /* Assume it has changed */
1233 PUSHp("0 but true", 10);
1252 fp = IoIFP(GvIOp(gv));
1256 value = (I32)(flock(fileno(fp), argtype) >= 0);
1264 DIE(no_func, "flock()"); /* XXX emulate flock() with lockf()? */
1266 DIE(no_func, "flock()");
1279 int protocol = POPi;
1287 SETERRNO(EBADF,LIB$_INVARG);
1293 do_close(gv, FALSE);
1295 TAINT_PROPER("socket");
1296 fd = socket(domain, type, protocol);
1299 IoIFP(io) = fdopen(fd, "r"); /* stdio gets confused about sockets */
1300 IoOFP(io) = fdopen(fd, "w");
1302 if (!IoIFP(io) || !IoOFP(io)) {
1303 if (IoIFP(io)) fclose(IoIFP(io));
1304 if (IoOFP(io)) fclose(IoOFP(io));
1305 if (!IoIFP(io) && !IoOFP(io)) close(fd);
1311 DIE(no_sock_func, "socket");
1318 #ifdef HAS_SOCKETPAIR
1323 int protocol = POPi;
1336 do_close(gv1, FALSE);
1338 do_close(gv2, FALSE);
1340 TAINT_PROPER("socketpair");
1341 if (socketpair(domain, type, protocol, fd) < 0)
1343 IoIFP(io1) = fdopen(fd[0], "r");
1344 IoOFP(io1) = fdopen(fd[0], "w");
1346 IoIFP(io2) = fdopen(fd[1], "r");
1347 IoOFP(io2) = fdopen(fd[1], "w");
1349 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
1350 if (IoIFP(io1)) fclose(IoIFP(io1));
1351 if (IoOFP(io1)) fclose(IoOFP(io1));
1352 if (!IoIFP(io1) && !IoOFP(io1)) close(fd[0]);
1353 if (IoIFP(io2)) fclose(IoIFP(io2));
1354 if (IoOFP(io2)) fclose(IoOFP(io2));
1355 if (!IoIFP(io2) && !IoOFP(io2)) close(fd[1]);
1361 DIE(no_sock_func, "socketpair");
1372 register IO *io = GvIOn(gv);
1375 if (!io || !IoIFP(io))
1378 addr = SvPV(addrsv, len);
1379 TAINT_PROPER("bind");
1380 if (bind(fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
1387 warn("bind() on closed fd");
1388 SETERRNO(EBADF,SS$_IVCHAN);
1391 DIE(no_sock_func, "bind");
1402 register IO *io = GvIOn(gv);
1405 if (!io || !IoIFP(io))
1408 addr = SvPV(addrsv, len);
1409 TAINT_PROPER("connect");
1410 if (connect(fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
1417 warn("connect() on closed fd");
1418 SETERRNO(EBADF,SS$_IVCHAN);
1421 DIE(no_sock_func, "connect");
1431 register IO *io = GvIOn(gv);
1433 if (!io || !IoIFP(io))
1436 if (listen(fileno(IoIFP(io)), backlog) >= 0)
1443 warn("listen() on closed fd");
1444 SETERRNO(EBADF,SS$_IVCHAN);
1447 DIE(no_sock_func, "listen");
1453 struct sockaddr_in saddr; /* use a struct to avoid alignment problems */
1460 int len = sizeof saddr;
1472 if (!gstio || !IoIFP(gstio))
1477 do_close(ngv, FALSE);
1479 fd = accept(fileno(IoIFP(gstio)), (struct sockaddr *)&saddr, &len);
1482 IoIFP(nstio) = fdopen(fd, "r");
1483 IoOFP(nstio) = fdopen(fd, "w");
1484 IoTYPE(nstio) = 's';
1485 if (!IoIFP(nstio) || !IoOFP(nstio)) {
1486 if (IoIFP(nstio)) fclose(IoIFP(nstio));
1487 if (IoOFP(nstio)) fclose(IoOFP(nstio));
1488 if (!IoIFP(nstio) && !IoOFP(nstio)) close(fd);
1492 PUSHp((char *)&saddr, len);
1497 warn("accept() on closed fd");
1498 SETERRNO(EBADF,SS$_IVCHAN);
1504 DIE(no_sock_func, "accept");
1514 register IO *io = GvIOn(gv);
1516 if (!io || !IoIFP(io))
1519 PUSHi( shutdown(fileno(IoIFP(io)), how) >= 0 );
1524 warn("shutdown() on closed fd");
1525 SETERRNO(EBADF,SS$_IVCHAN);
1528 DIE(no_sock_func, "shutdown");
1535 return pp_ssockopt(ARGS);
1537 DIE(no_sock_func, "getsockopt");
1545 int optype = op->op_type;
1548 unsigned int optname;
1554 if (optype == OP_GSOCKOPT)
1555 sv = sv_2mortal(NEWSV(22, 257));
1558 optname = (unsigned int) POPi;
1559 lvl = (unsigned int) POPi;
1563 if (!io || !IoIFP(io))
1566 fd = fileno(IoIFP(io));
1570 (void)SvPOK_only(sv);
1574 if (getsockopt(fd, lvl, optname, SvPVX(sv), &aint) < 0)
1584 buf = SvPV(sv, len);
1585 else if (SvOK(sv)) {
1586 aint = (int)SvIV(sv);
1590 if (setsockopt(fd, lvl, optname, buf, (int)len) < 0)
1600 warn("[gs]etsockopt() on closed fd");
1601 SETERRNO(EBADF,SS$_IVCHAN);
1606 DIE(no_sock_func, "setsockopt");
1613 return pp_getpeername(ARGS);
1615 DIE(no_sock_func, "getsockname");
1623 int optype = op->op_type;
1627 register IO *io = GvIOn(gv);
1630 if (!io || !IoIFP(io))
1633 sv = sv_2mortal(NEWSV(22, 257));
1634 (void)SvPOK_only(sv);
1638 fd = fileno(IoIFP(io));
1640 case OP_GETSOCKNAME:
1641 if (getsockname(fd, (struct sockaddr *)SvPVX(sv), &aint) < 0)
1644 case OP_GETPEERNAME:
1645 if (getpeername(fd, (struct sockaddr *)SvPVX(sv), &aint) < 0)
1656 warn("get{sock, peer}name() on closed fd");
1657 SETERRNO(EBADF,SS$_IVCHAN);
1662 DIE(no_sock_func, "getpeername");
1670 return pp_stat(ARGS);
1679 if (op->op_flags & OPf_REF) {
1680 tmpgv = cGVOP->op_gv;
1682 if (tmpgv != defgv) {
1683 laststype = OP_STAT;
1685 sv_setpv(statname, "");
1686 if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv)) ||
1687 Fstat(fileno(IoIFP(GvIOn(tmpgv))), &statcache) < 0) {
1692 else if (laststatval < 0)
1697 if (SvTYPE(sv) == SVt_PVGV) {
1701 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
1702 tmpgv = (GV*)SvRV(sv);
1705 sv_setpv(statname, SvPV(sv,na));
1708 laststype = op->op_type;
1709 if (op->op_type == OP_LSTAT)
1710 laststatval = lstat(SvPV(statname, na), &statcache);
1713 laststatval = Stat(SvPV(statname, na), &statcache);
1714 if (laststatval < 0) {
1715 if (dowarn && strchr(SvPV(statname, na), '\n'))
1716 warn(warn_nl, "stat");
1722 if (GIMME != G_ARRAY) {
1729 PUSHs(sv_2mortal(newSViv((I32)statcache.st_dev)));
1730 PUSHs(sv_2mortal(newSViv((I32)statcache.st_ino)));
1731 PUSHs(sv_2mortal(newSViv((I32)statcache.st_mode)));
1732 PUSHs(sv_2mortal(newSViv((I32)statcache.st_nlink)));
1733 PUSHs(sv_2mortal(newSViv((I32)statcache.st_uid)));
1734 PUSHs(sv_2mortal(newSViv((I32)statcache.st_gid)));
1735 PUSHs(sv_2mortal(newSViv((I32)statcache.st_rdev)));
1736 PUSHs(sv_2mortal(newSViv((I32)statcache.st_size)));
1737 PUSHs(sv_2mortal(newSViv((I32)statcache.st_atime)));
1738 PUSHs(sv_2mortal(newSViv((I32)statcache.st_mtime)));
1739 PUSHs(sv_2mortal(newSViv((I32)statcache.st_ctime)));
1740 #ifdef USE_STAT_BLOCKS
1741 PUSHs(sv_2mortal(newSViv((I32)statcache.st_blksize)));
1742 PUSHs(sv_2mortal(newSViv((I32)statcache.st_blocks)));
1744 PUSHs(sv_2mortal(newSVpv("", 0)));
1745 PUSHs(sv_2mortal(newSVpv("", 0)));
1753 I32 result = my_stat(ARGS);
1757 if (cando(S_IRUSR, 0, &statcache))
1764 I32 result = my_stat(ARGS);
1768 if (cando(S_IWUSR, 0, &statcache))
1775 I32 result = my_stat(ARGS);
1779 if (cando(S_IXUSR, 0, &statcache))
1786 I32 result = my_stat(ARGS);
1790 if (cando(S_IRUSR, 1, &statcache))
1797 I32 result = my_stat(ARGS);
1801 if (cando(S_IWUSR, 1, &statcache))
1808 I32 result = my_stat(ARGS);
1812 if (cando(S_IXUSR, 1, &statcache))
1819 I32 result = my_stat(ARGS);
1828 return pp_ftrowned(ARGS);
1833 I32 result = my_stat(ARGS);
1837 if (statcache.st_uid == (op->op_type == OP_FTEOWNED ? euid : uid) )
1844 I32 result = my_stat(ARGS);
1848 if (!statcache.st_size)
1855 I32 result = my_stat(ARGS);
1859 PUSHi(statcache.st_size);
1865 I32 result = my_stat(ARGS);
1869 PUSHn( (basetime - statcache.st_mtime) / 86400.0 );
1875 I32 result = my_stat(ARGS);
1879 PUSHn( (basetime - statcache.st_atime) / 86400.0 );
1885 I32 result = my_stat(ARGS);
1889 PUSHn( (basetime - statcache.st_ctime) / 86400.0 );
1895 I32 result = my_stat(ARGS);
1899 if (S_ISSOCK(statcache.st_mode))
1906 I32 result = my_stat(ARGS);
1910 if (S_ISCHR(statcache.st_mode))
1917 I32 result = my_stat(ARGS);
1921 if (S_ISBLK(statcache.st_mode))
1928 I32 result = my_stat(ARGS);
1932 if (S_ISREG(statcache.st_mode))
1939 I32 result = my_stat(ARGS);
1943 if (S_ISDIR(statcache.st_mode))
1950 I32 result = my_stat(ARGS);
1954 if (S_ISFIFO(statcache.st_mode))
1961 I32 result = my_lstat(ARGS);
1965 if (S_ISLNK(statcache.st_mode))
1974 I32 result = my_stat(ARGS);
1978 if (statcache.st_mode & S_ISUID)
1988 I32 result = my_stat(ARGS);
1992 if (statcache.st_mode & S_ISGID)
2002 I32 result = my_stat(ARGS);
2006 if (statcache.st_mode & S_ISVTX)
2018 if (op->op_flags & OPf_REF) {
2023 gv = gv_fetchpv(tmps = POPp, FALSE, SVt_PVIO);
2024 if (GvIO(gv) && IoIFP(GvIOp(gv)))
2025 fd = fileno(IoIFP(GvIOp(gv)));
2026 else if (isDIGIT(*tmps))
2035 #if defined(USE_STD_STDIO) || defined(atarist) /* this will work with atariST */
2036 # define FBASE(f) ((f)->_base)
2037 # define FSIZE(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
2038 # define FPTR(f) ((f)->_ptr)
2039 # define FCOUNT(f) ((f)->_cnt)
2041 # if defined(USE_LINUX_STDIO)
2042 # define FBASE(f) ((f)->_IO_read_base)
2043 # define FSIZE(f) ((f)->_IO_read_end - FBASE(f))
2044 # define FPTR(f) ((f)->_IO_read_ptr)
2045 # define FCOUNT(f) ((f)->_IO_read_end - FPTR(f))
2056 register STDCHAR *s;
2060 if (op->op_flags & OPf_REF) {
2062 if (cGVOP->op_gv == defgv) {
2067 goto really_filename;
2071 statgv = cGVOP->op_gv;
2072 sv_setpv(statname, "");
2075 if (io && IoIFP(io)) {
2077 Fstat(fileno(IoIFP(io)), &statcache);
2078 if (S_ISDIR(statcache.st_mode)) /* handle NFS glitch */
2079 if (op->op_type == OP_FTTEXT)
2083 if (FCOUNT(IoIFP(io)) <= 0) {
2084 i = getc(IoIFP(io));
2086 (void)ungetc(i, IoIFP(io));
2088 if (FCOUNT(IoIFP(io)) <= 0) /* null file is anything */
2090 len = FSIZE(IoIFP(io));
2091 s = FBASE(IoIFP(io));
2093 DIE("-T and -B not implemented on filehandles");
2098 warn("Test on unopened file <%s>",
2099 GvENAME(cGVOP->op_gv));
2100 SETERRNO(EBADF,RMS$_IFI);
2107 sv_setpv(statname, SvPV(sv, na));
2110 i = open(SvPV(sv, na), O_RDONLY, 0);
2112 i = open(SvPV(sv, na), 0);
2115 if (dowarn && strchr(SvPV(sv, na), '\n'))
2116 warn(warn_nl, "open");
2119 Fstat(i, &statcache);
2120 len = read(i, tbuf, 512);
2123 if (S_ISDIR(statcache.st_mode) && op->op_type == OP_FTTEXT)
2124 RETPUSHNO; /* special case NFS directories */
2125 RETPUSHYES; /* null file is anything */
2130 /* now scan s to look for textiness */
2132 for (i = 0; i < len; i++, s++) {
2133 if (!*s) { /* null never allowed in text */
2140 *s != '\n' && *s != '\r' && *s != '\b' &&
2141 *s != '\t' && *s != '\f' && *s != 27)
2145 if ((odd * 30 > len) == (op->op_type == OP_FTTEXT)) /* allow 30% odd */
2153 return pp_fttext(ARGS);
2168 if (!tmps || !*tmps) {
2169 svp = hv_fetch(GvHVn(envgv), "HOME", 4, FALSE);
2171 tmps = SvPV(*svp, na);
2173 if (!tmps || !*tmps) {
2174 svp = hv_fetch(GvHVn(envgv), "LOGDIR", 6, FALSE);
2176 tmps = SvPV(*svp, na);
2178 TAINT_PROPER("chdir");
2179 PUSHi( chdir(tmps) >= 0 );
2181 /* Clear the DEFAULT element of ENV so we'll get the new value
2183 hv_delete(GvHVn(envgv),"DEFAULT",7);
2190 dSP; dMARK; dTARGET;
2193 value = (I32)apply(op->op_type, MARK, SP);
2198 DIE(no_func, "Unsupported function chown");
2208 TAINT_PROPER("chroot");
2209 PUSHi( chroot(tmps) >= 0 );
2212 DIE(no_func, "chroot");
2218 dSP; dMARK; dTARGET;
2220 value = (I32)apply(op->op_type, MARK, SP);
2228 dSP; dMARK; dTARGET;
2230 value = (I32)apply(op->op_type, MARK, SP);
2238 dSP; dMARK; dTARGET;
2240 value = (I32)apply(op->op_type, MARK, SP);
2252 char *tmps = SvPV(TOPs, na);
2253 TAINT_PROPER("rename");
2255 anum = rename(tmps, tmps2);
2257 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
2260 if (euid || Stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
2261 (void)UNLINK(tmps2);
2262 if (!(anum = link(tmps, tmps2)))
2263 anum = UNLINK(tmps);
2275 char *tmps = SvPV(TOPs, na);
2276 TAINT_PROPER("link");
2277 SETi( link(tmps, tmps2) >= 0 );
2279 DIE(no_func, "Unsupported function link");
2289 char *tmps = SvPV(TOPs, na);
2290 TAINT_PROPER("symlink");
2291 SETi( symlink(tmps, tmps2) >= 0 );
2294 DIE(no_func, "symlink");
2305 len = readlink(tmps, buf, sizeof buf);
2313 RETSETUNDEF; /* just pretend it's a normal file */
2317 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
2319 dooneliner(cmd, filename)
2330 for (s = mybuf+strlen(mybuf); *filename; ) {
2335 myfp = my_popen(mybuf, "r");
2338 s = fgets(mybuf, sizeof mybuf, myfp);
2339 (void)my_pclose(myfp);
2341 for (errno = 1; errno < sys_nerr; errno++) {
2342 #ifdef HAS_SYS_ERRLIST
2343 if (instr(mybuf, sys_errlist[errno])) /* you don't see this */
2346 char *errmsg; /* especially if it isn't there */
2349 (errmsg = strerror(errno)) ? errmsg : "NoErRoR"))
2355 #define EACCES EPERM
2357 if (instr(mybuf, "cannot make"))
2358 SETERRNO(EEXIST,RMS$_FEX);
2359 else if (instr(mybuf, "existing file"))
2360 SETERRNO(EEXIST,RMS$_FEX);
2361 else if (instr(mybuf, "ile exists"))
2362 SETERRNO(EEXIST,RMS$_FEX);
2363 else if (instr(mybuf, "non-exist"))
2364 SETERRNO(ENOENT,RMS$_FNF);
2365 else if (instr(mybuf, "does not exist"))
2366 SETERRNO(ENOENT,RMS$_FNF);
2367 else if (instr(mybuf, "not empty"))
2368 SETERRNO(EBUSY,SS$_DEVOFFLINE);
2369 else if (instr(mybuf, "cannot access"))
2370 SETERRNO(EACCES,RMS$_PRV);
2372 SETERRNO(EPERM,RMS$_PRV);
2375 else { /* some mkdirs return no failure indication */
2376 anum = (Stat(filename, &statbuf) >= 0);
2377 if (op->op_type == OP_RMDIR)
2382 SETERRNO(EACCES,RMS$_PRV); /* a guess */
2398 char *tmps = SvPV(TOPs, na);
2400 TAINT_PROPER("mkdir");
2402 SETi( mkdir(tmps, mode) >= 0 );
2404 SETi( dooneliner("mkdir", tmps) );
2405 oldumask = umask(0);
2407 chmod(tmps, (mode & ~oldumask) & 0777);
2418 TAINT_PROPER("rmdir");
2420 XPUSHi( rmdir(tmps) >= 0 );
2422 XPUSHi( dooneliner("rmdir", tmps) );
2427 /* Directory calls. */
2432 #if defined(Direntry_t) && defined(HAS_READDIR)
2433 char *dirname = POPp;
2435 register IO *io = GvIOn(gv);
2441 closedir(IoDIRP(io));
2442 if (!(IoDIRP(io) = opendir(dirname)))
2448 SETERRNO(EBADF,RMS$_DIR);
2451 DIE(no_dir_func, "opendir");
2458 #if defined(Direntry_t) && defined(HAS_READDIR)
2460 Direntry_t *readdir _((DIR *));
2462 register Direntry_t *dp;
2464 register IO *io = GvIOn(gv);
2466 if (!io || !IoDIRP(io))
2469 if (GIMME == G_ARRAY) {
2471 while (dp = (Direntry_t *)readdir(IoDIRP(io))) {
2473 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
2475 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
2480 if (!(dp = (Direntry_t *)readdir(IoDIRP(io))))
2483 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
2485 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
2492 SETERRNO(EBADF,RMS$_ISI);
2493 if (GIMME == G_ARRAY)
2498 DIE(no_dir_func, "readdir");
2505 #if defined(HAS_TELLDIR) || defined(telldir)
2506 #if !defined(telldir) && !defined(HAS_TELLDIR_PROTOTYPE)
2507 long telldir _((DIR *));
2510 register IO *io = GvIOn(gv);
2512 if (!io || !IoDIRP(io))
2515 PUSHi( telldir(IoDIRP(io)) );
2519 SETERRNO(EBADF,RMS$_ISI);
2522 DIE(no_dir_func, "telldir");
2529 #if defined(HAS_SEEKDIR) || defined(seekdir)
2532 register IO *io = GvIOn(gv);
2534 if (!io || !IoDIRP(io))
2537 (void)seekdir(IoDIRP(io), along);
2542 SETERRNO(EBADF,RMS$_ISI);
2545 DIE(no_dir_func, "seekdir");
2552 #if defined(HAS_REWINDDIR) || defined(rewinddir)
2554 register IO *io = GvIOn(gv);
2556 if (!io || !IoDIRP(io))
2559 (void)rewinddir(IoDIRP(io));
2563 SETERRNO(EBADF,RMS$_ISI);
2566 DIE(no_dir_func, "rewinddir");
2573 #if defined(Direntry_t) && defined(HAS_READDIR)
2575 register IO *io = GvIOn(gv);
2577 if (!io || !IoDIRP(io))
2580 #ifdef VOID_CLOSEDIR
2581 closedir(IoDIRP(io));
2583 if (closedir(IoDIRP(io)) < 0) {
2584 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
2593 SETERRNO(EBADF,RMS$_IFI);
2596 DIE(no_dir_func, "closedir");
2600 /* Process control. */
2615 if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
2616 sv_setiv(GvSV(tmpgv), (I32)getpid());
2617 hv_clear(pidstatus); /* no kids, so don't wait for 'em */
2622 DIE(no_func, "Unsupported function fork");
2635 childpid = wait(&argflags);
2637 pidgone(childpid, argflags);
2638 value = (I32)childpid;
2639 statusvalue = FIXSTATUS(argflags);
2643 DIE(no_func, "Unsupported function wait");
2658 childpid = wait4pid(childpid, &argflags, optype);
2659 value = (I32)childpid;
2660 statusvalue = FIXSTATUS(argflags);
2664 DIE(no_func, "Unsupported function wait");
2670 dSP; dMARK; dORIGMARK; dTARGET;
2675 Signal_t (*ihand)(); /* place to save signal during system() */
2676 Signal_t (*qhand)(); /* place to save signal during system() */
2678 #if defined(HAS_FORK) && !defined(VMS)
2679 if (SP - MARK == 1) {
2681 char *junk = SvPV(TOPs, na);
2683 TAINT_PROPER("system");
2686 while ((childpid = vfork()) == -1) {
2687 if (errno != EAGAIN) {
2696 ihand = signal(SIGINT, SIG_IGN);
2697 qhand = signal(SIGQUIT, SIG_IGN);
2699 result = wait4pid(childpid, &status, 0);
2700 } while (result == -1 && errno == EINTR);
2701 (void)signal(SIGINT, ihand);
2702 (void)signal(SIGQUIT, qhand);
2703 statusvalue = FIXSTATUS(status);
2707 value = (I32)((unsigned int)status & 0xffff);
2709 do_execfree(); /* free any memory child malloced on vfork */
2714 if (op->op_flags & OPf_STACKED) {
2715 SV *really = *++MARK;
2716 value = (I32)do_aexec(really, MARK, SP);
2718 else if (SP - MARK != 1)
2719 value = (I32)do_aexec(Nullsv, MARK, SP);
2721 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
2724 #else /* ! FORK or VMS */
2725 if (op->op_flags & OPf_STACKED) {
2726 SV *really = *++MARK;
2727 value = (I32)do_aspawn(really, MARK, SP);
2729 else if (SP - MARK != 1)
2730 value = (I32)do_aspawn(Nullsv, MARK, SP);
2732 value = (I32)do_spawn(SvPVx(sv_mortalcopy(*SP), na));
2737 #endif /* !FORK or VMS */
2743 dSP; dMARK; dORIGMARK; dTARGET;
2746 if (op->op_flags & OPf_STACKED) {
2747 SV *really = *++MARK;
2748 value = (I32)do_aexec(really, MARK, SP);
2750 else if (SP - MARK != 1)
2752 value = (I32)vms_do_aexec(Nullsv, MARK, SP);
2754 value = (I32)do_aexec(Nullsv, MARK, SP);
2758 char *junk = SvPV(*SP, na);
2760 TAINT_PROPER("exec");
2763 value = (I32)vms_do_exec(SvPVx(sv_mortalcopy(*SP), na));
2765 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
2775 dSP; dMARK; dTARGET;
2778 value = (I32)apply(op->op_type, MARK, SP);
2783 DIE(no_func, "Unsupported function kill");
2791 XPUSHi( getppid() );
2794 DIE(no_func, "getppid");
2810 value = (I32)getpgrp(pid);
2813 DIE("POSIX getpgrp can't take an argument");
2814 value = (I32)getpgrp();
2819 DIE(no_func, "getpgrp()");
2838 TAINT_PROPER("setpgrp");
2840 SETi( setpgrp(pid, pgrp) >= 0 );
2842 if ((pgrp != 0) || (pid != 0)) {
2843 DIE("POSIX setpgrp can't take an argument");
2845 SETi( setpgrp() >= 0 );
2846 #endif /* USE_BSDPGRP */
2849 DIE(no_func, "setpgrp()");
2858 #ifdef HAS_GETPRIORITY
2861 SETi( getpriority(which, who) );
2864 DIE(no_func, "getpriority()");
2874 #ifdef HAS_SETPRIORITY
2878 TAINT_PROPER("setpriority");
2879 SETi( setpriority(which, who, niceval) >= 0 );
2882 DIE(no_func, "setpriority()");
2891 XPUSHi( time(Null(Time_t*)) );
2903 #if defined(MSDOS) || !defined(HAS_TIMES)
2904 DIE("times not implemented");
2909 (void)times(×buf);
2911 (void)times((tbuffer_t *)×buf); /* time.h uses different name for */
2912 /* struct tms, though same data */
2916 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_utime)/HZ)));
2917 if (GIMME == G_ARRAY) {
2918 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_stime)/HZ)));
2919 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cutime)/HZ)));
2920 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cstime)/HZ)));
2928 return pp_gmtime(ARGS);
2936 static char *dayname[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2937 static char *monname[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2938 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2943 when = (Time_t)SvIVx(POPs);
2945 if (op->op_type == OP_LOCALTIME)
2946 tmbuf = localtime(&when);
2948 tmbuf = gmtime(&when);
2951 if (GIMME != G_ARRAY) {
2956 sprintf(mybuf, "%s %s %2d %02d:%02d:%02d %d",
2957 dayname[tmbuf->tm_wday],
2958 monname[tmbuf->tm_mon],
2963 tmbuf->tm_year + 1900);
2964 PUSHp(mybuf, strlen(mybuf));
2967 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_sec)));
2968 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_min)));
2969 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_hour)));
2970 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mday)));
2971 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mon)));
2972 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_year)));
2973 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_wday)));
2974 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_yday)));
2975 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_isdst)));
2986 anum = alarm((unsigned int)anum);
2993 DIE(no_func, "Unsupported function alarm");
3004 (void)time(&lasttime);
3009 sleep((unsigned int)duration);
3012 XPUSHi(when - lasttime);
3016 /* Shared memory. */
3020 return pp_semget(ARGS);
3025 return pp_semctl(ARGS);
3030 return pp_shmwrite(ARGS);
3035 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3036 dSP; dMARK; dTARGET;
3037 I32 value = (I32)(do_shmio(op->op_type, MARK, SP) >= 0);
3042 return pp_semget(ARGS);
3046 /* Message passing. */
3050 return pp_semget(ARGS);
3055 return pp_semctl(ARGS);
3060 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3061 dSP; dMARK; dTARGET;
3062 I32 value = (I32)(do_msgsnd(MARK, SP) >= 0);
3067 return pp_semget(ARGS);
3073 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3074 dSP; dMARK; dTARGET;
3075 I32 value = (I32)(do_msgrcv(MARK, SP) >= 0);
3080 return pp_semget(ARGS);
3088 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3089 dSP; dMARK; dTARGET;
3090 int anum = do_ipcget(op->op_type, MARK, SP);
3097 DIE("System V IPC is not implemented on this machine");
3103 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3104 dSP; dMARK; dTARGET;
3105 int anum = do_ipcctl(op->op_type, MARK, SP);
3113 PUSHp("0 but true",10);
3117 return pp_semget(ARGS);
3123 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3124 dSP; dMARK; dTARGET;
3125 I32 value = (I32)(do_semop(MARK, SP) >= 0);
3130 return pp_semget(ARGS);
3134 /* Get system info. */
3139 return pp_ghostent(ARGS);
3141 DIE(no_sock_func, "gethostbyname");
3148 return pp_ghostent(ARGS);
3150 DIE(no_sock_func, "gethostbyaddr");
3158 I32 which = op->op_type;
3159 register char **elem;
3161 struct hostent *gethostbyname();
3162 struct hostent *gethostbyaddr();
3163 #ifdef HAS_GETHOSTENT
3164 struct hostent *gethostent();
3166 struct hostent *hent;
3170 if (which == OP_GHBYNAME) {
3171 hent = gethostbyname(POPp);
3173 else if (which == OP_GHBYADDR) {
3174 int addrtype = POPi;
3177 char *addr = SvPV(addrsv, addrlen);
3179 hent = gethostbyaddr(addr, addrlen, addrtype);
3182 #ifdef HAS_GETHOSTENT
3183 hent = gethostent();
3185 DIE("gethostent not implemented");
3188 #ifdef HOST_NOT_FOUND
3190 statusvalue = FIXSTATUS(h_errno);
3193 if (GIMME != G_ARRAY) {
3194 PUSHs(sv = sv_newmortal());
3196 if (which == OP_GHBYNAME) {
3197 sv_setpvn(sv, hent->h_addr, hent->h_length);
3200 sv_setpv(sv, (char*)hent->h_name);
3206 PUSHs(sv = sv_mortalcopy(&sv_no));
3207 sv_setpv(sv, (char*)hent->h_name);
3208 PUSHs(sv = sv_mortalcopy(&sv_no));
3209 for (elem = hent->h_aliases; elem && *elem; elem++) {
3210 sv_catpv(sv, *elem);
3212 sv_catpvn(sv, " ", 1);
3214 PUSHs(sv = sv_mortalcopy(&sv_no));
3215 sv_setiv(sv, (I32)hent->h_addrtype);
3216 PUSHs(sv = sv_mortalcopy(&sv_no));
3217 len = hent->h_length;
3218 sv_setiv(sv, (I32)len);
3220 for (elem = hent->h_addr_list; elem && *elem; elem++) {
3221 XPUSHs(sv = sv_mortalcopy(&sv_no));
3222 sv_setpvn(sv, *elem, len);
3225 PUSHs(sv = sv_mortalcopy(&sv_no));
3226 sv_setpvn(sv, hent->h_addr, len);
3231 DIE(no_sock_func, "gethostent");
3238 return pp_gnetent(ARGS);
3240 DIE(no_sock_func, "getnetbyname");
3247 return pp_gnetent(ARGS);
3249 DIE(no_sock_func, "getnetbyaddr");
3257 I32 which = op->op_type;
3258 register char **elem;
3260 struct netent *getnetbyname();
3261 struct netent *getnetbyaddr();
3262 struct netent *getnetent();
3263 struct netent *nent;
3265 if (which == OP_GNBYNAME)
3266 nent = getnetbyname(POPp);
3267 else if (which == OP_GNBYADDR) {
3268 int addrtype = POPi;
3269 unsigned long addr = U_L(POPn);
3270 nent = getnetbyaddr((long)addr, addrtype);
3276 if (GIMME != G_ARRAY) {
3277 PUSHs(sv = sv_newmortal());
3279 if (which == OP_GNBYNAME)
3280 sv_setiv(sv, (I32)nent->n_net);
3282 sv_setpv(sv, nent->n_name);
3288 PUSHs(sv = sv_mortalcopy(&sv_no));
3289 sv_setpv(sv, nent->n_name);
3290 PUSHs(sv = sv_mortalcopy(&sv_no));
3291 for (elem = nent->n_aliases; *elem; elem++) {
3292 sv_catpv(sv, *elem);
3294 sv_catpvn(sv, " ", 1);
3296 PUSHs(sv = sv_mortalcopy(&sv_no));
3297 sv_setiv(sv, (I32)nent->n_addrtype);
3298 PUSHs(sv = sv_mortalcopy(&sv_no));
3299 sv_setiv(sv, (I32)nent->n_net);
3304 DIE(no_sock_func, "getnetent");
3311 return pp_gprotoent(ARGS);
3313 DIE(no_sock_func, "getprotobyname");
3320 return pp_gprotoent(ARGS);
3322 DIE(no_sock_func, "getprotobynumber");
3330 I32 which = op->op_type;
3331 register char **elem;
3333 struct protoent *getprotobyname();
3334 struct protoent *getprotobynumber();
3335 struct protoent *getprotoent();
3336 struct protoent *pent;
3338 if (which == OP_GPBYNAME)
3339 pent = getprotobyname(POPp);
3340 else if (which == OP_GPBYNUMBER)
3341 pent = getprotobynumber(POPi);
3343 pent = getprotoent();
3346 if (GIMME != G_ARRAY) {
3347 PUSHs(sv = sv_newmortal());
3349 if (which == OP_GPBYNAME)
3350 sv_setiv(sv, (I32)pent->p_proto);
3352 sv_setpv(sv, pent->p_name);
3358 PUSHs(sv = sv_mortalcopy(&sv_no));
3359 sv_setpv(sv, pent->p_name);
3360 PUSHs(sv = sv_mortalcopy(&sv_no));
3361 for (elem = pent->p_aliases; *elem; elem++) {
3362 sv_catpv(sv, *elem);
3364 sv_catpvn(sv, " ", 1);
3366 PUSHs(sv = sv_mortalcopy(&sv_no));
3367 sv_setiv(sv, (I32)pent->p_proto);
3372 DIE(no_sock_func, "getprotoent");
3379 return pp_gservent(ARGS);
3381 DIE(no_sock_func, "getservbyname");
3388 return pp_gservent(ARGS);
3390 DIE(no_sock_func, "getservbyport");
3398 I32 which = op->op_type;
3399 register char **elem;
3401 struct servent *getservbyname();
3402 struct servent *getservbynumber();
3403 struct servent *getservent();
3404 struct servent *sent;
3406 if (which == OP_GSBYNAME) {
3410 if (proto && !*proto)
3413 sent = getservbyname(name, proto);
3415 else if (which == OP_GSBYPORT) {
3419 sent = getservbyport(port, proto);
3422 sent = getservent();
3425 if (GIMME != G_ARRAY) {
3426 PUSHs(sv = sv_newmortal());
3428 if (which == OP_GSBYNAME) {
3430 sv_setiv(sv, (I32)ntohs(sent->s_port));
3432 sv_setiv(sv, (I32)(sent->s_port));
3436 sv_setpv(sv, sent->s_name);
3442 PUSHs(sv = sv_mortalcopy(&sv_no));
3443 sv_setpv(sv, sent->s_name);
3444 PUSHs(sv = sv_mortalcopy(&sv_no));
3445 for (elem = sent->s_aliases; *elem; elem++) {
3446 sv_catpv(sv, *elem);
3448 sv_catpvn(sv, " ", 1);
3450 PUSHs(sv = sv_mortalcopy(&sv_no));
3452 sv_setiv(sv, (I32)ntohs(sent->s_port));
3454 sv_setiv(sv, (I32)(sent->s_port));
3456 PUSHs(sv = sv_mortalcopy(&sv_no));
3457 sv_setpv(sv, sent->s_proto);
3462 DIE(no_sock_func, "getservent");
3473 DIE(no_sock_func, "sethostent");
3484 DIE(no_sock_func, "setnetent");
3495 DIE(no_sock_func, "setprotoent");
3506 DIE(no_sock_func, "setservent");
3518 DIE(no_sock_func, "endhostent");
3530 DIE(no_sock_func, "endnetent");
3542 DIE(no_sock_func, "endprotoent");
3554 DIE(no_sock_func, "endservent");
3561 return pp_gpwent(ARGS);
3563 DIE(no_func, "getpwnam");
3570 return pp_gpwent(ARGS);
3572 DIE(no_func, "getpwuid");
3580 I32 which = op->op_type;
3582 struct passwd *pwent;
3584 if (which == OP_GPWNAM)
3585 pwent = getpwnam(POPp);
3586 else if (which == OP_GPWUID)
3587 pwent = getpwuid(POPi);
3589 pwent = (struct passwd *)getpwent();
3592 if (GIMME != G_ARRAY) {
3593 PUSHs(sv = sv_newmortal());
3595 if (which == OP_GPWNAM)
3596 sv_setiv(sv, (I32)pwent->pw_uid);
3598 sv_setpv(sv, pwent->pw_name);
3604 PUSHs(sv = sv_mortalcopy(&sv_no));
3605 sv_setpv(sv, pwent->pw_name);
3606 PUSHs(sv = sv_mortalcopy(&sv_no));
3607 sv_setpv(sv, pwent->pw_passwd);
3608 PUSHs(sv = sv_mortalcopy(&sv_no));
3609 sv_setiv(sv, (I32)pwent->pw_uid);
3610 PUSHs(sv = sv_mortalcopy(&sv_no));
3611 sv_setiv(sv, (I32)pwent->pw_gid);
3612 PUSHs(sv = sv_mortalcopy(&sv_no));
3614 sv_setiv(sv, (I32)pwent->pw_change);
3617 sv_setiv(sv, (I32)pwent->pw_quota);
3620 sv_setpv(sv, pwent->pw_age);
3624 PUSHs(sv = sv_mortalcopy(&sv_no));
3626 sv_setpv(sv, pwent->pw_class);
3629 sv_setpv(sv, pwent->pw_comment);
3632 PUSHs(sv = sv_mortalcopy(&sv_no));
3633 sv_setpv(sv, pwent->pw_gecos);
3634 PUSHs(sv = sv_mortalcopy(&sv_no));
3635 sv_setpv(sv, pwent->pw_dir);
3636 PUSHs(sv = sv_mortalcopy(&sv_no));
3637 sv_setpv(sv, pwent->pw_shell);
3639 PUSHs(sv = sv_mortalcopy(&sv_no));
3640 sv_setiv(sv, (I32)pwent->pw_expire);
3645 DIE(no_func, "getpwent");
3656 DIE(no_func, "setpwent");
3667 DIE(no_func, "endpwent");
3674 return pp_ggrent(ARGS);
3676 DIE(no_func, "getgrnam");
3683 return pp_ggrent(ARGS);
3685 DIE(no_func, "getgrgid");
3693 I32 which = op->op_type;
3694 register char **elem;
3696 struct group *grent;
3698 if (which == OP_GGRNAM)
3699 grent = (struct group *)getgrnam(POPp);
3700 else if (which == OP_GGRGID)
3701 grent = (struct group *)getgrgid(POPi);
3703 grent = (struct group *)getgrent();
3706 if (GIMME != G_ARRAY) {
3707 PUSHs(sv = sv_newmortal());
3709 if (which == OP_GGRNAM)
3710 sv_setiv(sv, (I32)grent->gr_gid);
3712 sv_setpv(sv, grent->gr_name);
3718 PUSHs(sv = sv_mortalcopy(&sv_no));
3719 sv_setpv(sv, grent->gr_name);
3720 PUSHs(sv = sv_mortalcopy(&sv_no));
3721 sv_setpv(sv, grent->gr_passwd);
3722 PUSHs(sv = sv_mortalcopy(&sv_no));
3723 sv_setiv(sv, (I32)grent->gr_gid);
3724 PUSHs(sv = sv_mortalcopy(&sv_no));
3725 for (elem = grent->gr_mem; *elem; elem++) {
3726 sv_catpv(sv, *elem);
3728 sv_catpvn(sv, " ", 1);
3734 DIE(no_func, "getgrent");
3745 DIE(no_func, "setgrent");
3756 DIE(no_func, "endgrent");
3766 if (!(tmps = getlogin()))
3768 PUSHp(tmps, strlen(tmps));
3771 DIE(no_func, "getlogin");
3775 /* Miscellaneous. */
3780 dSP; dMARK; dORIGMARK; dTARGET;
3781 register I32 items = SP - MARK;
3782 unsigned long a[20];
3788 while (++MARK <= SP) {
3789 if (SvGMAGICAL(*MARK) && SvSMAGICAL(*MARK) &&
3790 (mg = mg_find(*MARK, 't')) && mg->mg_len & 1)
3794 TAINT_PROPER("syscall");
3797 /* This probably won't work on machines where sizeof(long) != sizeof(int)
3798 * or where sizeof(long) != sizeof(char*). But such machines will
3799 * not likely have syscall implemented either, so who cares?
3801 while (++MARK <= SP) {
3802 if (SvNIOK(*MARK) || !i)
3803 a[i++] = SvIV(*MARK);
3804 else if (*MARK == &sv_undef)
3807 a[i++] = (unsigned long)SvPV_force(*MARK, na);
3813 DIE("Too many args to syscall");
3815 DIE("Too few args to syscall");
3817 retval = syscall(a[0]);
3820 retval = syscall(a[0],a[1]);
3823 retval = syscall(a[0],a[1],a[2]);
3826 retval = syscall(a[0],a[1],a[2],a[3]);
3829 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
3832 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
3835 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
3838 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
3842 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
3845 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
3848 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3852 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3856 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3860 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3861 a[10],a[11],a[12],a[13]);
3863 #endif /* atarist */
3869 DIE(no_func, "syscall");