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