Minor Win32 glitch with -S flag
[p5sagit/p5-mst-13.2.git] / doio.c
diff --git a/doio.c b/doio.c
index 829d6d9..62b7de9 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -34,7 +34,7 @@
 #endif
 
 #ifdef I_UTIME
-#  ifdef WIN32
+#  ifdef _MSC_VER
 #    include <sys/utime.h>
 #  else
 #    include <utime.h>
@@ -481,7 +481,10 @@ register GV *gv;
 #ifdef HAS_FCHMOD
                (void)fchmod(lastfd,filemode);
 #else
+#  if !(defined(WIN32) && defined(__BORLANDC__))
+               /* Borland runtime creates a readonly file! */
                (void)chmod(oldname,filemode);
+#  endif
 #endif
                if (fileuid != statbuf.st_uid || filegid != statbuf.st_gid) {
 #ifdef HAS_FCHOWN
@@ -667,13 +670,10 @@ GV *gv;
        if (PerlIO_eof(fp))
            (void)PerlIO_seek(fp, 0L, 2);       /* ultrix 1.2 workaround */
 #endif
-       if (op->op_type == OP_SYSTELL)
-           return lseek(PerlIO_fileno(fp), 0L, 1);
-       else
-           return PerlIO_tell(fp);
+       return PerlIO_tell(fp);
     }
     if (dowarn)
-       warn("%s() on unopened file", op_name[op->op_type]);
+       warn("tell() on unopened file");
     SETERRNO(EBADF,RMS$_IFI);
     return -1L;
 }
@@ -692,17 +692,31 @@ int whence;
        if (PerlIO_eof(fp))
            (void)PerlIO_seek(fp, 0L, 2);       /* ultrix 1.2 workaround */
 #endif
-       if (op->op_type == OP_SYSSEEK)
-           return lseek(PerlIO_fileno(fp), pos, whence) >= 0;
-       else
-           return PerlIO_seek(fp, pos, whence) >= 0;
+       return PerlIO_seek(fp, pos, whence) >= 0;
     }
     if (dowarn)
-       warn("%s() on unopened file", op_name[op->op_type]);
+       warn("seek() on unopened file");
     SETERRNO(EBADF,RMS$_IFI);
     return FALSE;
 }
 
+long
+do_sysseek(gv, pos, whence)
+GV *gv;
+long pos;
+int whence;
+{
+    register IO *io;
+    register PerlIO *fp;
+
+    if (gv && (io = GvIO(gv)) && (fp = IoIFP(io)))
+       return lseek(PerlIO_fileno(fp), pos, whence);
+    if (dowarn)
+       warn("sysseek() on unopened file");
+    SETERRNO(EBADF,RMS$_IFI);
+    return -1L;
+}
+
 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
        /* code courtesy of William Kucharski */
 #define HAS_CHSIZE
@@ -711,7 +725,6 @@ I32 my_chsize(fd, length)
 I32 fd;                        /* file descriptor */
 Off_t length;          /* length to set file to */
 {
-    extern long lseek();
     struct flock fl;
     struct stat filebuf;
 
@@ -1320,6 +1333,9 @@ SV **sp;
     char *a;
     I32 id, n, cmd, infosize, getinfo;
     I32 ret = -1;
+#ifdef __linux__       /* XXX Need metaconfig test */
+    union semun unsemds;
+#endif
 
     id = SvIVx(*++mark);
     n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0;
@@ -1348,11 +1364,29 @@ SV **sp;
            infosize = sizeof(struct semid_ds);
        else if (cmd == GETALL || cmd == SETALL)
        {
+#ifdef __linux__       /* XXX Need metaconfig test */
+/* linux uses :
+   int semctl (int semid, int semnun, int cmd, union semun arg)
+
+       union semun {
+            int val;
+            struct semid_ds *buf;
+            ushort *array;
+       };
+*/
+            union semun semds;
+           if (semctl(id, 0, IPC_STAT, semds) == -1)
+#else
            struct semid_ds semds;
            if (semctl(id, 0, IPC_STAT, &semds) == -1)
+#endif
                return -1;
            getinfo = (cmd == GETALL);
+#ifdef __linux__       /* XXX Need metaconfig test */
+           infosize = semds.buf->sem_nsems * sizeof(short);
+#else
            infosize = semds.sem_nsems * sizeof(short);
+#endif
                /* "short" is technically wrong but much more portable
                   than guessing about u_?short(_t)? */
        }
@@ -1395,7 +1429,12 @@ SV **sp;
 #endif
 #ifdef HAS_SEM
     case OP_SEMCTL:
+#ifdef __linux__       /* XXX Need metaconfig test */
+        unsemds.buf = (struct semid_ds *)a;
+       ret = semctl(id, n, cmd, unsemds);
+#else
        ret = semctl(id, n, cmd, (struct semid_ds *)a);
+#endif
        break;
 #endif
 #ifdef HAS_SHM