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) || defined(F_FREESP)
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)
2325 *save_filename = filename;
2331 for (s = mybuf+strlen(mybuf); *filename; ) {
2336 myfp = my_popen(mybuf, "r");
2339 s = fgets(mybuf, sizeof mybuf, myfp);
2340 (void)my_pclose(myfp);
2342 for (errno = 1; errno < sys_nerr; errno++) {
2343 #ifdef HAS_SYS_ERRLIST
2344 if (instr(mybuf, sys_errlist[errno])) /* you don't see this */
2347 char *errmsg; /* especially if it isn't there */
2350 (errmsg = strerror(errno)) ? errmsg : "NoErRoR"))
2356 #define EACCES EPERM
2358 if (instr(mybuf, "cannot make"))
2359 SETERRNO(EEXIST,RMS$_FEX);
2360 else if (instr(mybuf, "existing file"))
2361 SETERRNO(EEXIST,RMS$_FEX);
2362 else if (instr(mybuf, "ile exists"))
2363 SETERRNO(EEXIST,RMS$_FEX);
2364 else if (instr(mybuf, "non-exist"))
2365 SETERRNO(ENOENT,RMS$_FNF);
2366 else if (instr(mybuf, "does not exist"))
2367 SETERRNO(ENOENT,RMS$_FNF);
2368 else if (instr(mybuf, "not empty"))
2369 SETERRNO(EBUSY,SS$_DEVOFFLINE);
2370 else if (instr(mybuf, "cannot access"))
2371 SETERRNO(EACCES,RMS$_PRV);
2373 SETERRNO(EPERM,RMS$_PRV);
2376 else { /* some mkdirs return no failure indication */
2377 anum = (Stat(save_filename, &statbuf) >= 0);
2378 if (op->op_type == OP_RMDIR)
2383 SETERRNO(EACCES,RMS$_PRV); /* a guess */
2399 char *tmps = SvPV(TOPs, na);
2401 TAINT_PROPER("mkdir");
2403 SETi( mkdir(tmps, mode) >= 0 );
2405 SETi( dooneliner("mkdir", tmps) );
2406 oldumask = umask(0);
2408 chmod(tmps, (mode & ~oldumask) & 0777);
2419 TAINT_PROPER("rmdir");
2421 XPUSHi( rmdir(tmps) >= 0 );
2423 XPUSHi( dooneliner("rmdir", tmps) );
2428 /* Directory calls. */
2433 #if defined(Direntry_t) && defined(HAS_READDIR)
2434 char *dirname = POPp;
2436 register IO *io = GvIOn(gv);
2442 closedir(IoDIRP(io));
2443 if (!(IoDIRP(io) = opendir(dirname)))
2449 SETERRNO(EBADF,RMS$_DIR);
2452 DIE(no_dir_func, "opendir");
2459 #if defined(Direntry_t) && defined(HAS_READDIR)
2461 Direntry_t *readdir _((DIR *));
2463 register Direntry_t *dp;
2465 register IO *io = GvIOn(gv);
2467 if (!io || !IoDIRP(io))
2470 if (GIMME == G_ARRAY) {
2472 while (dp = (Direntry_t *)readdir(IoDIRP(io))) {
2474 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
2476 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
2481 if (!(dp = (Direntry_t *)readdir(IoDIRP(io))))
2484 XPUSHs(sv_2mortal(newSVpv(dp->d_name, dp->d_namlen)));
2486 XPUSHs(sv_2mortal(newSVpv(dp->d_name, 0)));
2493 SETERRNO(EBADF,RMS$_ISI);
2494 if (GIMME == G_ARRAY)
2499 DIE(no_dir_func, "readdir");
2506 #if defined(HAS_TELLDIR) || defined(telldir)
2507 #if !defined(telldir) && !defined(HAS_TELLDIR_PROTOTYPE)
2508 long telldir _((DIR *));
2511 register IO *io = GvIOn(gv);
2513 if (!io || !IoDIRP(io))
2516 PUSHi( telldir(IoDIRP(io)) );
2520 SETERRNO(EBADF,RMS$_ISI);
2523 DIE(no_dir_func, "telldir");
2530 #if defined(HAS_SEEKDIR) || defined(seekdir)
2533 register IO *io = GvIOn(gv);
2535 if (!io || !IoDIRP(io))
2538 (void)seekdir(IoDIRP(io), along);
2543 SETERRNO(EBADF,RMS$_ISI);
2546 DIE(no_dir_func, "seekdir");
2553 #if defined(HAS_REWINDDIR) || defined(rewinddir)
2555 register IO *io = GvIOn(gv);
2557 if (!io || !IoDIRP(io))
2560 (void)rewinddir(IoDIRP(io));
2564 SETERRNO(EBADF,RMS$_ISI);
2567 DIE(no_dir_func, "rewinddir");
2574 #if defined(Direntry_t) && defined(HAS_READDIR)
2576 register IO *io = GvIOn(gv);
2578 if (!io || !IoDIRP(io))
2581 #ifdef VOID_CLOSEDIR
2582 closedir(IoDIRP(io));
2584 if (closedir(IoDIRP(io)) < 0) {
2585 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
2594 SETERRNO(EBADF,RMS$_IFI);
2597 DIE(no_dir_func, "closedir");
2601 /* Process control. */
2616 if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
2617 sv_setiv(GvSV(tmpgv), (I32)getpid());
2618 hv_clear(pidstatus); /* no kids, so don't wait for 'em */
2623 DIE(no_func, "Unsupported function fork");
2636 childpid = wait(&argflags);
2638 pidgone(childpid, argflags);
2639 value = (I32)childpid;
2640 statusvalue = FIXSTATUS(argflags);
2644 DIE(no_func, "Unsupported function wait");
2659 childpid = wait4pid(childpid, &argflags, optype);
2660 value = (I32)childpid;
2661 statusvalue = FIXSTATUS(argflags);
2665 DIE(no_func, "Unsupported function wait");
2671 dSP; dMARK; dORIGMARK; dTARGET;
2676 Signal_t (*ihand)(); /* place to save signal during system() */
2677 Signal_t (*qhand)(); /* place to save signal during system() */
2679 #if defined(HAS_FORK) && !defined(VMS)
2680 if (SP - MARK == 1) {
2682 char *junk = SvPV(TOPs, na);
2684 TAINT_PROPER("system");
2687 while ((childpid = vfork()) == -1) {
2688 if (errno != EAGAIN) {
2697 ihand = signal(SIGINT, SIG_IGN);
2698 qhand = signal(SIGQUIT, SIG_IGN);
2700 result = wait4pid(childpid, &status, 0);
2701 } while (result == -1 && errno == EINTR);
2702 (void)signal(SIGINT, ihand);
2703 (void)signal(SIGQUIT, qhand);
2704 statusvalue = FIXSTATUS(status);
2708 value = (I32)((unsigned int)status & 0xffff);
2710 do_execfree(); /* free any memory child malloced on vfork */
2715 if (op->op_flags & OPf_STACKED) {
2716 SV *really = *++MARK;
2717 value = (I32)do_aexec(really, MARK, SP);
2719 else if (SP - MARK != 1)
2720 value = (I32)do_aexec(Nullsv, MARK, SP);
2722 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
2725 #else /* ! FORK or VMS */
2726 if (op->op_flags & OPf_STACKED) {
2727 SV *really = *++MARK;
2728 value = (I32)do_aspawn(really, MARK, SP);
2730 else if (SP - MARK != 1)
2731 value = (I32)do_aspawn(Nullsv, MARK, SP);
2733 value = (I32)do_spawn(SvPVx(sv_mortalcopy(*SP), na));
2738 #endif /* !FORK or VMS */
2744 dSP; dMARK; dORIGMARK; dTARGET;
2747 if (op->op_flags & OPf_STACKED) {
2748 SV *really = *++MARK;
2749 value = (I32)do_aexec(really, MARK, SP);
2751 else if (SP - MARK != 1)
2753 value = (I32)vms_do_aexec(Nullsv, MARK, SP);
2755 value = (I32)do_aexec(Nullsv, MARK, SP);
2759 char *junk = SvPV(*SP, na);
2761 TAINT_PROPER("exec");
2764 value = (I32)vms_do_exec(SvPVx(sv_mortalcopy(*SP), na));
2766 value = (I32)do_exec(SvPVx(sv_mortalcopy(*SP), na));
2776 dSP; dMARK; dTARGET;
2779 value = (I32)apply(op->op_type, MARK, SP);
2784 DIE(no_func, "Unsupported function kill");
2792 XPUSHi( getppid() );
2795 DIE(no_func, "getppid");
2811 value = (I32)getpgrp(pid);
2814 DIE("POSIX getpgrp can't take an argument");
2815 value = (I32)getpgrp();
2820 DIE(no_func, "getpgrp()");
2839 TAINT_PROPER("setpgrp");
2841 SETi( setpgrp(pid, pgrp) >= 0 );
2843 if ((pgrp != 0) || (pid != 0)) {
2844 DIE("POSIX setpgrp can't take an argument");
2846 SETi( setpgrp() >= 0 );
2847 #endif /* USE_BSDPGRP */
2850 DIE(no_func, "setpgrp()");
2859 #ifdef HAS_GETPRIORITY
2862 SETi( getpriority(which, who) );
2865 DIE(no_func, "getpriority()");
2875 #ifdef HAS_SETPRIORITY
2879 TAINT_PROPER("setpriority");
2880 SETi( setpriority(which, who, niceval) >= 0 );
2883 DIE(no_func, "setpriority()");
2892 XPUSHi( time(Null(Time_t*)) );
2904 #if defined(MSDOS) || !defined(HAS_TIMES)
2905 DIE("times not implemented");
2910 (void)times(×buf);
2912 (void)times((tbuffer_t *)×buf); /* time.h uses different name for */
2913 /* struct tms, though same data */
2917 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_utime)/HZ)));
2918 if (GIMME == G_ARRAY) {
2919 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_stime)/HZ)));
2920 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cutime)/HZ)));
2921 PUSHs(sv_2mortal(newSVnv(((double)timesbuf.tms_cstime)/HZ)));
2929 return pp_gmtime(ARGS);
2937 static char *dayname[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2938 static char *monname[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
2939 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
2944 when = (Time_t)SvIVx(POPs);
2946 if (op->op_type == OP_LOCALTIME)
2947 tmbuf = localtime(&when);
2949 tmbuf = gmtime(&when);
2952 if (GIMME != G_ARRAY) {
2957 sprintf(mybuf, "%s %s %2d %02d:%02d:%02d %d",
2958 dayname[tmbuf->tm_wday],
2959 monname[tmbuf->tm_mon],
2964 tmbuf->tm_year + 1900);
2965 PUSHp(mybuf, strlen(mybuf));
2968 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_sec)));
2969 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_min)));
2970 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_hour)));
2971 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mday)));
2972 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_mon)));
2973 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_year)));
2974 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_wday)));
2975 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_yday)));
2976 PUSHs(sv_2mortal(newSViv((I32)tmbuf->tm_isdst)));
2987 anum = alarm((unsigned int)anum);
2994 DIE(no_func, "Unsupported function alarm");
3005 (void)time(&lasttime);
3010 sleep((unsigned int)duration);
3013 XPUSHi(when - lasttime);
3017 /* Shared memory. */
3021 return pp_semget(ARGS);
3026 return pp_semctl(ARGS);
3031 return pp_shmwrite(ARGS);
3036 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3037 dSP; dMARK; dTARGET;
3038 I32 value = (I32)(do_shmio(op->op_type, MARK, SP) >= 0);
3043 return pp_semget(ARGS);
3047 /* Message passing. */
3051 return pp_semget(ARGS);
3056 return pp_semctl(ARGS);
3061 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3062 dSP; dMARK; dTARGET;
3063 I32 value = (I32)(do_msgsnd(MARK, SP) >= 0);
3068 return pp_semget(ARGS);
3074 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3075 dSP; dMARK; dTARGET;
3076 I32 value = (I32)(do_msgrcv(MARK, SP) >= 0);
3081 return pp_semget(ARGS);
3089 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3090 dSP; dMARK; dTARGET;
3091 int anum = do_ipcget(op->op_type, MARK, SP);
3098 DIE("System V IPC is not implemented on this machine");
3104 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3105 dSP; dMARK; dTARGET;
3106 int anum = do_ipcctl(op->op_type, MARK, SP);
3114 PUSHp("0 but true",10);
3118 return pp_semget(ARGS);
3124 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
3125 dSP; dMARK; dTARGET;
3126 I32 value = (I32)(do_semop(MARK, SP) >= 0);
3131 return pp_semget(ARGS);
3135 /* Get system info. */
3140 return pp_ghostent(ARGS);
3142 DIE(no_sock_func, "gethostbyname");
3149 return pp_ghostent(ARGS);
3151 DIE(no_sock_func, "gethostbyaddr");
3159 I32 which = op->op_type;
3160 register char **elem;
3162 struct hostent *gethostbyname();
3163 struct hostent *gethostbyaddr();
3164 #ifdef HAS_GETHOSTENT
3165 struct hostent *gethostent();
3167 struct hostent *hent;
3171 if (which == OP_GHBYNAME) {
3172 hent = gethostbyname(POPp);
3174 else if (which == OP_GHBYADDR) {
3175 int addrtype = POPi;
3178 char *addr = SvPV(addrsv, addrlen);
3180 hent = gethostbyaddr(addr, addrlen, addrtype);
3183 #ifdef HAS_GETHOSTENT
3184 hent = gethostent();
3186 DIE("gethostent not implemented");
3189 #ifdef HOST_NOT_FOUND
3191 statusvalue = FIXSTATUS(h_errno);
3194 if (GIMME != G_ARRAY) {
3195 PUSHs(sv = sv_newmortal());
3197 if (which == OP_GHBYNAME) {
3198 sv_setpvn(sv, hent->h_addr, hent->h_length);
3201 sv_setpv(sv, (char*)hent->h_name);
3207 PUSHs(sv = sv_mortalcopy(&sv_no));
3208 sv_setpv(sv, (char*)hent->h_name);
3209 PUSHs(sv = sv_mortalcopy(&sv_no));
3210 for (elem = hent->h_aliases; elem && *elem; elem++) {
3211 sv_catpv(sv, *elem);
3213 sv_catpvn(sv, " ", 1);
3215 PUSHs(sv = sv_mortalcopy(&sv_no));
3216 sv_setiv(sv, (I32)hent->h_addrtype);
3217 PUSHs(sv = sv_mortalcopy(&sv_no));
3218 len = hent->h_length;
3219 sv_setiv(sv, (I32)len);
3221 for (elem = hent->h_addr_list; elem && *elem; elem++) {
3222 XPUSHs(sv = sv_mortalcopy(&sv_no));
3223 sv_setpvn(sv, *elem, len);
3226 PUSHs(sv = sv_mortalcopy(&sv_no));
3227 sv_setpvn(sv, hent->h_addr, len);
3232 DIE(no_sock_func, "gethostent");
3239 return pp_gnetent(ARGS);
3241 DIE(no_sock_func, "getnetbyname");
3248 return pp_gnetent(ARGS);
3250 DIE(no_sock_func, "getnetbyaddr");
3258 I32 which = op->op_type;
3259 register char **elem;
3261 struct netent *getnetbyname();
3262 struct netent *getnetbyaddr();
3263 struct netent *getnetent();
3264 struct netent *nent;
3266 if (which == OP_GNBYNAME)
3267 nent = getnetbyname(POPp);
3268 else if (which == OP_GNBYADDR) {
3269 int addrtype = POPi;
3270 unsigned long addr = U_L(POPn);
3271 nent = getnetbyaddr((long)addr, addrtype);
3277 if (GIMME != G_ARRAY) {
3278 PUSHs(sv = sv_newmortal());
3280 if (which == OP_GNBYNAME)
3281 sv_setiv(sv, (I32)nent->n_net);
3283 sv_setpv(sv, nent->n_name);
3289 PUSHs(sv = sv_mortalcopy(&sv_no));
3290 sv_setpv(sv, nent->n_name);
3291 PUSHs(sv = sv_mortalcopy(&sv_no));
3292 for (elem = nent->n_aliases; *elem; elem++) {
3293 sv_catpv(sv, *elem);
3295 sv_catpvn(sv, " ", 1);
3297 PUSHs(sv = sv_mortalcopy(&sv_no));
3298 sv_setiv(sv, (I32)nent->n_addrtype);
3299 PUSHs(sv = sv_mortalcopy(&sv_no));
3300 sv_setiv(sv, (I32)nent->n_net);
3305 DIE(no_sock_func, "getnetent");
3312 return pp_gprotoent(ARGS);
3314 DIE(no_sock_func, "getprotobyname");
3321 return pp_gprotoent(ARGS);
3323 DIE(no_sock_func, "getprotobynumber");
3331 I32 which = op->op_type;
3332 register char **elem;
3334 struct protoent *getprotobyname();
3335 struct protoent *getprotobynumber();
3336 struct protoent *getprotoent();
3337 struct protoent *pent;
3339 if (which == OP_GPBYNAME)
3340 pent = getprotobyname(POPp);
3341 else if (which == OP_GPBYNUMBER)
3342 pent = getprotobynumber(POPi);
3344 pent = getprotoent();
3347 if (GIMME != G_ARRAY) {
3348 PUSHs(sv = sv_newmortal());
3350 if (which == OP_GPBYNAME)
3351 sv_setiv(sv, (I32)pent->p_proto);
3353 sv_setpv(sv, pent->p_name);
3359 PUSHs(sv = sv_mortalcopy(&sv_no));
3360 sv_setpv(sv, pent->p_name);
3361 PUSHs(sv = sv_mortalcopy(&sv_no));
3362 for (elem = pent->p_aliases; *elem; elem++) {
3363 sv_catpv(sv, *elem);
3365 sv_catpvn(sv, " ", 1);
3367 PUSHs(sv = sv_mortalcopy(&sv_no));
3368 sv_setiv(sv, (I32)pent->p_proto);
3373 DIE(no_sock_func, "getprotoent");
3380 return pp_gservent(ARGS);
3382 DIE(no_sock_func, "getservbyname");
3389 return pp_gservent(ARGS);
3391 DIE(no_sock_func, "getservbyport");
3399 I32 which = op->op_type;
3400 register char **elem;
3402 struct servent *getservbyname();
3403 struct servent *getservbynumber();
3404 struct servent *getservent();
3405 struct servent *sent;
3407 if (which == OP_GSBYNAME) {
3411 if (proto && !*proto)
3414 sent = getservbyname(name, proto);
3416 else if (which == OP_GSBYPORT) {
3420 sent = getservbyport(port, proto);
3423 sent = getservent();
3426 if (GIMME != G_ARRAY) {
3427 PUSHs(sv = sv_newmortal());
3429 if (which == OP_GSBYNAME) {
3431 sv_setiv(sv, (I32)ntohs(sent->s_port));
3433 sv_setiv(sv, (I32)(sent->s_port));
3437 sv_setpv(sv, sent->s_name);
3443 PUSHs(sv = sv_mortalcopy(&sv_no));
3444 sv_setpv(sv, sent->s_name);
3445 PUSHs(sv = sv_mortalcopy(&sv_no));
3446 for (elem = sent->s_aliases; *elem; elem++) {
3447 sv_catpv(sv, *elem);
3449 sv_catpvn(sv, " ", 1);
3451 PUSHs(sv = sv_mortalcopy(&sv_no));
3453 sv_setiv(sv, (I32)ntohs(sent->s_port));
3455 sv_setiv(sv, (I32)(sent->s_port));
3457 PUSHs(sv = sv_mortalcopy(&sv_no));
3458 sv_setpv(sv, sent->s_proto);
3463 DIE(no_sock_func, "getservent");
3474 DIE(no_sock_func, "sethostent");
3485 DIE(no_sock_func, "setnetent");
3496 DIE(no_sock_func, "setprotoent");
3507 DIE(no_sock_func, "setservent");
3519 DIE(no_sock_func, "endhostent");
3531 DIE(no_sock_func, "endnetent");
3543 DIE(no_sock_func, "endprotoent");
3555 DIE(no_sock_func, "endservent");
3562 return pp_gpwent(ARGS);
3564 DIE(no_func, "getpwnam");
3571 return pp_gpwent(ARGS);
3573 DIE(no_func, "getpwuid");
3581 I32 which = op->op_type;
3583 struct passwd *pwent;
3585 if (which == OP_GPWNAM)
3586 pwent = getpwnam(POPp);
3587 else if (which == OP_GPWUID)
3588 pwent = getpwuid(POPi);
3590 pwent = (struct passwd *)getpwent();
3593 if (GIMME != G_ARRAY) {
3594 PUSHs(sv = sv_newmortal());
3596 if (which == OP_GPWNAM)
3597 sv_setiv(sv, (I32)pwent->pw_uid);
3599 sv_setpv(sv, pwent->pw_name);
3605 PUSHs(sv = sv_mortalcopy(&sv_no));
3606 sv_setpv(sv, pwent->pw_name);
3607 PUSHs(sv = sv_mortalcopy(&sv_no));
3608 sv_setpv(sv, pwent->pw_passwd);
3609 PUSHs(sv = sv_mortalcopy(&sv_no));
3610 sv_setiv(sv, (I32)pwent->pw_uid);
3611 PUSHs(sv = sv_mortalcopy(&sv_no));
3612 sv_setiv(sv, (I32)pwent->pw_gid);
3613 PUSHs(sv = sv_mortalcopy(&sv_no));
3615 sv_setiv(sv, (I32)pwent->pw_change);
3618 sv_setiv(sv, (I32)pwent->pw_quota);
3621 sv_setpv(sv, pwent->pw_age);
3625 PUSHs(sv = sv_mortalcopy(&sv_no));
3627 sv_setpv(sv, pwent->pw_class);
3630 sv_setpv(sv, pwent->pw_comment);
3633 PUSHs(sv = sv_mortalcopy(&sv_no));
3634 sv_setpv(sv, pwent->pw_gecos);
3635 PUSHs(sv = sv_mortalcopy(&sv_no));
3636 sv_setpv(sv, pwent->pw_dir);
3637 PUSHs(sv = sv_mortalcopy(&sv_no));
3638 sv_setpv(sv, pwent->pw_shell);
3640 PUSHs(sv = sv_mortalcopy(&sv_no));
3641 sv_setiv(sv, (I32)pwent->pw_expire);
3646 DIE(no_func, "getpwent");
3657 DIE(no_func, "setpwent");
3668 DIE(no_func, "endpwent");
3675 return pp_ggrent(ARGS);
3677 DIE(no_func, "getgrnam");
3684 return pp_ggrent(ARGS);
3686 DIE(no_func, "getgrgid");
3694 I32 which = op->op_type;
3695 register char **elem;
3697 struct group *grent;
3699 if (which == OP_GGRNAM)
3700 grent = (struct group *)getgrnam(POPp);
3701 else if (which == OP_GGRGID)
3702 grent = (struct group *)getgrgid(POPi);
3704 grent = (struct group *)getgrent();
3707 if (GIMME != G_ARRAY) {
3708 PUSHs(sv = sv_newmortal());
3710 if (which == OP_GGRNAM)
3711 sv_setiv(sv, (I32)grent->gr_gid);
3713 sv_setpv(sv, grent->gr_name);
3719 PUSHs(sv = sv_mortalcopy(&sv_no));
3720 sv_setpv(sv, grent->gr_name);
3721 PUSHs(sv = sv_mortalcopy(&sv_no));
3722 sv_setpv(sv, grent->gr_passwd);
3723 PUSHs(sv = sv_mortalcopy(&sv_no));
3724 sv_setiv(sv, (I32)grent->gr_gid);
3725 PUSHs(sv = sv_mortalcopy(&sv_no));
3726 for (elem = grent->gr_mem; *elem; elem++) {
3727 sv_catpv(sv, *elem);
3729 sv_catpvn(sv, " ", 1);
3735 DIE(no_func, "getgrent");
3746 DIE(no_func, "setgrent");
3757 DIE(no_func, "endgrent");
3767 if (!(tmps = getlogin()))
3769 PUSHp(tmps, strlen(tmps));
3772 DIE(no_func, "getlogin");
3776 /* Miscellaneous. */
3781 dSP; dMARK; dORIGMARK; dTARGET;
3782 register I32 items = SP - MARK;
3783 unsigned long a[20];
3789 while (++MARK <= SP) {
3790 if (SvGMAGICAL(*MARK) && SvSMAGICAL(*MARK) &&
3791 (mg = mg_find(*MARK, 't')) && mg->mg_len & 1)
3795 TAINT_PROPER("syscall");
3798 /* This probably won't work on machines where sizeof(long) != sizeof(int)
3799 * or where sizeof(long) != sizeof(char*). But such machines will
3800 * not likely have syscall implemented either, so who cares?
3802 while (++MARK <= SP) {
3803 if (SvNIOK(*MARK) || !i)
3804 a[i++] = SvIV(*MARK);
3805 else if (*MARK == &sv_undef)
3808 a[i++] = (unsigned long)SvPV_force(*MARK, na);
3814 DIE("Too many args to syscall");
3816 DIE("Too few args to syscall");
3818 retval = syscall(a[0]);
3821 retval = syscall(a[0],a[1]);
3824 retval = syscall(a[0],a[1],a[2]);
3827 retval = syscall(a[0],a[1],a[2],a[3]);
3830 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
3833 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
3836 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
3839 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
3843 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
3846 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
3849 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3853 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3857 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3861 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
3862 a[10],a[11],a[12],a[13]);
3864 #endif /* atarist */
3870 DIE(no_func, "syscall");