This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[inseparable changes from patch from perl5.003_10 to perl5.003_11]
[perl5.git] / ext / POSIX / POSIX.xs
1 #include "EXTERN.h"
2 #define PERLIO_NOT_STDIO 1
3 #include "perl.h"
4 #include "XSUB.h"
5 #include <ctype.h>
6 #ifdef I_DIRENT    /* XXX maybe better to just rely on perl.h? */
7 #include <dirent.h>
8 #endif
9 #include <errno.h>
10 #ifdef I_FLOAT
11 #include <float.h>
12 #endif
13 #ifdef I_LIMITS
14 #include <limits.h>
15 #endif
16 #include <locale.h>
17 #include <math.h>
18 #ifdef I_PWD
19 #include <pwd.h>
20 #endif
21 #include <setjmp.h>
22 #include <signal.h>
23 #ifdef I_STDARG
24 #include <stdarg.h>
25 #endif
26 #ifdef I_STDDEF
27 #include <stddef.h>
28 #endif
29 /* XXX This comment is just to make I_TERMIO and I_SGTTY visible to 
30    metaconfig for future extension writers.  We don't use them in POSIX.
31    (This is really sneaky :-)  --AD
32 */
33 #if defined(I_TERMIOS)
34 #include <termios.h>
35 #endif
36 #ifdef I_STDLIB
37 #include <stdlib.h>
38 #endif
39 #include <string.h>
40 #include <sys/stat.h>
41 #include <sys/types.h>
42 #include <time.h>
43 #include <unistd.h>
44 #if defined(__VMS) && !defined(__POSIX_SOURCE)
45 #  include <file.h>         /* == fcntl.h for DECC; no fcntl.h for VAXC */
46 #  include <libdef.h>       /* LIB$_INVARG constant */
47 #  include <lib$routines.h> /* prototype for lib$ediv() */
48 #  include <starlet.h>      /* prototype for sys$gettim() */
49
50 #  undef mkfifo  /* #defined in perl.h */
51 #  define mkfifo(a,b) (not_here("mkfifo"),-1)
52 #  define tzset() not_here("tzset")
53
54    /* The default VMS emulation of Unix signals isn't very POSIXish */
55    typedef int sigset_t;
56 #  define sigpending(a) (not_here("sigpending"),0)
57
58    /* sigset_t is atomic under VMS, so these routines are easy */
59    int sigemptyset(sigset_t *set) {
60         if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
61         *set = 0; return 0;
62    }
63    int sigfillset(sigset_t *set) {
64         int i;
65         if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
66         for (i = 0; i < NSIG; i++) *set |= (1 << i);
67         return 0;
68    }
69    int sigaddset(sigset_t *set, int sig) {
70         if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
71         if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
72         *set |= (1 << (sig - 1));
73         return 0;
74    }
75    int sigdelset(sigset_t *set, int sig) {
76         if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
77         if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
78         *set &= ~(1 << (sig - 1));
79         return 0;
80    }
81    int sigismember(sigset_t *set, int sig) {
82         if (!set) { SETERRNO(EFAULT,SS$_ACCVIO); return -1; }
83         if (sig > NSIG) { SETERRNO(EINVAL,LIB$_INVARG); return -1; }
84         *set & (1 << (sig - 1));
85    }
86    /* The tools for sigprocmask() are there, just not the routine itself */
87 #  ifndef SIG_UNBLOCK
88 #    define SIG_UNBLOCK 1
89 #  endif
90 #  ifndef SIG_BLOCK
91 #    define SIG_BLOCK 2
92 #  endif
93 #  ifndef SIG_SETMASK
94 #    define SIG_SETMASK 3
95 #  endif
96    int sigprocmask(int how, sigset_t *set, sigset_t *oset) {
97         if (!set || !oset) {
98           set_errno(EFAULT); set_vaxc_errno(SS$_ACCVIO);
99           return -1;
100         }
101         switch (how) {
102           case SIG_SETMASK:
103             *oset = sigsetmask(*set);
104             break;
105           case SIG_BLOCK:
106             *oset = sigblock(*set);
107             break;
108           case SIG_UNBLOCK:
109             *oset = sigblock(0);
110             sigsetmask(*oset & ~*set);
111             break;
112           default:
113             set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG);
114             return -1;
115         }
116         return 0;
117     }
118 #  define sigaction sigvec
119 #  define sa_flags sv_onstack
120 #  define sa_handler sv_handler
121 #  define sa_mask sv_mask
122 #  define sigsuspend(set) sigpause(*set)
123
124    /* The POSIX notion of ttyname() is better served by getname() under VMS */
125    static char ttnambuf[64];
126 #  define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
127
128    /* The non-POSIX CRTL times() has void return type, so we just get the
129       current time directly */
130    clock_t vms_times(struct tms *bufptr) {
131         clock_t retval;
132         /* Get wall time and convert to 10 ms intervals to
133          * produce the return value that the POSIX standard expects */
134 #  if defined(__DECC) && defined (__ALPHA)
135 #    include <ints.h>
136         uint64 vmstime;
137         _ckvmssts(sys$gettim(&vmstime));
138         vmstime /= 100000;
139         retval = vmstime & 0x7fffffff;
140 #  else
141         /* (Older hw or ccs don't have an atomic 64-bit type, so we
142          * juggle 32-bit ints (and a float) to produce a time_t result
143          * with minimal loss of information.) */
144         long int vmstime[2],remainder,divisor = 100000;
145         _ckvmssts(sys$gettim((unsigned long int *)vmstime));
146         vmstime[1] &= 0x7fff;  /* prevent overflow in EDIV */
147         _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
148 #  endif
149         /* Fill in the struct tms using the CRTL routine . . .*/
150         times((tbuffer_t *)bufptr);
151         return (clock_t) retval;
152    }
153 #  define times(t) vms_times(t)
154 #else
155 #  include <fcntl.h>
156 #  include <grp.h>
157 #  include <sys/times.h>
158 #  ifdef HAS_UNAME
159 #    include <sys/utsname.h>
160 #  endif
161 #  include <sys/wait.h>
162 #  ifdef I_UTIME
163 #    include <utime.h>
164 #  endif
165 #endif
166
167 typedef int SysRet;
168 typedef long SysRetLong;
169 typedef sigset_t* POSIX__SigSet;
170 typedef HV* POSIX__SigAction;
171 #ifdef I_TERMIOS
172 typedef struct termios* POSIX__Termios;
173 #else /* Define termios types to int, and call not_here for the functions.*/
174 #define POSIX__Termios int
175 #define speed_t int
176 #define tcflag_t int
177 #define cc_t int
178 #define cfgetispeed(x) not_here("cfgetispeed")
179 #define cfgetospeed(x) not_here("cfgetospeed")
180 #define tcdrain(x) not_here("tcdrain")
181 #define tcflush(x,y) not_here("tcflush")
182 #define tcsendbreak(x,y) not_here("tcsendbreak")
183 #define cfsetispeed(x,y) not_here("cfsetispeed")
184 #define cfsetospeed(x,y) not_here("cfsetospeed")
185 #define ctermid(x) (char *) not_here("ctermid")
186 #define tcflow(x,y) not_here("tcflow")
187 #define tcgetattr(x,y) not_here("tcgetattr")
188 #define tcsetattr(x,y,z) not_here("tcsetattr")
189 #endif
190
191 /* Possibly needed prototypes */
192 char *cuserid _((char *));
193 double strtod _((const char *, char **));
194 long strtol _((const char *, char **, int));
195 unsigned long strtoul _((const char *, char **, int));
196
197 #ifndef HAS_CUSERID
198 #define cuserid(a) (char *) not_here("cuserid")
199 #endif
200 #ifndef HAS_DIFFTIME
201 #ifndef difftime
202 #define difftime(a,b) not_here("difftime")
203 #endif
204 #endif
205 #ifndef HAS_FPATHCONF
206 #define fpathconf(f,n)  (SysRetLong) not_here("fpathconf")
207 #endif
208 #ifndef HAS_MKTIME
209 #define mktime(a) not_here("mktime")
210 #endif
211 #ifndef HAS_NICE
212 #define nice(a) not_here("nice")
213 #endif
214 #ifndef HAS_PATHCONF
215 #define pathconf(f,n)   (SysRetLong) not_here("pathconf")
216 #endif
217 #ifndef HAS_SYSCONF
218 #define sysconf(n)      (SysRetLong) not_here("sysconf")
219 #endif
220 #ifndef HAS_READLINK
221 #define readlink(a,b,c) not_here("readlink")
222 #endif
223 #ifndef HAS_SETPGID
224 #define setpgid(a,b) not_here("setpgid")
225 #endif
226 #ifndef HAS_SETSID
227 #define setsid() not_here("setsid")
228 #endif
229 #ifndef HAS_STRCOLL
230 #define strcoll(s1,s2) not_here("strcoll")
231 #endif
232 #ifndef HAS_STRTOD
233 #define strtod(s1,s2) not_here("strtod")
234 #endif
235 #ifndef HAS_STRTOL
236 #define strtol(s1,s2,b) not_here("strtol")
237 #endif
238 #ifndef HAS_STRTOUL
239 #define strtoul(s1,s2,b) not_here("strtoul")
240 #endif
241 #ifndef HAS_STRXFRM
242 #define strxfrm(s1,s2,n) not_here("strxfrm")
243 #endif
244 #ifndef HAS_TCGETPGRP
245 #define tcgetpgrp(a) not_here("tcgetpgrp")
246 #endif
247 #ifndef HAS_TCSETPGRP
248 #define tcsetpgrp(a,b) not_here("tcsetpgrp")
249 #endif
250 #ifndef HAS_TIMES
251 #define times(a) not_here("times")
252 #endif
253 #ifndef HAS_UNAME
254 #define uname(a) not_here("uname")
255 #endif
256 #ifndef HAS_WAITPID
257 #define waitpid(a,b,c) not_here("waitpid")
258 #endif
259
260 #ifndef HAS_MBLEN
261 #ifndef mblen
262 #define mblen(a,b) not_here("mblen")
263 #endif
264 #endif
265 #ifndef HAS_MBSTOWCS
266 #define mbstowcs(s, pwcs, n) not_here("mbstowcs")
267 #endif
268 #ifndef HAS_MBTOWC
269 #define mbtowc(pwc, s, n) not_here("mbtowc")
270 #endif
271 #ifndef HAS_WCSTOMBS
272 #define wcstombs(s, pwcs, n) not_here("wcstombs")
273 #endif
274 #ifndef HAS_WCTOMB
275 #define wctomb(s, wchar) not_here("wcstombs")
276 #endif
277 #if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
278 /* If we don't have these functions, then we wouldn't have gotten a typedef
279    for wchar_t, the wide character type.  Defining wchar_t allows the
280    functions referencing it to compile.  Its actual type is then meaningless,
281    since without the above functions, all sections using it end up calling
282    not_here() and croak.  --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
283 #ifndef wchar_t
284 #define wchar_t char
285 #endif
286 #endif
287
288 #ifndef HAS_LOCALECONV
289 #define localeconv() not_here("localeconv")
290 #endif
291
292 #ifdef HAS_TZNAME
293 extern char *tzname[];
294 #else
295 char *tzname[] = { "" , "" };
296 #endif
297
298 /* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
299  * fields for which we don't have Configure support yet:
300  *   char *tm_zone;   -- abbreviation of timezone name
301  *   long tm_gmtoff;  -- offset from GMT in seconds
302  * To workaround core dumps from the uninitialised tm_zone we get the
303  * system to give us a reasonable struct to copy.  This fix means that
304  * strftime uses the tm_zone and tm_gmtoff values returned by
305  * localtime(time()). That should give the desired result most of the
306  * time. But probably not always!
307  *
308  * This is a temporary workaround to be removed once Configure
309  * support is added and NETaa14816 is considered in full.
310  * It does not address tzname aspects of NETaa14816.
311  */
312 #ifdef STRUCT_TM_HASZONE
313 static void
314 init_tm(ptm)            /* see mktime, strftime and asctime     */
315     struct tm *ptm;
316 {
317     Time_t now;
318     (void)time(&now);
319     Copy(localtime(&now), ptm, 1, struct tm);
320 }
321
322 #else
323 # define init_tm(ptm)
324 #endif
325
326
327 #ifndef HAS_LONG_DOUBLE /* XXX What to do about long doubles? */
328 #ifdef LDBL_MAX
329 #undef LDBL_MAX
330 #endif
331 #ifdef LDBL_MIN
332 #undef LDBL_MIN
333 #endif
334 #ifdef LDBL_EPSILON
335 #undef LDBL_EPSILON
336 #endif
337 #endif
338
339 static int
340 not_here(s)
341 char *s;
342 {
343     croak("POSIX::%s not implemented on this architecture", s);
344     return -1;
345 }
346
347 static double
348 constant(name, arg)
349 char *name;
350 int arg;
351 {
352     errno = 0;
353     switch (*name) {
354     case 'A':
355         if (strEQ(name, "ARG_MAX"))
356 #ifdef ARG_MAX
357             return ARG_MAX;
358 #else
359             goto not_there;
360 #endif
361         break;
362     case 'B':
363         if (strEQ(name, "BUFSIZ"))
364 #ifdef BUFSIZ
365             return BUFSIZ;
366 #else
367             goto not_there;
368 #endif
369         if (strEQ(name, "BRKINT"))
370 #ifdef BRKINT
371             return BRKINT;
372 #else
373             goto not_there;
374 #endif
375         if (strEQ(name, "B9600"))
376 #ifdef B9600
377             return B9600;
378 #else
379             goto not_there;
380 #endif
381         if (strEQ(name, "B19200"))
382 #ifdef B19200
383             return B19200;
384 #else
385             goto not_there;
386 #endif
387         if (strEQ(name, "B38400"))
388 #ifdef B38400
389             return B38400;
390 #else
391             goto not_there;
392 #endif
393         if (strEQ(name, "B0"))
394 #ifdef B0
395             return B0;
396 #else
397             goto not_there;
398 #endif
399         if (strEQ(name, "B110"))
400 #ifdef B110
401             return B110;
402 #else
403             goto not_there;
404 #endif
405         if (strEQ(name, "B1200"))
406 #ifdef B1200
407             return B1200;
408 #else
409             goto not_there;
410 #endif
411         if (strEQ(name, "B134"))
412 #ifdef B134
413             return B134;
414 #else
415             goto not_there;
416 #endif
417         if (strEQ(name, "B150"))
418 #ifdef B150
419             return B150;
420 #else
421             goto not_there;
422 #endif
423         if (strEQ(name, "B1800"))
424 #ifdef B1800
425             return B1800;
426 #else
427             goto not_there;
428 #endif
429         if (strEQ(name, "B200"))
430 #ifdef B200
431             return B200;
432 #else
433             goto not_there;
434 #endif
435         if (strEQ(name, "B2400"))
436 #ifdef B2400
437             return B2400;
438 #else
439             goto not_there;
440 #endif
441         if (strEQ(name, "B300"))
442 #ifdef B300
443             return B300;
444 #else
445             goto not_there;
446 #endif
447         if (strEQ(name, "B4800"))
448 #ifdef B4800
449             return B4800;
450 #else
451             goto not_there;
452 #endif
453         if (strEQ(name, "B50"))
454 #ifdef B50
455             return B50;
456 #else
457             goto not_there;
458 #endif
459         if (strEQ(name, "B600"))
460 #ifdef B600
461             return B600;
462 #else
463             goto not_there;
464 #endif
465         if (strEQ(name, "B75"))
466 #ifdef B75
467             return B75;
468 #else
469             goto not_there;
470 #endif
471         break;
472     case 'C':
473         if (strEQ(name, "CHAR_BIT"))
474 #ifdef CHAR_BIT
475             return CHAR_BIT;
476 #else
477             goto not_there;
478 #endif
479         if (strEQ(name, "CHAR_MAX"))
480 #ifdef CHAR_MAX
481             return CHAR_MAX;
482 #else
483             goto not_there;
484 #endif
485         if (strEQ(name, "CHAR_MIN"))
486 #ifdef CHAR_MIN
487             return CHAR_MIN;
488 #else
489             goto not_there;
490 #endif
491         if (strEQ(name, "CHILD_MAX"))
492 #ifdef CHILD_MAX
493             return CHILD_MAX;
494 #else
495             goto not_there;
496 #endif
497         if (strEQ(name, "CLK_TCK"))
498 #ifdef CLK_TCK
499             return CLK_TCK;
500 #else
501             goto not_there;
502 #endif
503         if (strEQ(name, "CLOCAL"))
504 #ifdef CLOCAL
505             return CLOCAL;
506 #else
507             goto not_there;
508 #endif
509         if (strEQ(name, "CLOCKS_PER_SEC"))
510 #ifdef CLOCKS_PER_SEC
511             return CLOCKS_PER_SEC;
512 #else
513             goto not_there;
514 #endif
515         if (strEQ(name, "CREAD"))
516 #ifdef CREAD
517             return CREAD;
518 #else
519             goto not_there;
520 #endif
521         if (strEQ(name, "CS5"))
522 #ifdef CS5
523             return CS5;
524 #else
525             goto not_there;
526 #endif
527         if (strEQ(name, "CS6"))
528 #ifdef CS6
529             return CS6;
530 #else
531             goto not_there;
532 #endif
533         if (strEQ(name, "CS7"))
534 #ifdef CS7
535             return CS7;
536 #else
537             goto not_there;
538 #endif
539         if (strEQ(name, "CS8"))
540 #ifdef CS8
541             return CS8;
542 #else
543             goto not_there;
544 #endif
545         if (strEQ(name, "CSIZE"))
546 #ifdef CSIZE
547             return CSIZE;
548 #else
549             goto not_there;
550 #endif
551         if (strEQ(name, "CSTOPB"))
552 #ifdef CSTOPB
553             return CSTOPB;
554 #else
555             goto not_there;
556 #endif
557         break;
558     case 'D':
559         if (strEQ(name, "DBL_MAX"))
560 #ifdef DBL_MAX
561             return DBL_MAX;
562 #else
563             goto not_there;
564 #endif
565         if (strEQ(name, "DBL_MIN"))
566 #ifdef DBL_MIN
567             return DBL_MIN;
568 #else
569             goto not_there;
570 #endif
571         if (strEQ(name, "DBL_DIG"))
572 #ifdef DBL_DIG
573             return DBL_DIG;
574 #else
575             goto not_there;
576 #endif
577         if (strEQ(name, "DBL_EPSILON"))
578 #ifdef DBL_EPSILON
579             return DBL_EPSILON;
580 #else
581             goto not_there;
582 #endif
583         if (strEQ(name, "DBL_MANT_DIG"))
584 #ifdef DBL_MANT_DIG
585             return DBL_MANT_DIG;
586 #else
587             goto not_there;
588 #endif
589         if (strEQ(name, "DBL_MAX_10_EXP"))
590 #ifdef DBL_MAX_10_EXP
591             return DBL_MAX_10_EXP;
592 #else
593             goto not_there;
594 #endif
595         if (strEQ(name, "DBL_MAX_EXP"))
596 #ifdef DBL_MAX_EXP
597             return DBL_MAX_EXP;
598 #else
599             goto not_there;
600 #endif
601         if (strEQ(name, "DBL_MIN_10_EXP"))
602 #ifdef DBL_MIN_10_EXP
603             return DBL_MIN_10_EXP;
604 #else
605             goto not_there;
606 #endif
607         if (strEQ(name, "DBL_MIN_EXP"))
608 #ifdef DBL_MIN_EXP
609             return DBL_MIN_EXP;
610 #else
611             goto not_there;
612 #endif
613         break;
614     case 'E':
615         switch (name[1]) {
616         case 'A':
617             if (strEQ(name, "EACCES"))
618 #ifdef EACCES
619                 return EACCES;
620 #else
621                 goto not_there;
622 #endif
623             if (strEQ(name, "EAGAIN"))
624 #ifdef EAGAIN
625                 return EAGAIN;
626 #else
627                 goto not_there;
628 #endif
629             break;
630         case 'B':
631             if (strEQ(name, "EBADF"))
632 #ifdef EBADF
633                 return EBADF;
634 #else
635                 goto not_there;
636 #endif
637             if (strEQ(name, "EBUSY"))
638 #ifdef EBUSY
639                 return EBUSY;
640 #else
641                 goto not_there;
642 #endif
643             break;
644         case 'C':
645             if (strEQ(name, "ECHILD"))
646 #ifdef ECHILD
647                 return ECHILD;
648 #else
649                 goto not_there;
650 #endif
651             if (strEQ(name, "ECHO"))
652 #ifdef ECHO
653                 return ECHO;
654 #else
655                 goto not_there;
656 #endif
657             if (strEQ(name, "ECHOE"))
658 #ifdef ECHOE
659                 return ECHOE;
660 #else
661                 goto not_there;
662 #endif
663             if (strEQ(name, "ECHOK"))
664 #ifdef ECHOK
665                 return ECHOK;
666 #else
667                 goto not_there;
668 #endif
669             if (strEQ(name, "ECHONL"))
670 #ifdef ECHONL
671                 return ECHONL;
672 #else
673                 goto not_there;
674 #endif
675             break;
676         case 'D':
677             if (strEQ(name, "EDEADLK"))
678 #ifdef EDEADLK
679                 return EDEADLK;
680 #else
681                 goto not_there;
682 #endif
683             if (strEQ(name, "EDOM"))
684 #ifdef EDOM
685                 return EDOM;
686 #else
687                 goto not_there;
688 #endif
689             break;
690         case 'E':
691             if (strEQ(name, "EEXIST"))
692 #ifdef EEXIST
693                 return EEXIST;
694 #else
695                 goto not_there;
696 #endif
697             break;
698         case 'F':
699             if (strEQ(name, "EFAULT"))
700 #ifdef EFAULT
701                 return EFAULT;
702 #else
703                 goto not_there;
704 #endif
705             if (strEQ(name, "EFBIG"))
706 #ifdef EFBIG
707                 return EFBIG;
708 #else
709                 goto not_there;
710 #endif
711             break;
712         case 'I':
713             if (strEQ(name, "EINTR"))
714 #ifdef EINTR
715                 return EINTR;
716 #else
717                 goto not_there;
718 #endif
719             if (strEQ(name, "EINVAL"))
720 #ifdef EINVAL
721                 return EINVAL;
722 #else
723                 goto not_there;
724 #endif
725             if (strEQ(name, "EIO"))
726 #ifdef EIO
727                 return EIO;
728 #else
729                 goto not_there;
730 #endif
731             if (strEQ(name, "EISDIR"))
732 #ifdef EISDIR
733                 return EISDIR;
734 #else
735                 goto not_there;
736 #endif
737             break;
738         case 'M':
739             if (strEQ(name, "EMFILE"))
740 #ifdef EMFILE
741                 return EMFILE;
742 #else
743                 goto not_there;
744 #endif
745             if (strEQ(name, "EMLINK"))
746 #ifdef EMLINK
747                 return EMLINK;
748 #else
749                 goto not_there;
750 #endif
751             break;
752         case 'N':
753             if (strEQ(name, "ENOMEM"))
754 #ifdef ENOMEM
755                 return ENOMEM;
756 #else
757                 goto not_there;
758 #endif
759             if (strEQ(name, "ENOSPC"))
760 #ifdef ENOSPC
761                 return ENOSPC;
762 #else
763                 goto not_there;
764 #endif
765             if (strEQ(name, "ENOEXEC"))
766 #ifdef ENOEXEC
767                 return ENOEXEC;
768 #else
769                 goto not_there;
770 #endif
771             if (strEQ(name, "ENOTTY"))
772 #ifdef ENOTTY
773                 return ENOTTY;
774 #else
775                 goto not_there;
776 #endif
777             if (strEQ(name, "ENOTDIR"))
778 #ifdef ENOTDIR
779                 return ENOTDIR;
780 #else
781                 goto not_there;
782 #endif
783             if (strEQ(name, "ENOTEMPTY"))
784 #ifdef ENOTEMPTY
785                 return ENOTEMPTY;
786 #else
787                 goto not_there;
788 #endif
789             if (strEQ(name, "ENFILE"))
790 #ifdef ENFILE
791                 return ENFILE;
792 #else
793                 goto not_there;
794 #endif
795             if (strEQ(name, "ENODEV"))
796 #ifdef ENODEV
797                 return ENODEV;
798 #else
799                 goto not_there;
800 #endif
801             if (strEQ(name, "ENOENT"))
802 #ifdef ENOENT
803                 return ENOENT;
804 #else
805                 goto not_there;
806 #endif
807             if (strEQ(name, "ENOLCK"))
808 #ifdef ENOLCK
809                 return ENOLCK;
810 #else
811                 goto not_there;
812 #endif
813             if (strEQ(name, "ENOSYS"))
814 #ifdef ENOSYS
815                 return ENOSYS;
816 #else
817                 goto not_there;
818 #endif
819             if (strEQ(name, "ENXIO"))
820 #ifdef ENXIO
821                 return ENXIO;
822 #else
823                 goto not_there;
824 #endif
825             if (strEQ(name, "ENAMETOOLONG"))
826 #ifdef ENAMETOOLONG
827                 return ENAMETOOLONG;
828 #else
829                 goto not_there;
830 #endif
831             break;
832         case 'O':
833             if (strEQ(name, "EOF"))
834 #ifdef EOF
835                 return EOF;
836 #else
837                 goto not_there;
838 #endif
839             break;
840         case 'P':
841             if (strEQ(name, "EPERM"))
842 #ifdef EPERM
843                 return EPERM;
844 #else
845                 goto not_there;
846 #endif
847             if (strEQ(name, "EPIPE"))
848 #ifdef EPIPE
849                 return EPIPE;
850 #else
851                 goto not_there;
852 #endif
853             break;
854         case 'R':
855             if (strEQ(name, "ERANGE"))
856 #ifdef ERANGE
857                 return ERANGE;
858 #else
859                 goto not_there;
860 #endif
861             if (strEQ(name, "EROFS"))
862 #ifdef EROFS
863                 return EROFS;
864 #else
865                 goto not_there;
866 #endif
867             break;
868         case 'S':
869             if (strEQ(name, "ESPIPE"))
870 #ifdef ESPIPE
871                 return ESPIPE;
872 #else
873                 goto not_there;
874 #endif
875             if (strEQ(name, "ESRCH"))
876 #ifdef ESRCH
877                 return ESRCH;
878 #else
879                 goto not_there;
880 #endif
881             break;
882         case 'X':
883             if (strEQ(name, "EXIT_FAILURE"))
884 #ifdef EXIT_FAILURE
885                 return EXIT_FAILURE;
886 #else
887                 return 1;
888 #endif
889             if (strEQ(name, "EXIT_SUCCESS"))
890 #ifdef EXIT_SUCCESS
891                 return EXIT_SUCCESS;
892 #else
893                 return 0;
894 #endif
895             if (strEQ(name, "EXDEV"))
896 #ifdef EXDEV
897                 return EXDEV;
898 #else
899                 goto not_there;
900 #endif
901             break;
902         }
903         if (strEQ(name, "E2BIG"))
904 #ifdef E2BIG
905             return E2BIG;
906 #else
907             goto not_there;
908 #endif
909         break;
910     case 'F':
911         if (strnEQ(name, "FLT_", 4)) {
912             if (strEQ(name, "FLT_MAX"))
913 #ifdef FLT_MAX
914                 return FLT_MAX;
915 #else
916                 goto not_there;
917 #endif
918             if (strEQ(name, "FLT_MIN"))
919 #ifdef FLT_MIN
920                 return FLT_MIN;
921 #else
922                 goto not_there;
923 #endif
924             if (strEQ(name, "FLT_ROUNDS"))
925 #ifdef FLT_ROUNDS
926                 return FLT_ROUNDS;
927 #else
928                 goto not_there;
929 #endif
930             if (strEQ(name, "FLT_DIG"))
931 #ifdef FLT_DIG
932                 return FLT_DIG;
933 #else
934                 goto not_there;
935 #endif
936             if (strEQ(name, "FLT_EPSILON"))
937 #ifdef FLT_EPSILON
938                 return FLT_EPSILON;
939 #else
940                 goto not_there;
941 #endif
942             if (strEQ(name, "FLT_MANT_DIG"))
943 #ifdef FLT_MANT_DIG
944                 return FLT_MANT_DIG;
945 #else
946                 goto not_there;
947 #endif
948             if (strEQ(name, "FLT_MAX_10_EXP"))
949 #ifdef FLT_MAX_10_EXP
950                 return FLT_MAX_10_EXP;
951 #else
952                 goto not_there;
953 #endif
954             if (strEQ(name, "FLT_MAX_EXP"))
955 #ifdef FLT_MAX_EXP
956                 return FLT_MAX_EXP;
957 #else
958                 goto not_there;
959 #endif
960             if (strEQ(name, "FLT_MIN_10_EXP"))
961 #ifdef FLT_MIN_10_EXP
962                 return FLT_MIN_10_EXP;
963 #else
964                 goto not_there;
965 #endif
966             if (strEQ(name, "FLT_MIN_EXP"))
967 #ifdef FLT_MIN_EXP
968                 return FLT_MIN_EXP;
969 #else
970                 goto not_there;
971 #endif
972             if (strEQ(name, "FLT_RADIX"))
973 #ifdef FLT_RADIX
974                 return FLT_RADIX;
975 #else
976                 goto not_there;
977 #endif
978             break;
979         }
980         if (strnEQ(name, "F_", 2)) {
981             if (strEQ(name, "F_DUPFD"))
982 #ifdef F_DUPFD
983                 return F_DUPFD;
984 #else
985                 goto not_there;
986 #endif
987             if (strEQ(name, "F_GETFD"))
988 #ifdef F_GETFD
989                 return F_GETFD;
990 #else
991                 goto not_there;
992 #endif
993             if (strEQ(name, "F_GETFL"))
994 #ifdef F_GETFL
995                 return F_GETFL;
996 #else
997                 goto not_there;
998 #endif
999             if (strEQ(name, "F_GETLK"))
1000 #ifdef F_GETLK
1001                 return F_GETLK;
1002 #else
1003                 goto not_there;
1004 #endif
1005             if (strEQ(name, "F_OK"))
1006 #ifdef F_OK
1007                 return F_OK;
1008 #else
1009                 goto not_there;
1010 #endif
1011             if (strEQ(name, "F_RDLCK"))
1012 #ifdef F_RDLCK
1013                 return F_RDLCK;
1014 #else
1015                 goto not_there;
1016 #endif
1017             if (strEQ(name, "F_SETFD"))
1018 #ifdef F_SETFD
1019                 return F_SETFD;
1020 #else
1021                 goto not_there;
1022 #endif
1023             if (strEQ(name, "F_SETFL"))
1024 #ifdef F_SETFL
1025                 return F_SETFL;
1026 #else
1027                 goto not_there;
1028 #endif
1029             if (strEQ(name, "F_SETLK"))
1030 #ifdef F_SETLK
1031                 return F_SETLK;
1032 #else
1033                 goto not_there;
1034 #endif
1035             if (strEQ(name, "F_SETLKW"))
1036 #ifdef F_SETLKW
1037                 return F_SETLKW;
1038 #else
1039                 goto not_there;
1040 #endif
1041             if (strEQ(name, "F_UNLCK"))
1042 #ifdef F_UNLCK
1043                 return F_UNLCK;
1044 #else
1045                 goto not_there;
1046 #endif
1047             if (strEQ(name, "F_WRLCK"))
1048 #ifdef F_WRLCK
1049                 return F_WRLCK;
1050 #else
1051                 goto not_there;
1052 #endif
1053             break;
1054         }
1055         if (strEQ(name, "FD_CLOEXEC"))
1056 #ifdef FD_CLOEXEC
1057             return FD_CLOEXEC;
1058 #else
1059             goto not_there;
1060 #endif
1061         if (strEQ(name, "FILENAME_MAX"))
1062 #ifdef FILENAME_MAX
1063             return FILENAME_MAX;
1064 #else
1065             goto not_there;
1066 #endif
1067         break;
1068     case 'H':
1069         if (strEQ(name, "HUGE_VAL"))
1070 #ifdef HUGE_VAL
1071             return HUGE_VAL;
1072 #else
1073             goto not_there;
1074 #endif
1075         if (strEQ(name, "HUPCL"))
1076 #ifdef HUPCL
1077             return HUPCL;
1078 #else
1079             goto not_there;
1080 #endif
1081         break;
1082     case 'I':
1083         if (strEQ(name, "INT_MAX"))
1084 #ifdef INT_MAX
1085             return INT_MAX;
1086 #else
1087             goto not_there;
1088 #endif
1089         if (strEQ(name, "INT_MIN"))
1090 #ifdef INT_MIN
1091             return INT_MIN;
1092 #else
1093             goto not_there;
1094 #endif
1095         if (strEQ(name, "ICANON"))
1096 #ifdef ICANON
1097             return ICANON;
1098 #else
1099             goto not_there;
1100 #endif
1101         if (strEQ(name, "ICRNL"))
1102 #ifdef ICRNL
1103             return ICRNL;
1104 #else
1105             goto not_there;
1106 #endif
1107         if (strEQ(name, "IEXTEN"))
1108 #ifdef IEXTEN
1109             return IEXTEN;
1110 #else
1111             goto not_there;
1112 #endif
1113         if (strEQ(name, "IGNBRK"))
1114 #ifdef IGNBRK
1115             return IGNBRK;
1116 #else
1117             goto not_there;
1118 #endif
1119         if (strEQ(name, "IGNCR"))
1120 #ifdef IGNCR
1121             return IGNCR;
1122 #else
1123             goto not_there;
1124 #endif
1125         if (strEQ(name, "IGNPAR"))
1126 #ifdef IGNPAR
1127             return IGNPAR;
1128 #else
1129             goto not_there;
1130 #endif
1131         if (strEQ(name, "INLCR"))
1132 #ifdef INLCR
1133             return INLCR;
1134 #else
1135             goto not_there;
1136 #endif
1137         if (strEQ(name, "INPCK"))
1138 #ifdef INPCK
1139             return INPCK;
1140 #else
1141             goto not_there;
1142 #endif
1143         if (strEQ(name, "ISIG"))
1144 #ifdef ISIG
1145             return ISIG;
1146 #else
1147             goto not_there;
1148 #endif
1149         if (strEQ(name, "ISTRIP"))
1150 #ifdef ISTRIP
1151             return ISTRIP;
1152 #else
1153             goto not_there;
1154 #endif
1155         if (strEQ(name, "IXOFF"))
1156 #ifdef IXOFF
1157             return IXOFF;
1158 #else
1159             goto not_there;
1160 #endif
1161         if (strEQ(name, "IXON"))
1162 #ifdef IXON
1163             return IXON;
1164 #else
1165             goto not_there;
1166 #endif
1167         break;
1168     case 'L':
1169         if (strnEQ(name, "LC_", 3)) {
1170             if (strEQ(name, "LC_ALL"))
1171 #ifdef LC_ALL
1172                 return LC_ALL;
1173 #else
1174                 goto not_there;
1175 #endif
1176             if (strEQ(name, "LC_COLLATE"))
1177 #ifdef LC_COLLATE
1178                 return LC_COLLATE;
1179 #else
1180                 goto not_there;
1181 #endif
1182             if (strEQ(name, "LC_CTYPE"))
1183 #ifdef LC_CTYPE
1184                 return LC_CTYPE;
1185 #else
1186                 goto not_there;
1187 #endif
1188             if (strEQ(name, "LC_MONETARY"))
1189 #ifdef LC_MONETARY
1190                 return LC_MONETARY;
1191 #else
1192                 goto not_there;
1193 #endif
1194             if (strEQ(name, "LC_NUMERIC"))
1195 #ifdef LC_NUMERIC
1196                 return LC_NUMERIC;
1197 #else
1198                 goto not_there;
1199 #endif
1200             if (strEQ(name, "LC_TIME"))
1201 #ifdef LC_TIME
1202                 return LC_TIME;
1203 #else
1204                 goto not_there;
1205 #endif
1206             break;
1207         }
1208         if (strnEQ(name, "LDBL_", 5)) {
1209             if (strEQ(name, "LDBL_MAX"))
1210 #ifdef LDBL_MAX
1211                 return LDBL_MAX;
1212 #else
1213                 goto not_there;
1214 #endif
1215             if (strEQ(name, "LDBL_MIN"))
1216 #ifdef LDBL_MIN
1217                 return LDBL_MIN;
1218 #else
1219                 goto not_there;
1220 #endif
1221             if (strEQ(name, "LDBL_DIG"))
1222 #ifdef LDBL_DIG
1223                 return LDBL_DIG;
1224 #else
1225                 goto not_there;
1226 #endif
1227             if (strEQ(name, "LDBL_EPSILON"))
1228 #ifdef LDBL_EPSILON
1229                 return LDBL_EPSILON;
1230 #else
1231                 goto not_there;
1232 #endif
1233             if (strEQ(name, "LDBL_MANT_DIG"))
1234 #ifdef LDBL_MANT_DIG
1235                 return LDBL_MANT_DIG;
1236 #else
1237                 goto not_there;
1238 #endif
1239             if (strEQ(name, "LDBL_MAX_10_EXP"))
1240 #ifdef LDBL_MAX_10_EXP
1241                 return LDBL_MAX_10_EXP;
1242 #else
1243                 goto not_there;
1244 #endif
1245             if (strEQ(name, "LDBL_MAX_EXP"))
1246 #ifdef LDBL_MAX_EXP
1247                 return LDBL_MAX_EXP;
1248 #else
1249                 goto not_there;
1250 #endif
1251             if (strEQ(name, "LDBL_MIN_10_EXP"))
1252 #ifdef LDBL_MIN_10_EXP
1253                 return LDBL_MIN_10_EXP;
1254 #else
1255                 goto not_there;
1256 #endif
1257             if (strEQ(name, "LDBL_MIN_EXP"))
1258 #ifdef LDBL_MIN_EXP
1259                 return LDBL_MIN_EXP;
1260 #else
1261                 goto not_there;
1262 #endif
1263             break;
1264         }
1265         if (strnEQ(name, "L_", 2)) {
1266             if (strEQ(name, "L_ctermid"))
1267 #ifdef L_ctermid
1268                 return L_ctermid;
1269 #else
1270                 goto not_there;
1271 #endif
1272             if (strEQ(name, "L_cuserid"))
1273 #ifdef L_cuserid
1274                 return L_cuserid;
1275 #else
1276                 goto not_there;
1277 #endif
1278             if (strEQ(name, "L_tmpname"))
1279 #ifdef L_tmpname
1280                 return L_tmpname;
1281 #else
1282                 goto not_there;
1283 #endif
1284             break;
1285         }
1286         if (strEQ(name, "LONG_MAX"))
1287 #ifdef LONG_MAX
1288             return LONG_MAX;
1289 #else
1290             goto not_there;
1291 #endif
1292         if (strEQ(name, "LONG_MIN"))
1293 #ifdef LONG_MIN
1294             return LONG_MIN;
1295 #else
1296             goto not_there;
1297 #endif
1298         if (strEQ(name, "LINK_MAX"))
1299 #ifdef LINK_MAX
1300             return LINK_MAX;
1301 #else
1302             goto not_there;
1303 #endif
1304         break;
1305     case 'M':
1306         if (strEQ(name, "MAX_CANON"))
1307 #ifdef MAX_CANON
1308             return MAX_CANON;
1309 #else
1310             goto not_there;
1311 #endif
1312         if (strEQ(name, "MAX_INPUT"))
1313 #ifdef MAX_INPUT
1314             return MAX_INPUT;
1315 #else
1316             goto not_there;
1317 #endif
1318         if (strEQ(name, "MB_CUR_MAX"))
1319 #ifdef MB_CUR_MAX
1320             return MB_CUR_MAX;
1321 #else
1322             goto not_there;
1323 #endif
1324         if (strEQ(name, "MB_LEN_MAX"))
1325 #ifdef MB_LEN_MAX
1326             return MB_LEN_MAX;
1327 #else
1328             goto not_there;
1329 #endif
1330         break;
1331     case 'N':
1332         if (strEQ(name, "NULL")) return 0;
1333         if (strEQ(name, "NAME_MAX"))
1334 #ifdef NAME_MAX
1335             return NAME_MAX;
1336 #else
1337             goto not_there;
1338 #endif
1339         if (strEQ(name, "NCCS"))
1340 #ifdef NCCS
1341             return NCCS;
1342 #else
1343             goto not_there;
1344 #endif
1345         if (strEQ(name, "NGROUPS_MAX"))
1346 #ifdef NGROUPS_MAX
1347             return NGROUPS_MAX;
1348 #else
1349             goto not_there;
1350 #endif
1351         if (strEQ(name, "NOFLSH"))
1352 #ifdef NOFLSH
1353             return NOFLSH;
1354 #else
1355             goto not_there;
1356 #endif
1357         break;
1358     case 'O':
1359         if (strnEQ(name, "O_", 2)) {
1360             if (strEQ(name, "O_APPEND"))
1361 #ifdef O_APPEND
1362                 return O_APPEND;
1363 #else
1364                 goto not_there;
1365 #endif
1366             if (strEQ(name, "O_CREAT"))
1367 #ifdef O_CREAT
1368                 return O_CREAT;
1369 #else
1370                 goto not_there;
1371 #endif
1372             if (strEQ(name, "O_TRUNC"))
1373 #ifdef O_TRUNC
1374                 return O_TRUNC;
1375 #else
1376                 goto not_there;
1377 #endif
1378             if (strEQ(name, "O_RDONLY"))
1379 #ifdef O_RDONLY
1380                 return O_RDONLY;
1381 #else
1382                 goto not_there;
1383 #endif
1384             if (strEQ(name, "O_RDWR"))
1385 #ifdef O_RDWR
1386                 return O_RDWR;
1387 #else
1388                 goto not_there;
1389 #endif
1390             if (strEQ(name, "O_WRONLY"))
1391 #ifdef O_WRONLY
1392                 return O_WRONLY;
1393 #else
1394                 goto not_there;
1395 #endif
1396             if (strEQ(name, "O_EXCL"))
1397 #ifdef O_EXCL
1398                 return O_EXCL;
1399 #else
1400                 goto not_there;
1401 #endif
1402             if (strEQ(name, "O_NOCTTY"))
1403 #ifdef O_NOCTTY
1404                 return O_NOCTTY;
1405 #else
1406                 goto not_there;
1407 #endif
1408             if (strEQ(name, "O_NONBLOCK"))
1409 #ifdef O_NONBLOCK
1410                 return O_NONBLOCK;
1411 #else
1412                 goto not_there;
1413 #endif
1414             if (strEQ(name, "O_ACCMODE"))
1415 #ifdef O_ACCMODE
1416                 return O_ACCMODE;
1417 #else
1418                 goto not_there;
1419 #endif
1420             break;
1421         }
1422         if (strEQ(name, "OPEN_MAX"))
1423 #ifdef OPEN_MAX
1424             return OPEN_MAX;
1425 #else
1426             goto not_there;
1427 #endif
1428         if (strEQ(name, "OPOST"))
1429 #ifdef OPOST
1430             return OPOST;
1431 #else
1432             goto not_there;
1433 #endif
1434         break;
1435     case 'P':
1436         if (strEQ(name, "PATH_MAX"))
1437 #ifdef PATH_MAX
1438             return PATH_MAX;
1439 #else
1440             goto not_there;
1441 #endif
1442         if (strEQ(name, "PARENB"))
1443 #ifdef PARENB
1444             return PARENB;
1445 #else
1446             goto not_there;
1447 #endif
1448         if (strEQ(name, "PARMRK"))
1449 #ifdef PARMRK
1450             return PARMRK;
1451 #else
1452             goto not_there;
1453 #endif
1454         if (strEQ(name, "PARODD"))
1455 #ifdef PARODD
1456             return PARODD;
1457 #else
1458             goto not_there;
1459 #endif
1460         if (strEQ(name, "PIPE_BUF"))
1461 #ifdef PIPE_BUF
1462             return PIPE_BUF;
1463 #else
1464             goto not_there;
1465 #endif
1466         break;
1467     case 'R':
1468         if (strEQ(name, "RAND_MAX"))
1469 #ifdef RAND_MAX
1470             return RAND_MAX;
1471 #else
1472             goto not_there;
1473 #endif
1474         if (strEQ(name, "R_OK"))
1475 #ifdef R_OK
1476             return R_OK;
1477 #else
1478             goto not_there;
1479 #endif
1480         break;
1481     case 'S':
1482         if (strnEQ(name, "SIG", 3)) {
1483             if (name[3] == '_') {
1484                 if (strEQ(name, "SIG_BLOCK"))
1485 #ifdef SIG_BLOCK
1486                     return SIG_BLOCK;
1487 #else
1488                     goto not_there;
1489 #endif
1490 #ifdef SIG_DFL
1491                 if (strEQ(name, "SIG_DFL")) return (int)SIG_DFL;
1492 #endif
1493 #ifdef SIG_ERR
1494                 if (strEQ(name, "SIG_ERR")) return (int)SIG_ERR;
1495 #endif
1496 #ifdef SIG_IGN
1497                 if (strEQ(name, "SIG_IGN")) return (int)SIG_IGN;
1498 #endif
1499                 if (strEQ(name, "SIG_SETMASK"))
1500 #ifdef SIG_SETMASK
1501                     return SIG_SETMASK;
1502 #else
1503                     goto not_there;
1504 #endif
1505                 if (strEQ(name, "SIG_UNBLOCK"))
1506 #ifdef SIG_UNBLOCK
1507                     return SIG_UNBLOCK;
1508 #else
1509                     goto not_there;
1510 #endif
1511                 break;
1512             }
1513             if (strEQ(name, "SIGABRT"))
1514 #ifdef SIGABRT
1515                 return SIGABRT;
1516 #else
1517                 goto not_there;
1518 #endif
1519             if (strEQ(name, "SIGALRM"))
1520 #ifdef SIGALRM
1521                 return SIGALRM;
1522 #else
1523                 goto not_there;
1524 #endif
1525             if (strEQ(name, "SIGCHLD"))
1526 #ifdef SIGCHLD
1527                 return SIGCHLD;
1528 #else
1529                 goto not_there;
1530 #endif
1531             if (strEQ(name, "SIGCONT"))
1532 #ifdef SIGCONT
1533                 return SIGCONT;
1534 #else
1535                 goto not_there;
1536 #endif
1537             if (strEQ(name, "SIGFPE"))
1538 #ifdef SIGFPE
1539                 return SIGFPE;
1540 #else
1541                 goto not_there;
1542 #endif
1543             if (strEQ(name, "SIGHUP"))
1544 #ifdef SIGHUP
1545                 return SIGHUP;
1546 #else
1547                 goto not_there;
1548 #endif
1549             if (strEQ(name, "SIGILL"))
1550 #ifdef SIGILL
1551                 return SIGILL;
1552 #else
1553                 goto not_there;
1554 #endif
1555             if (strEQ(name, "SIGINT"))
1556 #ifdef SIGINT
1557                 return SIGINT;
1558 #else
1559                 goto not_there;
1560 #endif
1561             if (strEQ(name, "SIGKILL"))
1562 #ifdef SIGKILL
1563                 return SIGKILL;
1564 #else
1565                 goto not_there;
1566 #endif
1567             if (strEQ(name, "SIGPIPE"))
1568 #ifdef SIGPIPE
1569                 return SIGPIPE;
1570 #else
1571                 goto not_there;
1572 #endif
1573             if (strEQ(name, "SIGQUIT"))
1574 #ifdef SIGQUIT
1575                 return SIGQUIT;
1576 #else
1577                 goto not_there;
1578 #endif
1579             if (strEQ(name, "SIGSEGV"))
1580 #ifdef SIGSEGV
1581                 return SIGSEGV;
1582 #else
1583                 goto not_there;
1584 #endif
1585             if (strEQ(name, "SIGSTOP"))
1586 #ifdef SIGSTOP
1587                 return SIGSTOP;
1588 #else
1589                 goto not_there;
1590 #endif
1591             if (strEQ(name, "SIGTERM"))
1592 #ifdef SIGTERM
1593                 return SIGTERM;
1594 #else
1595                 goto not_there;
1596 #endif
1597             if (strEQ(name, "SIGTSTP"))
1598 #ifdef SIGTSTP
1599                 return SIGTSTP;
1600 #else
1601                 goto not_there;
1602 #endif
1603             if (strEQ(name, "SIGTTIN"))
1604 #ifdef SIGTTIN
1605                 return SIGTTIN;
1606 #else
1607                 goto not_there;
1608 #endif
1609             if (strEQ(name, "SIGTTOU"))
1610 #ifdef SIGTTOU
1611                 return SIGTTOU;
1612 #else
1613                 goto not_there;
1614 #endif
1615             if (strEQ(name, "SIGUSR1"))
1616 #ifdef SIGUSR1
1617                 return SIGUSR1;
1618 #else
1619                 goto not_there;
1620 #endif
1621             if (strEQ(name, "SIGUSR2"))
1622 #ifdef SIGUSR2
1623                 return SIGUSR2;
1624 #else
1625                 goto not_there;
1626 #endif
1627             break;
1628         }
1629         if (name[1] == '_') {
1630             if (strEQ(name, "S_ISGID"))
1631 #ifdef S_ISGID
1632                 return S_ISGID;
1633 #else
1634                 goto not_there;
1635 #endif
1636             if (strEQ(name, "S_ISUID"))
1637 #ifdef S_ISUID
1638                 return S_ISUID;
1639 #else
1640                 goto not_there;
1641 #endif
1642             if (strEQ(name, "S_IRGRP"))
1643 #ifdef S_IRGRP
1644                 return S_IRGRP;
1645 #else
1646                 goto not_there;
1647 #endif
1648             if (strEQ(name, "S_IROTH"))
1649 #ifdef S_IROTH
1650                 return S_IROTH;
1651 #else
1652                 goto not_there;
1653 #endif
1654             if (strEQ(name, "S_IRUSR"))
1655 #ifdef S_IRUSR
1656                 return S_IRUSR;
1657 #else
1658                 goto not_there;
1659 #endif
1660             if (strEQ(name, "S_IRWXG"))
1661 #ifdef S_IRWXG
1662                 return S_IRWXG;
1663 #else
1664                 goto not_there;
1665 #endif
1666             if (strEQ(name, "S_IRWXO"))
1667 #ifdef S_IRWXO
1668                 return S_IRWXO;
1669 #else
1670                 goto not_there;
1671 #endif
1672             if (strEQ(name, "S_IRWXU"))
1673 #ifdef S_IRWXU
1674                 return S_IRWXU;
1675 #else
1676                 goto not_there;
1677 #endif
1678             if (strEQ(name, "S_IWGRP"))
1679 #ifdef S_IWGRP
1680                 return S_IWGRP;
1681 #else
1682                 goto not_there;
1683 #endif
1684             if (strEQ(name, "S_IWOTH"))
1685 #ifdef S_IWOTH
1686                 return S_IWOTH;
1687 #else
1688                 goto not_there;
1689 #endif
1690             if (strEQ(name, "S_IWUSR"))
1691 #ifdef S_IWUSR
1692                 return S_IWUSR;
1693 #else
1694                 goto not_there;
1695 #endif
1696             if (strEQ(name, "S_IXGRP"))
1697 #ifdef S_IXGRP
1698                 return S_IXGRP;
1699 #else
1700                 goto not_there;
1701 #endif
1702             if (strEQ(name, "S_IXOTH"))
1703 #ifdef S_IXOTH
1704                 return S_IXOTH;
1705 #else
1706                 goto not_there;
1707 #endif
1708             if (strEQ(name, "S_IXUSR"))
1709 #ifdef S_IXUSR
1710                 return S_IXUSR;
1711 #else
1712                 goto not_there;
1713 #endif
1714             errno = EAGAIN;             /* the following aren't constants */
1715 #ifdef S_ISBLK
1716             if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
1717 #endif
1718 #ifdef S_ISCHR
1719             if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
1720 #endif
1721 #ifdef S_ISDIR
1722             if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
1723 #endif
1724 #ifdef S_ISFIFO
1725             if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
1726 #endif
1727 #ifdef S_ISREG
1728             if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
1729 #endif
1730             break;
1731         }
1732         if (strEQ(name, "SEEK_CUR"))
1733 #ifdef SEEK_CUR
1734             return SEEK_CUR;
1735 #else
1736             goto not_there;
1737 #endif
1738         if (strEQ(name, "SEEK_END"))
1739 #ifdef SEEK_END
1740             return SEEK_END;
1741 #else
1742             goto not_there;
1743 #endif
1744         if (strEQ(name, "SEEK_SET"))
1745 #ifdef SEEK_SET
1746             return SEEK_SET;
1747 #else
1748             goto not_there;
1749 #endif
1750         if (strEQ(name, "STREAM_MAX"))
1751 #ifdef STREAM_MAX
1752             return STREAM_MAX;
1753 #else
1754             goto not_there;
1755 #endif
1756         if (strEQ(name, "SHRT_MAX"))
1757 #ifdef SHRT_MAX
1758             return SHRT_MAX;
1759 #else
1760             goto not_there;
1761 #endif
1762         if (strEQ(name, "SHRT_MIN"))
1763 #ifdef SHRT_MIN
1764             return SHRT_MIN;
1765 #else
1766             goto not_there;
1767 #endif
1768         if (strEQ(name, "SA_NOCLDSTOP"))
1769 #ifdef SA_NOCLDSTOP
1770             return SA_NOCLDSTOP;
1771 #else
1772             goto not_there;
1773 #endif
1774         if (strEQ(name, "SCHAR_MAX"))
1775 #ifdef SCHAR_MAX
1776             return SCHAR_MAX;
1777 #else
1778             goto not_there;
1779 #endif
1780         if (strEQ(name, "SCHAR_MIN"))
1781 #ifdef SCHAR_MIN
1782             return SCHAR_MIN;
1783 #else
1784             goto not_there;
1785 #endif
1786         if (strEQ(name, "SSIZE_MAX"))
1787 #ifdef SSIZE_MAX
1788             return SSIZE_MAX;
1789 #else
1790             goto not_there;
1791 #endif
1792         if (strEQ(name, "STDIN_FILENO"))
1793 #ifdef STDIN_FILENO
1794             return STDIN_FILENO;
1795 #else
1796             goto not_there;
1797 #endif
1798         if (strEQ(name, "STDOUT_FILENO"))
1799 #ifdef STDOUT_FILENO
1800             return STDOUT_FILENO;
1801 #else
1802             goto not_there;
1803 #endif
1804         if (strEQ(name, "STRERR_FILENO"))
1805 #ifdef STRERR_FILENO
1806             return STRERR_FILENO;
1807 #else
1808             goto not_there;
1809 #endif
1810         break;
1811     case 'T':
1812         if (strEQ(name, "TCIFLUSH"))
1813 #ifdef TCIFLUSH
1814             return TCIFLUSH;
1815 #else
1816             goto not_there;
1817 #endif
1818         if (strEQ(name, "TCIOFF"))
1819 #ifdef TCIOFF
1820             return TCIOFF;
1821 #else
1822             goto not_there;
1823 #endif
1824         if (strEQ(name, "TCIOFLUSH"))
1825 #ifdef TCIOFLUSH
1826             return TCIOFLUSH;
1827 #else
1828             goto not_there;
1829 #endif
1830         if (strEQ(name, "TCION"))
1831 #ifdef TCION
1832             return TCION;
1833 #else
1834             goto not_there;
1835 #endif
1836         if (strEQ(name, "TCOFLUSH"))
1837 #ifdef TCOFLUSH
1838             return TCOFLUSH;
1839 #else
1840             goto not_there;
1841 #endif
1842         if (strEQ(name, "TCOOFF"))
1843 #ifdef TCOOFF
1844             return TCOOFF;
1845 #else
1846             goto not_there;
1847 #endif
1848         if (strEQ(name, "TCOON"))
1849 #ifdef TCOON
1850             return TCOON;
1851 #else
1852             goto not_there;
1853 #endif
1854         if (strEQ(name, "TCSADRAIN"))
1855 #ifdef TCSADRAIN
1856             return TCSADRAIN;
1857 #else
1858             goto not_there;
1859 #endif
1860         if (strEQ(name, "TCSAFLUSH"))
1861 #ifdef TCSAFLUSH
1862             return TCSAFLUSH;
1863 #else
1864             goto not_there;
1865 #endif
1866         if (strEQ(name, "TCSANOW"))
1867 #ifdef TCSANOW
1868             return TCSANOW;
1869 #else
1870             goto not_there;
1871 #endif
1872         if (strEQ(name, "TMP_MAX"))
1873 #ifdef TMP_MAX
1874             return TMP_MAX;
1875 #else
1876             goto not_there;
1877 #endif
1878         if (strEQ(name, "TOSTOP"))
1879 #ifdef TOSTOP
1880             return TOSTOP;
1881 #else
1882             goto not_there;
1883 #endif
1884         if (strEQ(name, "TZNAME_MAX"))
1885 #ifdef TZNAME_MAX
1886             return TZNAME_MAX;
1887 #else
1888             goto not_there;
1889 #endif
1890         break;
1891     case 'U':
1892         if (strEQ(name, "UCHAR_MAX"))
1893 #ifdef UCHAR_MAX
1894             return UCHAR_MAX;
1895 #else
1896             goto not_there;
1897 #endif
1898         if (strEQ(name, "UINT_MAX"))
1899 #ifdef UINT_MAX
1900             return UINT_MAX;
1901 #else
1902             goto not_there;
1903 #endif
1904         if (strEQ(name, "ULONG_MAX"))
1905 #ifdef ULONG_MAX
1906             return ULONG_MAX;
1907 #else
1908             goto not_there;
1909 #endif
1910         if (strEQ(name, "USHRT_MAX"))
1911 #ifdef USHRT_MAX
1912             return USHRT_MAX;
1913 #else
1914             goto not_there;
1915 #endif
1916         break;
1917     case 'V':
1918         if (strEQ(name, "VEOF"))
1919 #ifdef VEOF
1920             return VEOF;
1921 #else
1922             goto not_there;
1923 #endif
1924         if (strEQ(name, "VEOL"))
1925 #ifdef VEOL
1926             return VEOL;
1927 #else
1928             goto not_there;
1929 #endif
1930         if (strEQ(name, "VERASE"))
1931 #ifdef VERASE
1932             return VERASE;
1933 #else
1934             goto not_there;
1935 #endif
1936         if (strEQ(name, "VINTR"))
1937 #ifdef VINTR
1938             return VINTR;
1939 #else
1940             goto not_there;
1941 #endif
1942         if (strEQ(name, "VKILL"))
1943 #ifdef VKILL
1944             return VKILL;
1945 #else
1946             goto not_there;
1947 #endif
1948         if (strEQ(name, "VMIN"))
1949 #ifdef VMIN
1950             return VMIN;
1951 #else
1952             goto not_there;
1953 #endif
1954         if (strEQ(name, "VQUIT"))
1955 #ifdef VQUIT
1956             return VQUIT;
1957 #else
1958             goto not_there;
1959 #endif
1960         if (strEQ(name, "VSTART"))
1961 #ifdef VSTART
1962             return VSTART;
1963 #else
1964             goto not_there;
1965 #endif
1966         if (strEQ(name, "VSTOP"))
1967 #ifdef VSTOP
1968             return VSTOP;
1969 #else
1970             goto not_there;
1971 #endif
1972         if (strEQ(name, "VSUSP"))
1973 #ifdef VSUSP
1974             return VSUSP;
1975 #else
1976             goto not_there;
1977 #endif
1978         if (strEQ(name, "VTIME"))
1979 #ifdef VTIME
1980             return VTIME;
1981 #else
1982             goto not_there;
1983 #endif
1984         break;
1985     case 'W':
1986         if (strEQ(name, "W_OK"))
1987 #ifdef W_OK
1988             return W_OK;
1989 #else
1990             goto not_there;
1991 #endif
1992         if (strEQ(name, "WNOHANG"))
1993 #ifdef WNOHANG
1994             return WNOHANG;
1995 #else
1996             goto not_there;
1997 #endif
1998         if (strEQ(name, "WUNTRACED"))
1999 #ifdef WUNTRACED
2000             return WUNTRACED;
2001 #else
2002             goto not_there;
2003 #endif
2004         errno = EAGAIN;         /* the following aren't constants */
2005 #ifdef WEXITSTATUS
2006         if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
2007 #endif
2008 #ifdef WIFEXITED
2009         if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
2010 #endif
2011 #ifdef WIFSIGNALED
2012         if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
2013 #endif
2014 #ifdef WIFSTOPPED
2015         if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
2016 #endif
2017 #ifdef WSTOPSIG
2018         if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
2019 #endif
2020 #ifdef WTERMSIG
2021         if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
2022 #endif
2023         break;
2024     case 'X':
2025         if (strEQ(name, "X_OK"))
2026 #ifdef X_OK
2027             return X_OK;
2028 #else
2029             goto not_there;
2030 #endif
2031         break;
2032     case '_':
2033         if (strnEQ(name, "_PC_", 4)) {
2034             if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
2035 #ifdef _PC_CHOWN_RESTRICTED
2036                 return _PC_CHOWN_RESTRICTED;
2037 #else
2038                 goto not_there;
2039 #endif
2040             if (strEQ(name, "_PC_LINK_MAX"))
2041 #ifdef _PC_LINK_MAX
2042                 return _PC_LINK_MAX;
2043 #else
2044                 goto not_there;
2045 #endif
2046             if (strEQ(name, "_PC_MAX_CANON"))
2047 #ifdef _PC_MAX_CANON
2048                 return _PC_MAX_CANON;
2049 #else
2050                 goto not_there;
2051 #endif
2052             if (strEQ(name, "_PC_MAX_INPUT"))
2053 #ifdef _PC_MAX_INPUT
2054                 return _PC_MAX_INPUT;
2055 #else
2056                 goto not_there;
2057 #endif
2058             if (strEQ(name, "_PC_NAME_MAX"))
2059 #ifdef _PC_NAME_MAX
2060                 return _PC_NAME_MAX;
2061 #else
2062                 goto not_there;
2063 #endif
2064             if (strEQ(name, "_PC_NO_TRUNC"))
2065 #ifdef _PC_NO_TRUNC
2066                 return _PC_NO_TRUNC;
2067 #else
2068                 goto not_there;
2069 #endif
2070             if (strEQ(name, "_PC_PATH_MAX"))
2071 #ifdef _PC_PATH_MAX
2072                 return _PC_PATH_MAX;
2073 #else
2074                 goto not_there;
2075 #endif
2076             if (strEQ(name, "_PC_PIPE_BUF"))
2077 #ifdef _PC_PIPE_BUF
2078                 return _PC_PIPE_BUF;
2079 #else
2080                 goto not_there;
2081 #endif
2082             if (strEQ(name, "_PC_VDISABLE"))
2083 #ifdef _PC_VDISABLE
2084                 return _PC_VDISABLE;
2085 #else
2086                 goto not_there;
2087 #endif
2088             break;
2089         }
2090         if (strnEQ(name, "_POSIX_", 7)) {
2091             if (strEQ(name, "_POSIX_ARG_MAX"))
2092 #ifdef _POSIX_ARG_MAX
2093                 return _POSIX_ARG_MAX;
2094 #else
2095                 return 0;
2096 #endif
2097             if (strEQ(name, "_POSIX_CHILD_MAX"))
2098 #ifdef _POSIX_CHILD_MAX
2099                 return _POSIX_CHILD_MAX;
2100 #else
2101                 return 0;
2102 #endif
2103             if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
2104 #ifdef _POSIX_CHOWN_RESTRICTED
2105                 return _POSIX_CHOWN_RESTRICTED;
2106 #else
2107                 return 0;
2108 #endif
2109             if (strEQ(name, "_POSIX_JOB_CONTROL"))
2110 #ifdef _POSIX_JOB_CONTROL
2111                 return _POSIX_JOB_CONTROL;
2112 #else
2113                 return 0;
2114 #endif
2115             if (strEQ(name, "_POSIX_LINK_MAX"))
2116 #ifdef _POSIX_LINK_MAX
2117                 return _POSIX_LINK_MAX;
2118 #else
2119                 return 0;
2120 #endif
2121             if (strEQ(name, "_POSIX_MAX_CANON"))
2122 #ifdef _POSIX_MAX_CANON
2123                 return _POSIX_MAX_CANON;
2124 #else
2125                 return 0;
2126 #endif
2127             if (strEQ(name, "_POSIX_MAX_INPUT"))
2128 #ifdef _POSIX_MAX_INPUT
2129                 return _POSIX_MAX_INPUT;
2130 #else
2131                 return 0;
2132 #endif
2133             if (strEQ(name, "_POSIX_NAME_MAX"))
2134 #ifdef _POSIX_NAME_MAX
2135                 return _POSIX_NAME_MAX;
2136 #else
2137                 return 0;
2138 #endif
2139             if (strEQ(name, "_POSIX_NGROUPS_MAX"))
2140 #ifdef _POSIX_NGROUPS_MAX
2141                 return _POSIX_NGROUPS_MAX;
2142 #else
2143                 return 0;
2144 #endif
2145             if (strEQ(name, "_POSIX_NO_TRUNC"))
2146 #ifdef _POSIX_NO_TRUNC
2147                 return _POSIX_NO_TRUNC;
2148 #else
2149                 return 0;
2150 #endif
2151             if (strEQ(name, "_POSIX_OPEN_MAX"))
2152 #ifdef _POSIX_OPEN_MAX
2153                 return _POSIX_OPEN_MAX;
2154 #else
2155                 return 0;
2156 #endif
2157             if (strEQ(name, "_POSIX_PATH_MAX"))
2158 #ifdef _POSIX_PATH_MAX
2159                 return _POSIX_PATH_MAX;
2160 #else
2161                 return 0;
2162 #endif
2163             if (strEQ(name, "_POSIX_PIPE_BUF"))
2164 #ifdef _POSIX_PIPE_BUF
2165                 return _POSIX_PIPE_BUF;
2166 #else
2167                 return 0;
2168 #endif
2169             if (strEQ(name, "_POSIX_SAVED_IDS"))
2170 #ifdef _POSIX_SAVED_IDS
2171                 return _POSIX_SAVED_IDS;
2172 #else
2173                 return 0;
2174 #endif
2175             if (strEQ(name, "_POSIX_SSIZE_MAX"))
2176 #ifdef _POSIX_SSIZE_MAX
2177                 return _POSIX_SSIZE_MAX;
2178 #else
2179                 return 0;
2180 #endif
2181             if (strEQ(name, "_POSIX_STREAM_MAX"))
2182 #ifdef _POSIX_STREAM_MAX
2183                 return _POSIX_STREAM_MAX;
2184 #else
2185                 return 0;
2186 #endif
2187             if (strEQ(name, "_POSIX_TZNAME_MAX"))
2188 #ifdef _POSIX_TZNAME_MAX
2189                 return _POSIX_TZNAME_MAX;
2190 #else
2191                 return 0;
2192 #endif
2193             if (strEQ(name, "_POSIX_VDISABLE"))
2194 #ifdef _POSIX_VDISABLE
2195                 return _POSIX_VDISABLE;
2196 #else
2197                 return 0;
2198 #endif
2199             if (strEQ(name, "_POSIX_VERSION"))
2200 #ifdef _POSIX_VERSION
2201                 return _POSIX_VERSION;
2202 #else
2203                 return 0;
2204 #endif
2205             break;
2206         }
2207         if (strnEQ(name, "_SC_", 4)) {
2208             if (strEQ(name, "_SC_ARG_MAX"))
2209 #ifdef _SC_ARG_MAX
2210                 return _SC_ARG_MAX;
2211 #else
2212                 goto not_there;
2213 #endif
2214             if (strEQ(name, "_SC_CHILD_MAX"))
2215 #ifdef _SC_CHILD_MAX
2216                 return _SC_CHILD_MAX;
2217 #else
2218                 goto not_there;
2219 #endif
2220             if (strEQ(name, "_SC_CLK_TCK"))
2221 #ifdef _SC_CLK_TCK
2222                 return _SC_CLK_TCK;
2223 #else
2224                 goto not_there;
2225 #endif
2226             if (strEQ(name, "_SC_JOB_CONTROL"))
2227 #ifdef _SC_JOB_CONTROL
2228                 return _SC_JOB_CONTROL;
2229 #else
2230                 goto not_there;
2231 #endif
2232             if (strEQ(name, "_SC_NGROUPS_MAX"))
2233 #ifdef _SC_NGROUPS_MAX
2234                 return _SC_NGROUPS_MAX;
2235 #else
2236                 goto not_there;
2237 #endif
2238             if (strEQ(name, "_SC_OPEN_MAX"))
2239 #ifdef _SC_OPEN_MAX
2240                 return _SC_OPEN_MAX;
2241 #else
2242                 goto not_there;
2243 #endif
2244             if (strEQ(name, "_SC_SAVED_IDS"))
2245 #ifdef _SC_SAVED_IDS
2246                 return _SC_SAVED_IDS;
2247 #else
2248                 goto not_there;
2249 #endif
2250             if (strEQ(name, "_SC_STREAM_MAX"))
2251 #ifdef _SC_STREAM_MAX
2252                 return _SC_STREAM_MAX;
2253 #else
2254                 goto not_there;
2255 #endif
2256             if (strEQ(name, "_SC_TZNAME_MAX"))
2257 #ifdef _SC_TZNAME_MAX
2258                 return _SC_TZNAME_MAX;
2259 #else
2260                 goto not_there;
2261 #endif
2262             if (strEQ(name, "_SC_VERSION"))
2263 #ifdef _SC_VERSION
2264                 return _SC_VERSION;
2265 #else
2266                 goto not_there;
2267 #endif
2268             break;
2269         }
2270     }
2271     errno = EINVAL;
2272     return 0;
2273
2274 not_there:
2275     errno = ENOENT;
2276     return 0;
2277 }
2278
2279 MODULE = SigSet         PACKAGE = POSIX::SigSet         PREFIX = sig
2280
2281 POSIX::SigSet
2282 new(packname = "POSIX::SigSet", ...)
2283     char *              packname
2284     CODE:
2285         {
2286             int i;
2287             RETVAL = (sigset_t*)safemalloc(sizeof(sigset_t));
2288             sigemptyset(RETVAL);
2289             for (i = 1; i < items; i++)
2290                 sigaddset(RETVAL, SvIV(ST(i)));
2291         }
2292     OUTPUT:
2293         RETVAL
2294
2295 void
2296 DESTROY(sigset)
2297         POSIX::SigSet   sigset
2298     CODE:
2299         safefree((char *)sigset);
2300
2301 SysRet
2302 sigaddset(sigset, sig)
2303         POSIX::SigSet   sigset
2304         int             sig
2305
2306 SysRet
2307 sigdelset(sigset, sig)
2308         POSIX::SigSet   sigset
2309         int             sig
2310
2311 SysRet
2312 sigemptyset(sigset)
2313         POSIX::SigSet   sigset
2314
2315 SysRet
2316 sigfillset(sigset)
2317         POSIX::SigSet   sigset
2318
2319 int
2320 sigismember(sigset, sig)
2321         POSIX::SigSet   sigset
2322         int             sig
2323
2324
2325 MODULE = Termios        PACKAGE = POSIX::Termios        PREFIX = cf
2326
2327 POSIX::Termios
2328 new(packname = "POSIX::Termios", ...)
2329     char *              packname
2330     CODE:
2331         {
2332 #ifdef I_TERMIOS
2333             RETVAL = (struct termios*)safemalloc(sizeof(struct termios));
2334 #else
2335             not_here("termios");
2336 #endif
2337         }
2338     OUTPUT:
2339         RETVAL
2340
2341 void
2342 DESTROY(termios_ref)
2343         POSIX::Termios  termios_ref
2344     CODE:
2345 #ifdef I_TERMIOS
2346         safefree((char *)termios_ref);
2347 #else
2348             not_here("termios");
2349 #endif
2350
2351 SysRet
2352 getattr(termios_ref, fd = 0)
2353         POSIX::Termios  termios_ref
2354         int             fd
2355     CODE:
2356         RETVAL = tcgetattr(fd, termios_ref);
2357     OUTPUT:
2358         RETVAL
2359
2360 SysRet
2361 setattr(termios_ref, fd = 0, optional_actions = 0)
2362         POSIX::Termios  termios_ref
2363         int             fd
2364         int             optional_actions
2365     CODE:
2366         RETVAL = tcsetattr(fd, optional_actions, termios_ref);
2367     OUTPUT:
2368         RETVAL
2369
2370 speed_t
2371 cfgetispeed(termios_ref)
2372         POSIX::Termios  termios_ref
2373
2374 speed_t
2375 cfgetospeed(termios_ref)
2376         POSIX::Termios  termios_ref
2377
2378 tcflag_t
2379 getiflag(termios_ref)
2380         POSIX::Termios  termios_ref
2381     CODE:
2382 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2383         RETVAL = termios_ref->c_iflag;
2384 #else
2385             not_here("getiflag");
2386 #endif
2387     OUTPUT:
2388         RETVAL
2389
2390 tcflag_t
2391 getoflag(termios_ref)
2392         POSIX::Termios  termios_ref
2393     CODE:
2394 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2395         RETVAL = termios_ref->c_oflag;
2396 #else
2397             not_here("getoflag");
2398 #endif
2399     OUTPUT:
2400         RETVAL
2401
2402 tcflag_t
2403 getcflag(termios_ref)
2404         POSIX::Termios  termios_ref
2405     CODE:
2406 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2407         RETVAL = termios_ref->c_cflag;
2408 #else
2409             not_here("getcflag");
2410 #endif
2411     OUTPUT:
2412         RETVAL
2413
2414 tcflag_t
2415 getlflag(termios_ref)
2416         POSIX::Termios  termios_ref
2417     CODE:
2418 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2419         RETVAL = termios_ref->c_lflag;
2420 #else
2421             not_here("getlflag");
2422 #endif
2423     OUTPUT:
2424         RETVAL
2425
2426 cc_t
2427 getcc(termios_ref, ccix)
2428         POSIX::Termios  termios_ref
2429         int             ccix
2430     CODE:
2431 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2432         if (ccix >= NCCS)
2433             croak("Bad getcc subscript");
2434         RETVAL = termios_ref->c_cc[ccix];
2435 #else
2436             not_here("getcc");
2437 #endif
2438     OUTPUT:
2439         RETVAL
2440
2441 SysRet
2442 cfsetispeed(termios_ref, speed)
2443         POSIX::Termios  termios_ref
2444         speed_t         speed
2445
2446 SysRet
2447 cfsetospeed(termios_ref, speed)
2448         POSIX::Termios  termios_ref
2449         speed_t         speed
2450
2451 void
2452 setiflag(termios_ref, iflag)
2453         POSIX::Termios  termios_ref
2454         tcflag_t        iflag
2455     CODE:
2456 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2457         termios_ref->c_iflag = iflag;
2458 #else
2459             not_here("setiflag");
2460 #endif
2461
2462 void
2463 setoflag(termios_ref, oflag)
2464         POSIX::Termios  termios_ref
2465         tcflag_t        oflag
2466     CODE:
2467 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2468         termios_ref->c_oflag = oflag;
2469 #else
2470             not_here("setoflag");
2471 #endif
2472
2473 void
2474 setcflag(termios_ref, cflag)
2475         POSIX::Termios  termios_ref
2476         tcflag_t        cflag
2477     CODE:
2478 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2479         termios_ref->c_cflag = cflag;
2480 #else
2481             not_here("setcflag");
2482 #endif
2483
2484 void
2485 setlflag(termios_ref, lflag)
2486         POSIX::Termios  termios_ref
2487         tcflag_t        lflag
2488     CODE:
2489 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2490         termios_ref->c_lflag = lflag;
2491 #else
2492             not_here("setlflag");
2493 #endif
2494
2495 void
2496 setcc(termios_ref, ccix, cc)
2497         POSIX::Termios  termios_ref
2498         int             ccix
2499         cc_t            cc
2500     CODE:
2501 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2502         if (ccix >= NCCS)
2503             croak("Bad setcc subscript");
2504         termios_ref->c_cc[ccix] = cc;
2505 #else
2506             not_here("setcc");
2507 #endif
2508
2509
2510 MODULE = POSIX          PACKAGE = POSIX
2511
2512 double
2513 constant(name,arg)
2514         char *          name
2515         int             arg
2516
2517 int
2518 isalnum(charstring)
2519         char *          charstring
2520     CODE:
2521         char *s;
2522         RETVAL = 1;
2523         for (s = charstring; *s && RETVAL; s++)
2524             if (!isalnum(*s))
2525                 RETVAL = 0;
2526     OUTPUT:
2527         RETVAL
2528
2529 int
2530 isalpha(charstring)
2531         char *          charstring
2532     CODE:
2533         char *s;
2534         RETVAL = 1;
2535         for (s = charstring; *s && RETVAL; s++)
2536             if (!isalpha(*s))
2537                 RETVAL = 0;
2538     OUTPUT:
2539         RETVAL
2540
2541 int
2542 iscntrl(charstring)
2543         char *          charstring
2544     CODE:
2545         char *s;
2546         RETVAL = 1;
2547         for (s = charstring; *s && RETVAL; s++)
2548             if (!iscntrl(*s))
2549                 RETVAL = 0;
2550     OUTPUT:
2551         RETVAL
2552
2553 int
2554 isdigit(charstring)
2555         char *          charstring
2556     CODE:
2557         char *s;
2558         RETVAL = 1;
2559         for (s = charstring; *s && RETVAL; s++)
2560             if (!isdigit(*s))
2561                 RETVAL = 0;
2562     OUTPUT:
2563         RETVAL
2564
2565 int
2566 isgraph(charstring)
2567         char *          charstring
2568     CODE:
2569         char *s;
2570         RETVAL = 1;
2571         for (s = charstring; *s && RETVAL; s++)
2572             if (!isgraph(*s))
2573                 RETVAL = 0;
2574     OUTPUT:
2575         RETVAL
2576
2577 int
2578 islower(charstring)
2579         char *          charstring
2580     CODE:
2581         char *s;
2582         RETVAL = 1;
2583         for (s = charstring; *s && RETVAL; s++)
2584             if (!islower(*s))
2585                 RETVAL = 0;
2586     OUTPUT:
2587         RETVAL
2588
2589 int
2590 isprint(charstring)
2591         char *          charstring
2592     CODE:
2593         char *s;
2594         RETVAL = 1;
2595         for (s = charstring; *s && RETVAL; s++)
2596             if (!isprint(*s))
2597                 RETVAL = 0;
2598     OUTPUT:
2599         RETVAL
2600
2601 int
2602 ispunct(charstring)
2603         char *          charstring
2604     CODE:
2605         char *s;
2606         RETVAL = 1;
2607         for (s = charstring; *s && RETVAL; s++)
2608             if (!ispunct(*s))
2609                 RETVAL = 0;
2610     OUTPUT:
2611         RETVAL
2612
2613 int
2614 isspace(charstring)
2615         char *          charstring
2616     CODE:
2617         char *s;
2618         RETVAL = 1;
2619         for (s = charstring; *s && RETVAL; s++)
2620             if (!isspace(*s))
2621                 RETVAL = 0;
2622     OUTPUT:
2623         RETVAL
2624
2625 int
2626 isupper(charstring)
2627         char *          charstring
2628     CODE:
2629         char *s;
2630         RETVAL = 1;
2631         for (s = charstring; *s && RETVAL; s++)
2632             if (!isupper(*s))
2633                 RETVAL = 0;
2634     OUTPUT:
2635         RETVAL
2636
2637 int
2638 isxdigit(charstring)
2639         char *          charstring
2640     CODE:
2641         char *s;
2642         RETVAL = 1;
2643         for (s = charstring; *s && RETVAL; s++)
2644             if (!isxdigit(*s))
2645                 RETVAL = 0;
2646     OUTPUT:
2647         RETVAL
2648
2649 SysRet
2650 open(filename, flags = O_RDONLY, mode = 0666)
2651         char *          filename
2652         int             flags
2653         Mode_t          mode
2654     CODE:
2655         if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
2656             TAINT_PROPER("open");
2657         RETVAL = open(filename, flags, mode);
2658     OUTPUT:
2659         RETVAL
2660
2661
2662 HV *
2663 localeconv()
2664     CODE:
2665 #ifdef HAS_LOCALECONV
2666         struct lconv *lcbuf;
2667         RETVAL = newHV();
2668         if (lcbuf = localeconv()) {
2669             /* the strings */
2670             if (lcbuf->decimal_point && *lcbuf->decimal_point)
2671                 hv_store(RETVAL, "decimal_point", 13,
2672                     newSVpv(lcbuf->decimal_point, 0), 0);
2673             if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
2674                 hv_store(RETVAL, "thousands_sep", 13,
2675                     newSVpv(lcbuf->thousands_sep, 0), 0);
2676             if (lcbuf->grouping && *lcbuf->grouping)
2677                 hv_store(RETVAL, "grouping", 8,
2678                     newSVpv(lcbuf->grouping, 0), 0);
2679             if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
2680                 hv_store(RETVAL, "int_curr_symbol", 15,
2681                     newSVpv(lcbuf->int_curr_symbol, 0), 0);
2682             if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
2683                 hv_store(RETVAL, "currency_symbol", 15,
2684                     newSVpv(lcbuf->currency_symbol, 0), 0);
2685             if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
2686                 hv_store(RETVAL, "mon_decimal_point", 17,
2687                     newSVpv(lcbuf->mon_decimal_point, 0), 0);
2688             if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
2689                 hv_store(RETVAL, "mon_thousands_sep", 17,
2690                     newSVpv(lcbuf->mon_thousands_sep, 0), 0);
2691             if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
2692                 hv_store(RETVAL, "mon_grouping", 12,
2693                     newSVpv(lcbuf->mon_grouping, 0), 0);
2694             if (lcbuf->positive_sign && *lcbuf->positive_sign)
2695                 hv_store(RETVAL, "positive_sign", 13,
2696                     newSVpv(lcbuf->positive_sign, 0), 0);
2697             if (lcbuf->negative_sign && *lcbuf->negative_sign)
2698                 hv_store(RETVAL, "negative_sign", 13,
2699                     newSVpv(lcbuf->negative_sign, 0), 0);
2700             /* the integers */
2701             if (lcbuf->int_frac_digits != CHAR_MAX)
2702                 hv_store(RETVAL, "int_frac_digits", 15,
2703                     newSViv(lcbuf->int_frac_digits), 0);
2704             if (lcbuf->frac_digits != CHAR_MAX)
2705                 hv_store(RETVAL, "frac_digits", 11,
2706                     newSViv(lcbuf->frac_digits), 0);
2707             if (lcbuf->p_cs_precedes != CHAR_MAX)
2708                 hv_store(RETVAL, "p_cs_precedes", 13,
2709                     newSViv(lcbuf->p_cs_precedes), 0);
2710             if (lcbuf->p_sep_by_space != CHAR_MAX)
2711                 hv_store(RETVAL, "p_sep_by_space", 14,
2712                     newSViv(lcbuf->p_sep_by_space), 0);
2713             if (lcbuf->n_cs_precedes != CHAR_MAX)
2714                 hv_store(RETVAL, "n_cs_precedes", 13,
2715                     newSViv(lcbuf->n_cs_precedes), 0);
2716             if (lcbuf->n_sep_by_space != CHAR_MAX)
2717                 hv_store(RETVAL, "n_sep_by_space", 14,
2718                     newSViv(lcbuf->n_sep_by_space), 0);
2719             if (lcbuf->p_sign_posn != CHAR_MAX)
2720                 hv_store(RETVAL, "p_sign_posn", 11,
2721                     newSViv(lcbuf->p_sign_posn), 0);
2722             if (lcbuf->n_sign_posn != CHAR_MAX)
2723                 hv_store(RETVAL, "n_sign_posn", 11,
2724                     newSViv(lcbuf->n_sign_posn), 0);
2725         }
2726 #else
2727         localeconv(); /* A stub to call not_here(). */
2728 #endif
2729     OUTPUT:
2730         RETVAL
2731
2732 char *
2733 setlocale(category, locale = 0)
2734         int             category
2735         char *          locale
2736     CODE:
2737         RETVAL = setlocale(category, locale);
2738         if (RETVAL) {
2739 #ifdef USE_LOCALE_CTYPE
2740             if (category == LC_CTYPE
2741 #ifdef LC_ALL
2742                 || category == LC_ALL
2743 #endif
2744                 )
2745             {
2746                 char *newctype;
2747 #ifdef LC_ALL
2748                 if (category == LC_ALL)
2749                     newctype = setlocale(LC_CTYPE, NULL);
2750                 else
2751 #endif
2752                     newctype = RETVAL;
2753                 perl_new_ctype(newctype);
2754             }
2755 #endif /* USE_LOCALE_CTYPE */
2756 #ifdef USE_LOCALE_COLLATE
2757             if (category == LC_COLLATE
2758 #ifdef LC_ALL
2759                 || category == LC_ALL
2760 #endif
2761                 )
2762             {
2763                 char *newcoll;
2764 #ifdef LC_ALL
2765                 if (category == LC_ALL)
2766                     newcoll = setlocale(LC_COLLATE, NULL);
2767                 else
2768 #endif
2769                     newcoll = RETVAL;
2770                 perl_new_collate(newcoll);
2771             }
2772 #endif /* USE_LOCALE_COLLATE */
2773 #ifdef USE_LOCALE_NUMERIC
2774             if (category == LC_NUMERIC
2775 #ifdef LC_ALL
2776                 || category == LC_ALL
2777 #endif
2778                 )
2779             {
2780                 char *newnum;
2781 #ifdef LC_ALL
2782                 if (category == LC_ALL)
2783                     newnum = setlocale(LC_NUMERIC, NULL);
2784                 else
2785 #endif
2786                     newnum = RETVAL;
2787                 perl_new_numeric(newnum);
2788             }
2789 #endif /* USE_LOCALE_NUMERIC */
2790         }
2791     OUTPUT:
2792         RETVAL
2793
2794
2795 double
2796 acos(x)
2797         double          x
2798
2799 double
2800 asin(x)
2801         double          x
2802
2803 double
2804 atan(x)
2805         double          x
2806
2807 double
2808 ceil(x)
2809         double          x
2810
2811 double
2812 cosh(x)
2813         double          x
2814
2815 double
2816 floor(x)
2817         double          x
2818
2819 double
2820 fmod(x,y)
2821         double          x
2822         double          y
2823
2824 void
2825 frexp(x)
2826         double          x
2827     PPCODE:
2828         int expvar;
2829         /* (We already know stack is long enough.) */
2830         PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
2831         PUSHs(sv_2mortal(newSViv(expvar)));
2832
2833 double
2834 ldexp(x,exp)
2835         double          x
2836         int             exp
2837
2838 double
2839 log10(x)
2840         double          x
2841
2842 void
2843 modf(x)
2844         double          x
2845     PPCODE:
2846         double intvar;
2847         /* (We already know stack is long enough.) */
2848         PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
2849         PUSHs(sv_2mortal(newSVnv(intvar)));
2850
2851 double
2852 sinh(x)
2853         double          x
2854
2855 double
2856 tan(x)
2857         double          x
2858
2859 double
2860 tanh(x)
2861         double          x
2862
2863 SysRet
2864 sigaction(sig, action, oldaction = 0)
2865         int                     sig
2866         POSIX::SigAction        action
2867         POSIX::SigAction        oldaction
2868     CODE:
2869
2870 # This code is really grody because we're trying to make the signal
2871 # interface look beautiful, which is hard.
2872
2873         if (!siggv)
2874             gv_fetchpv("SIG", TRUE, SVt_PVHV);
2875
2876         {
2877             struct sigaction act;
2878             struct sigaction oact;
2879             POSIX__SigSet sigset;
2880             SV** svp;
2881             SV** sigsvp = hv_fetch(GvHVn(siggv),
2882                                  sig_name[sig],
2883                                  strlen(sig_name[sig]),
2884                                  TRUE);
2885
2886             /* Remember old handler name if desired. */
2887             if (oldaction) {
2888                 char *hand = SvPVx(*sigsvp, na);
2889                 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
2890                 sv_setpv(*svp, *hand ? hand : "DEFAULT");
2891             }
2892
2893             if (action) {
2894                 /* Vector new handler through %SIG.  (We always use sighandler
2895                    for the C signal handler, which reads %SIG to dispatch.) */
2896                 svp = hv_fetch(action, "HANDLER", 7, FALSE);
2897                 if (!svp)
2898                     croak("Can't supply an action without a HANDLER");
2899                 sv_setpv(*sigsvp, SvPV(*svp, na));
2900                 mg_set(*sigsvp);        /* handles DEFAULT and IGNORE */
2901                 act.sa_handler = sighandler;
2902
2903                 /* Set up any desired mask. */
2904                 svp = hv_fetch(action, "MASK", 4, FALSE);
2905                 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
2906                     unsigned long tmp;
2907                     tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
2908                     sigset = (sigset_t*) tmp;
2909                     act.sa_mask = *sigset;
2910                 }
2911                 else
2912                     sigemptyset(& act.sa_mask);
2913
2914                 /* Set up any desired flags. */
2915                 svp = hv_fetch(action, "FLAGS", 5, FALSE);
2916                 act.sa_flags = svp ? SvIV(*svp) : 0;
2917             }
2918
2919             /* Now work around sigaction oddities */
2920             if (action && oldaction)
2921                 RETVAL = sigaction(sig, & act, & oact);
2922             else if (action)
2923                 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
2924             else if (oldaction)
2925                 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
2926             else
2927                 RETVAL = -1;
2928
2929             if (oldaction) {
2930                 /* Get back the mask. */
2931                 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
2932                 if (sv_isa(*svp, "POSIX::SigSet")) {
2933                     unsigned long tmp;
2934                     tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
2935                     sigset = (sigset_t*) tmp;
2936                 }
2937                 else {
2938                     sigset = (sigset_t*)safemalloc(sizeof(sigset_t));
2939                     sv_setptrobj(*svp, sigset, "POSIX::SigSet");
2940                 }
2941                 *sigset = oact.sa_mask;
2942
2943                 /* Get back the flags. */
2944                 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
2945                 sv_setiv(*svp, oact.sa_flags);
2946             }
2947         }
2948     OUTPUT:
2949         RETVAL
2950
2951 SysRet
2952 sigpending(sigset)
2953         POSIX::SigSet           sigset
2954
2955 SysRet
2956 sigprocmask(how, sigset, oldsigset = 0)
2957         int                     how
2958         POSIX::SigSet           sigset
2959         POSIX::SigSet           oldsigset
2960
2961 SysRet
2962 sigsuspend(signal_mask)
2963         POSIX::SigSet           signal_mask
2964
2965 void
2966 _exit(status)
2967         int             status
2968
2969 SysRet
2970 close(fd)
2971         int             fd
2972
2973 SysRet
2974 dup(fd)
2975         int             fd
2976
2977 SysRet
2978 dup2(fd1, fd2)
2979         int             fd1
2980         int             fd2
2981
2982 SysRetLong
2983 lseek(fd, offset, whence)
2984         int             fd
2985         Off_t           offset
2986         int             whence
2987
2988 SysRet
2989 nice(incr)
2990         int             incr
2991
2992 int
2993 pipe()
2994     PPCODE:
2995         int fds[2];
2996         if (pipe(fds) != -1) {
2997             EXTEND(sp,2);
2998             PUSHs(sv_2mortal(newSViv(fds[0])));
2999             PUSHs(sv_2mortal(newSViv(fds[1])));
3000         }
3001
3002 SysRet
3003 read(fd, buffer, nbytes)
3004     PREINIT:
3005         SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
3006     INPUT:
3007         int             fd
3008         size_t          nbytes
3009         char *          buffer = sv_grow( sv_buffer, nbytes+1 );
3010     CLEANUP:
3011         if (RETVAL >= 0) {
3012             SvCUR(sv_buffer) = RETVAL;
3013             SvPOK_only(sv_buffer);
3014             *SvEND(sv_buffer) = '\0';
3015             SvTAINTED_on(sv_buffer);
3016         }
3017
3018 SysRet
3019 setpgid(pid, pgid)
3020         pid_t           pid
3021         pid_t           pgid
3022
3023 pid_t
3024 setsid()
3025
3026 pid_t
3027 tcgetpgrp(fd)
3028         int             fd
3029
3030 SysRet
3031 tcsetpgrp(fd, pgrp_id)
3032         int             fd
3033         pid_t           pgrp_id
3034
3035 int
3036 uname()
3037     PPCODE:
3038 #ifdef HAS_UNAME
3039         struct utsname buf;
3040         if (uname(&buf) >= 0) {
3041             EXTEND(sp, 5);
3042             PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
3043             PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
3044             PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
3045             PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
3046             PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
3047         }
3048 #else
3049         uname((char *) 0); /* A stub to call not_here(). */
3050 #endif
3051
3052 SysRet
3053 write(fd, buffer, nbytes)
3054         int             fd
3055         char *          buffer
3056         size_t          nbytes
3057
3058 char *
3059 tmpnam(s = 0)
3060         char *          s = 0;
3061
3062 void
3063 abort()
3064
3065 int
3066 mblen(s, n)
3067         char *          s
3068         size_t          n
3069
3070 size_t
3071 mbstowcs(s, pwcs, n)
3072         wchar_t *       s
3073         char *          pwcs
3074         size_t          n
3075
3076 int
3077 mbtowc(pwc, s, n)
3078         wchar_t *       pwc
3079         char *          s
3080         size_t          n
3081
3082 int
3083 wcstombs(s, pwcs, n)
3084         char *          s
3085         wchar_t *       pwcs
3086         size_t          n
3087
3088 int
3089 wctomb(s, wchar)
3090         char *          s
3091         wchar_t         wchar
3092
3093 int
3094 strcoll(s1, s2)
3095         char *          s1
3096         char *          s2
3097
3098 void
3099 strtod(str)
3100         char *          str
3101     PREINIT:
3102         double num;
3103         char *unparsed;
3104     PPCODE:
3105         SET_NUMERIC_LOCAL();
3106         num = strtod(str, &unparsed);
3107         PUSHs(sv_2mortal(newSVnv(num)));
3108         if (GIMME == G_ARRAY) {
3109             EXTEND(sp, 1);
3110             if (unparsed)
3111                 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3112             else
3113                 PUSHs(&sv_undef);
3114         }
3115
3116 void
3117 strtol(str, base = 0)
3118         char *          str
3119         int             base
3120     PREINIT:
3121         long num;
3122         char *unparsed;
3123     PPCODE:
3124         num = strtol(str, &unparsed, base);
3125         if (num >= IV_MIN && num <= IV_MAX)
3126             PUSHs(sv_2mortal(newSViv((IV)num)));
3127         else
3128             PUSHs(sv_2mortal(newSVnv((double)num)));
3129         if (GIMME == G_ARRAY) {
3130             EXTEND(sp, 1);
3131             if (unparsed)
3132                 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3133             else
3134                 PUSHs(&sv_undef);
3135         }
3136
3137 void
3138 strtoul(str, base = 0)
3139         char *          str
3140         int             base
3141     PREINIT:
3142         unsigned long num;
3143         char *unparsed;
3144     PPCODE:
3145         num = strtoul(str, &unparsed, base);
3146         if (num <= IV_MAX)
3147             PUSHs(sv_2mortal(newSViv((IV)num)));
3148         else
3149             PUSHs(sv_2mortal(newSVnv((double)num)));
3150         if (GIMME == G_ARRAY) {
3151             EXTEND(sp, 1);
3152             if (unparsed)
3153                 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3154             else
3155                 PUSHs(&sv_undef);
3156         }
3157
3158 SV *
3159 strxfrm(src)
3160         SV *            src
3161     CODE:
3162         {
3163           STRLEN srclen;
3164           STRLEN dstlen;
3165           char *p = SvPV(src,srclen);
3166           srclen++;
3167           ST(0) = sv_2mortal(NEWSV(800,srclen));
3168           dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
3169           if (dstlen > srclen) {
3170               dstlen++;
3171               SvGROW(ST(0), dstlen);
3172               strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
3173               dstlen--;
3174           }
3175           SvCUR(ST(0)) = dstlen;
3176             SvPOK_only(ST(0));
3177         }
3178
3179 SysRet
3180 mkfifo(filename, mode)
3181         char *          filename
3182         Mode_t          mode
3183     CODE:
3184         TAINT_PROPER("mkfifo");
3185         RETVAL = mkfifo(filename, mode);
3186     OUTPUT:
3187         RETVAL
3188
3189 SysRet
3190 tcdrain(fd)
3191         int             fd
3192
3193
3194 SysRet
3195 tcflow(fd, action)
3196         int             fd
3197         int             action
3198
3199
3200 SysRet
3201 tcflush(fd, queue_selector)
3202         int             fd
3203         int             queue_selector
3204
3205 SysRet
3206 tcsendbreak(fd, duration)
3207         int             fd
3208         int             duration
3209
3210 char *
3211 asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3212         int             sec
3213         int             min
3214         int             hour
3215         int             mday
3216         int             mon
3217         int             year
3218         int             wday
3219         int             yday
3220         int             isdst
3221     CODE:
3222         {
3223             struct tm mytm;
3224             init_tm(&mytm);     /* XXX workaround - see init_tm() above */
3225             mytm.tm_sec = sec;
3226             mytm.tm_min = min;
3227             mytm.tm_hour = hour;
3228             mytm.tm_mday = mday;
3229             mytm.tm_mon = mon;
3230             mytm.tm_year = year;
3231             mytm.tm_wday = wday;
3232             mytm.tm_yday = yday;
3233             mytm.tm_isdst = isdst;
3234             RETVAL = asctime(&mytm);
3235         }
3236     OUTPUT:
3237         RETVAL
3238
3239 long
3240 clock()
3241
3242 char *
3243 ctime(time)
3244         Time_t          &time
3245
3246 void
3247 times()
3248         PPCODE:
3249         struct tms tms;
3250         clock_t realtime;
3251         realtime = times( &tms );
3252         EXTEND(sp,5);
3253         PUSHs( sv_2mortal( newSVnv( realtime ) ) );
3254         PUSHs( sv_2mortal( newSVnv( tms.tms_utime ) ) );
3255         PUSHs( sv_2mortal( newSVnv( tms.tms_stime ) ) );
3256         PUSHs( sv_2mortal( newSVnv( tms.tms_cutime ) ) );
3257         PUSHs( sv_2mortal( newSVnv( tms.tms_cstime ) ) );
3258
3259 double
3260 difftime(time1, time2)
3261         Time_t          time1
3262         Time_t          time2
3263
3264 SysRetLong
3265 mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3266         int             sec
3267         int             min
3268         int             hour
3269         int             mday
3270         int             mon
3271         int             year
3272         int             wday
3273         int             yday
3274         int             isdst
3275     CODE:
3276         {
3277             struct tm mytm;
3278             init_tm(&mytm);     /* XXX workaround - see init_tm() above */
3279             mytm.tm_sec = sec;
3280             mytm.tm_min = min;
3281             mytm.tm_hour = hour;
3282             mytm.tm_mday = mday;
3283             mytm.tm_mon = mon;
3284             mytm.tm_year = year;
3285             mytm.tm_wday = wday;
3286             mytm.tm_yday = yday;
3287             mytm.tm_isdst = isdst;
3288             RETVAL = mktime(&mytm);
3289         }
3290     OUTPUT:
3291         RETVAL
3292
3293 char *
3294 strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3295         char *          fmt
3296         int             sec
3297         int             min
3298         int             hour
3299         int             mday
3300         int             mon
3301         int             year
3302         int             wday
3303         int             yday
3304         int             isdst
3305     CODE:
3306         {
3307             char tmpbuf[128];
3308             struct tm mytm;
3309             int len;
3310             init_tm(&mytm);     /* XXX workaround - see init_tm() above */
3311             mytm.tm_sec = sec;
3312             mytm.tm_min = min;
3313             mytm.tm_hour = hour;
3314             mytm.tm_mday = mday;
3315             mytm.tm_mon = mon;
3316             mytm.tm_year = year;
3317             mytm.tm_wday = wday;
3318             mytm.tm_yday = yday;
3319             mytm.tm_isdst = isdst;
3320             len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
3321             ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
3322         }
3323
3324 void
3325 tzset()
3326
3327 void
3328 tzname()
3329     PPCODE:
3330         EXTEND(sp,2);
3331         PUSHs(sv_2mortal(newSVpv(tzname[0],strlen(tzname[0]))));
3332         PUSHs(sv_2mortal(newSVpv(tzname[1],strlen(tzname[1]))));
3333
3334 SysRet
3335 access(filename, mode)
3336         char *          filename
3337         Mode_t          mode
3338
3339 char *
3340 ctermid(s = 0)
3341         char *          s = 0;
3342
3343 char *
3344 cuserid(s = 0)
3345         char *          s = 0;
3346
3347 SysRetLong
3348 fpathconf(fd, name)
3349         int             fd
3350         int             name
3351
3352 SysRetLong
3353 pathconf(filename, name)
3354         char *          filename
3355         int             name
3356
3357 SysRet
3358 pause()
3359
3360 SysRetLong
3361 sysconf(name)
3362         int             name
3363
3364 char *
3365 ttyname(fd)
3366         int             fd