5 #define PERL_NO_GET_CONTEXT
8 #define PERLIO_NOT_STDIO 1
11 #if defined(PERL_OBJECT) || defined(PERL_CAPI) || defined(PERL_IMPLICIT_SYS)
15 # define open PerlLIO_open3
18 #ifdef I_DIRENT /* XXX maybe better to just rely on perl.h? */
41 /* XXX This comment is just to make I_TERMIO and I_SGTTY visible to
42 metaconfig for future extension writers. We don't use them in POSIX.
43 (This is really sneaky :-) --AD
45 #if defined(I_TERMIOS)
53 #include <sys/types.h>
58 #ifdef MACOS_TRADITIONAL
63 #if defined(__VMS) && !defined(__POSIX_SOURCE)
64 # include <libdef.h> /* LIB$_INVARG constant */
65 # include <lib$routines.h> /* prototype for lib$ediv() */
66 # include <starlet.h> /* prototype for sys$gettim() */
67 # if DECC_VERSION < 50000000
68 # define pid_t int /* old versions of DECC miss this in types.h */
72 # define mkfifo(a,b) (not_here("mkfifo"),-1)
73 # define tzset() not_here("tzset")
75 #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
76 # define HAS_TZNAME /* shows up in VMS 7.0 or Dec C 5.6 */
78 # endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
80 /* The POSIX notion of ttyname() is better served by getname() under VMS */
81 static char ttnambuf[64];
82 # define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
84 /* The non-POSIX CRTL times() has void return type, so we just get the
85 current time directly */
86 clock_t vms_times(struct tms *bufptr) {
89 /* Get wall time and convert to 10 ms intervals to
90 * produce the return value that the POSIX standard expects */
91 # if defined(__DECC) && defined (__ALPHA)
94 _ckvmssts(sys$gettim(&vmstime));
96 retval = vmstime & 0x7fffffff;
98 /* (Older hw or ccs don't have an atomic 64-bit type, so we
99 * juggle 32-bit ints (and a float) to produce a time_t result
100 * with minimal loss of information.) */
101 long int vmstime[2],remainder,divisor = 100000;
102 _ckvmssts(sys$gettim((unsigned long int *)vmstime));
103 vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
104 _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
106 /* Fill in the struct tms using the CRTL routine . . .*/
107 times((tbuffer_t *)bufptr);
108 return (clock_t) retval;
110 # define times(t) vms_times(t)
112 #if defined (__CYGWIN__)
113 # define tzname _tzname
117 # define mkfifo(a,b) not_here("mkfifo")
118 # define ttyname(a) (char*)not_here("ttyname")
119 # define sigset_t long
122 # define tzname _tzname
125 # define mode_t short
128 # define mode_t short
130 # define tzset() not_here("tzset")
132 # ifndef _POSIX_OPEN_MAX
133 # define _POSIX_OPEN_MAX FOPEN_MAX /* XXX bogus ? */
136 # define sigaction(a,b,c) not_here("sigaction")
137 # define sigpending(a) not_here("sigpending")
138 # define sigprocmask(a,b,c) not_here("sigprocmask")
139 # define sigsuspend(a) not_here("sigsuspend")
140 # define sigemptyset(a) not_here("sigemptyset")
141 # define sigaddset(a,b) not_here("sigaddset")
142 # define sigdelset(a,b) not_here("sigdelset")
143 # define sigfillset(a) not_here("sigfillset")
144 # define sigismember(a,b) not_here("sigismember")
148 # if defined(OS2) || defined(MACOS_TRADITIONAL)
149 # define mkfifo(a,b) not_here("mkfifo")
150 # else /* !( defined OS2 ) */
152 # define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
155 # endif /* !HAS_MKFIFO */
157 # ifdef MACOS_TRADITIONAL
158 struct tms { time_t tms_utime, tms_stime, tms_cutime, tms_cstime; };
159 # define times(a) not_here("times")
160 # define ttyname(a) (char*)not_here("ttyname")
161 # define tzset() not_here("tzset")
164 # include <sys/times.h>
166 # include <sys/utsname.h>
168 # include <sys/wait.h>
177 typedef long SysRetLong;
178 typedef sigset_t* POSIX__SigSet;
179 typedef HV* POSIX__SigAction;
181 typedef struct termios* POSIX__Termios;
182 #else /* Define termios types to int, and call not_here for the functions.*/
183 #define POSIX__Termios int
187 #define cfgetispeed(x) not_here("cfgetispeed")
188 #define cfgetospeed(x) not_here("cfgetospeed")
189 #define tcdrain(x) not_here("tcdrain")
190 #define tcflush(x,y) not_here("tcflush")
191 #define tcsendbreak(x,y) not_here("tcsendbreak")
192 #define cfsetispeed(x,y) not_here("cfsetispeed")
193 #define cfsetospeed(x,y) not_here("cfsetospeed")
194 #define ctermid(x) (char *) not_here("ctermid")
195 #define tcflow(x,y) not_here("tcflow")
196 #define tcgetattr(x,y) not_here("tcgetattr")
197 #define tcsetattr(x,y,z) not_here("tcsetattr")
200 /* Possibly needed prototypes */
201 char *cuserid (char *);
202 double strtod (const char *, char **);
203 long strtol (const char *, char **, int);
204 unsigned long strtoul (const char *, char **, int);
207 #define cuserid(a) (char *) not_here("cuserid")
211 #define difftime(a,b) not_here("difftime")
214 #ifndef HAS_FPATHCONF
215 #define fpathconf(f,n) (SysRetLong) not_here("fpathconf")
218 #define mktime(a) not_here("mktime")
221 #define nice(a) not_here("nice")
224 #define pathconf(f,n) (SysRetLong) not_here("pathconf")
227 #define sysconf(n) (SysRetLong) not_here("sysconf")
230 #define readlink(a,b,c) not_here("readlink")
233 #define setpgid(a,b) not_here("setpgid")
236 #define setsid() not_here("setsid")
239 #define strcoll(s1,s2) not_here("strcoll")
242 #define strtod(s1,s2) not_here("strtod")
245 #define strtol(s1,s2,b) not_here("strtol")
248 #define strtoul(s1,s2,b) not_here("strtoul")
251 #define strxfrm(s1,s2,n) not_here("strxfrm")
253 #ifndef HAS_TCGETPGRP
254 #define tcgetpgrp(a) not_here("tcgetpgrp")
256 #ifndef HAS_TCSETPGRP
257 #define tcsetpgrp(a,b) not_here("tcsetpgrp")
260 #define times(a) not_here("times")
263 #define uname(a) not_here("uname")
266 #define waitpid(a,b,c) not_here("waitpid")
271 #define mblen(a,b) not_here("mblen")
275 #define mbstowcs(s, pwcs, n) not_here("mbstowcs")
278 #define mbtowc(pwc, s, n) not_here("mbtowc")
281 #define wcstombs(s, pwcs, n) not_here("wcstombs")
284 #define wctomb(s, wchar) not_here("wcstombs")
286 #if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
287 /* If we don't have these functions, then we wouldn't have gotten a typedef
288 for wchar_t, the wide character type. Defining wchar_t allows the
289 functions referencing it to compile. Its actual type is then meaningless,
290 since without the above functions, all sections using it end up calling
291 not_here() and croak. --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
297 #ifndef HAS_LOCALECONV
298 #define localeconv() not_here("localeconv")
302 # if !defined(WIN32) && !defined(__CYGWIN__)
303 extern char *tzname[];
306 #if !defined(WIN32) || (defined(__MINGW32__) && !defined(tzname))
307 char *tzname[] = { "" , "" };
311 /* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
312 * fields for which we don't have Configure support yet:
313 * char *tm_zone; -- abbreviation of timezone name
314 * long tm_gmtoff; -- offset from GMT in seconds
315 * To workaround core dumps from the uninitialised tm_zone we get the
316 * system to give us a reasonable struct to copy. This fix means that
317 * strftime uses the tm_zone and tm_gmtoff values returned by
318 * localtime(time()). That should give the desired result most of the
319 * time. But probably not always!
321 * This is a temporary workaround to be removed once Configure
322 * support is added and NETaa14816 is considered in full.
323 * It does not address tzname aspects of NETaa14816.
326 # ifndef STRUCT_TM_HASZONE
327 # define STRUCT_TM_HASZONE
331 #ifdef STRUCT_TM_HASZONE
333 init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
337 Copy(localtime(&now), ptm, 1, struct tm);
341 # define init_tm(ptm)
345 * mini_mktime - normalise struct tm values without the localtime()
346 * semantics (and overhead) of mktime().
349 mini_mktime(struct tm *ptm)
353 int month, mday, year, jday;
354 int odd_cent, odd_year;
356 #define DAYS_PER_YEAR 365
357 #define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
358 #define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
359 #define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
360 #define SECS_PER_HOUR (60*60)
361 #define SECS_PER_DAY (24*SECS_PER_HOUR)
362 /* parentheses deliberately absent on these two, otherwise they don't work */
363 #define MONTH_TO_DAYS 153/5
364 #define DAYS_TO_MONTH 5/153
365 /* offset to bias by March (month 4) 1st between month/mday & year finding */
366 #define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
367 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
368 #define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
371 * Year/day algorithm notes:
373 * With a suitable offset for numeric value of the month, one can find
374 * an offset into the year by considering months to have 30.6 (153/5) days,
375 * using integer arithmetic (i.e., with truncation). To avoid too much
376 * messing about with leap days, we consider January and February to be
377 * the 13th and 14th month of the previous year. After that transformation,
378 * we need the month index we use to be high by 1 from 'normal human' usage,
379 * so the month index values we use run from 4 through 15.
381 * Given that, and the rules for the Gregorian calendar (leap years are those
382 * divisible by 4 unless also divisible by 100, when they must be divisible
383 * by 400 instead), we can simply calculate the number of days since some
384 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
385 * the days we derive from our month index, and adding in the day of the
386 * month. The value used here is not adjusted for the actual origin which
387 * it normally would use (1 January A.D. 1), since we're not exposing it.
388 * We're only building the value so we can turn around and get the
389 * normalised values for the year, month, day-of-month, and day-of-year.
391 * For going backward, we need to bias the value we're using so that we find
392 * the right year value. (Basically, we don't want the contribution of
393 * March 1st to the number to apply while deriving the year). Having done
394 * that, we 'count up' the contribution to the year number by accounting for
395 * full quadracenturies (400-year periods) with their extra leap days, plus
396 * the contribution from full centuries (to avoid counting in the lost leap
397 * days), plus the contribution from full quad-years (to count in the normal
398 * leap days), plus the leftover contribution from any non-leap years.
399 * At this point, if we were working with an actual leap day, we'll have 0
400 * days left over. This is also true for March 1st, however. So, we have
401 * to special-case that result, and (earlier) keep track of the 'odd'
402 * century and year contributions. If we got 4 extra centuries in a qcent,
403 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
404 * Otherwise, we add back in the earlier bias we removed (the 123 from
405 * figuring in March 1st), find the month index (integer division by 30.6),
406 * and the remainder is the day-of-month. We then have to convert back to
407 * 'real' months (including fixing January and February from being 14/15 in
408 * the previous year to being in the proper year). After that, to get
409 * tm_yday, we work with the normalised year and get a new yearday value for
410 * January 1st, which we subtract from the yearday value we had earlier,
411 * representing the date we've re-built. This is done from January 1
412 * because tm_yday is 0-origin.
414 * Since POSIX time routines are only guaranteed to work for times since the
415 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
416 * applies Gregorian calendar rules even to dates before the 16th century
417 * doesn't bother me. Besides, you'd need cultural context for a given
418 * date to know whether it was Julian or Gregorian calendar, and that's
419 * outside the scope for this routine. Since we convert back based on the
420 * same rules we used to build the yearday, you'll only get strange results
421 * for input which needed normalising, or for the 'odd' century years which
422 * were leap years in the Julian calander but not in the Gregorian one.
423 * I can live with that.
425 * This algorithm also fails to handle years before A.D. 1 gracefully, but
426 * that's still outside the scope for POSIX time manipulation, so I don't
430 year = 1900 + ptm->tm_year;
433 /* allow given yday with no month & mday to dominate the result */
434 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
437 jday = 1 + ptm->tm_yday;
446 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
447 yearday += month*MONTH_TO_DAYS + mday + jday;
449 * Note that we don't know when leap-seconds were or will be,
450 * so we have to trust the user if we get something which looks
451 * like a sensible leap-second. Wild values for seconds will
452 * be rationalised, however.
454 if ((unsigned) ptm->tm_sec <= 60) {
461 secs += 60 * ptm->tm_min;
462 secs += SECS_PER_HOUR * ptm->tm_hour;
464 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
465 /* got negative remainder, but need positive time */
466 /* back off an extra day to compensate */
467 yearday += (secs/SECS_PER_DAY)-1;
468 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
471 yearday += (secs/SECS_PER_DAY);
472 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
475 else if (secs >= SECS_PER_DAY) {
476 yearday += (secs/SECS_PER_DAY);
477 secs %= SECS_PER_DAY;
479 ptm->tm_hour = secs/SECS_PER_HOUR;
480 secs %= SECS_PER_HOUR;
481 ptm->tm_min = secs/60;
484 /* done with time of day effects */
486 * The algorithm for yearday has (so far) left it high by 428.
487 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
488 * bias it by 123 while trying to figure out what year it
489 * really represents. Even with this tweak, the reverse
490 * translation fails for years before A.D. 0001.
491 * It would still fail for Feb 29, but we catch that one below.
493 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
494 yearday -= YEAR_ADJUST;
495 year = (yearday / DAYS_PER_QCENT) * 400;
496 yearday %= DAYS_PER_QCENT;
497 odd_cent = yearday / DAYS_PER_CENT;
498 year += odd_cent * 100;
499 yearday %= DAYS_PER_CENT;
500 year += (yearday / DAYS_PER_QYEAR) * 4;
501 yearday %= DAYS_PER_QYEAR;
502 odd_year = yearday / DAYS_PER_YEAR;
504 yearday %= DAYS_PER_YEAR;
505 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
510 yearday += YEAR_ADJUST; /* recover March 1st crock */
511 month = yearday*DAYS_TO_MONTH;
512 yearday -= month*MONTH_TO_DAYS;
513 /* recover other leap-year adjustment */
522 ptm->tm_year = year - 1900;
524 ptm->tm_mday = yearday;
529 ptm->tm_mon = month - 1;
531 /* re-build yearday based on Jan 1 to get tm_yday */
533 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
534 yearday += 14*MONTH_TO_DAYS + 1;
535 ptm->tm_yday = jday - yearday;
536 /* fix tm_wday if not overridden by caller */
537 if ((unsigned)ptm->tm_wday > 6)
538 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
541 #ifdef HAS_LONG_DOUBLE
542 # if LONG_DOUBLESIZE > NVSIZE
543 # undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */
547 #ifndef HAS_LONG_DOUBLE
562 croak("POSIX::%s not implemented on this architecture", s);
568 constant(char *name, int arg)
573 if (strEQ(name, "ARG_MAX"))
581 if (strEQ(name, "BUFSIZ"))
587 if (strEQ(name, "BRKINT"))
593 if (strEQ(name, "B9600"))
599 if (strEQ(name, "B19200"))
605 if (strEQ(name, "B38400"))
611 if (strEQ(name, "B0"))
617 if (strEQ(name, "B110"))
623 if (strEQ(name, "B1200"))
629 if (strEQ(name, "B134"))
635 if (strEQ(name, "B150"))
641 if (strEQ(name, "B1800"))
647 if (strEQ(name, "B200"))
653 if (strEQ(name, "B2400"))
659 if (strEQ(name, "B300"))
665 if (strEQ(name, "B4800"))
671 if (strEQ(name, "B50"))
677 if (strEQ(name, "B600"))
683 if (strEQ(name, "B75"))
691 if (strEQ(name, "CHAR_BIT"))
697 if (strEQ(name, "CHAR_MAX"))
703 if (strEQ(name, "CHAR_MIN"))
709 if (strEQ(name, "CHILD_MAX"))
715 if (strEQ(name, "CLK_TCK"))
721 if (strEQ(name, "CLOCAL"))
727 if (strEQ(name, "CLOCKS_PER_SEC"))
728 #ifdef CLOCKS_PER_SEC
729 return CLOCKS_PER_SEC;
733 if (strEQ(name, "CREAD"))
739 if (strEQ(name, "CS5"))
745 if (strEQ(name, "CS6"))
751 if (strEQ(name, "CS7"))
757 if (strEQ(name, "CS8"))
763 if (strEQ(name, "CSIZE"))
769 if (strEQ(name, "CSTOPB"))
777 if (strEQ(name, "DBL_MAX"))
783 if (strEQ(name, "DBL_MIN"))
789 if (strEQ(name, "DBL_DIG"))
795 if (strEQ(name, "DBL_EPSILON"))
801 if (strEQ(name, "DBL_MANT_DIG"))
807 if (strEQ(name, "DBL_MAX_10_EXP"))
808 #ifdef DBL_MAX_10_EXP
809 return DBL_MAX_10_EXP;
813 if (strEQ(name, "DBL_MAX_EXP"))
819 if (strEQ(name, "DBL_MIN_10_EXP"))
820 #ifdef DBL_MIN_10_EXP
821 return DBL_MIN_10_EXP;
825 if (strEQ(name, "DBL_MIN_EXP"))
835 if (strEQ(name, "EACCES"))
841 if (strEQ(name, "EADDRINUSE"))
847 if (strEQ(name, "EADDRNOTAVAIL"))
849 return EADDRNOTAVAIL;
853 if (strEQ(name, "EAFNOSUPPORT"))
859 if (strEQ(name, "EAGAIN"))
865 if (strEQ(name, "EALREADY"))
873 if (strEQ(name, "EBADF"))
879 if (strEQ(name, "EBUSY"))
887 if (strEQ(name, "ECHILD"))
893 if (strEQ(name, "ECHO"))
899 if (strEQ(name, "ECHOE"))
905 if (strEQ(name, "ECHOK"))
911 if (strEQ(name, "ECHONL"))
917 if (strEQ(name, "ECONNABORTED"))
923 if (strEQ(name, "ECONNREFUSED"))
929 if (strEQ(name, "ECONNRESET"))
937 if (strEQ(name, "EDEADLK"))
943 if (strEQ(name, "EDESTADDRREQ"))
949 if (strEQ(name, "EDOM"))
955 if (strEQ(name, "EDQUOT"))
963 if (strEQ(name, "EEXIST"))
971 if (strEQ(name, "EFAULT"))
977 if (strEQ(name, "EFBIG"))
985 if (strEQ(name, "EHOSTDOWN"))
991 if (strEQ(name, "EHOSTUNREACH"))
999 if (strEQ(name, "EINPROGRESS"))
1005 if (strEQ(name, "EINTR"))
1011 if (strEQ(name, "EINVAL"))
1017 if (strEQ(name, "EIO"))
1023 if (strEQ(name, "EISCONN"))
1029 if (strEQ(name, "EISDIR"))
1037 if (strEQ(name, "ELOOP"))
1045 if (strEQ(name, "EMFILE"))
1051 if (strEQ(name, "EMLINK"))
1057 if (strEQ(name, "EMSGSIZE"))
1065 if (strEQ(name, "ENETDOWN"))
1071 if (strEQ(name, "ENETRESET"))
1077 if (strEQ(name, "ENETUNREACH"))
1083 if (strEQ(name, "ENOBUFS"))
1089 if (strEQ(name, "ENOEXEC"))
1095 if (strEQ(name, "ENOMEM"))
1101 if (strEQ(name, "ENOPROTOOPT"))
1107 if (strEQ(name, "ENOSPC"))
1113 if (strEQ(name, "ENOTBLK"))
1119 if (strEQ(name, "ENOTCONN"))
1125 if (strEQ(name, "ENOTDIR"))
1131 if (strEQ(name, "ENOTEMPTY"))
1137 if (strEQ(name, "ENOTSOCK"))
1143 if (strEQ(name, "ENOTTY"))
1149 if (strEQ(name, "ENFILE"))
1155 if (strEQ(name, "ENODEV"))
1161 if (strEQ(name, "ENOENT"))
1167 if (strEQ(name, "ENOLCK"))
1173 if (strEQ(name, "ENOSYS"))
1179 if (strEQ(name, "ENXIO"))
1185 if (strEQ(name, "ENAMETOOLONG"))
1187 return ENAMETOOLONG;
1193 if (strEQ(name, "EOF"))
1199 if (strEQ(name, "EOPNOTSUPP"))
1207 if (strEQ(name, "EPERM"))
1213 if (strEQ(name, "EPFNOSUPPORT"))
1215 return EPFNOSUPPORT;
1219 if (strEQ(name, "EPIPE"))
1225 if (strEQ(name, "EPROCLIM"))
1231 if (strEQ(name, "EPROTONOSUPPORT"))
1232 #ifdef EPROTONOSUPPORT
1233 return EPROTONOSUPPORT;
1237 if (strEQ(name, "EPROTOTYPE"))
1245 if (strEQ(name, "ERANGE"))
1251 if (strEQ(name, "EREMOTE"))
1257 if (strEQ(name, "ERESTART"))
1263 if (strEQ(name, "EROFS"))
1271 if (strEQ(name, "ESHUTDOWN"))
1277 if (strEQ(name, "ESOCKTNOSUPPORT"))
1278 #ifdef ESOCKTNOSUPPORT
1279 return ESOCKTNOSUPPORT;
1283 if (strEQ(name, "ESPIPE"))
1289 if (strEQ(name, "ESRCH"))
1295 if (strEQ(name, "ESTALE"))
1303 if (strEQ(name, "ETIMEDOUT"))
1309 if (strEQ(name, "ETOOMANYREFS"))
1311 return ETOOMANYREFS;
1315 if (strEQ(name, "ETXTBSY"))
1323 if (strEQ(name, "EUSERS"))
1331 if (strEQ(name, "EWOULDBLOCK"))
1339 if (strEQ(name, "EXIT_FAILURE"))
1341 return EXIT_FAILURE;
1345 if (strEQ(name, "EXIT_SUCCESS"))
1347 return EXIT_SUCCESS;
1351 if (strEQ(name, "EXDEV"))
1359 if (strEQ(name, "E2BIG"))
1367 if (strnEQ(name, "FLT_", 4)) {
1368 if (strEQ(name, "FLT_MAX"))
1374 if (strEQ(name, "FLT_MIN"))
1380 if (strEQ(name, "FLT_ROUNDS"))
1386 if (strEQ(name, "FLT_DIG"))
1392 if (strEQ(name, "FLT_EPSILON"))
1398 if (strEQ(name, "FLT_MANT_DIG"))
1400 return FLT_MANT_DIG;
1404 if (strEQ(name, "FLT_MAX_10_EXP"))
1405 #ifdef FLT_MAX_10_EXP
1406 return FLT_MAX_10_EXP;
1410 if (strEQ(name, "FLT_MAX_EXP"))
1416 if (strEQ(name, "FLT_MIN_10_EXP"))
1417 #ifdef FLT_MIN_10_EXP
1418 return FLT_MIN_10_EXP;
1422 if (strEQ(name, "FLT_MIN_EXP"))
1428 if (strEQ(name, "FLT_RADIX"))
1436 if (strnEQ(name, "F_", 2)) {
1437 if (strEQ(name, "F_DUPFD"))
1443 if (strEQ(name, "F_GETFD"))
1449 if (strEQ(name, "F_GETFL"))
1455 if (strEQ(name, "F_GETLK"))
1461 if (strEQ(name, "F_OK"))
1467 if (strEQ(name, "F_RDLCK"))
1473 if (strEQ(name, "F_SETFD"))
1479 if (strEQ(name, "F_SETFL"))
1485 if (strEQ(name, "F_SETLK"))
1491 if (strEQ(name, "F_SETLKW"))
1497 if (strEQ(name, "F_UNLCK"))
1503 if (strEQ(name, "F_WRLCK"))
1511 if (strEQ(name, "FD_CLOEXEC"))
1517 if (strEQ(name, "FILENAME_MAX"))
1519 return FILENAME_MAX;
1525 if (strEQ(name, "HUGE_VAL"))
1526 #if defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
1527 /* HUGE_VALL is admittedly non-POSIX but if we are using long doubles
1528 * we might as well use long doubles. --jhi */
1536 if (strEQ(name, "HUPCL"))
1544 if (strEQ(name, "INT_MAX"))
1550 if (strEQ(name, "INT_MIN"))
1556 if (strEQ(name, "ICANON"))
1562 if (strEQ(name, "ICRNL"))
1568 if (strEQ(name, "IEXTEN"))
1574 if (strEQ(name, "IGNBRK"))
1580 if (strEQ(name, "IGNCR"))
1586 if (strEQ(name, "IGNPAR"))
1592 if (strEQ(name, "INLCR"))
1598 if (strEQ(name, "INPCK"))
1604 if (strEQ(name, "ISIG"))
1610 if (strEQ(name, "ISTRIP"))
1616 if (strEQ(name, "IXOFF"))
1622 if (strEQ(name, "IXON"))
1630 if (strnEQ(name, "LC_", 3)) {
1631 if (strEQ(name, "LC_ALL"))
1637 if (strEQ(name, "LC_COLLATE"))
1643 if (strEQ(name, "LC_CTYPE"))
1649 if (strEQ(name, "LC_MONETARY"))
1655 if (strEQ(name, "LC_NUMERIC"))
1661 if (strEQ(name, "LC_TIME"))
1669 if (strnEQ(name, "LDBL_", 5)) {
1670 if (strEQ(name, "LDBL_MAX"))
1676 if (strEQ(name, "LDBL_MIN"))
1682 if (strEQ(name, "LDBL_DIG"))
1688 if (strEQ(name, "LDBL_EPSILON"))
1690 return LDBL_EPSILON;
1694 if (strEQ(name, "LDBL_MANT_DIG"))
1695 #ifdef LDBL_MANT_DIG
1696 return LDBL_MANT_DIG;
1700 if (strEQ(name, "LDBL_MAX_10_EXP"))
1701 #ifdef LDBL_MAX_10_EXP
1702 return LDBL_MAX_10_EXP;
1706 if (strEQ(name, "LDBL_MAX_EXP"))
1708 return LDBL_MAX_EXP;
1712 if (strEQ(name, "LDBL_MIN_10_EXP"))
1713 #ifdef LDBL_MIN_10_EXP
1714 return LDBL_MIN_10_EXP;
1718 if (strEQ(name, "LDBL_MIN_EXP"))
1720 return LDBL_MIN_EXP;
1726 if (strnEQ(name, "L_", 2)) {
1727 if (strEQ(name, "L_ctermid"))
1733 if (strEQ(name, "L_cuserid"))
1739 /* L_tmpnam[e] was a typo--retained for compatibility */
1740 if (strEQ(name, "L_tmpname") || strEQ(name, "L_tmpnam"))
1748 if (strEQ(name, "LONG_MAX"))
1754 if (strEQ(name, "LONG_MIN"))
1760 if (strEQ(name, "LINK_MAX"))
1768 if (strEQ(name, "MAX_CANON"))
1774 if (strEQ(name, "MAX_INPUT"))
1780 if (strEQ(name, "MB_CUR_MAX"))
1786 if (strEQ(name, "MB_LEN_MAX"))
1794 if (strEQ(name, "NULL")) return 0;
1795 if (strEQ(name, "NAME_MAX"))
1801 if (strEQ(name, "NCCS"))
1807 if (strEQ(name, "NGROUPS_MAX"))
1813 if (strEQ(name, "NOFLSH"))
1821 if (strnEQ(name, "O_", 2)) {
1822 if (strEQ(name, "O_APPEND"))
1828 if (strEQ(name, "O_CREAT"))
1834 if (strEQ(name, "O_TRUNC"))
1840 if (strEQ(name, "O_RDONLY"))
1846 if (strEQ(name, "O_RDWR"))
1852 if (strEQ(name, "O_WRONLY"))
1858 if (strEQ(name, "O_EXCL"))
1864 if (strEQ(name, "O_NOCTTY"))
1870 if (strEQ(name, "O_NONBLOCK"))
1876 if (strEQ(name, "O_ACCMODE"))
1884 if (strEQ(name, "OPEN_MAX"))
1890 if (strEQ(name, "OPOST"))
1898 if (strEQ(name, "PATH_MAX"))
1904 if (strEQ(name, "PARENB"))
1910 if (strEQ(name, "PARMRK"))
1916 if (strEQ(name, "PARODD"))
1922 if (strEQ(name, "PIPE_BUF"))
1930 if (strEQ(name, "RAND_MAX"))
1936 if (strEQ(name, "R_OK"))
1944 if (strnEQ(name, "SIG", 3)) {
1945 if (name[3] == '_') {
1946 if (strEQ(name, "SIG_BLOCK"))
1953 if (strEQ(name, "SIG_DFL")) return (IV)SIG_DFL;
1956 if (strEQ(name, "SIG_ERR")) return (IV)SIG_ERR;
1959 if (strEQ(name, "SIG_IGN")) return (IV)SIG_IGN;
1961 if (strEQ(name, "SIG_SETMASK"))
1967 if (strEQ(name, "SIG_UNBLOCK"))
1975 if (strEQ(name, "SIGABRT"))
1981 if (strEQ(name, "SIGALRM"))
1987 if (strEQ(name, "SIGCHLD"))
1993 if (strEQ(name, "SIGCONT"))
1999 if (strEQ(name, "SIGFPE"))
2005 if (strEQ(name, "SIGHUP"))
2011 if (strEQ(name, "SIGILL"))
2017 if (strEQ(name, "SIGINT"))
2023 if (strEQ(name, "SIGKILL"))
2029 if (strEQ(name, "SIGPIPE"))
2035 if (strEQ(name, "SIGQUIT"))
2041 if (strEQ(name, "SIGSEGV"))
2047 if (strEQ(name, "SIGSTOP"))
2053 if (strEQ(name, "SIGTERM"))
2059 if (strEQ(name, "SIGTSTP"))
2065 if (strEQ(name, "SIGTTIN"))
2071 if (strEQ(name, "SIGTTOU"))
2077 if (strEQ(name, "SIGUSR1"))
2083 if (strEQ(name, "SIGUSR2"))
2091 if (name[1] == '_') {
2092 if (strEQ(name, "S_ISGID"))
2098 if (strEQ(name, "S_ISUID"))
2104 if (strEQ(name, "S_IRGRP"))
2110 if (strEQ(name, "S_IROTH"))
2116 if (strEQ(name, "S_IRUSR"))
2122 if (strEQ(name, "S_IRWXG"))
2128 if (strEQ(name, "S_IRWXO"))
2134 if (strEQ(name, "S_IRWXU"))
2140 if (strEQ(name, "S_IWGRP"))
2146 if (strEQ(name, "S_IWOTH"))
2152 if (strEQ(name, "S_IWUSR"))
2158 if (strEQ(name, "S_IXGRP"))
2164 if (strEQ(name, "S_IXOTH"))
2170 if (strEQ(name, "S_IXUSR"))
2176 errno = EAGAIN; /* the following aren't constants */
2178 if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
2181 if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
2184 if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
2187 if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
2190 if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
2194 if (strEQ(name, "SEEK_CUR"))
2200 if (strEQ(name, "SEEK_END"))
2206 if (strEQ(name, "SEEK_SET"))
2212 if (strEQ(name, "STREAM_MAX"))
2218 if (strEQ(name, "SHRT_MAX"))
2224 if (strEQ(name, "SHRT_MIN"))
2230 if (strnEQ(name, "SA_", 3)) {
2231 if (strEQ(name, "SA_NOCLDSTOP"))
2233 return SA_NOCLDSTOP;
2237 if (strEQ(name, "SA_NOCLDWAIT"))
2239 return SA_NOCLDWAIT;
2243 if (strEQ(name, "SA_NODEFER"))
2249 if (strEQ(name, "SA_ONSTACK"))
2255 if (strEQ(name, "SA_RESETHAND"))
2257 return SA_RESETHAND;
2261 if (strEQ(name, "SA_RESTART"))
2267 if (strEQ(name, "SA_SIGINFO"))
2275 if (strEQ(name, "SCHAR_MAX"))
2281 if (strEQ(name, "SCHAR_MIN"))
2287 if (strEQ(name, "SSIZE_MAX"))
2293 if (strEQ(name, "STDIN_FILENO"))
2295 return STDIN_FILENO;
2299 if (strEQ(name, "STDOUT_FILENO"))
2300 #ifdef STDOUT_FILENO
2301 return STDOUT_FILENO;
2305 if (strEQ(name, "STDERR_FILENO"))
2306 #ifdef STDERR_FILENO
2307 return STDERR_FILENO;
2313 if (strEQ(name, "TCIFLUSH"))
2319 if (strEQ(name, "TCIOFF"))
2325 if (strEQ(name, "TCIOFLUSH"))
2331 if (strEQ(name, "TCION"))
2337 if (strEQ(name, "TCOFLUSH"))
2343 if (strEQ(name, "TCOOFF"))
2349 if (strEQ(name, "TCOON"))
2355 if (strEQ(name, "TCSADRAIN"))
2361 if (strEQ(name, "TCSAFLUSH"))
2367 if (strEQ(name, "TCSANOW"))
2373 if (strEQ(name, "TMP_MAX"))
2379 if (strEQ(name, "TOSTOP"))
2385 if (strEQ(name, "TZNAME_MAX"))
2393 if (strEQ(name, "UCHAR_MAX"))
2399 if (strEQ(name, "UINT_MAX"))
2405 if (strEQ(name, "ULONG_MAX"))
2411 if (strEQ(name, "USHRT_MAX"))
2419 if (strEQ(name, "VEOF"))
2425 if (strEQ(name, "VEOL"))
2431 if (strEQ(name, "VERASE"))
2437 if (strEQ(name, "VINTR"))
2443 if (strEQ(name, "VKILL"))
2449 if (strEQ(name, "VMIN"))
2455 if (strEQ(name, "VQUIT"))
2461 if (strEQ(name, "VSTART"))
2467 if (strEQ(name, "VSTOP"))
2473 if (strEQ(name, "VSUSP"))
2479 if (strEQ(name, "VTIME"))
2487 if (strEQ(name, "W_OK"))
2493 if (strEQ(name, "WNOHANG"))
2499 if (strEQ(name, "WUNTRACED"))
2505 errno = EAGAIN; /* the following aren't constants */
2507 if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
2510 if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
2513 if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
2516 if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
2519 if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
2522 if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
2526 if (strEQ(name, "X_OK"))
2534 if (strnEQ(name, "_PC_", 4)) {
2535 if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
2536 #if defined(_PC_CHOWN_RESTRICTED) || HINT_SC_EXIST
2537 return _PC_CHOWN_RESTRICTED;
2541 if (strEQ(name, "_PC_LINK_MAX"))
2542 #if defined(_PC_LINK_MAX) || HINT_SC_EXIST
2543 return _PC_LINK_MAX;
2547 if (strEQ(name, "_PC_MAX_CANON"))
2548 #if defined(_PC_MAX_CANON) || HINT_SC_EXIST
2549 return _PC_MAX_CANON;
2553 if (strEQ(name, "_PC_MAX_INPUT"))
2554 #if defined(_PC_MAX_INPUT) || HINT_SC_EXIST
2555 return _PC_MAX_INPUT;
2559 if (strEQ(name, "_PC_NAME_MAX"))
2560 #if defined(_PC_NAME_MAX) || HINT_SC_EXIST
2561 return _PC_NAME_MAX;
2565 if (strEQ(name, "_PC_NO_TRUNC"))
2566 #if defined(_PC_NO_TRUNC) || HINT_SC_EXIST
2567 return _PC_NO_TRUNC;
2571 if (strEQ(name, "_PC_PATH_MAX"))
2572 #if defined(_PC_PATH_MAX) || HINT_SC_EXIST
2573 return _PC_PATH_MAX;
2577 if (strEQ(name, "_PC_PIPE_BUF"))
2578 #if defined(_PC_PIPE_BUF) || HINT_SC_EXIST
2579 return _PC_PIPE_BUF;
2583 if (strEQ(name, "_PC_VDISABLE"))
2584 #if defined(_PC_VDISABLE) || HINT_SC_EXIST
2585 return _PC_VDISABLE;
2591 if (strnEQ(name, "_POSIX_", 7)) {
2592 if (strEQ(name, "_POSIX_ARG_MAX"))
2593 #ifdef _POSIX_ARG_MAX
2594 return _POSIX_ARG_MAX;
2598 if (strEQ(name, "_POSIX_CHILD_MAX"))
2599 #ifdef _POSIX_CHILD_MAX
2600 return _POSIX_CHILD_MAX;
2604 if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
2605 #ifdef _POSIX_CHOWN_RESTRICTED
2606 return _POSIX_CHOWN_RESTRICTED;
2610 if (strEQ(name, "_POSIX_JOB_CONTROL"))
2611 #ifdef _POSIX_JOB_CONTROL
2612 return _POSIX_JOB_CONTROL;
2616 if (strEQ(name, "_POSIX_LINK_MAX"))
2617 #ifdef _POSIX_LINK_MAX
2618 return _POSIX_LINK_MAX;
2622 if (strEQ(name, "_POSIX_MAX_CANON"))
2623 #ifdef _POSIX_MAX_CANON
2624 return _POSIX_MAX_CANON;
2628 if (strEQ(name, "_POSIX_MAX_INPUT"))
2629 #ifdef _POSIX_MAX_INPUT
2630 return _POSIX_MAX_INPUT;
2634 if (strEQ(name, "_POSIX_NAME_MAX"))
2635 #ifdef _POSIX_NAME_MAX
2636 return _POSIX_NAME_MAX;
2640 if (strEQ(name, "_POSIX_NGROUPS_MAX"))
2641 #ifdef _POSIX_NGROUPS_MAX
2642 return _POSIX_NGROUPS_MAX;
2646 if (strEQ(name, "_POSIX_NO_TRUNC"))
2647 #ifdef _POSIX_NO_TRUNC
2648 return _POSIX_NO_TRUNC;
2652 if (strEQ(name, "_POSIX_OPEN_MAX"))
2653 #ifdef _POSIX_OPEN_MAX
2654 return _POSIX_OPEN_MAX;
2658 if (strEQ(name, "_POSIX_PATH_MAX"))
2659 #ifdef _POSIX_PATH_MAX
2660 return _POSIX_PATH_MAX;
2664 if (strEQ(name, "_POSIX_PIPE_BUF"))
2665 #ifdef _POSIX_PIPE_BUF
2666 return _POSIX_PIPE_BUF;
2670 if (strEQ(name, "_POSIX_SAVED_IDS"))
2671 #ifdef _POSIX_SAVED_IDS
2672 return _POSIX_SAVED_IDS;
2676 if (strEQ(name, "_POSIX_SSIZE_MAX"))
2677 #ifdef _POSIX_SSIZE_MAX
2678 return _POSIX_SSIZE_MAX;
2682 if (strEQ(name, "_POSIX_STREAM_MAX"))
2683 #ifdef _POSIX_STREAM_MAX
2684 return _POSIX_STREAM_MAX;
2688 if (strEQ(name, "_POSIX_TZNAME_MAX"))
2689 #ifdef _POSIX_TZNAME_MAX
2690 return _POSIX_TZNAME_MAX;
2694 if (strEQ(name, "_POSIX_VDISABLE"))
2695 #ifdef _POSIX_VDISABLE
2696 return _POSIX_VDISABLE;
2700 if (strEQ(name, "_POSIX_VERSION"))
2701 #ifdef _POSIX_VERSION
2702 return _POSIX_VERSION;
2708 if (strnEQ(name, "_SC_", 4)) {
2709 if (strEQ(name, "_SC_ARG_MAX"))
2710 #if defined(_SC_ARG_MAX) || HINT_SC_EXIST
2715 if (strEQ(name, "_SC_CHILD_MAX"))
2716 #if defined(_SC_CHILD_MAX) || HINT_SC_EXIST
2717 return _SC_CHILD_MAX;
2721 if (strEQ(name, "_SC_CLK_TCK"))
2722 #if defined(_SC_CLK_TCK) || HINT_SC_EXIST
2727 if (strEQ(name, "_SC_JOB_CONTROL"))
2728 #if defined(_SC_JOB_CONTROL) || HINT_SC_EXIST
2729 return _SC_JOB_CONTROL;
2733 if (strEQ(name, "_SC_NGROUPS_MAX"))
2734 #if defined(_SC_NGROUPS_MAX) || HINT_SC_EXIST
2735 return _SC_NGROUPS_MAX;
2739 if (strEQ(name, "_SC_OPEN_MAX"))
2740 #if defined(_SC_OPEN_MAX) || HINT_SC_EXIST
2741 return _SC_OPEN_MAX;
2745 if (strEQ(name, "_SC_SAVED_IDS"))
2746 #if defined(_SC_SAVED_IDS) || HINT_SC_EXIST
2747 return _SC_SAVED_IDS;
2751 if (strEQ(name, "_SC_STREAM_MAX"))
2752 #if defined(_SC_STREAM_MAX) || HINT_SC_EXIST
2753 return _SC_STREAM_MAX;
2757 if (strEQ(name, "_SC_TZNAME_MAX"))
2758 #if defined(_SC_TZNAME_MAX) || HINT_SC_EXIST
2759 return _SC_TZNAME_MAX;
2763 if (strEQ(name, "_SC_VERSION"))
2764 #if defined(_SC_VERSION) || HINT_SC_EXIST
2781 restore_sigmask(sigset_t *ossetp)
2783 /* Fortunately, restoring the signal mask can't fail, because
2784 * there's nothing we can do about it if it does -- we're not
2785 * supposed to return -1 from sigaction unless the disposition
2788 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
2791 MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
2794 new(packname = "POSIX::SigSet", ...)
2799 New(0, RETVAL, 1, sigset_t);
2800 sigemptyset(RETVAL);
2801 for (i = 1; i < items; i++)
2802 sigaddset(RETVAL, SvIV(ST(i)));
2809 POSIX::SigSet sigset
2814 sigaddset(sigset, sig)
2815 POSIX::SigSet sigset
2819 sigdelset(sigset, sig)
2820 POSIX::SigSet sigset
2825 POSIX::SigSet sigset
2829 POSIX::SigSet sigset
2832 sigismember(sigset, sig)
2833 POSIX::SigSet sigset
2837 MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
2840 new(packname = "POSIX::Termios", ...)
2845 New(0, RETVAL, 1, struct termios);
2847 not_here("termios");
2855 DESTROY(termios_ref)
2856 POSIX::Termios termios_ref
2859 Safefree(termios_ref);
2861 not_here("termios");
2865 getattr(termios_ref, fd = 0)
2866 POSIX::Termios termios_ref
2869 RETVAL = tcgetattr(fd, termios_ref);
2874 setattr(termios_ref, fd = 0, optional_actions = 0)
2875 POSIX::Termios termios_ref
2877 int optional_actions
2879 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
2884 cfgetispeed(termios_ref)
2885 POSIX::Termios termios_ref
2888 cfgetospeed(termios_ref)
2889 POSIX::Termios termios_ref
2892 getiflag(termios_ref)
2893 POSIX::Termios termios_ref
2895 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2896 RETVAL = termios_ref->c_iflag;
2898 not_here("getiflag");
2905 getoflag(termios_ref)
2906 POSIX::Termios termios_ref
2908 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2909 RETVAL = termios_ref->c_oflag;
2911 not_here("getoflag");
2918 getcflag(termios_ref)
2919 POSIX::Termios termios_ref
2921 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2922 RETVAL = termios_ref->c_cflag;
2924 not_here("getcflag");
2931 getlflag(termios_ref)
2932 POSIX::Termios termios_ref
2934 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2935 RETVAL = termios_ref->c_lflag;
2937 not_here("getlflag");
2944 getcc(termios_ref, ccix)
2945 POSIX::Termios termios_ref
2948 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2950 croak("Bad getcc subscript");
2951 RETVAL = termios_ref->c_cc[ccix];
2960 cfsetispeed(termios_ref, speed)
2961 POSIX::Termios termios_ref
2965 cfsetospeed(termios_ref, speed)
2966 POSIX::Termios termios_ref
2970 setiflag(termios_ref, iflag)
2971 POSIX::Termios termios_ref
2974 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2975 termios_ref->c_iflag = iflag;
2977 not_here("setiflag");
2981 setoflag(termios_ref, oflag)
2982 POSIX::Termios termios_ref
2985 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2986 termios_ref->c_oflag = oflag;
2988 not_here("setoflag");
2992 setcflag(termios_ref, cflag)
2993 POSIX::Termios termios_ref
2996 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2997 termios_ref->c_cflag = cflag;
2999 not_here("setcflag");
3003 setlflag(termios_ref, lflag)
3004 POSIX::Termios termios_ref
3007 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
3008 termios_ref->c_lflag = lflag;
3010 not_here("setlflag");
3014 setcc(termios_ref, ccix, cc)
3015 POSIX::Termios termios_ref
3019 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
3021 croak("Bad setcc subscript");
3022 termios_ref->c_cc[ccix] = cc;
3028 MODULE = POSIX PACKAGE = POSIX
3037 unsigned char * charstring
3039 unsigned char *s = charstring;
3040 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3041 for (RETVAL = 1; RETVAL && s < e; s++)
3049 unsigned char * charstring
3051 unsigned char *s = charstring;
3052 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3053 for (RETVAL = 1; RETVAL && s < e; s++)
3061 unsigned char * charstring
3063 unsigned char *s = charstring;
3064 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3065 for (RETVAL = 1; RETVAL && s < e; s++)
3073 unsigned char * charstring
3075 unsigned char *s = charstring;
3076 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3077 for (RETVAL = 1; RETVAL && s < e; s++)
3085 unsigned char * charstring
3087 unsigned char *s = charstring;
3088 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3089 for (RETVAL = 1; RETVAL && s < e; s++)
3097 unsigned char * charstring
3099 unsigned char *s = charstring;
3100 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3101 for (RETVAL = 1; RETVAL && s < e; s++)
3109 unsigned char * charstring
3111 unsigned char *s = charstring;
3112 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3113 for (RETVAL = 1; RETVAL && s < e; s++)
3121 unsigned char * charstring
3123 unsigned char *s = charstring;
3124 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3125 for (RETVAL = 1; RETVAL && s < e; s++)
3133 unsigned char * charstring
3135 unsigned char *s = charstring;
3136 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3137 for (RETVAL = 1; RETVAL && s < e; s++)
3145 unsigned char * charstring
3147 unsigned char *s = charstring;
3148 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3149 for (RETVAL = 1; RETVAL && s < e; s++)
3156 isxdigit(charstring)
3157 unsigned char * charstring
3159 unsigned char *s = charstring;
3160 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3161 for (RETVAL = 1; RETVAL && s < e; s++)
3168 open(filename, flags = O_RDONLY, mode = 0666)
3173 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
3174 TAINT_PROPER("open");
3175 RETVAL = open(filename, flags, mode);
3183 #ifdef HAS_LOCALECONV
3184 struct lconv *lcbuf;
3186 if ((lcbuf = localeconv())) {
3188 if (lcbuf->decimal_point && *lcbuf->decimal_point)
3189 hv_store(RETVAL, "decimal_point", 13,
3190 newSVpv(lcbuf->decimal_point, 0), 0);
3191 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
3192 hv_store(RETVAL, "thousands_sep", 13,
3193 newSVpv(lcbuf->thousands_sep, 0), 0);
3194 #ifndef NO_LOCALECONV_GROUPING
3195 if (lcbuf->grouping && *lcbuf->grouping)
3196 hv_store(RETVAL, "grouping", 8,
3197 newSVpv(lcbuf->grouping, 0), 0);
3199 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
3200 hv_store(RETVAL, "int_curr_symbol", 15,
3201 newSVpv(lcbuf->int_curr_symbol, 0), 0);
3202 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
3203 hv_store(RETVAL, "currency_symbol", 15,
3204 newSVpv(lcbuf->currency_symbol, 0), 0);
3205 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
3206 hv_store(RETVAL, "mon_decimal_point", 17,
3207 newSVpv(lcbuf->mon_decimal_point, 0), 0);
3208 #ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
3209 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
3210 hv_store(RETVAL, "mon_thousands_sep", 17,
3211 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
3213 #ifndef NO_LOCALECONV_MON_GROUPING
3214 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
3215 hv_store(RETVAL, "mon_grouping", 12,
3216 newSVpv(lcbuf->mon_grouping, 0), 0);
3218 if (lcbuf->positive_sign && *lcbuf->positive_sign)
3219 hv_store(RETVAL, "positive_sign", 13,
3220 newSVpv(lcbuf->positive_sign, 0), 0);
3221 if (lcbuf->negative_sign && *lcbuf->negative_sign)
3222 hv_store(RETVAL, "negative_sign", 13,
3223 newSVpv(lcbuf->negative_sign, 0), 0);
3225 if (lcbuf->int_frac_digits != CHAR_MAX)
3226 hv_store(RETVAL, "int_frac_digits", 15,
3227 newSViv(lcbuf->int_frac_digits), 0);
3228 if (lcbuf->frac_digits != CHAR_MAX)
3229 hv_store(RETVAL, "frac_digits", 11,
3230 newSViv(lcbuf->frac_digits), 0);
3231 if (lcbuf->p_cs_precedes != CHAR_MAX)
3232 hv_store(RETVAL, "p_cs_precedes", 13,
3233 newSViv(lcbuf->p_cs_precedes), 0);
3234 if (lcbuf->p_sep_by_space != CHAR_MAX)
3235 hv_store(RETVAL, "p_sep_by_space", 14,
3236 newSViv(lcbuf->p_sep_by_space), 0);
3237 if (lcbuf->n_cs_precedes != CHAR_MAX)
3238 hv_store(RETVAL, "n_cs_precedes", 13,
3239 newSViv(lcbuf->n_cs_precedes), 0);
3240 if (lcbuf->n_sep_by_space != CHAR_MAX)
3241 hv_store(RETVAL, "n_sep_by_space", 14,
3242 newSViv(lcbuf->n_sep_by_space), 0);
3243 if (lcbuf->p_sign_posn != CHAR_MAX)
3244 hv_store(RETVAL, "p_sign_posn", 11,
3245 newSViv(lcbuf->p_sign_posn), 0);
3246 if (lcbuf->n_sign_posn != CHAR_MAX)
3247 hv_store(RETVAL, "n_sign_posn", 11,
3248 newSViv(lcbuf->n_sign_posn), 0);
3251 localeconv(); /* A stub to call not_here(). */
3257 setlocale(category, locale = 0)
3261 RETVAL = setlocale(category, locale);
3263 #ifdef USE_LOCALE_CTYPE
3264 if (category == LC_CTYPE
3266 || category == LC_ALL
3272 if (category == LC_ALL)
3273 newctype = setlocale(LC_CTYPE, NULL);
3277 new_ctype(newctype);
3279 #endif /* USE_LOCALE_CTYPE */
3280 #ifdef USE_LOCALE_COLLATE
3281 if (category == LC_COLLATE
3283 || category == LC_ALL
3289 if (category == LC_ALL)
3290 newcoll = setlocale(LC_COLLATE, NULL);
3294 new_collate(newcoll);
3296 #endif /* USE_LOCALE_COLLATE */
3297 #ifdef USE_LOCALE_NUMERIC
3298 if (category == LC_NUMERIC
3300 || category == LC_ALL
3306 if (category == LC_ALL)
3307 newnum = setlocale(LC_NUMERIC, NULL);
3311 new_numeric(newnum);
3313 #endif /* USE_LOCALE_NUMERIC */
3353 /* (We already know stack is long enough.) */
3354 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
3355 PUSHs(sv_2mortal(newSViv(expvar)));
3371 /* (We already know stack is long enough.) */
3372 PUSHs(sv_2mortal(newSVnv(Perl_modf(x,&intvar))));
3373 PUSHs(sv_2mortal(newSVnv(intvar)));
3388 sigaction(sig, optaction, oldaction = 0)
3391 POSIX::SigAction oldaction
3394 RETVAL = not_here("sigaction");
3396 # This code is really grody because we're trying to make the signal
3397 # interface look beautiful, which is hard.
3400 POSIX__SigAction action;
3401 GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
3402 struct sigaction act;
3403 struct sigaction oact;
3406 POSIX__SigSet sigset;
3408 SV** sigsvp = hv_fetch(GvHVn(siggv),
3410 strlen(PL_sig_name[sig]),
3414 /* Check optaction and set action */
3415 if(SvTRUE(optaction)) {
3416 if(sv_isa(optaction, "POSIX::SigAction"))
3417 action = (HV*)SvRV(optaction);
3419 croak("action is not of type POSIX::SigAction");
3425 /* sigaction() is supposed to look atomic. In particular, any
3426 * signal handler invoked during a sigaction() call should
3427 * see either the old or the new disposition, and not something
3428 * in between. We use sigprocmask() to make it so.
3431 RETVAL=sigprocmask(SIG_BLOCK, &sset, &osset);
3435 /* Restore signal mask no matter how we exit this block. */
3436 SAVEDESTRUCTOR(restore_sigmask, &osset);
3438 RETVAL=-1; /* In case both oldaction and action are 0. */
3440 /* Remember old disposition if desired. */
3442 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
3444 croak("Can't supply an oldaction without a HANDLER");
3445 if(SvTRUE(*sigsvp)) { /* TBD: what if "0"? */
3446 sv_setsv(*svp, *sigsvp);
3449 sv_setpv(*svp, "DEFAULT");
3451 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
3454 /* Get back the mask. */
3455 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
3456 if (sv_isa(*svp, "POSIX::SigSet")) {
3457 IV tmp = SvIV((SV*)SvRV(*svp));
3458 sigset = INT2PTR(sigset_t*, tmp);
3461 New(0, sigset, 1, sigset_t);
3462 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
3464 *sigset = oact.sa_mask;
3466 /* Get back the flags. */
3467 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
3468 sv_setiv(*svp, oact.sa_flags);
3472 /* Vector new handler through %SIG. (We always use sighandler
3473 for the C signal handler, which reads %SIG to dispatch.) */
3474 svp = hv_fetch(action, "HANDLER", 7, FALSE);
3476 croak("Can't supply an action without a HANDLER");
3477 sv_setsv(*sigsvp, *svp);
3478 mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
3480 char *s=SvPVX(*svp);
3481 if(strEQ(s,"IGNORE")) {
3482 act.sa_handler = SIG_IGN;
3484 else if(strEQ(s,"DEFAULT")) {
3485 act.sa_handler = SIG_DFL;
3488 act.sa_handler = PL_sighandlerp;
3492 act.sa_handler = PL_sighandlerp;
3495 /* Set up any desired mask. */
3496 svp = hv_fetch(action, "MASK", 4, FALSE);
3497 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
3498 IV tmp = SvIV((SV*)SvRV(*svp));
3499 sigset = INT2PTR(sigset_t*, tmp);
3500 act.sa_mask = *sigset;
3503 sigemptyset(& act.sa_mask);
3505 /* Set up any desired flags. */
3506 svp = hv_fetch(action, "FLAGS", 5, FALSE);
3507 act.sa_flags = svp ? SvIV(*svp) : 0;
3509 /* Don't worry about cleaning up *sigsvp if this fails,
3510 * because that means we tried to disposition a
3511 * nonblockable signal, in which case *sigsvp is
3512 * essentially meaningless anyway.
3514 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
3525 POSIX::SigSet sigset
3528 sigprocmask(how, sigset, oldsigset = 0)
3530 POSIX::SigSet sigset
3531 POSIX::SigSet oldsigset = NO_INIT
3536 else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
3537 IV tmp = SvIV((SV*)SvRV(ST(2)));
3538 oldsigset = INT2PTR(POSIX__SigSet,tmp);
3541 New(0, oldsigset, 1, sigset_t);
3542 sigemptyset(oldsigset);
3543 sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
3547 sigsuspend(signal_mask)
3548 POSIX::SigSet signal_mask
3568 lseek(fd, offset, whence)
3581 if (pipe(fds) != -1) {
3583 PUSHs(sv_2mortal(newSViv(fds[0])));
3584 PUSHs(sv_2mortal(newSViv(fds[1])));
3588 read(fd, buffer, nbytes)
3590 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
3594 char * buffer = sv_grow( sv_buffer, nbytes+1 );
3597 SvCUR(sv_buffer) = RETVAL;
3598 SvPOK_only(sv_buffer);
3599 *SvEND(sv_buffer) = '\0';
3600 SvTAINTED_on(sv_buffer);
3616 tcsetpgrp(fd, pgrp_id)
3625 if (uname(&buf) >= 0) {
3627 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
3628 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
3629 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
3630 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
3631 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
3634 uname((char *) 0); /* A stub to call not_here(). */
3638 write(fd, buffer, nbytes)
3649 RETVAL = newSVpvn("", 0);
3650 SvGROW(RETVAL, L_tmpnam);
3651 len = strlen(tmpnam(SvPV(RETVAL, i)));
3652 SvCUR_set(RETVAL, len);
3665 mbstowcs(s, pwcs, n)
3677 wcstombs(s, pwcs, n)
3699 SET_NUMERIC_LOCAL();
3700 num = strtod(str, &unparsed);
3701 PUSHs(sv_2mortal(newSVnv(num)));
3702 if (GIMME == G_ARRAY) {
3705 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3707 PUSHs(&PL_sv_undef);
3711 strtol(str, base = 0)
3718 num = strtol(str, &unparsed, base);
3719 #if IVSIZE <= LONGSIZE
3720 if (num < IV_MIN || num > IV_MAX)
3721 PUSHs(sv_2mortal(newSVnv((double)num)));
3724 PUSHs(sv_2mortal(newSViv((IV)num)));
3725 if (GIMME == G_ARRAY) {
3728 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3730 PUSHs(&PL_sv_undef);
3734 strtoul(str, base = 0)
3741 num = strtoul(str, &unparsed, base);
3743 PUSHs(sv_2mortal(newSViv((IV)num)));
3745 PUSHs(sv_2mortal(newSVnv((double)num)));
3746 if (GIMME == G_ARRAY) {
3749 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3751 PUSHs(&PL_sv_undef);
3761 char *p = SvPV(src,srclen);
3763 ST(0) = sv_2mortal(NEWSV(800,srclen));
3764 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
3765 if (dstlen > srclen) {
3767 SvGROW(ST(0), dstlen);
3768 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
3771 SvCUR(ST(0)) = dstlen;
3776 mkfifo(filename, mode)
3780 TAINT_PROPER("mkfifo");
3781 RETVAL = mkfifo(filename, mode);
3797 tcflush(fd, queue_selector)
3802 tcsendbreak(fd, duration)
3807 asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3820 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3823 mytm.tm_hour = hour;
3824 mytm.tm_mday = mday;
3826 mytm.tm_year = year;
3827 mytm.tm_wday = wday;
3828 mytm.tm_yday = yday;
3829 mytm.tm_isdst = isdst;
3830 RETVAL = asctime(&mytm);
3847 realtime = times( &tms );
3849 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
3850 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
3851 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
3852 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
3853 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
3856 difftime(time1, time2)
3861 mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3874 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3877 mytm.tm_hour = hour;
3878 mytm.tm_mday = mday;
3880 mytm.tm_year = year;
3881 mytm.tm_wday = wday;
3882 mytm.tm_yday = yday;
3883 mytm.tm_isdst = isdst;
3884 RETVAL = mktime(&mytm);
3889 #XXX: if $xsubpp::WantOptimize is always the default
3890 # sv_setpv(TARG, ...) could be used rather than
3891 # ST(0) = sv_2mortal(newSVpv(...))
3893 strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
3909 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3912 mytm.tm_hour = hour;
3913 mytm.tm_mday = mday;
3915 mytm.tm_year = year;
3916 mytm.tm_wday = wday;
3917 mytm.tm_yday = yday;
3918 mytm.tm_isdst = isdst;
3920 len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
3922 ** The following is needed to handle to the situation where
3923 ** tmpbuf overflows. Basically we want to allocate a buffer
3924 ** and try repeatedly. The reason why it is so complicated
3925 ** is that getting a return value of 0 from strftime can indicate
3926 ** one of the following:
3927 ** 1. buffer overflowed,
3928 ** 2. illegal conversion specifier, or
3929 ** 3. the format string specifies nothing to be returned(not
3930 ** an error). This could be because format is an empty string
3931 ** or it specifies %p that yields an empty string in some locale.
3932 ** If there is a better way to make it portable, go ahead by
3935 if ((len > 0 && len < sizeof(tmpbuf)) || (len == 0 && *fmt == '\0'))
3936 ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
3938 /* Possibly buf overflowed - try again with a bigger buf */
3939 int fmtlen = strlen(fmt);
3940 int bufsize = fmtlen + sizeof(tmpbuf);
3944 New(0, buf, bufsize, char);
3946 buflen = strftime(buf, bufsize, fmt, &mytm);
3947 if (buflen > 0 && buflen < bufsize)
3949 /* heuristic to prevent out-of-memory errors */
3950 if (bufsize > 100*fmtlen) {
3956 Renew(buf, bufsize, char);
3959 ST(0) = sv_2mortal(newSVpvn(buf, buflen));
3963 ST(0) = sv_2mortal(newSVpvn(tmpbuf, len));
3974 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
3975 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
3978 access(filename, mode)
3996 pathconf(filename, name)