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;
544 croak("POSIX::%s not implemented on this architecture", s);
550 constant(char *name, int arg)
555 if (strEQ(name, "ARG_MAX"))
563 if (strEQ(name, "BUFSIZ"))
569 if (strEQ(name, "BRKINT"))
575 if (strEQ(name, "B9600"))
581 if (strEQ(name, "B19200"))
587 if (strEQ(name, "B38400"))
593 if (strEQ(name, "B0"))
599 if (strEQ(name, "B110"))
605 if (strEQ(name, "B1200"))
611 if (strEQ(name, "B134"))
617 if (strEQ(name, "B150"))
623 if (strEQ(name, "B1800"))
629 if (strEQ(name, "B200"))
635 if (strEQ(name, "B2400"))
641 if (strEQ(name, "B300"))
647 if (strEQ(name, "B4800"))
653 if (strEQ(name, "B50"))
659 if (strEQ(name, "B600"))
665 if (strEQ(name, "B75"))
673 if (strEQ(name, "CHAR_BIT"))
679 if (strEQ(name, "CHAR_MAX"))
685 if (strEQ(name, "CHAR_MIN"))
691 if (strEQ(name, "CHILD_MAX"))
697 if (strEQ(name, "CLK_TCK"))
703 if (strEQ(name, "CLOCAL"))
709 if (strEQ(name, "CLOCKS_PER_SEC"))
710 #ifdef CLOCKS_PER_SEC
711 return CLOCKS_PER_SEC;
715 if (strEQ(name, "CREAD"))
721 if (strEQ(name, "CS5"))
727 if (strEQ(name, "CS6"))
733 if (strEQ(name, "CS7"))
739 if (strEQ(name, "CS8"))
745 if (strEQ(name, "CSIZE"))
751 if (strEQ(name, "CSTOPB"))
759 if (strEQ(name, "DBL_MAX"))
765 if (strEQ(name, "DBL_MIN"))
771 if (strEQ(name, "DBL_DIG"))
777 if (strEQ(name, "DBL_EPSILON"))
783 if (strEQ(name, "DBL_MANT_DIG"))
789 if (strEQ(name, "DBL_MAX_10_EXP"))
790 #ifdef DBL_MAX_10_EXP
791 return DBL_MAX_10_EXP;
795 if (strEQ(name, "DBL_MAX_EXP"))
801 if (strEQ(name, "DBL_MIN_10_EXP"))
802 #ifdef DBL_MIN_10_EXP
803 return DBL_MIN_10_EXP;
807 if (strEQ(name, "DBL_MIN_EXP"))
817 if (strEQ(name, "EACCES"))
823 if (strEQ(name, "EADDRINUSE"))
829 if (strEQ(name, "EADDRNOTAVAIL"))
831 return EADDRNOTAVAIL;
835 if (strEQ(name, "EAFNOSUPPORT"))
841 if (strEQ(name, "EAGAIN"))
847 if (strEQ(name, "EALREADY"))
855 if (strEQ(name, "EBADF"))
861 if (strEQ(name, "EBUSY"))
869 if (strEQ(name, "ECHILD"))
875 if (strEQ(name, "ECHO"))
881 if (strEQ(name, "ECHOE"))
887 if (strEQ(name, "ECHOK"))
893 if (strEQ(name, "ECHONL"))
899 if (strEQ(name, "ECONNABORTED"))
905 if (strEQ(name, "ECONNREFUSED"))
911 if (strEQ(name, "ECONNRESET"))
919 if (strEQ(name, "EDEADLK"))
925 if (strEQ(name, "EDESTADDRREQ"))
931 if (strEQ(name, "EDOM"))
937 if (strEQ(name, "EDQUOT"))
945 if (strEQ(name, "EEXIST"))
953 if (strEQ(name, "EFAULT"))
959 if (strEQ(name, "EFBIG"))
967 if (strEQ(name, "EHOSTDOWN"))
973 if (strEQ(name, "EHOSTUNREACH"))
981 if (strEQ(name, "EINPROGRESS"))
987 if (strEQ(name, "EINTR"))
993 if (strEQ(name, "EINVAL"))
999 if (strEQ(name, "EIO"))
1005 if (strEQ(name, "EISCONN"))
1011 if (strEQ(name, "EISDIR"))
1019 if (strEQ(name, "ELOOP"))
1027 if (strEQ(name, "EMFILE"))
1033 if (strEQ(name, "EMLINK"))
1039 if (strEQ(name, "EMSGSIZE"))
1047 if (strEQ(name, "ENETDOWN"))
1053 if (strEQ(name, "ENETRESET"))
1059 if (strEQ(name, "ENETUNREACH"))
1065 if (strEQ(name, "ENOBUFS"))
1071 if (strEQ(name, "ENOEXEC"))
1077 if (strEQ(name, "ENOMEM"))
1083 if (strEQ(name, "ENOPROTOOPT"))
1089 if (strEQ(name, "ENOSPC"))
1095 if (strEQ(name, "ENOTBLK"))
1101 if (strEQ(name, "ENOTCONN"))
1107 if (strEQ(name, "ENOTDIR"))
1113 if (strEQ(name, "ENOTEMPTY"))
1119 if (strEQ(name, "ENOTSOCK"))
1125 if (strEQ(name, "ENOTTY"))
1131 if (strEQ(name, "ENFILE"))
1137 if (strEQ(name, "ENODEV"))
1143 if (strEQ(name, "ENOENT"))
1149 if (strEQ(name, "ENOLCK"))
1155 if (strEQ(name, "ENOSYS"))
1161 if (strEQ(name, "ENXIO"))
1167 if (strEQ(name, "ENAMETOOLONG"))
1169 return ENAMETOOLONG;
1175 if (strEQ(name, "EOF"))
1181 if (strEQ(name, "EOPNOTSUPP"))
1189 if (strEQ(name, "EPERM"))
1195 if (strEQ(name, "EPFNOSUPPORT"))
1197 return EPFNOSUPPORT;
1201 if (strEQ(name, "EPIPE"))
1207 if (strEQ(name, "EPROCLIM"))
1213 if (strEQ(name, "EPROTONOSUPPORT"))
1214 #ifdef EPROTONOSUPPORT
1215 return EPROTONOSUPPORT;
1219 if (strEQ(name, "EPROTOTYPE"))
1227 if (strEQ(name, "ERANGE"))
1233 if (strEQ(name, "EREMOTE"))
1239 if (strEQ(name, "ERESTART"))
1245 if (strEQ(name, "EROFS"))
1253 if (strEQ(name, "ESHUTDOWN"))
1259 if (strEQ(name, "ESOCKTNOSUPPORT"))
1260 #ifdef ESOCKTNOSUPPORT
1261 return ESOCKTNOSUPPORT;
1265 if (strEQ(name, "ESPIPE"))
1271 if (strEQ(name, "ESRCH"))
1277 if (strEQ(name, "ESTALE"))
1285 if (strEQ(name, "ETIMEDOUT"))
1291 if (strEQ(name, "ETOOMANYREFS"))
1293 return ETOOMANYREFS;
1297 if (strEQ(name, "ETXTBSY"))
1305 if (strEQ(name, "EUSERS"))
1313 if (strEQ(name, "EWOULDBLOCK"))
1321 if (strEQ(name, "EXIT_FAILURE"))
1323 return EXIT_FAILURE;
1327 if (strEQ(name, "EXIT_SUCCESS"))
1329 return EXIT_SUCCESS;
1333 if (strEQ(name, "EXDEV"))
1341 if (strEQ(name, "E2BIG"))
1349 if (strnEQ(name, "FLT_", 4)) {
1350 if (strEQ(name, "FLT_MAX"))
1356 if (strEQ(name, "FLT_MIN"))
1362 if (strEQ(name, "FLT_ROUNDS"))
1368 if (strEQ(name, "FLT_DIG"))
1374 if (strEQ(name, "FLT_EPSILON"))
1380 if (strEQ(name, "FLT_MANT_DIG"))
1382 return FLT_MANT_DIG;
1386 if (strEQ(name, "FLT_MAX_10_EXP"))
1387 #ifdef FLT_MAX_10_EXP
1388 return FLT_MAX_10_EXP;
1392 if (strEQ(name, "FLT_MAX_EXP"))
1398 if (strEQ(name, "FLT_MIN_10_EXP"))
1399 #ifdef FLT_MIN_10_EXP
1400 return FLT_MIN_10_EXP;
1404 if (strEQ(name, "FLT_MIN_EXP"))
1410 if (strEQ(name, "FLT_RADIX"))
1418 if (strnEQ(name, "F_", 2)) {
1419 if (strEQ(name, "F_DUPFD"))
1425 if (strEQ(name, "F_GETFD"))
1431 if (strEQ(name, "F_GETFL"))
1437 if (strEQ(name, "F_GETLK"))
1443 if (strEQ(name, "F_OK"))
1449 if (strEQ(name, "F_RDLCK"))
1455 if (strEQ(name, "F_SETFD"))
1461 if (strEQ(name, "F_SETFL"))
1467 if (strEQ(name, "F_SETLK"))
1473 if (strEQ(name, "F_SETLKW"))
1479 if (strEQ(name, "F_UNLCK"))
1485 if (strEQ(name, "F_WRLCK"))
1493 if (strEQ(name, "FD_CLOEXEC"))
1499 if (strEQ(name, "FILENAME_MAX"))
1501 return FILENAME_MAX;
1507 if (strEQ(name, "HUGE_VAL"))
1508 #if defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
1509 /* HUGE_VALL is admittedly non-POSIX but if we are using long doubles
1510 * we might as well use long doubles. --jhi */
1518 if (strEQ(name, "HUPCL"))
1526 if (strEQ(name, "INT_MAX"))
1532 if (strEQ(name, "INT_MIN"))
1538 if (strEQ(name, "ICANON"))
1544 if (strEQ(name, "ICRNL"))
1550 if (strEQ(name, "IEXTEN"))
1556 if (strEQ(name, "IGNBRK"))
1562 if (strEQ(name, "IGNCR"))
1568 if (strEQ(name, "IGNPAR"))
1574 if (strEQ(name, "INLCR"))
1580 if (strEQ(name, "INPCK"))
1586 if (strEQ(name, "ISIG"))
1592 if (strEQ(name, "ISTRIP"))
1598 if (strEQ(name, "IXOFF"))
1604 if (strEQ(name, "IXON"))
1612 if (strnEQ(name, "LC_", 3)) {
1613 if (strEQ(name, "LC_ALL"))
1619 if (strEQ(name, "LC_COLLATE"))
1625 if (strEQ(name, "LC_CTYPE"))
1631 if (strEQ(name, "LC_MONETARY"))
1637 if (strEQ(name, "LC_NUMERIC"))
1643 if (strEQ(name, "LC_TIME"))
1651 if (strnEQ(name, "LDBL_", 5)) {
1652 if (strEQ(name, "LDBL_MAX"))
1658 if (strEQ(name, "LDBL_MIN"))
1664 if (strEQ(name, "LDBL_DIG"))
1670 if (strEQ(name, "LDBL_EPSILON"))
1672 return LDBL_EPSILON;
1676 if (strEQ(name, "LDBL_MANT_DIG"))
1677 #ifdef LDBL_MANT_DIG
1678 return LDBL_MANT_DIG;
1682 if (strEQ(name, "LDBL_MAX_10_EXP"))
1683 #ifdef LDBL_MAX_10_EXP
1684 return LDBL_MAX_10_EXP;
1688 if (strEQ(name, "LDBL_MAX_EXP"))
1690 return LDBL_MAX_EXP;
1694 if (strEQ(name, "LDBL_MIN_10_EXP"))
1695 #ifdef LDBL_MIN_10_EXP
1696 return LDBL_MIN_10_EXP;
1700 if (strEQ(name, "LDBL_MIN_EXP"))
1702 return LDBL_MIN_EXP;
1708 if (strnEQ(name, "L_", 2)) {
1709 if (strEQ(name, "L_ctermid"))
1715 if (strEQ(name, "L_cuserid"))
1721 /* L_tmpnam[e] was a typo--retained for compatibility */
1722 if (strEQ(name, "L_tmpname") || strEQ(name, "L_tmpnam"))
1730 if (strEQ(name, "LONG_MAX"))
1736 if (strEQ(name, "LONG_MIN"))
1742 if (strEQ(name, "LINK_MAX"))
1750 if (strEQ(name, "MAX_CANON"))
1756 if (strEQ(name, "MAX_INPUT"))
1762 if (strEQ(name, "MB_CUR_MAX"))
1768 if (strEQ(name, "MB_LEN_MAX"))
1776 if (strEQ(name, "NULL")) return 0;
1777 if (strEQ(name, "NAME_MAX"))
1783 if (strEQ(name, "NCCS"))
1789 if (strEQ(name, "NGROUPS_MAX"))
1795 if (strEQ(name, "NOFLSH"))
1803 if (strnEQ(name, "O_", 2)) {
1804 if (strEQ(name, "O_APPEND"))
1810 if (strEQ(name, "O_CREAT"))
1816 if (strEQ(name, "O_TRUNC"))
1822 if (strEQ(name, "O_RDONLY"))
1828 if (strEQ(name, "O_RDWR"))
1834 if (strEQ(name, "O_WRONLY"))
1840 if (strEQ(name, "O_EXCL"))
1846 if (strEQ(name, "O_NOCTTY"))
1852 if (strEQ(name, "O_NONBLOCK"))
1858 if (strEQ(name, "O_ACCMODE"))
1866 if (strEQ(name, "OPEN_MAX"))
1872 if (strEQ(name, "OPOST"))
1880 if (strEQ(name, "PATH_MAX"))
1886 if (strEQ(name, "PARENB"))
1892 if (strEQ(name, "PARMRK"))
1898 if (strEQ(name, "PARODD"))
1904 if (strEQ(name, "PIPE_BUF"))
1912 if (strEQ(name, "RAND_MAX"))
1918 if (strEQ(name, "R_OK"))
1926 if (strnEQ(name, "SIG", 3)) {
1927 if (name[3] == '_') {
1928 if (strEQ(name, "SIG_BLOCK"))
1935 if (strEQ(name, "SIG_DFL")) return (IV)SIG_DFL;
1938 if (strEQ(name, "SIG_ERR")) return (IV)SIG_ERR;
1941 if (strEQ(name, "SIG_IGN")) return (IV)SIG_IGN;
1943 if (strEQ(name, "SIG_SETMASK"))
1949 if (strEQ(name, "SIG_UNBLOCK"))
1957 if (strEQ(name, "SIGABRT"))
1963 if (strEQ(name, "SIGALRM"))
1969 if (strEQ(name, "SIGCHLD"))
1975 if (strEQ(name, "SIGCONT"))
1981 if (strEQ(name, "SIGFPE"))
1987 if (strEQ(name, "SIGHUP"))
1993 if (strEQ(name, "SIGILL"))
1999 if (strEQ(name, "SIGINT"))
2005 if (strEQ(name, "SIGKILL"))
2011 if (strEQ(name, "SIGPIPE"))
2017 if (strEQ(name, "SIGQUIT"))
2023 if (strEQ(name, "SIGSEGV"))
2029 if (strEQ(name, "SIGSTOP"))
2035 if (strEQ(name, "SIGTERM"))
2041 if (strEQ(name, "SIGTSTP"))
2047 if (strEQ(name, "SIGTTIN"))
2053 if (strEQ(name, "SIGTTOU"))
2059 if (strEQ(name, "SIGUSR1"))
2065 if (strEQ(name, "SIGUSR2"))
2073 if (name[1] == '_') {
2074 if (strEQ(name, "S_ISGID"))
2080 if (strEQ(name, "S_ISUID"))
2086 if (strEQ(name, "S_IRGRP"))
2092 if (strEQ(name, "S_IROTH"))
2098 if (strEQ(name, "S_IRUSR"))
2104 if (strEQ(name, "S_IRWXG"))
2110 if (strEQ(name, "S_IRWXO"))
2116 if (strEQ(name, "S_IRWXU"))
2122 if (strEQ(name, "S_IWGRP"))
2128 if (strEQ(name, "S_IWOTH"))
2134 if (strEQ(name, "S_IWUSR"))
2140 if (strEQ(name, "S_IXGRP"))
2146 if (strEQ(name, "S_IXOTH"))
2152 if (strEQ(name, "S_IXUSR"))
2158 errno = EAGAIN; /* the following aren't constants */
2160 if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
2163 if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
2166 if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
2169 if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
2172 if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
2176 if (strEQ(name, "SEEK_CUR"))
2182 if (strEQ(name, "SEEK_END"))
2188 if (strEQ(name, "SEEK_SET"))
2194 if (strEQ(name, "STREAM_MAX"))
2200 if (strEQ(name, "SHRT_MAX"))
2206 if (strEQ(name, "SHRT_MIN"))
2212 if (strnEQ(name, "SA_", 3)) {
2213 if (strEQ(name, "SA_NOCLDSTOP"))
2215 return SA_NOCLDSTOP;
2219 if (strEQ(name, "SA_NOCLDWAIT"))
2221 return SA_NOCLDWAIT;
2225 if (strEQ(name, "SA_NODEFER"))
2231 if (strEQ(name, "SA_ONSTACK"))
2237 if (strEQ(name, "SA_RESETHAND"))
2239 return SA_RESETHAND;
2243 if (strEQ(name, "SA_RESTART"))
2249 if (strEQ(name, "SA_SIGINFO"))
2257 if (strEQ(name, "SCHAR_MAX"))
2263 if (strEQ(name, "SCHAR_MIN"))
2269 if (strEQ(name, "SSIZE_MAX"))
2275 if (strEQ(name, "STDIN_FILENO"))
2277 return STDIN_FILENO;
2281 if (strEQ(name, "STDOUT_FILENO"))
2282 #ifdef STDOUT_FILENO
2283 return STDOUT_FILENO;
2287 if (strEQ(name, "STDERR_FILENO"))
2288 #ifdef STDERR_FILENO
2289 return STDERR_FILENO;
2295 if (strEQ(name, "TCIFLUSH"))
2301 if (strEQ(name, "TCIOFF"))
2307 if (strEQ(name, "TCIOFLUSH"))
2313 if (strEQ(name, "TCION"))
2319 if (strEQ(name, "TCOFLUSH"))
2325 if (strEQ(name, "TCOOFF"))
2331 if (strEQ(name, "TCOON"))
2337 if (strEQ(name, "TCSADRAIN"))
2343 if (strEQ(name, "TCSAFLUSH"))
2349 if (strEQ(name, "TCSANOW"))
2355 if (strEQ(name, "TMP_MAX"))
2361 if (strEQ(name, "TOSTOP"))
2367 if (strEQ(name, "TZNAME_MAX"))
2375 if (strEQ(name, "UCHAR_MAX"))
2381 if (strEQ(name, "UINT_MAX"))
2387 if (strEQ(name, "ULONG_MAX"))
2393 if (strEQ(name, "USHRT_MAX"))
2401 if (strEQ(name, "VEOF"))
2407 if (strEQ(name, "VEOL"))
2413 if (strEQ(name, "VERASE"))
2419 if (strEQ(name, "VINTR"))
2425 if (strEQ(name, "VKILL"))
2431 if (strEQ(name, "VMIN"))
2437 if (strEQ(name, "VQUIT"))
2443 if (strEQ(name, "VSTART"))
2449 if (strEQ(name, "VSTOP"))
2455 if (strEQ(name, "VSUSP"))
2461 if (strEQ(name, "VTIME"))
2469 if (strEQ(name, "W_OK"))
2475 if (strEQ(name, "WNOHANG"))
2481 if (strEQ(name, "WUNTRACED"))
2487 errno = EAGAIN; /* the following aren't constants */
2489 if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
2492 if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
2495 if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
2498 if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
2501 if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
2504 if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
2508 if (strEQ(name, "X_OK"))
2516 if (strnEQ(name, "_PC_", 4)) {
2517 if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
2518 #if defined(_PC_CHOWN_RESTRICTED) || HINT_SC_EXIST
2519 return _PC_CHOWN_RESTRICTED;
2523 if (strEQ(name, "_PC_LINK_MAX"))
2524 #if defined(_PC_LINK_MAX) || HINT_SC_EXIST
2525 return _PC_LINK_MAX;
2529 if (strEQ(name, "_PC_MAX_CANON"))
2530 #if defined(_PC_MAX_CANON) || HINT_SC_EXIST
2531 return _PC_MAX_CANON;
2535 if (strEQ(name, "_PC_MAX_INPUT"))
2536 #if defined(_PC_MAX_INPUT) || HINT_SC_EXIST
2537 return _PC_MAX_INPUT;
2541 if (strEQ(name, "_PC_NAME_MAX"))
2542 #if defined(_PC_NAME_MAX) || HINT_SC_EXIST
2543 return _PC_NAME_MAX;
2547 if (strEQ(name, "_PC_NO_TRUNC"))
2548 #if defined(_PC_NO_TRUNC) || HINT_SC_EXIST
2549 return _PC_NO_TRUNC;
2553 if (strEQ(name, "_PC_PATH_MAX"))
2554 #if defined(_PC_PATH_MAX) || HINT_SC_EXIST
2555 return _PC_PATH_MAX;
2559 if (strEQ(name, "_PC_PIPE_BUF"))
2560 #if defined(_PC_PIPE_BUF) || HINT_SC_EXIST
2561 return _PC_PIPE_BUF;
2565 if (strEQ(name, "_PC_VDISABLE"))
2566 #if defined(_PC_VDISABLE) || HINT_SC_EXIST
2567 return _PC_VDISABLE;
2573 if (strnEQ(name, "_POSIX_", 7)) {
2574 if (strEQ(name, "_POSIX_ARG_MAX"))
2575 #ifdef _POSIX_ARG_MAX
2576 return _POSIX_ARG_MAX;
2580 if (strEQ(name, "_POSIX_CHILD_MAX"))
2581 #ifdef _POSIX_CHILD_MAX
2582 return _POSIX_CHILD_MAX;
2586 if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
2587 #ifdef _POSIX_CHOWN_RESTRICTED
2588 return _POSIX_CHOWN_RESTRICTED;
2592 if (strEQ(name, "_POSIX_JOB_CONTROL"))
2593 #ifdef _POSIX_JOB_CONTROL
2594 return _POSIX_JOB_CONTROL;
2598 if (strEQ(name, "_POSIX_LINK_MAX"))
2599 #ifdef _POSIX_LINK_MAX
2600 return _POSIX_LINK_MAX;
2604 if (strEQ(name, "_POSIX_MAX_CANON"))
2605 #ifdef _POSIX_MAX_CANON
2606 return _POSIX_MAX_CANON;
2610 if (strEQ(name, "_POSIX_MAX_INPUT"))
2611 #ifdef _POSIX_MAX_INPUT
2612 return _POSIX_MAX_INPUT;
2616 if (strEQ(name, "_POSIX_NAME_MAX"))
2617 #ifdef _POSIX_NAME_MAX
2618 return _POSIX_NAME_MAX;
2622 if (strEQ(name, "_POSIX_NGROUPS_MAX"))
2623 #ifdef _POSIX_NGROUPS_MAX
2624 return _POSIX_NGROUPS_MAX;
2628 if (strEQ(name, "_POSIX_NO_TRUNC"))
2629 #ifdef _POSIX_NO_TRUNC
2630 return _POSIX_NO_TRUNC;
2634 if (strEQ(name, "_POSIX_OPEN_MAX"))
2635 #ifdef _POSIX_OPEN_MAX
2636 return _POSIX_OPEN_MAX;
2640 if (strEQ(name, "_POSIX_PATH_MAX"))
2641 #ifdef _POSIX_PATH_MAX
2642 return _POSIX_PATH_MAX;
2646 if (strEQ(name, "_POSIX_PIPE_BUF"))
2647 #ifdef _POSIX_PIPE_BUF
2648 return _POSIX_PIPE_BUF;
2652 if (strEQ(name, "_POSIX_SAVED_IDS"))
2653 #ifdef _POSIX_SAVED_IDS
2654 return _POSIX_SAVED_IDS;
2658 if (strEQ(name, "_POSIX_SSIZE_MAX"))
2659 #ifdef _POSIX_SSIZE_MAX
2660 return _POSIX_SSIZE_MAX;
2664 if (strEQ(name, "_POSIX_STREAM_MAX"))
2665 #ifdef _POSIX_STREAM_MAX
2666 return _POSIX_STREAM_MAX;
2670 if (strEQ(name, "_POSIX_TZNAME_MAX"))
2671 #ifdef _POSIX_TZNAME_MAX
2672 return _POSIX_TZNAME_MAX;
2676 if (strEQ(name, "_POSIX_VDISABLE"))
2677 #ifdef _POSIX_VDISABLE
2678 return _POSIX_VDISABLE;
2682 if (strEQ(name, "_POSIX_VERSION"))
2683 #ifdef _POSIX_VERSION
2684 return _POSIX_VERSION;
2690 if (strnEQ(name, "_SC_", 4)) {
2691 if (strEQ(name, "_SC_ARG_MAX"))
2692 #if defined(_SC_ARG_MAX) || HINT_SC_EXIST
2697 if (strEQ(name, "_SC_CHILD_MAX"))
2698 #if defined(_SC_CHILD_MAX) || HINT_SC_EXIST
2699 return _SC_CHILD_MAX;
2703 if (strEQ(name, "_SC_CLK_TCK"))
2704 #if defined(_SC_CLK_TCK) || HINT_SC_EXIST
2709 if (strEQ(name, "_SC_JOB_CONTROL"))
2710 #if defined(_SC_JOB_CONTROL) || HINT_SC_EXIST
2711 return _SC_JOB_CONTROL;
2715 if (strEQ(name, "_SC_NGROUPS_MAX"))
2716 #if defined(_SC_NGROUPS_MAX) || HINT_SC_EXIST
2717 return _SC_NGROUPS_MAX;
2721 if (strEQ(name, "_SC_OPEN_MAX"))
2722 #if defined(_SC_OPEN_MAX) || HINT_SC_EXIST
2723 return _SC_OPEN_MAX;
2727 if (strEQ(name, "_SC_SAVED_IDS"))
2728 #if defined(_SC_SAVED_IDS) || HINT_SC_EXIST
2729 return _SC_SAVED_IDS;
2733 if (strEQ(name, "_SC_STREAM_MAX"))
2734 #if defined(_SC_STREAM_MAX) || HINT_SC_EXIST
2735 return _SC_STREAM_MAX;
2739 if (strEQ(name, "_SC_TZNAME_MAX"))
2740 #if defined(_SC_TZNAME_MAX) || HINT_SC_EXIST
2741 return _SC_TZNAME_MAX;
2745 if (strEQ(name, "_SC_VERSION"))
2746 #if defined(_SC_VERSION) || HINT_SC_EXIST
2762 MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
2765 new(packname = "POSIX::SigSet", ...)
2770 New(0, RETVAL, 1, sigset_t);
2771 sigemptyset(RETVAL);
2772 for (i = 1; i < items; i++)
2773 sigaddset(RETVAL, SvIV(ST(i)));
2780 POSIX::SigSet sigset
2785 sigaddset(sigset, sig)
2786 POSIX::SigSet sigset
2790 sigdelset(sigset, sig)
2791 POSIX::SigSet sigset
2796 POSIX::SigSet sigset
2800 POSIX::SigSet sigset
2803 sigismember(sigset, sig)
2804 POSIX::SigSet sigset
2808 MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
2811 new(packname = "POSIX::Termios", ...)
2816 New(0, RETVAL, 1, struct termios);
2818 not_here("termios");
2826 DESTROY(termios_ref)
2827 POSIX::Termios termios_ref
2830 Safefree(termios_ref);
2832 not_here("termios");
2836 getattr(termios_ref, fd = 0)
2837 POSIX::Termios termios_ref
2840 RETVAL = tcgetattr(fd, termios_ref);
2845 setattr(termios_ref, fd = 0, optional_actions = 0)
2846 POSIX::Termios termios_ref
2848 int optional_actions
2850 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
2855 cfgetispeed(termios_ref)
2856 POSIX::Termios termios_ref
2859 cfgetospeed(termios_ref)
2860 POSIX::Termios termios_ref
2863 getiflag(termios_ref)
2864 POSIX::Termios termios_ref
2866 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2867 RETVAL = termios_ref->c_iflag;
2869 not_here("getiflag");
2876 getoflag(termios_ref)
2877 POSIX::Termios termios_ref
2879 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2880 RETVAL = termios_ref->c_oflag;
2882 not_here("getoflag");
2889 getcflag(termios_ref)
2890 POSIX::Termios termios_ref
2892 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2893 RETVAL = termios_ref->c_cflag;
2895 not_here("getcflag");
2902 getlflag(termios_ref)
2903 POSIX::Termios termios_ref
2905 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2906 RETVAL = termios_ref->c_lflag;
2908 not_here("getlflag");
2915 getcc(termios_ref, ccix)
2916 POSIX::Termios termios_ref
2919 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2921 croak("Bad getcc subscript");
2922 RETVAL = termios_ref->c_cc[ccix];
2931 cfsetispeed(termios_ref, speed)
2932 POSIX::Termios termios_ref
2936 cfsetospeed(termios_ref, speed)
2937 POSIX::Termios termios_ref
2941 setiflag(termios_ref, iflag)
2942 POSIX::Termios termios_ref
2945 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2946 termios_ref->c_iflag = iflag;
2948 not_here("setiflag");
2952 setoflag(termios_ref, oflag)
2953 POSIX::Termios termios_ref
2956 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2957 termios_ref->c_oflag = oflag;
2959 not_here("setoflag");
2963 setcflag(termios_ref, cflag)
2964 POSIX::Termios termios_ref
2967 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2968 termios_ref->c_cflag = cflag;
2970 not_here("setcflag");
2974 setlflag(termios_ref, lflag)
2975 POSIX::Termios termios_ref
2978 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2979 termios_ref->c_lflag = lflag;
2981 not_here("setlflag");
2985 setcc(termios_ref, ccix, cc)
2986 POSIX::Termios termios_ref
2990 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
2992 croak("Bad setcc subscript");
2993 termios_ref->c_cc[ccix] = cc;
2999 MODULE = POSIX PACKAGE = POSIX
3008 unsigned char * charstring
3010 unsigned char *s = charstring;
3011 unsigned char *e = s + PL_na; /* "PL_na" set by typemap side effect */
3012 for (RETVAL = 1; RETVAL && s < e; s++)
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++)
3127 isxdigit(charstring)
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 open(filename, flags = O_RDONLY, mode = 0666)
3144 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
3145 TAINT_PROPER("open");
3146 RETVAL = open(filename, flags, mode);
3154 #ifdef HAS_LOCALECONV
3155 struct lconv *lcbuf;
3157 if (lcbuf = localeconv()) {
3159 if (lcbuf->decimal_point && *lcbuf->decimal_point)
3160 hv_store(RETVAL, "decimal_point", 13,
3161 newSVpv(lcbuf->decimal_point, 0), 0);
3162 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
3163 hv_store(RETVAL, "thousands_sep", 13,
3164 newSVpv(lcbuf->thousands_sep, 0), 0);
3165 #ifndef NO_LOCALECONV_GROUPING
3166 if (lcbuf->grouping && *lcbuf->grouping)
3167 hv_store(RETVAL, "grouping", 8,
3168 newSVpv(lcbuf->grouping, 0), 0);
3170 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
3171 hv_store(RETVAL, "int_curr_symbol", 15,
3172 newSVpv(lcbuf->int_curr_symbol, 0), 0);
3173 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
3174 hv_store(RETVAL, "currency_symbol", 15,
3175 newSVpv(lcbuf->currency_symbol, 0), 0);
3176 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
3177 hv_store(RETVAL, "mon_decimal_point", 17,
3178 newSVpv(lcbuf->mon_decimal_point, 0), 0);
3179 #ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
3180 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
3181 hv_store(RETVAL, "mon_thousands_sep", 17,
3182 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
3184 #ifndef NO_LOCALECONV_MON_GROUPING
3185 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
3186 hv_store(RETVAL, "mon_grouping", 12,
3187 newSVpv(lcbuf->mon_grouping, 0), 0);
3189 if (lcbuf->positive_sign && *lcbuf->positive_sign)
3190 hv_store(RETVAL, "positive_sign", 13,
3191 newSVpv(lcbuf->positive_sign, 0), 0);
3192 if (lcbuf->negative_sign && *lcbuf->negative_sign)
3193 hv_store(RETVAL, "negative_sign", 13,
3194 newSVpv(lcbuf->negative_sign, 0), 0);
3196 if (lcbuf->int_frac_digits != CHAR_MAX)
3197 hv_store(RETVAL, "int_frac_digits", 15,
3198 newSViv(lcbuf->int_frac_digits), 0);
3199 if (lcbuf->frac_digits != CHAR_MAX)
3200 hv_store(RETVAL, "frac_digits", 11,
3201 newSViv(lcbuf->frac_digits), 0);
3202 if (lcbuf->p_cs_precedes != CHAR_MAX)
3203 hv_store(RETVAL, "p_cs_precedes", 13,
3204 newSViv(lcbuf->p_cs_precedes), 0);
3205 if (lcbuf->p_sep_by_space != CHAR_MAX)
3206 hv_store(RETVAL, "p_sep_by_space", 14,
3207 newSViv(lcbuf->p_sep_by_space), 0);
3208 if (lcbuf->n_cs_precedes != CHAR_MAX)
3209 hv_store(RETVAL, "n_cs_precedes", 13,
3210 newSViv(lcbuf->n_cs_precedes), 0);
3211 if (lcbuf->n_sep_by_space != CHAR_MAX)
3212 hv_store(RETVAL, "n_sep_by_space", 14,
3213 newSViv(lcbuf->n_sep_by_space), 0);
3214 if (lcbuf->p_sign_posn != CHAR_MAX)
3215 hv_store(RETVAL, "p_sign_posn", 11,
3216 newSViv(lcbuf->p_sign_posn), 0);
3217 if (lcbuf->n_sign_posn != CHAR_MAX)
3218 hv_store(RETVAL, "n_sign_posn", 11,
3219 newSViv(lcbuf->n_sign_posn), 0);
3222 localeconv(); /* A stub to call not_here(). */
3228 setlocale(category, locale = 0)
3232 RETVAL = setlocale(category, locale);
3234 #ifdef USE_LOCALE_CTYPE
3235 if (category == LC_CTYPE
3237 || category == LC_ALL
3243 if (category == LC_ALL)
3244 newctype = setlocale(LC_CTYPE, NULL);
3248 new_ctype(newctype);
3250 #endif /* USE_LOCALE_CTYPE */
3251 #ifdef USE_LOCALE_COLLATE
3252 if (category == LC_COLLATE
3254 || category == LC_ALL
3260 if (category == LC_ALL)
3261 newcoll = setlocale(LC_COLLATE, NULL);
3265 new_collate(newcoll);
3267 #endif /* USE_LOCALE_COLLATE */
3268 #ifdef USE_LOCALE_NUMERIC
3269 if (category == LC_NUMERIC
3271 || category == LC_ALL
3277 if (category == LC_ALL)
3278 newnum = setlocale(LC_NUMERIC, NULL);
3282 new_numeric(newnum);
3284 #endif /* USE_LOCALE_NUMERIC */
3324 /* (We already know stack is long enough.) */
3325 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
3326 PUSHs(sv_2mortal(newSViv(expvar)));
3342 /* (We already know stack is long enough.) */
3343 PUSHs(sv_2mortal(newSVnv(Perl_modf(x,&intvar))));
3344 PUSHs(sv_2mortal(newSVnv(intvar)));
3359 sigaction(sig, action, oldaction = 0)
3361 POSIX::SigAction action
3362 POSIX::SigAction oldaction
3365 RETVAL = not_here("sigaction");
3367 # This code is really grody because we're trying to make the signal
3368 # interface look beautiful, which is hard.
3371 GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
3372 struct sigaction act;
3373 struct sigaction oact;
3374 POSIX__SigSet sigset;
3376 SV** sigsvp = hv_fetch(GvHVn(siggv),
3378 strlen(PL_sig_name[sig]),
3382 /* Remember old handler name if desired. */
3384 char *hand = SvPVx(*sigsvp, n_a);
3385 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
3386 sv_setpv(*svp, *hand ? hand : "DEFAULT");
3390 /* Vector new handler through %SIG. (We always use sighandler
3391 for the C signal handler, which reads %SIG to dispatch.) */
3392 svp = hv_fetch(action, "HANDLER", 7, FALSE);
3394 croak("Can't supply an action without a HANDLER");
3395 sv_setpv(*sigsvp, SvPV(*svp, n_a));
3396 mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
3397 act.sa_handler = PL_sighandlerp;
3399 /* Set up any desired mask. */
3400 svp = hv_fetch(action, "MASK", 4, FALSE);
3401 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
3403 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3404 sigset = (sigset_t*) tmp;
3405 act.sa_mask = *sigset;
3408 sigemptyset(& act.sa_mask);
3410 /* Set up any desired flags. */
3411 svp = hv_fetch(action, "FLAGS", 5, FALSE);
3412 act.sa_flags = svp ? SvIV(*svp) : 0;
3415 /* Now work around sigaction oddities */
3416 if (action && oldaction)
3417 RETVAL = sigaction(sig, & act, & oact);
3419 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
3421 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
3426 /* Get back the mask. */
3427 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
3428 if (sv_isa(*svp, "POSIX::SigSet")) {
3430 tmp = (unsigned long)SvNV((SV*)SvRV(*svp));
3431 sigset = (sigset_t*) tmp;
3434 New(0, sigset, 1, sigset_t);
3435 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
3437 *sigset = oact.sa_mask;
3439 /* Get back the flags. */
3440 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
3441 sv_setiv(*svp, oact.sa_flags);
3450 POSIX::SigSet sigset
3453 sigprocmask(how, sigset, oldsigset = 0)
3455 POSIX::SigSet sigset
3456 POSIX::SigSet oldsigset = NO_INIT
3461 else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
3462 IV tmp = SvIV((SV*)SvRV(ST(2)));
3463 oldsigset = INT2PTR(POSIX__SigSet,tmp);
3466 New(0, oldsigset, 1, sigset_t);
3467 sigemptyset(oldsigset);
3468 sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
3472 sigsuspend(signal_mask)
3473 POSIX::SigSet signal_mask
3493 lseek(fd, offset, whence)
3506 if (pipe(fds) != -1) {
3508 PUSHs(sv_2mortal(newSViv(fds[0])));
3509 PUSHs(sv_2mortal(newSViv(fds[1])));
3513 read(fd, buffer, nbytes)
3515 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
3519 char * buffer = sv_grow( sv_buffer, nbytes+1 );
3522 SvCUR(sv_buffer) = RETVAL;
3523 SvPOK_only(sv_buffer);
3524 *SvEND(sv_buffer) = '\0';
3525 SvTAINTED_on(sv_buffer);
3541 tcsetpgrp(fd, pgrp_id)
3550 if (uname(&buf) >= 0) {
3552 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
3553 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
3554 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
3555 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
3556 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
3559 uname((char *) 0); /* A stub to call not_here(). */
3563 write(fd, buffer, nbytes)
3574 RETVAL = newSVpvn("", 0);
3575 SvGROW(RETVAL, L_tmpnam);
3576 len = strlen(tmpnam(SvPV(RETVAL, i)));
3577 SvCUR_set(RETVAL, len);
3590 mbstowcs(s, pwcs, n)
3602 wcstombs(s, pwcs, n)
3624 SET_NUMERIC_LOCAL();
3625 num = strtod(str, &unparsed);
3626 PUSHs(sv_2mortal(newSVnv(num)));
3627 if (GIMME == G_ARRAY) {
3630 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3632 PUSHs(&PL_sv_undef);
3636 strtol(str, base = 0)
3643 num = strtol(str, &unparsed, base);
3644 #if IVSIZE <= LONGSIZE
3645 if (num < IV_MIN || num > IV_MAX)
3646 PUSHs(sv_2mortal(newSVnv((double)num)));
3649 PUSHs(sv_2mortal(newSViv((IV)num)));
3650 if (GIMME == G_ARRAY) {
3653 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3655 PUSHs(&PL_sv_undef);
3659 strtoul(str, base = 0)
3666 num = strtoul(str, &unparsed, base);
3668 PUSHs(sv_2mortal(newSViv((IV)num)));
3670 PUSHs(sv_2mortal(newSVnv((double)num)));
3671 if (GIMME == G_ARRAY) {
3674 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
3676 PUSHs(&PL_sv_undef);
3686 char *p = SvPV(src,srclen);
3688 ST(0) = sv_2mortal(NEWSV(800,srclen));
3689 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
3690 if (dstlen > srclen) {
3692 SvGROW(ST(0), dstlen);
3693 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
3696 SvCUR(ST(0)) = dstlen;
3701 mkfifo(filename, mode)
3705 TAINT_PROPER("mkfifo");
3706 RETVAL = mkfifo(filename, mode);
3722 tcflush(fd, queue_selector)
3727 tcsendbreak(fd, duration)
3732 asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3745 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3748 mytm.tm_hour = hour;
3749 mytm.tm_mday = mday;
3751 mytm.tm_year = year;
3752 mytm.tm_wday = wday;
3753 mytm.tm_yday = yday;
3754 mytm.tm_isdst = isdst;
3755 RETVAL = asctime(&mytm);
3772 realtime = times( &tms );
3774 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
3775 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
3776 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
3777 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
3778 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
3781 difftime(time1, time2)
3786 mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
3799 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3802 mytm.tm_hour = hour;
3803 mytm.tm_mday = mday;
3805 mytm.tm_year = year;
3806 mytm.tm_wday = wday;
3807 mytm.tm_yday = yday;
3808 mytm.tm_isdst = isdst;
3809 RETVAL = mktime(&mytm);
3815 strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
3831 init_tm(&mytm); /* XXX workaround - see init_tm() above */
3834 mytm.tm_hour = hour;
3835 mytm.tm_mday = mday;
3837 mytm.tm_year = year;
3838 mytm.tm_wday = wday;
3839 mytm.tm_yday = yday;
3840 mytm.tm_isdst = isdst;
3842 len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
3844 ** The following is needed to handle to the situation where
3845 ** tmpbuf overflows. Basically we want to allocate a buffer
3846 ** and try repeatedly. The reason why it is so complicated
3847 ** is that getting a return value of 0 from strftime can indicate
3848 ** one of the following:
3849 ** 1. buffer overflowed,
3850 ** 2. illegal conversion specifier, or
3851 ** 3. the format string specifies nothing to be returned(not
3852 ** an error). This could be because format is an empty string
3853 ** or it specifies %p that yields an empty string in some locale.
3854 ** If there is a better way to make it portable, go ahead by
3857 if ((len > 0 && len < sizeof(tmpbuf)) || (len == 0 && *fmt == '\0'))
3858 ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
3860 /* Possibly buf overflowed - try again with a bigger buf */
3861 int fmtlen = strlen(fmt);
3862 int bufsize = fmtlen + sizeof(tmpbuf);
3866 New(0, buf, bufsize, char);
3868 buflen = strftime(buf, bufsize, fmt, &mytm);
3869 if (buflen > 0 && buflen < bufsize)
3871 /* heuristic to prevent out-of-memory errors */
3872 if (bufsize > 100*fmtlen) {
3878 Renew(buf, bufsize, char);
3881 ST(0) = sv_2mortal(newSVpvn(buf, buflen));
3885 ST(0) = sv_2mortal(newSVpvn(tmpbuf, len));
3896 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
3897 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
3900 access(filename, mode)
3918 pathconf(filename, name)