This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
applied patch, moved #define mkfifo ... from perl.h to POSIX.xs
[perl5.git] / ext / POSIX / POSIX.xs
index 817ef11..568fbee 100644 (file)
@@ -1,7 +1,17 @@
+#ifdef WIN32
+#define _POSIX_
+#endif
 #include "EXTERN.h"
 #define PERLIO_NOT_STDIO 1
 #include "perl.h"
 #include "XSUB.h"
+#ifdef PERL_OBJECT     /* XXX _very_ temporary hacks */
+#  undef signal
+#  undef open
+#  define open PerlLIO_open3
+#  undef TAINT_PROPER
+#  define TAINT_PROPER(a)
+#endif
 #include <ctype.h>
 #ifdef I_DIRENT    /* XXX maybe better to just rely on perl.h? */
 #include <dirent.h>
 #endif
 #include <setjmp.h>
 #include <signal.h>
-#ifdef I_STDARG
 #include <stdarg.h>
-#endif
+
 #ifdef I_STDDEF
 #include <stddef.h>
 #endif
+
 /* XXX This comment is just to make I_TERMIO and I_SGTTY visible to 
    metaconfig for future extension writers.  We don't use them in POSIX.
    (This is really sneaky :-)  --AD
@@ -40,7 +50,9 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <time.h>
-#include <unistd.h>    /* see hints/sunos_4_1.sh */
+#ifdef I_UNISTD
+#include <unistd.h>
+#endif
 #include <fcntl.h>
 
 #if defined(__VMS) && !defined(__POSIX_SOURCE)
@@ -51,8 +63,9 @@
 #    define pid_t int       /* old versions of DECC miss this in types.h */
 #  endif
 
-#  undef mkfifo  /* #defined in perl.h */
+#  undef mkfifo
 #  define mkfifo(a,b) (not_here("mkfifo"),-1)
+#  define mknod(a,b,c) (not_here("mknod"),-1)
 #  define tzset() not_here("tzset")
 
 #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
    }
 #  define times(t) vms_times(t)
 #else
+#if defined (WIN32)
+#  undef mkfifo
+#  define mkfifo(a,b) not_here("mkfifo")
+#  define mknod(a,b,c) not_here("mknod")
+#  define ttyname(a) (char*)not_here("ttyname")
+#  define sigset_t long
+#  define pid_t long
+#  ifdef __BORLANDC__
+#    define tzname _tzname
+#  endif
+#  ifdef _MSC_VER
+#    define mode_t short
+#  endif
+#  ifdef __MINGW32__
+#    define mode_t short
+#    ifndef tzset
+#      define tzset()          not_here("tzset")
+#    endif
+#    ifndef _POSIX_OPEN_MAX
+#      define _POSIX_OPEN_MAX  FOPEN_MAX       /* XXX bogus ? */
+#    endif
+#  endif
+#  define sigaction(a,b,c)     not_here("sigaction")
+#  define sigpending(a)                not_here("sigpending")
+#  define sigprocmask(a,b,c)   not_here("sigprocmask")
+#  define sigsuspend(a)                not_here("sigsuspend")
+#  define sigemptyset(a)       not_here("sigemptyset")
+#  define sigaddset(a,b)       not_here("sigaddset")
+#  define sigdelset(a,b)       not_here("sigdelset")
+#  define sigfillset(a)                not_here("sigfillset")
+#  define sigismember(a,b)     not_here("sigismember")
+#else
+
+#  ifndef HAS_MKFIFO
+#    ifndef mkfifo
+#      define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
+#    endif
+#  endif /* !HAS_MKFIFO */
+
 #  include <grp.h>
 #  include <sys/times.h>
 #  ifdef HAS_UNAME
 #  ifdef I_UTIME
 #    include <utime.h>
 #  endif
-#endif
+#endif /* WIN32 */
+#endif /* __VMS */
 
 typedef int SysRet;
 typedef long SysRetLong;
@@ -228,10 +281,14 @@ unsigned long strtoul _((const char *, char **, int));
 #endif
 
 #ifdef HAS_TZNAME
+#  ifndef WIN32
 extern char *tzname[];
+#  endif
 #else
+#if !defined(WIN32) || (defined(__MINGW32__) && !defined(tzname))
 char *tzname[] = { "" , "" };
 #endif
+#endif
 
 /* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
  * fields for which we don't have Configure support yet:
@@ -268,7 +325,13 @@ init_tm(ptm)               /* see mktime, strftime and asctime     */
 #endif
 
 
-#ifndef HAS_LONG_DOUBLE /* XXX What to do about long doubles? */
+#ifdef HAS_LONG_DOUBLE
+#  if LONG_DOUBLESIZE > DOUBLESIZE
+#    undef HAS_LONG_DOUBLE  /* XXX until we figure out how to use them */
+#  endif
+#endif
+
+#ifndef HAS_LONG_DOUBLE 
 #ifdef LDBL_MAX
 #undef LDBL_MAX
 #endif
@@ -2253,55 +2316,55 @@ constant(char *name, int arg)
     case '_':
        if (strnEQ(name, "_PC_", 4)) {
            if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
-#ifdef _PC_CHOWN_RESTRICTED
+#if defined(_PC_CHOWN_RESTRICTED) || HINT_SC_EXIST
                return _PC_CHOWN_RESTRICTED;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_LINK_MAX"))
-#ifdef _PC_LINK_MAX
+#if defined(_PC_LINK_MAX) || HINT_SC_EXIST
                return _PC_LINK_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_MAX_CANON"))
-#ifdef _PC_MAX_CANON
+#if defined(_PC_MAX_CANON) || HINT_SC_EXIST
                return _PC_MAX_CANON;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_MAX_INPUT"))
-#ifdef _PC_MAX_INPUT
+#if defined(_PC_MAX_INPUT) || HINT_SC_EXIST
                return _PC_MAX_INPUT;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_NAME_MAX"))
-#ifdef _PC_NAME_MAX
+#if defined(_PC_NAME_MAX) || HINT_SC_EXIST
                return _PC_NAME_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_NO_TRUNC"))
-#ifdef _PC_NO_TRUNC
+#if defined(_PC_NO_TRUNC) || HINT_SC_EXIST
                return _PC_NO_TRUNC;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_PATH_MAX"))
-#ifdef _PC_PATH_MAX
+#if defined(_PC_PATH_MAX) || HINT_SC_EXIST
                return _PC_PATH_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_PIPE_BUF"))
-#ifdef _PC_PIPE_BUF
+#if defined(_PC_PIPE_BUF) || HINT_SC_EXIST
                return _PC_PIPE_BUF;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_PC_VDISABLE"))
-#ifdef _PC_VDISABLE
+#if defined(_PC_VDISABLE) || HINT_SC_EXIST
                return _PC_VDISABLE;
 #else
                goto not_there;
@@ -2427,61 +2490,61 @@ constant(char *name, int arg)
        }
        if (strnEQ(name, "_SC_", 4)) {
            if (strEQ(name, "_SC_ARG_MAX"))
-#ifdef _SC_ARG_MAX
+#if defined(_SC_ARG_MAX) || HINT_SC_EXIST
                return _SC_ARG_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_CHILD_MAX"))
-#ifdef _SC_CHILD_MAX
+#if defined(_SC_CHILD_MAX) || HINT_SC_EXIST
                return _SC_CHILD_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_CLK_TCK"))
-#ifdef _SC_CLK_TCK
+#if defined(_SC_CLK_TCK) || HINT_SC_EXIST
                return _SC_CLK_TCK;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_JOB_CONTROL"))
-#ifdef _SC_JOB_CONTROL
+#if defined(_SC_JOB_CONTROL) || HINT_SC_EXIST
                return _SC_JOB_CONTROL;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_NGROUPS_MAX"))
-#ifdef _SC_NGROUPS_MAX
+#if defined(_SC_NGROUPS_MAX) || HINT_SC_EXIST
                return _SC_NGROUPS_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_OPEN_MAX"))
-#ifdef _SC_OPEN_MAX
+#if defined(_SC_OPEN_MAX) || HINT_SC_EXIST
                return _SC_OPEN_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_SAVED_IDS"))
-#ifdef _SC_SAVED_IDS
+#if defined(_SC_SAVED_IDS) || HINT_SC_EXIST
                return _SC_SAVED_IDS;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_STREAM_MAX"))
-#ifdef _SC_STREAM_MAX
+#if defined(_SC_STREAM_MAX) || HINT_SC_EXIST
                return _SC_STREAM_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_TZNAME_MAX"))
-#ifdef _SC_TZNAME_MAX
+#if defined(_SC_TZNAME_MAX) || HINT_SC_EXIST
                return _SC_TZNAME_MAX;
 #else
                goto not_there;
 #endif
            if (strEQ(name, "_SC_VERSION"))
-#ifdef _SC_VERSION
+#if defined(_SC_VERSION) || HINT_SC_EXIST
                return _SC_VERSION;
 #else
                goto not_there;
@@ -3096,7 +3159,9 @@ sigaction(sig, action, oldaction = 0)
        POSIX::SigAction        action
        POSIX::SigAction        oldaction
     CODE:
-
+#ifdef WIN32
+       RETVAL = not_here("sigaction");
+#else
 # This code is really grody because we're trying to make the signal
 # interface look beautiful, which is hard.
 
@@ -3175,6 +3240,7 @@ sigaction(sig, action, oldaction = 0)
                sv_setiv(*svp, oact.sa_flags);
            }
        }
+#endif
     OUTPUT:
        RETVAL
 
@@ -3417,6 +3483,17 @@ mkfifo(filename, mode)
        RETVAL
 
 SysRet
+mknod(filename, mode, device)
+       char *          filename
+       Mode_t          mode
+       Dev_t           device
+    CODE:
+       TAINT_PROPER("mknod");
+       RETVAL = mknod(filename, mode, device);
+    OUTPUT:
+       RETVAL
+
+SysRet
 tcdrain(fd)
        int             fd