integrate cfgperl contents into mainline
[p5sagit/p5-mst-13.2.git] / ext / Fcntl / Fcntl.xs
index dfdf099..b597e03 100644 (file)
@@ -1,8 +1,23 @@
+#define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
 
-#include <fcntl.h>
+#ifdef VMS
+#  include <file.h>
+#else
+#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
+#define _NO_OLDNAMES
+#endif 
+#  include <fcntl.h>
+#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
+#undef _NO_OLDNAMES
+#endif 
+#endif
+
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
 
 /* This comment is a kludge to get metaconfig to see the symbols
     VAL_O_NONBLOCK
 */
 
 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) {
+    case '_':
+       if (strEQ(name, "_S_IFMT")) /* Yes, on name _S_IFMT return S_IFMT. */
+#ifdef S_IFMT
+         return S_IFMT;
+#else
+         goto not_there;
+#endif
+       break;
     case 'F':
        if (strnEQ(name, "F_", 2)) {
+           if (strEQ(name, "F_ALLOCSP"))
+#ifdef F_ALLOCSP
+               return F_ALLOCSP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_ALLOCSP64"))
+#ifdef F_ALLOCSP64
+               return F_ALLOCSP64;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_COMPAT"))
+#ifdef F_COMPAT
+               return F_COMPAT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_DUP2FD"))
+#ifdef F_DUP2FD
+               return F_DUP2FD;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_DUPFD"))
 #ifdef F_DUPFD
                return F_DUPFD;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_EXLCK"))
+#ifdef F_EXLCK
+               return F_EXLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_FREESP"))
+#ifdef F_FREESP
+               return F_FREESP;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_FREESP64"))
+#ifdef F_FREESP64
+               return F_FREESP64;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_FSYNC"))
+#ifdef F_FSYNC
+               return F_FSYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_FSYNC64"))
+#ifdef F_FSYNC64
+               return F_FSYNC64;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_GETFD"))
 #ifdef F_GETFD
                return F_GETFD;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_GETFL"))
+#ifdef F_GETFL
+               return F_GETFL;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_GETLK"))
 #ifdef F_GETLK
                return F_GETLK;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "F_SETFD"))
-#ifdef F_SETFD
-               return F_SETFD;
+           if (strEQ(name, "F_GETLK64"))
+#ifdef F_GETLK64
+               return F_GETLK64;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "F_GETFL"))
-#ifdef F_GETFL
-               return F_GETFL;
+           if (strEQ(name, "F_GETOWN"))
+#ifdef F_GETOWN
+               return F_GETOWN;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_NODNY"))
+#ifdef F_NODNY
+               return F_NODNY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_POSIX"))
+#ifdef F_POSIX
+               return F_POSIX;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RDACC"))
+#ifdef F_RDACC
+               return F_RDACC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RDDNY"))
+#ifdef F_RDDNY
+               return F_RDDNY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RDLCK"))
+#ifdef F_RDLCK
+               return F_RDLCK;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RWACC"))
+#ifdef F_RWACC
+               return F_RWACC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_RWDNY"))
+#ifdef F_RWDNY
+               return F_RWDNY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SETFD"))
+#ifdef F_SETFD
+               return F_SETFD;
 #else
                goto not_there;
 #endif
@@ -77,15 +205,39 @@ int arg;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_SETLK64"))
+#ifdef F_SETLK64
+               return F_SETLK64;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_SETLKW"))
 #ifdef F_SETLKW
                return F_SETLKW;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "F_RDLCK"))
-#ifdef F_RDLCK
-               return F_RDLCK;
+           if (strEQ(name, "F_SETLKW64"))
+#ifdef F_SETLKW64
+               return F_SETLKW64;
+#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_SHARE"))
+#ifdef F_SHARE
+               return F_SHARE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_SHLCK"))
+#ifdef F_SHLCK
+               return F_SHLCK;
 #else
                goto not_there;
 #endif
@@ -95,6 +247,24 @@ int arg;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "F_UNSHARE"))
+#ifdef F_UNSHARE
+               return F_UNSHARE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_WRACC"))
+#ifdef F_WRACC
+               return F_WRACC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "F_WRDNY"))
+#ifdef F_WRDNY
+               return F_WRDNY;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "F_WRLCK"))
 #ifdef F_WRLCK
                return F_WRLCK;
@@ -103,43 +273,212 @@ 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, "FDEFER"))
+#ifdef FDEFER
+           return FDEFER;
+#else
+           goto not_there;
+#endif
+        if (strEQ(name, "FDSYNC"))
+#ifdef FDSYNC
+            return FDSYNC;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FEXCL"))
+#ifdef FEXCL
+            return FEXCL;
+#else
+            goto not_there;
+#endif
+        if (strEQ(name, "FLARGEFILE"))
+#ifdef FLARGEFILE
+            return FLARGEFILE;
+#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, "FRSYNC"))
+#ifdef FRSYNC
+            return FRSYNC;
+#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_ACCMODE"))
+#ifdef O_ACCMODE
+               return O_ACCMODE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_APPEND"))
+#ifdef O_APPEND
+               return O_APPEND;
+#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_BINARY"))
+#ifdef O_BINARY
+               return O_BINARY;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "O_CREAT"))
 #ifdef O_CREAT
                return O_CREAT;
 #else
                goto not_there;
 #endif
+           if (strEQ(name, "O_DEFER"))
+#ifdef O_DEFER
+               return O_DEFER;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_DIRECT"))
+#ifdef O_DIRECT
+               return O_DIRECT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_DIRECTORY"))
+#ifdef O_DIRECTORY
+               return O_DIRECTORY;
+#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_EXCL"))
 #ifdef O_EXCL
                return O_EXCL;
 #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_LARGEFILE"))
+#ifdef O_LARGEFILE
+               return O_LARGEFILE;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_NDELAY"))
+#ifdef O_NDELAY
+               return O_NDELAY;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "O_NOCTTY"))
 #ifdef O_NOCTTY
                return O_NOCTTY;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "O_TRUNC"))
-#ifdef O_TRUNC
-               return O_TRUNC;
+           if (strEQ(name, "O_NOFOLLOW"))
+#ifdef O_NOFOLLOW
+               return O_NOFOLLOW;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "O_APPEND"))
-#ifdef O_APPEND
-               return O_APPEND;
+           if (strEQ(name, "O_NOINHERIT"))
+#ifdef O_NOINHERIT
+               return O_NOINHERIT;
 #else
                goto not_there;
 #endif
@@ -149,9 +488,15 @@ int arg;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "O_NDELAY"))
-#ifdef O_NDELAY
-               return O_NDELAY;
+           if (strEQ(name, "O_RANDOM"))
+#ifdef O_RANDOM
+               return O_RANDOM;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RAW"))
+#ifdef O_RAW
+               return O_RAW;
 #else
                goto not_there;
 #endif
@@ -167,21 +512,262 @@ int arg;
 #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_SEQUENTIAL"))
+#ifdef O_SEQUENTIAL
+               return O_SEQUENTIAL;
+#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_SYNC"))
+#ifdef O_SYNC
+               return O_SYNC;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_TEMPORARY"))
+#ifdef O_TEMPORARY
+               return O_TEMPORARY;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_TEXT"))
+#ifdef O_TEXT
+               return O_TEXT;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_TRUNC"))
+#ifdef O_TRUNC
+               return O_TRUNC;
+#else
+               goto not_there;
+#endif
            if (strEQ(name, "O_WRONLY"))
 #ifdef O_WRONLY
                return O_WRONLY;
 #else
                goto not_there;
 #endif
-           if (strEQ(name, "O_BINARY"))
-#ifdef O_BINARY
-               return O_BINARY;
+           if (strEQ(name, "O_ALIAS"))
+#ifdef O_ALIAS
+               return O_ALIAS;
+#else
+               goto not_there;
+#endif
+           if (strEQ(name, "O_RSRC"))
+#ifdef O_RSRC
+               return O_RSRC;
 #else
                goto not_there;
 #endif
        } else
          goto not_there;
        break;
+    case 'S':
+      switch (name[1]) {
+      case '_':
+       if (strEQ(name, "S_ISUID"))
+#ifdef S_ISUID
+         return S_ISUID;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_ISGID"))
+#ifdef S_ISGID
+         return S_ISGID;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_ISVTX"))
+#ifdef S_ISVTX
+         return S_ISVTX;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_ISTXT"))
+#ifdef S_ISTXT
+         return S_ISTXT;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFREG"))
+#ifdef S_IFREG
+         return S_IFREG;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFDIR"))
+#ifdef S_IFDIR
+         return S_IFDIR;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFLNK"))
+#ifdef S_IFLNK
+         return S_IFLNK;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFSOCK"))
+#ifdef S_IFSOCK
+         return S_IFSOCK;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFBLK"))
+#ifdef S_IFBLK
+         return S_IFBLK;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFCHR"))
+#ifdef S_IFCHR
+         return S_IFCHR;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFIFO"))
+#ifdef S_IFIFO
+         return S_IFIFO;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IFWHT"))
+#ifdef S_IFWHT
+         return S_IFWHT;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_ENFMT"))
+#ifdef S_ENFMT
+         return S_ENFMT;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IRUSR"))
+#ifdef S_IRUSR
+         return S_IRUSR;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IWUSR"))
+#ifdef S_IWUSR
+         return S_IWUSR;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IXUSR"))
+#ifdef S_IXUSR
+         return S_IXUSR;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IRWXU"))
+#ifdef S_IRWXU
+         return S_IRWXU;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IRGRP"))
+#ifdef S_IRGRP
+         return S_IRGRP;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IWGRP"))
+#ifdef S_IWGRP
+         return S_IWGRP;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IXGRP"))
+#ifdef S_IXGRP
+         return S_IXGRP;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IRWXG"))
+#ifdef S_IRWXG
+         return S_IRWXG;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IROTH"))
+#ifdef S_IROTH
+         return S_IROTH;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IWOTH"))
+#ifdef S_IWOTH
+         return S_IWOTH;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IXOTH"))
+#ifdef S_IXOTH
+         return S_IXOTH;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IRWXO"))
+#ifdef S_IRWXO
+         return S_IRWXO;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IREAD"))
+#ifdef S_IREAD
+         return S_IREAD;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IWRITE"))
+#ifdef S_IWRITE
+         return S_IWRITE;
+#else
+         goto not_there;
+#endif
+       if (strEQ(name, "S_IEXEC"))
+#ifdef S_IEXEC
+         return S_IEXEC;
+#else
+         goto not_there;
+#endif
+       break;
+      case 'E':
+         if (strEQ(name, "SEEK_CUR"))
+#ifdef SEEK_CUR
+           return SEEK_CUR;
+#else
+           return 1;
+#endif
+       if (strEQ(name, "SEEK_END"))
+#ifdef SEEK_END
+           return SEEK_END;
+#else
+           return 2;
+#endif
+       if (strEQ(name, "SEEK_SET"))
+#ifdef SEEK_SET
+           return SEEK_SET;
+#else
+           return 0;
+#endif
+       break;
+      }    
     }
     errno = EINVAL;
     return 0;