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