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