#include <sys/file.h>
#endif
-/* Omit -- it causes too much grief on mixed systems.
-#ifdef I_UNISTD
-#include <unistd.h>
+#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
+# include <sys/socket.h>
+# include <netdb.h>
+# ifndef ENOTSOCK
+# ifdef I_NET_ERRNO
+# include <net/errno.h>
+# endif
+# endif
#endif
-*/
bool
do_open(gv,name,len,supplied_fp)
thatio = GvIO(gv);
if (!thatio) {
#ifdef EINVAL
- errno = EINVAL;
+ SETERRNO(EINVAL,SS$_IVCHAN);
#endif
goto say_false;
}
if (inplace) {
TAINT_PROPER("inplace open");
if (strEQ(oldname,"-")) {
- defoutgv = gv_fetchpv("STDOUT",TRUE,SVt_PVIO);
+ setdefout(gv_fetchpv("STDOUT",TRUE,SVt_PVIO));
return IoIFP(GvIOp(gv));
}
#ifndef FLEXFILENAMES
sv_setpvn(sv,">",1);
sv_catpv(sv,oldname);
- errno = 0; /* in case sprintf set errno */
+ SETERRNO(0,0); /* in case sprintf set errno */
if (!do_open(argvoutgv,SvPVX(sv),SvCUR(sv),Nullfp)) {
warn("Can't do inplace edit on %s: %s",
oldname, Strerror(errno) );
do_close(gv,FALSE);
continue;
}
- defoutgv = argvoutgv;
+ setdefout(argvoutgv);
lastfd = fileno(IoIFP(GvIOp(argvoutgv)));
(void)Fstat(lastfd,&statbuf);
#ifdef HAS_FCHMOD
}
if (inplace) {
(void)do_close(argvoutgv,FALSE);
- defoutgv = gv_fetchpv("STDOUT",TRUE,SVt_PVIO);
+ setdefout(gv_fetchpv("STDOUT",TRUE,SVt_PVIO));
}
return Nullfp;
}
if (!gv)
gv = argvgv;
if (!gv || SvTYPE(gv) != SVt_PVGV) {
- errno = EBADF;
+ SETERRNO(EBADF,SS$_IVCHAN);
return FALSE;
}
io = GvIO(gv);
if (IoTYPE(io) == '|') {
status = my_pclose(IoIFP(io));
retval = (status == 0);
- statusvalue = (unsigned short)status & 0xffff;
+ statusvalue = FIXSTATUS(status);
}
else if (IoTYPE(io) == '-')
retval = TRUE;
while (IoIFP(io)) {
-#ifdef USE_STD_STDIO /* (the code works without this) */
- if (IoIFP(io)->_cnt > 0) /* cheat a little, since */
+#ifdef USE_STDIO_PTR /* (the code works without this) */
+ if (FILE_cnt(IoIFP(io)) > 0) /* cheat a little, since */
return FALSE; /* this is the most usual case */
#endif
(void)ungetc(ch, IoIFP(io));
return FALSE;
}
-#ifdef USE_STD_STDIO
- if (IoIFP(io)->_cnt < -1)
- IoIFP(io)->_cnt = -1;
+#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
+ if (FILE_cnt(IoIFP(io)) < -1)
+ FILE_cnt(IoIFP(io)) = -1;
#endif
if (op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */
if (!nextargv(argvgv)) /* get another fp handy */
phooey:
if (dowarn)
warn("tell() on unopened file");
- errno = EBADF;
+ SETERRNO(EBADF,RMS$_IFI);
return -1L;
}
nuts:
if (dowarn)
warn("seek() on unopened file");
- errno = EBADF;
+ SETERRNO(EBADF,RMS$_IFI);
return FALSE;
}
{
dSP;
IO *io;
+ GV* tmpgv;
if (op->op_flags & OPf_REF) {
EXTEND(sp,1);
- io = GvIO(cGVOP->op_gv);
+ tmpgv = cGVOP->op_gv;
+ do_fstat:
+ io = GvIO(tmpgv);
if (io && IoIFP(io)) {
- statgv = cGVOP->op_gv;
+ statgv = tmpgv;
sv_setpv(statname,"");
laststype = OP_STAT;
return (laststatval = Fstat(fileno(IoIFP(io)), &statcache));
}
else {
- if (cGVOP->op_gv == defgv)
+ if (tmpgv == defgv)
return laststatval;
if (dowarn)
warn("Stat on unopened file <%s>",
- GvENAME(cGVOP->op_gv));
+ GvENAME(tmpgv));
statgv = Nullgv;
sv_setpv(statname,"");
return (laststatval = -1);
}
}
else {
- dPOPss;
+ SV* sv = POPs;
PUTBACK;
+ if (SvTYPE(sv) == SVt_PVGV) {
+ tmpgv = (GV*)sv;
+ goto do_fstat;
+ }
+ else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
+ tmpgv = (GV*)SvRV(sv);
+ goto do_fstat;
+ }
+
statgv = Nullgv;
sv_setpv(statname,SvPV(sv, na));
laststype = OP_STAT;
register char *s;
char flags[10];
+ while (*cmd && isSPACE(*cmd))
+ cmd++;
+
/* save an extra exec if possible */
#ifdef CSH
/* see if there are shell metacharacters in it */
- /*SUPPRESS 530*/
+ if (*cmd == '.' && isSPACE(cmd[1]))
+ goto doshell;
+
+ if (strnEQ(cmd,"exec",4) && isSPACE(cmd[4]))
+ goto doshell;
+
for (s = cmd; *s && isALPHA(*s); s++) ; /* catch VAR=val gizmo */
if (*s == '=')
goto doshell;
+
for (s = cmd; *s; s++) {
if (*s != ' ' && !isALPHA(*s) && strchr("$&*(){}[]'\";\\|?<>~`\n",*s)) {
if (*s == '\n' && !s[1]) {
return FALSE;
}
}
+
New(402,Argv, (s - cmd) / 2 + 2, char*);
Cmd = savepvn(cmd, s-cmd);
a = Argv;
if (tainting) {
while (++mark <= sp) {
- if (SvMAGICAL(*mark) && mg_find(*mark, 't'))
+ MAGIC *mg;
+ if (SvMAGICAL(*mark) && (mg = mg_find(*mark, 't')) && mg->mg_len & 1)
tainted = TRUE;
}
mark = oldmark;
case OP_UTIME:
TAINT_PROPER("utime");
if (sp - mark > 2) {
-#ifdef I_UTIME
+#if defined(I_UTIME) || defined(VMS)
struct utimbuf utbuf;
#else
struct {
key = (key_t)SvNVx(*++mark);
n = (optype == OP_MSGGET) ? 0 : SvIVx(*++mark);
flags = SvIVx(*++mark);
- errno = 0;
+ SETERRNO(0,0);
switch (optype)
{
#ifdef HAS_MSG
I32 i = SvIV(astr);
a = (char *)i; /* ouch */
}
- errno = 0;
+ SETERRNO(0,0);
switch (optype)
{
#ifdef HAS_MSG
mbuf = SvPV(mstr, len);
if ((msize = len - sizeof(long)) < 0)
croak("Arg too short for msgsnd");
- errno = 0;
+ SETERRNO(0,0);
return msgsnd(id, (struct msgbuf *)mbuf, msize, flags);
#else
croak("msgsnd not implemented");
SvPV_force(mstr, len);
mbuf = SvGROW(mstr, sizeof(long)+msize+1);
- errno = 0;
+ SETERRNO(0,0);
ret = msgrcv(id, (struct msgbuf *)mbuf, msize, mtype, flags);
if (ret >= 0) {
SvCUR_set(mstr, sizeof(long)+ret);
opbuf = SvPV(opstr, opsize);
if (opsize < sizeof(struct sembuf)
|| (opsize % sizeof(struct sembuf)) != 0) {
- errno = EINVAL;
+ SETERRNO(EINVAL,LIB$_INVARG);
return -1;
}
- errno = 0;
+ SETERRNO(0,0);
return semop(id, (struct sembuf *)opbuf, opsize/sizeof(struct sembuf));
#else
croak("semop not implemented");
mstr = *++mark;
mpos = SvIVx(*++mark);
msize = SvIVx(*++mark);
- errno = 0;
+ SETERRNO(0,0);
if (shmctl(id, IPC_STAT, &shmds) == -1)
return -1;
if (mpos < 0 || msize < 0 || mpos + msize > shmds.shm_segsz) {
- errno = EFAULT; /* can't do as caller requested */
+ SETERRNO(EFAULT,SS$_ACCVIO); /* can't do as caller requested */
return -1;
}
shm = (Shmat_t)shmat(id, (char*)NULL, (optype == OP_SHMREAD) ? SHM_RDONLY : 0);