[win32] fix POSIX for mingw32
[p5sagit/p5-mst-13.2.git] / ext / POSIX / POSIX.xs
index 2575ca1..97404b8 100644 (file)
@@ -1,3 +1,6 @@
+#ifdef WIN32
+#define _POSIX_
+#endif
 #include "EXTERN.h"
 #define PERLIO_NOT_STDIO 1
 #include "perl.h"
@@ -40,7 +43,9 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <time.h>
-#include <unistd.h>
+#ifdef I_UNISTD
+#include <unistd.h>    /* see hints/sunos_4_1.sh */
+#endif
 #include <fcntl.h>
 
 #if defined(__VMS) && !defined(__POSIX_SOURCE)
 #  define mkfifo(a,b) (not_here("mkfifo"),-1)
 #  define tzset() not_here("tzset")
 
-#  if __VMS_VER < 70000000
-     /* The default VMS emulation of Unix signals isn't very POSIXish */
-     typedef int sigset_t;
-#    define sigpending(a) (not_here("sigpending"),0)
-
-     /* sigset_t is atomic under VMS, so these routines are easy */
-     int sigemptyset(sigset_t *set) {
-       if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
-       *set = 0; return 0;
-     }
-     int sigfillset(sigset_t *set) {
-       int i;
-       if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
-       for (i = 0; i < NSIG; i++) *set |= (1 << i);
-       return 0;
-     }
-     int sigaddset(sigset_t *set, int sig) {
-       if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
-       if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
-       *set |= (1 << (sig - 1));
-       return 0;
-     }
-     int sigdelset(sigset_t *set, int sig) {
-       if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
-       if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
-       *set &= ~(1 << (sig - 1));
-       return 0;
-     }
-     int sigismember(sigset_t *set, int sig) {
-       if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
-       if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
-       *set & (1 << (sig - 1));
-     }
-     /* The tools for sigprocmask() are there, just not the routine itself */
-#    ifndef SIG_UNBLOCK
-#      define SIG_UNBLOCK 1
-#    endif
-#    ifndef SIG_BLOCK
-#      define SIG_BLOCK 2
-#    endif
-#    ifndef SIG_SETMASK
-#      define SIG_SETMASK 3
-#    endif
-     int sigprocmask(int how, sigset_t *set, sigset_t *oset) {
-       if (!set || !oset) {
-         set_errno(EFAULT); set_vaxc_errno(SS$_ACCVIO);
-         return -1;
-       }
-       switch (how) {
-         case SIG_SETMASK:
-           *oset = sigsetmask(*set);
-           break;
-         case SIG_BLOCK:
-           *oset = sigblock(*set);
-           break;
-         case SIG_UNBLOCK:
-           *oset = sigblock(0);
-           sigsetmask(*oset & ~*set);
-           break;
-         default:
-           set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG);
-           return -1;
-       }
-       return 0;
-     }
-#    define sigaction sigvec
-#    define sa_flags sv_onstack
-#    define sa_handler sv_handler
-#    define sa_mask sv_mask
-#    define sigsuspend(set) sigpause(*set)
-#  else
-#    define HAS_TZNAME  /* shows up in VMS 7.0 */
-#  endif /* __VMS_VER < 70000000 */
+#if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
+#    define HAS_TZNAME  /* shows up in VMS 7.0 or Dec C 5.6 */
+#    include <utsname.h>
+#  endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
 
    /* The POSIX notion of ttyname() is better served by getname() under VMS */
    static char ttnambuf[64];
    }
 #  define times(t) vms_times(t)
 #else
+#if defined (WIN32)
+#  undef mkfifo  /* #defined in perl.h */
+#  define mkfifo(a,b) not_here("mkfifo")
+#  define ttyname(a) 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
+#    define tzset()            not_here("tzset")
+#  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
 #  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;
@@ -297,7 +260,9 @@ unsigned long strtoul _((const char *, char **, int));
 #endif
 
 #ifdef HAS_TZNAME
+#  ifndef WIN32
 extern char *tzname[];
+#  endif
 #else
 char *tzname[] = { "" , "" };
 #endif
@@ -316,6 +281,12 @@ char *tzname[] = { "" , "" };
  * support is added and NETaa14816 is considered in full.
  * It does not address tzname aspects of NETaa14816.
  */
+#ifdef HAS_GNULIBC
+# ifndef STRUCT_TM_HASZONE
+#    define STRUCT_TM_HAS_ZONE
+# endif
+#endif
+
 #ifdef STRUCT_TM_HASZONE
 static void
 init_tm(ptm)           /* see mktime, strftime and asctime     */
@@ -331,7 +302,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
@@ -344,17 +321,19 @@ init_tm(ptm)              /* see mktime, strftime and asctime     */
 #endif
 
 static int
-not_here(s)
-char *s;
+not_here(char *s)
 {
     croak("POSIX::%s not implemented on this architecture", s);
     return -1;
 }
 
-static double
-constant(name, arg)
-char *name;
-int arg;
+static
+#ifdef HAS_LONG_DOUBLE
+long double
+#else
+double
+#endif
+constant(char *name, int arg)
 {
     errno = 0;
     switch (*name) {
@@ -1731,13 +1710,13 @@ int arg;
                    goto not_there;
 #endif
 #ifdef SIG_DFL
-               if (strEQ(name, "SIG_DFL")) return (int)SIG_DFL;
+               if (strEQ(name, "SIG_DFL")) return (IV)SIG_DFL;
 #endif
 #ifdef SIG_ERR
-               if (strEQ(name, "SIG_ERR")) return (int)SIG_ERR;
+               if (strEQ(name, "SIG_ERR")) return (IV)SIG_ERR;
 #endif
 #ifdef SIG_IGN
-               if (strEQ(name, "SIG_IGN")) return (int)SIG_IGN;
+               if (strEQ(name, "SIG_IGN")) return (IV)SIG_IGN;
 #endif
                if (strEQ(name, "SIG_SETMASK"))
 #ifdef SIG_SETMASK
@@ -2314,55 +2293,55 @@ 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;
@@ -2488,61 +2467,61 @@ 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;
@@ -2615,6 +2594,7 @@ new(packname = "POSIX::Termios", ...)
            RETVAL = (struct termios*)safemalloc(sizeof(struct termios));
 #else
            not_here("termios");
+        RETVAL = 0;
 #endif
        }
     OUTPUT:
@@ -2664,7 +2644,8 @@ getiflag(termios_ref)
 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
        RETVAL = termios_ref->c_iflag;
 #else
-           not_here("getiflag");
+     not_here("getiflag");
+     RETVAL = 0;
 #endif
     OUTPUT:
        RETVAL
@@ -2676,7 +2657,8 @@ getoflag(termios_ref)
 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
        RETVAL = termios_ref->c_oflag;
 #else
-           not_here("getoflag");
+     not_here("getoflag");
+     RETVAL = 0;
 #endif
     OUTPUT:
        RETVAL
@@ -2688,7 +2670,8 @@ getcflag(termios_ref)
 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
        RETVAL = termios_ref->c_cflag;
 #else
-           not_here("getcflag");
+     not_here("getcflag");
+     RETVAL = 0;
 #endif
     OUTPUT:
        RETVAL
@@ -2700,7 +2683,8 @@ getlflag(termios_ref)
 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
        RETVAL = termios_ref->c_lflag;
 #else
-           not_here("getlflag");
+     not_here("getlflag");
+     RETVAL = 0;
 #endif
     OUTPUT:
        RETVAL
@@ -2715,7 +2699,8 @@ getcc(termios_ref, ccix)
            croak("Bad getcc subscript");
        RETVAL = termios_ref->c_cc[ccix];
 #else
-           not_here("getcc");
+     not_here("getcc");
+     RETVAL = 0;
 #endif
     OUTPUT:
        RETVAL
@@ -2968,9 +2953,11 @@ localeconv()
            if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
                hv_store(RETVAL, "mon_decimal_point", 17,
                    newSVpv(lcbuf->mon_decimal_point, 0), 0);
+#ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
            if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
                hv_store(RETVAL, "mon_thousands_sep", 17,
                    newSVpv(lcbuf->mon_thousands_sep, 0), 0);
+#endif                    
            if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
                hv_store(RETVAL, "mon_grouping", 12,
                    newSVpv(lcbuf->mon_grouping, 0), 0);
@@ -3149,7 +3136,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.
 
@@ -3228,6 +3217,7 @@ sigaction(sig, action, oldaction = 0)
                sv_setiv(*svp, oact.sa_flags);
            }
        }
+#endif
     OUTPUT:
        RETVAL
 
@@ -3277,7 +3267,7 @@ pipe()
     PPCODE:
        int fds[2];
        if (pipe(fds) != -1) {
-           EXTEND(sp,2);
+           EXTEND(SP,2);
            PUSHs(sv_2mortal(newSViv(fds[0])));
            PUSHs(sv_2mortal(newSViv(fds[1])));
        }
@@ -3321,7 +3311,7 @@ uname()
 #ifdef HAS_UNAME
        struct utsname buf;
        if (uname(&buf) >= 0) {
-           EXTEND(sp, 5);
+           EXTEND(SP, 5);
            PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
            PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
            PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
@@ -3389,7 +3379,7 @@ strtod(str)
        num = strtod(str, &unparsed);
        PUSHs(sv_2mortal(newSVnv(num)));
        if (GIMME == G_ARRAY) {
-           EXTEND(sp, 1);
+           EXTEND(SP, 1);
            if (unparsed)
                PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
            else
@@ -3410,7 +3400,7 @@ strtol(str, base = 0)
        else
            PUSHs(sv_2mortal(newSVnv((double)num)));
        if (GIMME == G_ARRAY) {
-           EXTEND(sp, 1);
+           EXTEND(SP, 1);
            if (unparsed)
                PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
            else
@@ -3431,7 +3421,7 @@ strtoul(str, base = 0)
        else
            PUSHs(sv_2mortal(newSVnv((double)num)));
        if (GIMME == G_ARRAY) {
-           EXTEND(sp, 1);
+           EXTEND(SP, 1);
            if (unparsed)
                PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
            else
@@ -3532,7 +3522,7 @@ times()
        struct tms tms;
        clock_t realtime;
        realtime = times( &tms );
-       EXTEND(sp,5);
+       EXTEND(SP,5);
        PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
        PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
        PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
@@ -3610,7 +3600,7 @@ tzset()
 void
 tzname()
     PPCODE:
-       EXTEND(sp,2);
+       EXTEND(SP,2);
        PUSHs(sv_2mortal(newSVpv(tzname[0],strlen(tzname[0]))));
        PUSHs(sv_2mortal(newSVpv(tzname[1],strlen(tzname[1]))));