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>
60 #if defined(__VMS) && !defined(__POSIX_SOURCE)
61 # include <libdef.h> /* LIB$_INVARG constant */
62 # include <lib$routines.h> /* prototype for lib$ediv() */
63 # include <starlet.h> /* prototype for sys$gettim() */
64 # if DECC_VERSION < 50000000
65 # define pid_t int /* old versions of DECC miss this in types.h */
69 # define mkfifo(a,b) (not_here("mkfifo"),-1)
70 # define tzset() not_here("tzset")
72 #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
73 # define HAS_TZNAME /* shows up in VMS 7.0 or Dec C 5.6 */
75 # endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
77 /* The POSIX notion of ttyname() is better served by getname() under VMS */
78 static char ttnambuf[64];
79 # define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
81 /* The non-POSIX CRTL times() has void return type, so we just get the
82 current time directly */
83 clock_t vms_times(struct tms *PL_bufptr) {
86 /* Get wall time and convert to 10 ms intervals to
87 * produce the return value that the POSIX standard expects */
88 # if defined(__DECC) && defined (__ALPHA)
91 _ckvmssts(sys$gettim(&vmstime));
93 retval = vmstime & 0x7fffffff;
95 /* (Older hw or ccs don't have an atomic 64-bit type, so we
96 * juggle 32-bit ints (and a float) to produce a time_t result
97 * with minimal loss of information.) */
98 long int vmstime[2],remainder,divisor = 100000;
99 _ckvmssts(sys$gettim((unsigned long int *)vmstime));
100 vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
101 _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
103 /* Fill in the struct tms using the CRTL routine . . .*/
104 times((tbuffer_t *)PL_bufptr);
105 return (clock_t) retval;
107 # define times(t) vms_times(t)
109 #if defined (__CYGWIN__)
110 # define tzname _tzname
114 # define mkfifo(a,b) not_here("mkfifo")
115 # define ttyname(a) (char*)not_here("ttyname")
116 # define sigset_t long
119 # define tzname _tzname
122 # define mode_t short
125 # define mode_t short
127 # define tzset() not_here("tzset")
129 # ifndef _POSIX_OPEN_MAX
130 # define _POSIX_OPEN_MAX FOPEN_MAX /* XXX bogus ? */
133 # define sigaction(a,b,c) not_here("sigaction")
134 # define sigpending(a) not_here("sigpending")
135 # define sigprocmask(a,b,c) not_here("sigprocmask")
136 # define sigsuspend(a) not_here("sigsuspend")
137 # define sigemptyset(a) not_here("sigemptyset")
138 # define sigaddset(a,b) not_here("sigaddset")
139 # define sigdelset(a,b) not_here("sigdelset")
140 # define sigfillset(a) not_here("sigfillset")
141 # define sigismember(a,b) not_here("sigismember")
146 # define mkfifo(a,b) not_here("mkfifo")
147 # else /* !( defined OS2 ) */
149 # define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
152 # endif /* !HAS_MKFIFO */
155 # include <sys/times.h>
157 # include <sys/utsname.h>
159 # include <sys/wait.h>
167 typedef long SysRetLong;
168 typedef sigset_t* POSIX__SigSet;
169 typedef HV* POSIX__SigAction;
171 typedef struct termios* POSIX__Termios;
172 #else /* Define termios types to int, and call not_here for the functions.*/
173 #define POSIX__Termios int
177 #define cfgetispeed(x) not_here("cfgetispeed")
178 #define cfgetospeed(x) not_here("cfgetospeed")
179 #define tcdrain(x) not_here("tcdrain")
180 #define tcflush(x,y) not_here("tcflush")
181 #define tcsendbreak(x,y) not_here("tcsendbreak")
182 #define cfsetispeed(x,y) not_here("cfsetispeed")
183 #define cfsetospeed(x,y) not_here("cfsetospeed")
184 #define ctermid(x) (char *) not_here("ctermid")
185 #define tcflow(x,y) not_here("tcflow")
186 #define tcgetattr(x,y) not_here("tcgetattr")
187 #define tcsetattr(x,y,z) not_here("tcsetattr")
190 /* Possibly needed prototypes */
191 char *cuserid (char *);
192 double strtod (const char *, char **);
193 long strtol (const char *, char **, int);
194 unsigned long strtoul (const char *, char **, int);
197 #define cuserid(a) (char *) not_here("cuserid")
201 #define difftime(a,b) not_here("difftime")
204 #ifndef HAS_FPATHCONF
205 #define fpathconf(f,n) (SysRetLong) not_here("fpathconf")
208 #define mktime(a) not_here("mktime")
211 #define nice(a) not_here("nice")
214 #define pathconf(f,n) (SysRetLong) not_here("pathconf")
217 #define sysconf(n) (SysRetLong) not_here("sysconf")
220 #define readlink(a,b,c) not_here("readlink")
223 #define setpgid(a,b) not_here("setpgid")
226 #define setsid() not_here("setsid")
229 #define strcoll(s1,s2) not_here("strcoll")
232 #define strtod(s1,s2) not_here("strtod")
235 #define strtol(s1,s2,b) not_here("strtol")
238 #define strtoul(s1,s2,b) not_here("strtoul")
241 #define strxfrm(s1,s2,n) not_here("strxfrm")
243 #ifndef HAS_TCGETPGRP
244 #define tcgetpgrp(a) not_here("tcgetpgrp")
246 #ifndef HAS_TCSETPGRP
247 #define tcsetpgrp(a,b) not_here("tcsetpgrp")
250 #define times(a) not_here("times")
253 #define uname(a) not_here("uname")
256 #define waitpid(a,b,c) not_here("waitpid")
261 #define mblen(a,b) not_here("mblen")
265 #define mbstowcs(s, pwcs, n) not_here("mbstowcs")
268 #define mbtowc(pwc, s, n) not_here("mbtowc")
271 #define wcstombs(s, pwcs, n) not_here("wcstombs")
274 #define wctomb(s, wchar) not_here("wcstombs")
276 #if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
277 /* If we don't have these functions, then we wouldn't have gotten a typedef
278 for wchar_t, the wide character type. Defining wchar_t allows the
279 functions referencing it to compile. Its actual type is then meaningless,
280 since without the above functions, all sections using it end up calling
281 not_here() and croak. --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
287 #ifndef HAS_LOCALECONV
288 #define localeconv() not_here("localeconv")
292 # if !defined(WIN32) && !defined(__CYGWIN__)
293 extern char *tzname[];
296 #if !defined(WIN32) || (defined(__MINGW32__) && !defined(tzname))
297 char *tzname[] = { "" , "" };
301 /* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
302 * fields for which we don't have Configure support yet:
303 * char *tm_zone; -- abbreviation of timezone name
304 * long tm_gmtoff; -- offset from GMT in seconds
305 * To workaround core dumps from the uninitialised tm_zone we get the
306 * system to give us a reasonable struct to copy. This fix means that
307 * strftime uses the tm_zone and tm_gmtoff values returned by
308 * localtime(time()). That should give the desired result most of the
309 * time. But probably not always!
311 * This is a temporary workaround to be removed once Configure
312 * support is added and NETaa14816 is considered in full.
313 * It does not address tzname aspects of NETaa14816.
316 # ifndef STRUCT_TM_HASZONE
317 # define STRUCT_TM_HASZONE
321 #ifdef STRUCT_TM_HASZONE
323 init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
327 Copy(localtime(&now), ptm, 1, struct tm);
331 # define init_tm(ptm)
335 * mini_mktime - normalise struct tm values without the localtime()
336 * semantics (and overhead) of mktime().
339 mini_mktime(struct tm *ptm)
343 int month, mday, year, jday;
344 int odd_cent, odd_year;
346 #define DAYS_PER_YEAR 365
347 #define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
348 #define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
349 #define DAYS_PER_QCENT (4*DAYS_PER_CENT+1)
350 #define SECS_PER_HOUR (60*60)
351 #define SECS_PER_DAY (24*SECS_PER_HOUR)
352 /* parentheses deliberately absent on these two, otherwise they don't work */
353 #define MONTH_TO_DAYS 153/5
354 #define DAYS_TO_MONTH 5/153
355 /* offset to bias by March (month 4) 1st between month/mday & year finding */
356 #define YEAR_ADJUST (4*MONTH_TO_DAYS+1)
357 /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
358 #define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
361 * Year/day algorithm notes:
363 * With a suitable offset for numeric value of the month, one can find
364 * an offset into the year by considering months to have 30.6 (153/5) days,
365 * using integer arithmetic (i.e., with truncation). To avoid too much
366 * messing about with leap days, we consider January and February to be
367 * the 13th and 14th month of the previous year. After that transformation,
368 * we need the month index we use to be high by 1 from 'normal human' usage,
369 * so the month index values we use run from 4 through 15.
371 * Given that, and the rules for the Gregorian calendar (leap years are those
372 * divisible by 4 unless also divisible by 100, when they must be divisible
373 * by 400 instead), we can simply calculate the number of days since some
374 * arbitrary 'beginning of time' by futzing with the (adjusted) year number,
375 * the days we derive from our month index, and adding in the day of the
376 * month. The value used here is not adjusted for the actual origin which
377 * it normally would use (1 January A.D. 1), since we're not exposing it.
378 * We're only building the value so we can turn around and get the
379 * normalised values for the year, month, day-of-month, and day-of-year.
381 * For going backward, we need to bias the value we're using so that we find
382 * the right year value. (Basically, we don't want the contribution of
383 * March 1st to the number to apply while deriving the year). Having done
384 * that, we 'count up' the contribution to the year number by accounting for
385 * full quadracenturies (400-year periods) with their extra leap days, plus
386 * the contribution from full centuries (to avoid counting in the lost leap
387 * days), plus the contribution from full quad-years (to count in the normal
388 * leap days), plus the leftover contribution from any non-leap years.
389 * At this point, if we were working with an actual leap day, we'll have 0
390 * days left over. This is also true for March 1st, however. So, we have
391 * to special-case that result, and (earlier) keep track of the 'odd'
392 * century and year contributions. If we got 4 extra centuries in a qcent,
393 * or 4 extra years in a qyear, then it's a leap day and we call it 29 Feb.
394 * Otherwise, we add back in the earlier bias we removed (the 123 from
395 * figuring in March 1st), find the month index (integer division by 30.6),
396 * and the remainder is the day-of-month. We then have to convert back to
397 * 'real' months (including fixing January and February from being 14/15 in
398 * the previous year to being in the proper year). After that, to get
399 * tm_yday, we work with the normalised year and get a new yearday value for
400 * January 1st, which we subtract from the yearday value we had earlier,
401 * representing the date we've re-built. This is done from January 1
402 * because tm_yday is 0-origin.
404 * Since POSIX time routines are only guaranteed to work for times since the
405 * UNIX epoch (00:00:00 1 Jan 1970 UTC), the fact that this algorithm
406 * applies Gregorian calendar rules even to dates before the 16th century
407 * doesn't bother me. Besides, you'd need cultural context for a given
408 * date to know whether it was Julian or Gregorian calendar, and that's
409 * outside the scope for this routine. Since we convert back based on the
410 * same rules we used to build the yearday, you'll only get strange results
411 * for input which needed normalising, or for the 'odd' century years which
412 * were leap years in the Julian calander but not in the Gregorian one.
413 * I can live with that.
415 * This algorithm also fails to handle years before A.D. 1 gracefully, but
416 * that's still outside the scope for POSIX time manipulation, so I don't
420 year = 1900 + ptm->tm_year;
423 /* allow given yday with no month & mday to dominate the result */
424 if (ptm->tm_yday >= 0 && mday <= 0 && month <= 0) {
427 jday = 1 + ptm->tm_yday;
436 yearday = DAYS_PER_YEAR * year + year/4 - year/100 + year/400;
437 yearday += month*MONTH_TO_DAYS + mday + jday;
439 * Note that we don't know when leap-seconds were or will be,
440 * so we have to trust the user if we get something which looks
441 * like a sensible leap-second. Wild values for seconds will
442 * be rationalised, however.
444 if ((unsigned) ptm->tm_sec <= 60) {
451 secs += 60 * ptm->tm_min;
452 secs += SECS_PER_HOUR * ptm->tm_hour;
454 if (secs-(secs/SECS_PER_DAY*SECS_PER_DAY) < 0) {
455 /* got negative remainder, but need positive time */
456 /* back off an extra day to compensate */
457 yearday += (secs/SECS_PER_DAY)-1;
458 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY - 1);
461 yearday += (secs/SECS_PER_DAY);
462 secs -= SECS_PER_DAY * (secs/SECS_PER_DAY);
465 else if (secs >= SECS_PER_DAY) {
466 yearday += (secs/SECS_PER_DAY);
467 secs %= SECS_PER_DAY;
469 ptm->tm_hour = secs/SECS_PER_HOUR;
470 secs %= SECS_PER_HOUR;
471 ptm->tm_min = secs/60;
474 /* done with time of day effects */
476 * The algorithm for yearday has (so far) left it high by 428.
477 * To avoid mistaking a legitimate Feb 29 as Mar 1, we need to
478 * bias it by 123 while trying to figure out what year it
479 * really represents. Even with this tweak, the reverse
480 * translation fails for years before A.D. 0001.
481 * It would still fail for Feb 29, but we catch that one below.
483 jday = yearday; /* save for later fixup vis-a-vis Jan 1 */
484 yearday -= YEAR_ADJUST;
485 year = (yearday / DAYS_PER_QCENT) * 400;
486 yearday %= DAYS_PER_QCENT;
487 odd_cent = yearday / DAYS_PER_CENT;
488 year += odd_cent * 100;
489 yearday %= DAYS_PER_CENT;
490 year += (yearday / DAYS_PER_QYEAR) * 4;
491 yearday %= DAYS_PER_QYEAR;
492 odd_year = yearday / DAYS_PER_YEAR;
494 yearday %= DAYS_PER_YEAR;
495 if (!yearday && (odd_cent==4 || odd_year==4)) { /* catch Feb 29 */
500 yearday += YEAR_ADJUST; /* recover March 1st crock */
501 month = yearday*DAYS_TO_MONTH;
502 yearday -= month*MONTH_TO_DAYS;
503 /* recover other leap-year adjustment */
512 ptm->tm_year = year - 1900;
514 ptm->tm_mday = yearday;
519 ptm->tm_mon = month - 1;
521 /* re-build yearday based on Jan 1 to get tm_yday */
523 yearday = year*DAYS_PER_YEAR + year/4 - year/100 + year/400;
524 yearday += 14*MONTH_TO_DAYS + 1;
525 ptm->tm_yday = jday - yearday;
526 /* fix tm_wday if not overridden by caller */
527 if ((unsigned)ptm->tm_wday > 6)
528 ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7;
531 #ifdef HAS_LONG_DOUBLE
532 # if LONG_DOUBLESIZE > DOUBLESIZE
533 # undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */
537 #ifndef HAS_LONG_DOUBLE
552 croak("POSIX::%s not implemented on this architecture", s);
557 #if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
562 constant(char *name, int arg)
567 if (strEQ(name, "ARG_MAX"))
575 if (strEQ(name, "BUFSIZ"))
581 if (strEQ(name, "BRKINT"))
587 if (strEQ(name, "B9600"))
593 if (strEQ(name, "B19200"))
599 if (strEQ(name, "B38400"))
605 if (strEQ(name, "B0"))
611 if (strEQ(name, "B110"))
617 if (strEQ(name, "B1200"))
623 if (strEQ(name, "B134"))
629 if (strEQ(name, "B150"))
635 if (strEQ(name, "B1800"))
641 if (strEQ(name, "B200"))
647 if (strEQ(name, "B2400"))
653 if (strEQ(name, "B300"))
659 if (strEQ(name, "B4800"))
665 if (strEQ(name, "B50"))
671 if (strEQ(name, "B600"))
677 if (strEQ(name, "B75"))
685 if (strEQ(name, "CHAR_BIT"))
691 if (strEQ(name, "CHAR_MAX"))
697 if (strEQ(name, "CHAR_MIN"))
703 if (strEQ(name, "CHILD_MAX"))
709 if (strEQ(name, "CLK_TCK"))
715 if (strEQ(name, "CLOCAL"))
721 if (strEQ(name, "CLOCKS_PER_SEC"))
722 #ifdef CLOCKS_PER_SEC
723 return CLOCKS_PER_SEC;
727 if (strEQ(name, "CREAD"))
733 if (strEQ(name, "CS5"))
739 if (strEQ(name, "CS6"))
745 if (strEQ(name, "CS7"))
751 if (strEQ(name, "CS8"))
757 if (strEQ(name, "CSIZE"))
763 if (strEQ(name, "CSTOPB"))
771 if (strEQ(name, "DBL_MAX"))
777 if (strEQ(name, "DBL_MIN"))
783 if (strEQ(name, "DBL_DIG"))
789 if (strEQ(name, "DBL_EPSILON"))
795 if (strEQ(name, "DBL_MANT_DIG"))
801 if (strEQ(name, "DBL_MAX_10_EXP"))
802 #ifdef DBL_MAX_10_EXP
803 return DBL_MAX_10_EXP;
807 if (strEQ(name, "DBL_MAX_EXP"))
813 if (strEQ(name, "DBL_MIN_10_EXP"))
814 #ifdef DBL_MIN_10_EXP
815 return DBL_MIN_10_EXP;
819 if (strEQ(name, "DBL_MIN_EXP"))
829 if (strEQ(name, "EACCES"))
835 if (strEQ(name, "EADDRINUSE"))
841 if (strEQ(name, "EADDRNOTAVAIL"))
843 return EADDRNOTAVAIL;
847 if (strEQ(name, "EAFNOSUPPORT"))
853 if (strEQ(name, "EAGAIN"))
859 if (strEQ(name, "EALREADY"))
867 if (strEQ(name, "EBADF"))
873 if (strEQ(name, "EBUSY"))
881 if (strEQ(name, "ECHILD"))
887 if (strEQ(name, "ECHO"))
893 if (strEQ(name, "ECHOE"))
899 if (strEQ(name, "ECHOK"))
905 if (strEQ(name, "ECHONL"))
911 if (strEQ(name, "ECONNABORTED"))
917 if (strEQ(name, "ECONNREFUSED"))
923 if (strEQ(name, "ECONNRESET"))
931 if (strEQ(name, "EDEADLK"))
937 if (strEQ(name, "EDESTADDRREQ"))
943 if (strEQ(name, "EDOM"))
949 if (strEQ(name, "EDQUOT"))
957 if (strEQ(name, "EEXIST"))
965 if (strEQ(name, "EFAULT"))
971 if (strEQ(name, "EFBIG"))
979 if (strEQ(name, "EHOSTDOWN"))
985 if (strEQ(name, "EHOSTUNREACH"))
993 if (strEQ(name, "EINPROGRESS"))
999 if (strEQ(name, "EINTR"))
1005 if (strEQ(name, "EINVAL"))
1011 if (strEQ(name, "EIO"))
1017 if (strEQ(name, "EISCONN"))
1023 if (strEQ(name, "EISDIR"))
1031 if (strEQ(name, "ELOOP"))
1039 if (strEQ(name, "EMFILE"))
1045 if (strEQ(name, "EMLINK"))
1051 if (strEQ(name, "EMSGSIZE"))
1059 if (strEQ(name, "ENETDOWN"))
1065 if (strEQ(name, "ENETRESET"))
1071 if (strEQ(name, "ENETUNREACH"))
1077 if (strEQ(name, "ENOBUFS"))
1083 if (strEQ(name, "ENOEXEC"))
1089 if (strEQ(name, "ENOMEM"))
1095 if (strEQ(name, "ENOPROTOOPT"))
1101 if (strEQ(name, "ENOSPC"))
1107 if (strEQ(name, "ENOTBLK"))
1113 if (strEQ(name, "ENOTCONN"))
1119 if (strEQ(name, "ENOTDIR"))
1125 if (strEQ(name, "ENOTEMPTY"))
1131 if (strEQ(name, "ENOTSOCK"))
1137 if (strEQ(name, "ENOTTY"))
1143 if (strEQ(name, "ENFILE"))
1149 if (strEQ(name, "ENODEV"))
1155 if (strEQ(name, "ENOENT"))
1161 if (strEQ(name, "ENOLCK"))
1167 if (strEQ(name, "ENOSYS"))
1173 if (strEQ(name, "ENXIO"))
1179 if (strEQ(name, "ENAMETOOLONG"))
1181 return ENAMETOOLONG;
1187 if (strEQ(name, "EOF"))
1193 if (strEQ(name, "EOPNOTSUPP"))
1201 if (strEQ(name, "EPERM"))
1207 if (strEQ(name, "EPFNOSUPPORT"))
1209 return EPFNOSUPPORT;
1213 if (strEQ(name, "EPIPE"))
1219 if (strEQ(name, "EPROCLIM"))
1225 if (strEQ(name, "EPROTONOSUPPORT"))
1226 #ifdef EPROTONOSUPPORT
1227 return EPROTONOSUPPORT;
1231 if (strEQ(name, "EPROTOTYPE"))
1239 if (strEQ(name, "ERANGE"))
1245 if (strEQ(name, "EREMOTE"))
1251 if (strEQ(name, "ERESTART"))
1257 if (strEQ(name, "EROFS"))
1265 if (strEQ(name, "ESHUTDOWN"))
1271 if (strEQ(name, "ESOCKTNOSUPPORT"))
1272 #ifdef ESOCKTNOSUPPORT
1273 return ESOCKTNOSUPPORT;
1277 if (strEQ(name, "ESPIPE"))
1283 if (strEQ(name, "ESRCH"))
1289 if (strEQ(name, "ESTALE"))
1297 if (strEQ(name, "ETIMEDOUT"))
1303 if (strEQ(name, "ETOOMANYREFS"))
1305 return ETOOMANYREFS;
1309 if (strEQ(name, "ETXTBSY"))
1317 if (strEQ(name, "EUSERS"))
1325 if (strEQ(name, "EWOULDBLOCK"))
1333 if (strEQ(name, "EXIT_FAILURE"))
1335 return EXIT_FAILURE;
1339 if (strEQ(name, "EXIT_SUCCESS"))
1341 return EXIT_SUCCESS;
1345 if (strEQ(name, "EXDEV"))
1353 if (strEQ(name, "E2BIG"))
1361 if (strnEQ(name, "FLT_", 4)) {
1362 if (strEQ(name, "FLT_MAX"))
1368 if (strEQ(name, "FLT_MIN"))
1374 if (strEQ(name, "FLT_ROUNDS"))
1380 if (strEQ(name, "FLT_DIG"))
1386 if (strEQ(name, "FLT_EPSILON"))
1392 if (strEQ(name, "FLT_MANT_DIG"))
1394 return FLT_MANT_DIG;
1398 if (strEQ(name, "FLT_MAX_10_EXP"))
1399 #ifdef FLT_MAX_10_EXP
1400 return FLT_MAX_10_EXP;
1404 if (strEQ(name, "FLT_MAX_EXP"))
1410 if (strEQ(name, "FLT_MIN_10_EXP"))
1411 #ifdef FLT_MIN_10_EXP
1412 return FLT_MIN_10_EXP;
1416 if (strEQ(name, "FLT_MIN_EXP"))
1422 if (strEQ(name, "FLT_RADIX"))
1430 if (strnEQ(name, "F_", 2)) {
1431 if (strEQ(name, "F_DUPFD"))
1437 if (strEQ(name, "F_GETFD"))
1443 if (strEQ(name, "F_GETFL"))
1449 if (strEQ(name, "F_GETLK"))
1455 if (strEQ(name, "F_OK"))
1461 if (strEQ(name, "F_RDLCK"))
1467 if (strEQ(name, "F_SETFD"))
1473 if (strEQ(name, "F_SETFL"))
1479 if (strEQ(name, "F_SETLK"))
1485 if (strEQ(name, "F_SETLKW"))
1491 if (strEQ(name, "F_UNLCK"))
1497 if (strEQ(name, "F_WRLCK"))
1505 if (strEQ(name, "FD_CLOEXEC"))
1511 if (strEQ(name, "FILENAME_MAX"))
1513 return FILENAME_MAX;
1519 if (strEQ(name, "HUGE_VAL"))
1520 #if defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
1521 /* HUGE_VALL is admittedly non-POSIX but if are using long doubles
1522 * we might as well use long doubles. --jhi */
1530 if (strEQ(name, "HUPCL"))
1538 if (strEQ(name, "INT_MAX"))
1544 if (strEQ(name, "INT_MIN"))
1550 if (strEQ(name, "ICANON"))
1556 if (strEQ(name, "ICRNL"))
1562 if (strEQ(name, "IEXTEN"))
1568 if (strEQ(name, "IGNBRK"))
1574 if (strEQ(name, "IGNCR"))
1580 if (strEQ(name, "IGNPAR"))
1586 if (strEQ(name, "INLCR"))
1592 if (strEQ(name, "INPCK"))
1598 if (strEQ(name, "ISIG"))
1604 if (strEQ(name, "ISTRIP"))
1610 if (strEQ(name, "IXOFF"))
1616 if (strEQ(name, "IXON"))
1624 if (strnEQ(name, "LC_", 3)) {
1625 if (strEQ(name, "LC_ALL"))
1631 if (strEQ(name, "LC_COLLATE"))
1637 if (strEQ(name, "LC_CTYPE"))
1643 if (strEQ(name, "LC_MONETARY"))
1649 if (strEQ(name, "LC_NUMERIC"))
1655 if (strEQ(name, "LC_TIME"))
1663 if (strnEQ(name, "LDBL_", 5)) {
1664 if (strEQ(name, "LDBL_MAX"))
1670 if (strEQ(name, "LDBL_MIN"))
1676 if (strEQ(name, "LDBL_DIG"))
1682 if (strEQ(name, "LDBL_EPSILON"))
1684 return LDBL_EPSILON;
1688 if (strEQ(name, "LDBL_MANT_DIG"))
1689 #ifdef LDBL_MANT_DIG
1690 return LDBL_MANT_DIG;
1694 if (strEQ(name, "LDBL_MAX_10_EXP"))
1695 #ifdef LDBL_MAX_10_EXP
1696 return LDBL_MAX_10_EXP;
1700 if (strEQ(name, "LDBL_MAX_EXP"))
1702 return LDBL_MAX_EXP;
1706 if (strEQ(name, "LDBL_MIN_10_EXP"))
1707 #ifdef LDBL_MIN_10_EXP
1708 return LDBL_MIN_10_EXP;
1712 if (strEQ(name, "LDBL_MIN_EXP"))
1714 return LDBL_MIN_EXP;
1720 if (strnEQ(name, "L_", 2)) {
1721 if (strEQ(name, "L_ctermid"))
1727 if (strEQ(name, "L_cuserid"))
1733 /* L_tmpnam[e] was a typo--retained for compatibility */
1734 if (strEQ(name, "L_tmpname") || strEQ(name, "L_tmpnam"))
1742 if (strEQ(name, "LONG_MAX"))
1748 if (strEQ(name, "LONG_MIN"))
1754 if (strEQ(name, "LINK_MAX"))
1762 if (strEQ(name, "MAX_CANON"))
1768 if (strEQ(name, "MAX_INPUT"))
1774 if (strEQ(name, "MB_CUR_MAX"))
1780 if (strEQ(name, "MB_LEN_MAX"))
1788 if (strEQ(name, "NULL")) return 0;
1789 if (strEQ(name, "NAME_MAX"))
1795 if (strEQ(name, "NCCS"))
1801 if (strEQ(name, "NGROUPS_MAX"))
1807 if (strEQ(name, "NOFLSH"))
1815 if (strnEQ(name, "O_", 2)) {
1816 if (strEQ(name, "O_APPEND"))
1822 if (strEQ(name, "O_CREAT"))
1828 if (strEQ(name, "O_TRUNC"))
1834 if (strEQ(name, "O_RDONLY"))
1840 if (strEQ(name, "O_RDWR"))
1846 if (strEQ(name, "O_WRONLY"))
1852 if (strEQ(name, "O_EXCL"))
1858 if (strEQ(name, "O_NOCTTY"))
1864 if (strEQ(name, "O_NONBLOCK"))
1870 if (strEQ(name, "O_ACCMODE"))
1878 if (strEQ(name, "OPEN_MAX"))
1884 if (strEQ(name, "OPOST"))
1892 if (strEQ(name, "PATH_MAX"))
1898 if (strEQ(name, "PARENB"))
1904 if (strEQ(name, "PARMRK"))
1910 if (strEQ(name, "PARODD"))
1916 if (strEQ(name, "PIPE_BUF"))
1924 if (strEQ(name, "RAND_MAX"))
1930 if (strEQ(name, "R_OK"))
1938 if (strnEQ(name, "SIG", 3)) {
1939 if (name[3] == '_') {
1940 if (strEQ(name, "SIG_BLOCK"))
1947 if (strEQ(name, "SIG_DFL")) return (IV)SIG_DFL;
1950 if (strEQ(name, "SIG_ERR")) return (IV)SIG_ERR;
1953 if (strEQ(name, "SIG_IGN")) return (IV)SIG_IGN;
1955 if (strEQ(name, "SIG_SETMASK"))
1961 if (strEQ(name, "SIG_UNBLOCK"))
1969 if (strEQ(name, "SIGABRT"))
1975 if (strEQ(name, "SIGALRM"))
1981 if (strEQ(name, "SIGCHLD"))
1987 if (strEQ(name, "SIGCONT"))
1993 if (strEQ(name, "SIGFPE"))
1999 if (strEQ(name, "SIGHUP"))
2005 if (strEQ(name, "SIGILL"))
2011 if (strEQ(name, "SIGINT"))
2017 if (strEQ(name, "SIGKILL"))
2023 if (strEQ(name, "SIGPIPE"))
2029 if (strEQ(name, "SIGQUIT"))
2035 if (strEQ(name, "SIGSEGV"))
2041 if (strEQ(name, "SIGSTOP"))
2047 if (strEQ(name, "SIGTERM"))
2053 if (strEQ(name, "SIGTSTP"))
2059 if (strEQ(name, "SIGTTIN"))
2065 if (strEQ(name, "SIGTTOU"))
2071 if (strEQ(name, "SIGUSR1"))
2077 if (strEQ(name, "SIGUSR2"))
2085 if (name[1] == '_') {
2086 if (strEQ(name, "S_ISGID"))
2092 if (strEQ(name, "S_ISUID"))
2098 if (strEQ(name, "S_IRGRP"))
2104 if (strEQ(name, "S_IROTH"))
2110 if (strEQ(name, "S_IRUSR"))
2116 if (strEQ(name, "S_IRWXG"))
2122 if (strEQ(name, "S_IRWXO"))
2128 if (strEQ(name, "S_IRWXU"))
2134 if (strEQ(name, "S_IWGRP"))
2140 if (strEQ(name, "S_IWOTH"))
2146 if (strEQ(name, "S_IWUSR"))
2152 if (strEQ(name, "S_IXGRP"))
2158 if (strEQ(name, "S_IXOTH"))
2164 if (strEQ(name, "S_IXUSR"))
2170 errno = EAGAIN; /* the following aren't constants */
2172 if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
2175 if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
2178 if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
2181 if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
2184 if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
2188 if (strEQ(name, "SEEK_CUR"))
2194 if (strEQ(name, "SEEK_END"))
2200 if (strEQ(name, "SEEK_SET"))
2206 if (strEQ(name, "STREAM_MAX"))
2212 if (strEQ(name, "SHRT_MAX"))
2218 if (strEQ(name, "SHRT_MIN"))
2224 if (strnEQ(name, "SA_", 3)) {
2225 if (strEQ(name, "SA_NOCLDSTOP"))
2227 return SA_NOCLDSTOP;
2231 if (strEQ(name, "SA_NOCLDWAIT"))
2233 return SA_NOCLDWAIT;
2237 if (strEQ(name, "SA_NODEFER"))
2243 if (strEQ(name, "SA_ONSTACK"))
2249 if (strEQ(name, "SA_RESETHAND"))
2251 return SA_RESETHAND;
2255 if (strEQ(name, "SA_RESTART"))
2261 if (strEQ(name, "SA_SIGINFO"))
2269 if (strEQ(name, "SCHAR_MAX"))
2275 if (strEQ(name, "SCHAR_MIN"))
2281 if (strEQ(name, "SSIZE_MAX"))
2287 if (strEQ(name, "STDIN_FILENO"))
2289 return STDIN_FILENO;
2293 if (strEQ(name, "STDOUT_FILENO"))
2294 #ifdef STDOUT_FILENO
2295 return STDOUT_FILENO;
2299 if (strEQ(name, "STRERR_FILENO"))
2300 #ifdef STRERR_FILENO
2301 return STRERR_FILENO;
2307 if (strEQ(name, "TCIFLUSH"))
2313 if (strEQ(name, "TCIOFF"))
2319 if (strEQ(name, "TCIOFLUSH"))
2325 if (strEQ(name, "TCION"))
2331 if (strEQ(name, "TCOFLUSH"))
2337 if (strEQ(name, "TCOOFF"))
2343 if (strEQ(name, "TCOON"))
2349 if (strEQ(name, "TCSADRAIN"))
2355 if (strEQ(name, "TCSAFLUSH"))
2361 if (strEQ(name, "TCSANOW"))
2367 if (strEQ(name, "TMP_MAX"))
2373 if (strEQ(name, "TOSTOP"))
2379 if (strEQ(name, "TZNAME_MAX"))
2387 if (strEQ(name, "UCHAR_MAX"))
2393 if (strEQ(name, "UINT_MAX"))
2399 if (strEQ(name, "ULONG_MAX"))
2405 if (strEQ(name, "USHRT_MAX"))
2413 if (strEQ(name, "VEOF"))
2419 if (strEQ(name, "VEOL"))
2425 if (strEQ(name, "VERASE"))
2431 if (strEQ(name, "VINTR"))
2437 if (strEQ(name, "VKILL"))
2443 if (strEQ(name, "VMIN"))
2449 if (strEQ(name, "VQUIT"))
2455 if (strEQ(name, "VSTART"))
2461 if (strEQ(name, "VSTOP"))
2467 if (strEQ(name, "VSUSP"))
2473 if (strEQ(name, "VTIME"))
2481 if (strEQ(name, "W_OK"))
2487 if (strEQ(name, "WNOHANG"))
2493 if (strEQ(name, "WUNTRACED"))
2499 errno = EAGAIN; /* the following aren't constants */
2501 if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
2504 if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
2507 if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
2510 if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
2513 if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
2516 if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
2520 if (strEQ(name, "X_OK"))
2528 if (strnEQ(name, "_PC_", 4)) {
2529 if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
2530 #if defined(_PC_CHOWN_RESTRICTED) || HINT_SC_EXIST
2531 return _PC_CHOWN_RESTRICTED;
2535 if (strEQ(name, "_PC_LINK_MAX"))
2536 #if defined(_PC_LINK_MAX) || HINT_SC_EXIST
2537 return _PC_LINK_MAX;
2541 if (strEQ(name, "_PC_MAX_CANON"))
2542 #if defined(_PC_MAX_CANON) || HINT_SC_EXIST
2543 return _PC_MAX_CANON;
2547 if (strEQ(name, "_PC_MAX_INPUT"))
2548 #if defined(_PC_MAX_INPUT) || HINT_SC_EXIST
2549 return _PC_MAX_INPUT;
2553 if (strEQ(name, "_PC_NAME_MAX"))
2554 #if defined(_PC_NAME_MAX) || HINT_SC_EXIST
2555 return _PC_NAME_MAX;
2559 if (strEQ(name, "_PC_NO_TRUNC"))
2560 #if defined(_PC_NO_TRUNC) || HINT_SC_EXIST
2561 return _PC_NO_TRUNC;
2565 if (strEQ(name, "_PC_PATH_MAX"))
2566 #if defined(_PC_PATH_MAX) || HINT_SC_EXIST
2567 return _PC_PATH_MAX;
2571 if (strEQ(name, "_PC_PIPE_BUF"))
2572 #if defined(_PC_PIPE_BUF) || HINT_SC_EXIST
2573 return _PC_PIPE_BUF;
2577 if (strEQ(name, "_PC_VDISABLE"))
2578 #if defined(_PC_VDISABLE) || HINT_SC_EXIST
2579 return _PC_VDISABLE;
2585 if (strnEQ(name, "_POSIX_", 7)) {
2586 if (strEQ(name, "_POSIX_ARG_MAX"))
2587 #ifdef _POSIX_ARG_MAX
2588 return _POSIX_ARG_MAX;
2592 if (strEQ(name, "_POSIX_CHILD_MAX"))
2593 #ifdef _POSIX_CHILD_MAX
2594 return _POSIX_CHILD_MAX;
2598 if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
2599 #ifdef _POSIX_CHOWN_RESTRICTED
2600 return _POSIX_CHOWN_RESTRICTED;
2604 if (strEQ(name, "_POSIX_JOB_CONTROL"))
2605 #ifdef _POSIX_JOB_CONTROL
2606 return _POSIX_JOB_CONTROL;
2610 if (strEQ(name, "_POSIX_LINK_MAX"))
2611 #ifdef _POSIX_LINK_MAX
2612 return _POSIX_LINK_MAX;
2616 if (strEQ(name, "_POSIX_MAX_CANON"))
2617 #ifdef _POSIX_MAX_CANON
2618 return _POSIX_MAX_CANON;
2622 if (strEQ(name, "_POSIX_MAX_INPUT"))
2623 #ifdef _POSIX_MAX_INPUT
2624 return _POSIX_MAX_INPUT;
2628 if (strEQ(name, "_POSIX_NAME_MAX"))
2629 #ifdef _POSIX_NAME_MAX
2630 return _POSIX_NAME_MAX;
2634 if (strEQ(name, "_POSIX_NGROUPS_MAX"))
2635 #ifdef _POSIX_NGROUPS_MAX
2636 return _POSIX_NGROUPS_MAX;
2640 if (strEQ(name, "_POSIX_NO_TRUNC"))
2641 #ifdef _POSIX_NO_TRUNC
2642 return _POSIX_NO_TRUNC;
2646 if (strEQ(name, "_POSIX_OPEN_MAX"))
2647 #ifdef _POSIX_OPEN_MAX
2648 return _POSIX_OPEN_MAX;
2652 if (strEQ(name, "_POSIX_PATH_MAX"))
2653 #ifdef _POSIX_PATH_MAX
2654 return _POSIX_PATH_MAX;
2658 if (strEQ(name, "_POSIX_PIPE_BUF"))
2659 #ifdef _POSIX_PIPE_BUF
2660 return _POSIX_PIPE_BUF;
2664 if (strEQ(name, "_POSIX_SAVED_IDS"))
2665 #ifdef _POSIX_SAVED_IDS
2666 return _POSIX_SAVED_IDS;
2670 if (strEQ(name, "_POSIX_SSIZE_MAX"))
2671 #ifdef _POSIX_SSIZE_MAX
2672 return _POSIX_SSIZE_MAX;
2676 if (strEQ(name, "_POSIX_STREAM_MAX"))
2677 #ifdef _POSIX_STREAM_MAX
2678 return _POSIX_STREAM_MAX;
2682 if (strEQ(name, "_POSIX_TZNAME_MAX"))
2683 #ifdef _POSIX_TZNAME_MAX
2684 return _POSIX_TZNAME_MAX;
2688 if (strEQ(name, "_POSIX_VDISABLE"))
2689 #ifdef _POSIX_VDISABLE
2690 return _POSIX_VDISABLE;
2694 if (strEQ(name, "_POSIX_VERSION"))
2695 #ifdef _POSIX_VERSION
2696 return _POSIX_VERSION;
2702 if (strnEQ(name, "_SC_", 4)) {
2703 if (strEQ(name, "_SC_ARG_MAX"))
2704 #if defined(_SC_ARG_MAX) || HINT_SC_EXIST
2709 if (strEQ(name, "_SC_CHILD_MAX"))
2710 #if defined(_SC_CHILD_MAX) || HINT_SC_EXIST
2711 return _SC_CHILD_MAX;
2715 if (strEQ(name, "_SC_CLK_TCK"))
2716 #if defined(_SC_CLK_TCK) || HINT_SC_EXIST
2721 if (strEQ(name, "_SC_JOB_CONTROL"))
2722 #if defined(_SC_JOB_CONTROL) || HINT_SC_EXIST
2723 return _SC_JOB_CONTROL;
2727 if (strEQ(name, "_SC_NGROUPS_MAX"))
2728 #if defined(_SC_NGROUPS_MAX) || HINT_SC_EXIST
2729 return _SC_NGROUPS_MAX;
2733 if (strEQ(name, "_SC_OPEN_MAX"))
2734 #if defined(_SC_OPEN_MAX) || HINT_SC_EXIST
2735 return _SC_OPEN_MAX;
2739 if (strEQ(name, "_SC_SAVED_IDS"))
2740 #if defined(_SC_SAVED_IDS) || HINT_SC_EXIST
2741 return _SC_SAVED_IDS;
2745 if (strEQ(name, "_SC_STREAM_MAX"))
2746 #if defined(_SC_STREAM_MAX) || HINT_SC_EXIST
2747 return _SC_STREAM_MAX;
2751 if (strEQ(name, "_SC_TZNAME_MAX"))
2752 #if defined(_SC_TZNAME_MAX) || HINT_SC_EXIST
2753 return _SC_TZNAME_MAX;
2757 if (strEQ(name, "_SC_VERSION"))
2758 #if defined(_SC_VERSION) || HINT_SC_EXIST
2774 MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
2777 new(packname = "POSIX::SigSet", ...)
2782 New(0, RETVAL, 1, sigset_t);
2783 sigemptyset(RETVAL);
2784 for (i = 1; i < items; i++)
2785 sigaddset(RETVAL, SvIV(ST(i)));
2792 POSIX::SigSet sigset
2797 sigaddset(sigset, sig)
2798 POSIX::SigSet sigset
2802 sigdelset(sigset, sig)
2803 POSIX::SigSet sigset
2808 POSIX::SigSet sigset
2812 POSIX::SigSet sigset
2815 sigismember(sigset, sig)
2816 POSIX::SigSet sigset
2820 MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
2823 new(packname = "POSIX::Termios", ...)
2828 New(0, RETVAL, 1, struct termios);
2830 not_here("termios");
2838 DESTROY(termios_ref)
2839 POSIX::Termios termios_ref
2842 Safefree(termios_ref);
2844 not_here("termios");
2848 getattr(termios_ref, fd = 0)
2849 POSIX::Termios termios_ref
2852 RETVAL = tcgetattr(fd, termios_ref);
2857 setattr(termios_ref, fd = 0, optional_actions = 0)
2858 POSIX::Termios termios_ref
2860 int optional_actions
2862 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
2867 cfgetispeed(termios_ref)
2868 POSIX::Termios termios_ref
2871 cfgetospeed(termios_ref)
2872 POSIX::Termios termios_ref
2875 getiflag(termios_ref)
2876 POSIX::Termios termios_ref
2878 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2879 RETVAL = termios_ref->c_iflag;
2881 not_here("getiflag");
2888 getoflag(termios_ref)
2889 POSIX::Termios termios_ref
2891 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2892 RETVAL = termios_ref->c_oflag;
2894 not_here("getoflag");
2901 getcflag(termios_ref)
2902 POSIX::Termios termios_ref
2904 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2905 RETVAL = termios_ref->c_cflag;
2907 not_here("getcflag");
2914 getlflag(termios_ref)
2915 POSIX::Termios termios_ref
2917 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2918 RETVAL = termios_ref->c_lflag;
2920 not_here("getlflag");
2927 getcc(termios_ref, ccix)
2928 POSIX::Termios termios_ref
2931 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2933 croak("Bad getcc subscript");
2934 RETVAL = termios_ref->c_cc[ccix];
2943 cfsetispeed(termios_ref, speed)
2944 POSIX::Termios termios_ref
2948 cfsetospeed(termios_ref, speed)
2949 POSIX::Termios termios_ref
2953 setiflag(termios_ref, iflag)
2954 POSIX::Termios termios_ref
2957 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2958 termios_ref->c_iflag = iflag;
2960 not_here("setiflag");
2964 setoflag(termios_ref, oflag)
2965 POSIX::Termios termios_ref
2968 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2969 termios_ref->c_oflag = oflag;
2971 not_here("setoflag");
2975 setcflag(termios_ref, cflag)
2976 POSIX::Termios termios_ref
2979 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2980 termios_ref->c_cflag = cflag;
2982 not_here("setcflag");
2986 setlflag(termios_ref, lflag)
2987 POSIX::Termios termios_ref
2990 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2991 termios_ref->c_lflag = lflag;
2993 not_here("setlflag");
2997 setcc(termios_ref, ccix, cc)
2998 POSIX::Termios termios_ref
3002 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
3004 croak("Bad setcc subscript");
3005 termios_ref->c_cc[ccix] = cc;
3011 MODULE = POSIX PACKAGE = POSIX
3020 unsigned char * charstring
3022 unsigned char *s = charstring;
3023 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3024 for (RETVAL = 1; RETVAL && s < e; s++)
3032 unsigned char * charstring
3034 unsigned char *s = charstring;
3035 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3036 for (RETVAL = 1; RETVAL && s < e; s++)
3044 unsigned char * charstring
3046 unsigned char *s = charstring;
3047 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3048 for (RETVAL = 1; RETVAL && s < e; s++)
3056 unsigned char * charstring
3058 unsigned char *s = charstring;
3059 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3060 for (RETVAL = 1; RETVAL && s < e; s++)
3068 unsigned char * charstring
3070 unsigned char *s = charstring;
3071 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3072 for (RETVAL = 1; RETVAL && s < e; s++)
3080 unsigned char * charstring
3082 unsigned char *s = charstring;
3083 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3084 for (RETVAL = 1; RETVAL && s < e; s++)
3092 unsigned char * charstring
3094 unsigned char *s = charstring;
3095 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3096 for (RETVAL = 1; RETVAL && s < e; s++)
3104 unsigned char * charstring
3106 unsigned char *s = charstring;
3107 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3108 for (RETVAL = 1; RETVAL && s < e; s++)
3116 unsigned char * charstring
3118 unsigned char *s = charstring;
3119 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3120 for (RETVAL = 1; RETVAL && s < e; s++)
3128 unsigned char * charstring
3130 unsigned char *s = charstring;
3131 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3132 for (RETVAL = 1; RETVAL && s < e; s++)
3139 isxdigit(charstring)
3140 unsigned char * charstring
3142 unsigned char *s = charstring;
3143 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3144 for (RETVAL = 1; RETVAL && s < e; s++)
3151 open(filename, flags = O_RDONLY, mode = 0666)
3156 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
3157 TAINT_PROPER("open");
3158 RETVAL = open(filename, flags, mode);
3166 #ifdef HAS_LOCALECONV
3167 struct lconv *lcbuf;
3169 if (lcbuf = localeconv()) {
3171 if (lcbuf->decimal_point && *lcbuf->decimal_point)
3172 hv_store(RETVAL, "decimal_point", 13,
3173 newSVpv(lcbuf->decimal_point, 0), 0);
3174 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
3175 hv_store(RETVAL, "thousands_sep", 13,
3176 newSVpv(lcbuf->thousands_sep, 0), 0);
3177 #ifndef NO_LOCALECONV_GROUPING
3178 if (lcbuf->grouping && *lcbuf->grouping)
3179 hv_store(RETVAL, "grouping", 8,
3180 newSVpv(lcbuf->grouping, 0), 0);
3182 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
3183 hv_store(RETVAL, "int_curr_symbol", 15,
3184 newSVpv(lcbuf->int_curr_symbol, 0), 0);
3185 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
3186 hv_store(RETVAL, "currency_symbol", 15,
3187 newSVpv(lcbuf->currency_symbol, 0), 0);
3188 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
3189 hv_store(RETVAL, "mon_decimal_point", 17,
3190 newSVpv(lcbuf->mon_decimal_point, 0), 0);
3191 #ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
3192 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
3193 hv_store(RETVAL, "mon_thousands_sep", 17,
3194 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
3196 #ifndef NO_LOCALECONV_MON_GROUPING
3197 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
3198 hv_store(RETVAL, "mon_grouping", 12,
3199 newSVpv(lcbuf->mon_grouping, 0), 0);
3201 if (lcbuf->positive_sign && *lcbuf->positive_sign)
3202 hv_store(RETVAL, "positive_sign", 13,
3203 newSVpv(lcbuf->positive_sign, 0), 0);
3204 if (lcbuf->negative_sign && *lcbuf->negative_sign)
3205 hv_store(RETVAL, "negative_sign", 13,
3206 newSVpv(lcbuf->negative_sign, 0), 0);
3208 if (lcbuf->int_frac_digits != CHAR_MAX)
3209 hv_store(RETVAL, "int_frac_digits", 15,
3210 newSViv(lcbuf->int_frac_digits), 0);
3211 if (lcbuf->frac_digits != CHAR_MAX)
3212 hv_store(RETVAL, "frac_digits", 11,
3213 newSViv(lcbuf->frac_digits), 0);
3214 if (lcbuf->p_cs_precedes != CHAR_MAX)
3215 hv_store(RETVAL, "p_cs_precedes", 13,
3216 newSViv(lcbuf->p_cs_precedes), 0);
3217 if (lcbuf->p_sep_by_space != CHAR_MAX)
3218 hv_store(RETVAL, "p_sep_by_space", 14,
3219 newSViv(lcbuf->p_sep_by_space), 0);
3220 if (lcbuf->n_cs_precedes != CHAR_MAX)
3221 hv_store(RETVAL, "n_cs_precedes", 13,
3222 newSViv(lcbuf->n_cs_precedes), 0);
3223 if (lcbuf->n_sep_by_space != CHAR_MAX)
3224 hv_store(RETVAL, "n_sep_by_space", 14,
3225 newSViv(lcbuf->n_sep_by_space), 0);
3226 if (lcbuf->p_sign_posn != CHAR_MAX)
3227 hv_store(RETVAL, "p_sign_posn", 11,
3228 newSViv(lcbuf->p_sign_posn), 0);
3229 if (lcbuf->n_sign_posn != CHAR_MAX)
3230 hv_store(RETVAL, "n_sign_posn", 11,
3231 newSViv(lcbuf->n_sign_posn), 0);
3234 localeconv(); /* A stub to call not_here(). */
3240 setlocale(category, locale = 0)
3244 RETVAL = setlocale(category, locale);
3246 #ifdef USE_LOCALE_CTYPE
3247 if (category == LC_CTYPE
3249 || category == LC_ALL
3255 if (category == LC_ALL)
3256 newctype = setlocale(LC_CTYPE, NULL);
3260 new_ctype(newctype);
3262 #endif /* USE_LOCALE_CTYPE */
3263 #ifdef USE_LOCALE_COLLATE
3264 if (category == LC_COLLATE
3266 || category == LC_ALL
3272 if (category == LC_ALL)
3273 newcoll = setlocale(LC_COLLATE, NULL);
3277 new_collate(newcoll);
3279 #endif /* USE_LOCALE_COLLATE */
3280 #ifdef USE_LOCALE_NUMERIC
3281 if (category == LC_NUMERIC
3283 || category == LC_ALL
3289 if (category == LC_ALL)
3290 newnum = setlocale(LC_NUMERIC, NULL);
3294 new_numeric(newnum);
3296 #endif /* USE_LOCALE_NUMERIC */
3336 /* (We already know stack is long enough.) */
3337 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
3338 PUSHs(sv_2mortal(newSViv(expvar)));
3354 /* (We already know stack is long enough.) */
3355 PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
3356 PUSHs(sv_2mortal(newSVnv(intvar)));
3371 sigaction(sig, action, oldaction = 0)
3373 POSIX::SigAction action
3374 POSIX::SigAction oldaction
3377 RETVAL = not_here("sigaction");
3379 # This code is really grody because we're trying to make the signal
3380 # interface look beautiful, which is hard.
3383 GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
3384 struct sigaction act;
3385 struct sigaction oact;
3386 POSIX__SigSet sigset;
3388 SV** sigsvp = hv_fetch(GvHVn(siggv),
3390 strlen(PL_sig_name[sig]),
3394 /* Remember old handler name if desired. */
3396 char *hand = SvPVx(*sigsvp, n_a);
3397 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
3398 sv_setpv(*svp, *hand ? hand : "DEFAULT");
3402 /* Vector new handler through %SIG. (We always use sighandler
3403 for the C signal handler, which reads %SIG to dispatch.) */
3404 svp = hv_fetch(action, "HANDLER", 7, FALSE);
3406 croak("Can't supply an action without a HANDLER");
3407 sv_setpv(*sigsvp, SvPV(*svp, n_a));
3408 mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
3409 act.sa_handler = PL_sighandlerp;
3411 /* Set up any desired mask. */
3412 svp = hv_fetch(action, "MASK", 4, FALSE);
3413 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
3415 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3416 sigset = (sigset_t*) tmp;
3417 act.sa_mask = *sigset;
3420 sigemptyset(& act.sa_mask);
3422 /* Set up any desired flags. */
3423 svp = hv_fetch(action, "FLAGS", 5, FALSE);
3424 act.sa_flags = svp ? SvIV(*svp) : 0;
3427 /* Now work around sigaction oddities */
3428 if (action && oldaction)
3429 RETVAL = sigaction(sig, & act, & oact);
3431 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
3433 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
3438 /* Get back the mask. */
3439 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
3440 if (sv_isa(*svp, "POSIX::SigSet")) {
3442 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3443 sigset = (sigset_t*) tmp;
3446 New(0, sigset, 1, sigset_t);
3447 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
3449 *sigset = oact.sa_mask;
3451 /* Get back the flags. */
3452 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
3453 sv_setiv(*svp, oact.sa_flags);
3462 POSIX::SigSet sigset
3465 sigprocmask(how, sigset, oldsigset = 0)
3467 POSIX::SigSet sigset
3468 POSIX::SigSet oldsigset = NO_INIT
3473 else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
3474 IV tmp = SvIV((SV*)SvRV(ST(2)));
3475 oldsigset = INT2PTR(POSIX__SigSet,tmp);
3478 New(0, oldsigset, 1, sigset_t);
3479 sigemptyset(oldsigset);
3480 sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
3484 sigsuspend(signal_mask)
3485 POSIX::SigSet signal_mask
3505 lseek(fd, offset, whence)
3518 if (pipe(fds) != -1) {
3520 PUSHs(sv_2mortal(newSViv(fds[0])));
3521 PUSHs(sv_2mortal(newSViv(fds[1])));
3525 read(fd, buffer, nbytes)
3527 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
3531 char * buffer = sv_grow( sv_buffer, nbytes+1 );
3534 SvCUR(sv_buffer) = RETVAL;
3535 SvPOK_only(sv_buffer);
3536 *SvEND(sv_buffer) = '\0';
3537 SvTAINTED_on(sv_buffer);
3553 tcsetpgrp(fd, pgrp_id)
3562 if (uname(&buf) >= 0) {
3564 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
3565 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
3566 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
3567 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
3568 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
3571 uname((char *) 0); /* A stub to call not_here(). */
3575 write(fd, buffer, nbytes)
3586 RETVAL = newSVpvn("", 0);
3587 SvGROW(RETVAL, L_tmpnam);
3588 len = strlen(tmpnam(SvPV(RETVAL, i)));
3589 SvCUR_set(RETVAL, len);
3602 mbstowcs(s, pwcs, n)
3614 wcstombs(s, pwcs, n)
3636 SET_NUMERIC_LOCAL();
3637 num = strtod(str, &unparsed);
3638 PUSHs(sv_2mortal(newSVnv(num)));
3639 if (GIMME == G_ARRAY) {
3642 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3644 PUSHs(&PL_sv_undef);
3648 strtol(str, base = 0)
3655 num = strtol(str, &unparsed, base);
3656 #if IVSIZE <= LONGSIZE
3657 if (num < IV_MIN || num > IV_MAX)
3658 PUSHs(sv_2mortal(newSVnv((double)num)));
3661 PUSHs(sv_2mortal(newSViv((IV)num)));
3662 if (GIMME == G_ARRAY) {
3665 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3667 PUSHs(&PL_sv_undef);
3671 strtoul(str, base = 0)
3678 num = strtoul(str, &unparsed, base);
3680 PUSHs(sv_2mortal(newSViv((IV)num)));
3682 PUSHs(sv_2mortal(newSVnv((double)num)));
3683 if (GIMME == G_ARRAY) {
3686 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3688 PUSHs(&PL_sv_undef);
3698 char *p = SvPV(src,srclen);
3700 ST(0) = sv_2mortal(NEWSV(800,srclen));
3701 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
3702 if (dstlen > srclen) {
3704 SvGROW(ST(0), dstlen);
3705 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
3708 SvCUR(ST(0)) = dstlen;
3713 mkfifo(filename, mode)
3717 TAINT_PROPER("mkfifo");
3718 RETVAL = mkfifo(filename, mode);
3734 tcflush(fd, queue_selector)
3739 tcsendbreak(fd, duration)
3744 asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3757 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3760 mytm.tm_hour = hour;
3761 mytm.tm_mday = mday;
3763 mytm.tm_year = year;
3764 mytm.tm_wday = wday;
3765 mytm.tm_yday = yday;
3766 mytm.tm_isdst = isdst;
3767 RETVAL = asctime(&mytm);
3784 realtime = times( &tms );
3786 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
3787 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
3788 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
3789 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
3790 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
3793 difftime(time1, time2)
3798 mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3811 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3814 mytm.tm_hour = hour;
3815 mytm.tm_mday = mday;
3817 mytm.tm_year = year;
3818 mytm.tm_wday = wday;
3819 mytm.tm_yday = yday;
3820 mytm.tm_isdst = isdst;
3821 RETVAL = mktime(&mytm);
3827 strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
3843 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3846 mytm.tm_hour = hour;
3847 mytm.tm_mday = mday;
3849 mytm.tm_year = year;
3850 mytm.tm_wday = wday;
3851 mytm.tm_yday = yday;
3852 mytm.tm_isdst = isdst;
3854 len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
3856 ** The following is needed to handle to the situation where
3857 ** tmpbuf overflows. Basically we want to allocate a buffer
3858 ** and try repeatedly. The reason why it is so complicated
3859 ** is that getting a return value of 0 from strftime can indicate
3860 ** one of the following:
3861 ** 1. buffer overflowed,
3862 ** 2. illegal conversion specifier, or
3863 ** 3. the format string specifies nothing to be returned(not
3864 ** an error). This could be because format is an empty string
3865 ** or it specifies %p that yields an empty string in some locale.
3866 ** If there is a better way to make it portable, go ahead by
3869 if ((len > 0 && len < sizeof(tmpbuf)) || (len == 0 && *fmt == '\0'))
3870 ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
3872 /* Possibly buf overflowed - try again with a bigger buf */
3873 int fmtlen = strlen(fmt);
3874 int bufsize = fmtlen + sizeof(tmpbuf);
3878 New(0, buf, bufsize, char);
3880 buflen = strftime(buf, bufsize, fmt, &mytm);
3881 if (buflen > 0 && buflen < bufsize)
3883 /* heuristic to prevent out-of-memory errors */
3884 if (bufsize > 100*fmtlen) {
3890 Renew(buf, bufsize, char);
3893 ST(0) = sv_2mortal(newSVpvn(buf, buflen));
3897 ST(0) = sv_2mortal(newSVpvn(tmpbuf, len));
3908 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
3909 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
3912 access(filename, mode)
3930 pathconf(filename, name)