Further ANSI changes now builds and passes (most) tests
[p5sagit/p5-mst-13.2.git] / ext / Fcntl / Fcntl.xs
index 2a36095..251f3f4 100644 (file)
@@ -2,20 +2,35 @@
 #include "perl.h"
 #include "XSUB.h"
 
-#include <fcntl.h>
+#ifdef VMS
+#  include <file.h>
+#else
+#  include <fcntl.h>
+#endif
+
+/* This comment is a kludge to get metaconfig to see the symbols
+    VAL_O_NONBLOCK
+    VAL_EAGAIN
+    RD_NODATA
+    EOF_NONBLOCK
+   and include the appropriate metaconfig unit
+   so that Configure will test how to turn on non-blocking I/O
+   for a file descriptor.  See config.h for how to use these
+   in your extension. 
+   
+   While I'm at it, I'll have metaconfig look for HAS_POLL too.
+   --AD  October 16, 1995
+*/
 
 static int
-not_here(s)
-char *s;
+not_here(char *s)
 {
     croak("%s not implemented on this architecture", s);
     return -1;
 }
 
 static double
-constant(name, arg)
-char *name;
-int arg;
+constant(char *name, int arg)
 {
     errno = 0;
     switch (*name) {
@@ -39,6 +54,12 @@ int arg;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_GETOWN"))
+#ifdef F_GETOWN
+               return F_GETOWN;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_SETFD"))
 #ifdef F_SETFD
                return F_SETFD;
@@ -51,9 +72,15 @@ int arg;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "SETFL"))
-#ifdef SETFL
-               return SETFL;
+           if (strEQ(name, "F_POSIX"))
+#ifdef F_POSIX
+               return F_POSIX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFL"))
+#ifdef F_SETFL
+               return F_SETFL;
 #else
                goto not_there;
 #endif
@@ -69,6 +96,12 @@ int arg;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_SETOWN"))
+#ifdef F_SETOWN
+               return F_SETOWN;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_RDLCK"))
 #ifdef F_RDLCK
                return F_RDLCK;
@@ -89,14 +122,93 @@ int arg;
 #endif
            errno = EINVAL;
            return 0;
-       } else
-         if (strEQ(name, "FD_CLOEXEC"))
+       }
+        if (strEQ(name, "FAPPEND"))
+#ifdef FAPPEND
+            return FAPPEND;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FASYNC"))
+#ifdef FASYNC
+            return FASYNC;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FCREAT"))
+#ifdef FCREAT
+            return FCREAT;
+#else
+            goto not_there;
+#endif
+       if (strEQ(name, "FD_CLOEXEC"))
 #ifdef FD_CLOEXEC
            return FD_CLOEXEC;
 #else
            goto not_there;
 #endif
+        if (strEQ(name, "FEXCL"))
+#ifdef FEXCL
+            return FEXCL;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FNDELAY"))
+#ifdef FNDELAY
+            return FNDELAY;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FNONBLOCK"))
+#ifdef FNONBLOCK
+            return FNONBLOCK;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FSYNC"))
+#ifdef FSYNC
+            return FSYNC;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FTRUNC"))
+#ifdef FTRUNC
+            return FTRUNC;
+#else
+            goto not_there;
+#endif
        break;
+    case 'L':
+       if (strnEQ(name, "LOCK_", 5)) {
+           /* We support flock() on systems which don't have it, so
+              always supply the constants. */
+           if (strEQ(name, "LOCK_SH"))
+#ifdef LOCK_SH
+               return LOCK_SH;
+#else
+               return 1;
+#endif
+           if (strEQ(name, "LOCK_EX"))
+#ifdef LOCK_EX
+               return LOCK_EX;
+#else
+               return 2;
+#endif
+           if (strEQ(name, "LOCK_NB"))
+#ifdef LOCK_NB
+               return LOCK_NB;
+#else
+               return 4;
+#endif
+           if (strEQ(name, "LOCK_UN"))
+#ifdef LOCK_UN
+               return LOCK_UN;
+#else
+               return 8;
+#endif
+       } else
+         goto not_there;
+       break;
     case 'O':
        if (strnEQ(name, "O_", 2)) {
            if (strEQ(name, "O_CREAT"))
@@ -159,6 +271,54 @@ int arg;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "O_BINARY"))
+#ifdef O_BINARY
+               return O_BINARY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_EXLOCK"))
+#ifdef O_EXLOCK
+               return O_EXLOCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_SHLOCK"))
+#ifdef O_SHLOCK
+               return O_SHLOCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_ASYNC"))
+#ifdef O_ASYNC
+               return O_ASYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_DSYNC"))
+#ifdef O_DSYNC
+               return O_DSYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RSYNC"))
+#ifdef O_RSYNC
+               return O_RSYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_SYNC"))
+#ifdef O_SYNC
+               return O_SYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_DEFER"))
+#ifdef O_DEFER
+               return O_DEFER;
+#else
+               goto not_there;
+#endif
        } else
          goto not_there;
        break;