6 * Ideally this should be somewhere down in the includes
7 * but putting it in other places is giving compiler errors.
8 * Also here I am unable to check for HAS_UNAME since it wouldn't have
9 * yet come into the file at this stage - sgp 18th Oct 2000
11 #include <sys/utsname.h>
14 #define PERL_NO_GET_CONTEXT
17 #define PERLIO_NOT_STDIO 1
20 #if defined(PERL_IMPLICIT_SYS)
24 # define open PerlLIO_open3
27 #ifdef I_DIRENT /* XXX maybe better to just rely on perl.h? */
54 /* XXX This comment is just to make I_TERMIO and I_SGTTY visible to
55 metaconfig for future extension writers. We don't use them in POSIX.
56 (This is really sneaky :-) --AD
58 #if defined(I_TERMIOS)
68 #include <sys/types.h>
73 #ifdef MACOS_TRADITIONAL
79 # if !defined(WIN32) && !defined(__CYGWIN__) && !defined(NETWARE) && !defined(__UWIN__)
80 extern char *tzname[];
83 #if !defined(WIN32) && !defined(__UWIN__) || (defined(__MINGW32__) && !defined(tzname))
84 char *tzname[] = { "" , "" };
88 #ifndef PERL_UNUSED_DECL
90 # if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
91 # define PERL_UNUSED_DECL
93 # define PERL_UNUSED_DECL __attribute__((unused))
96 # define PERL_UNUSED_DECL
101 #define dNOOP extern int Perl___notused PERL_UNUSED_DECL
108 #if defined(__VMS) && !defined(__POSIX_SOURCE)
109 # include <libdef.h> /* LIB$_INVARG constant */
110 # include <lib$routines.h> /* prototype for lib$ediv() */
111 # include <starlet.h> /* prototype for sys$gettim() */
112 # if DECC_VERSION < 50000000
113 # define pid_t int /* old versions of DECC miss this in types.h */
117 # define mkfifo(a,b) (not_here("mkfifo"),-1)
118 # define tzset() not_here("tzset")
120 #if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
121 # define HAS_TZNAME /* shows up in VMS 7.0 or Dec C 5.6 */
122 # include <utsname.h>
123 # endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
125 /* The POSIX notion of ttyname() is better served by getname() under VMS */
126 static char ttnambuf[64];
127 # define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
129 /* The non-POSIX CRTL times() has void return type, so we just get the
130 current time directly */
131 clock_t vms_times(struct tms *bufptr) {
134 /* Get wall time and convert to 10 ms intervals to
135 * produce the return value that the POSIX standard expects */
136 # if defined(__DECC) && defined (__ALPHA)
139 _ckvmssts(sys$gettim(&vmstime));
141 retval = vmstime & 0x7fffffff;
143 /* (Older hw or ccs don't have an atomic 64-bit type, so we
144 * juggle 32-bit ints (and a float) to produce a time_t result
145 * with minimal loss of information.) */
146 long int vmstime[2],remainder,divisor = 100000;
147 _ckvmssts(sys$gettim((unsigned long int *)vmstime));
148 vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
149 _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
151 /* Fill in the struct tms using the CRTL routine . . .*/
152 times((tbuffer_t *)bufptr);
153 return (clock_t) retval;
155 # define times(t) vms_times(t)
157 #if defined (__CYGWIN__)
158 # define tzname _tzname
160 #if defined (WIN32) || defined (NETWARE)
162 # define mkfifo(a,b) not_here("mkfifo")
163 # define ttyname(a) (char*)not_here("ttyname")
164 # define sigset_t long
167 # define tzname _tzname
170 # define mode_t short
173 # define mode_t short
175 # define tzset() not_here("tzset")
177 # ifndef _POSIX_OPEN_MAX
178 # define _POSIX_OPEN_MAX FOPEN_MAX /* XXX bogus ? */
181 # define sigaction(a,b,c) not_here("sigaction")
182 # define sigpending(a) not_here("sigpending")
183 # define sigprocmask(a,b,c) not_here("sigprocmask")
184 # define sigsuspend(a) not_here("sigsuspend")
185 # define sigemptyset(a) not_here("sigemptyset")
186 # define sigaddset(a,b) not_here("sigaddset")
187 # define sigdelset(a,b) not_here("sigdelset")
188 # define sigfillset(a) not_here("sigfillset")
189 # define sigismember(a,b) not_here("sigismember")
193 # define setuid(a) not_here("setuid")
194 # define setgid(a) not_here("setgid")
199 # if defined(OS2) || defined(MACOS_TRADITIONAL)
200 # define mkfifo(a,b) not_here("mkfifo")
201 # else /* !( defined OS2 ) */
203 # define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
206 # endif /* !HAS_MKFIFO */
208 # ifdef MACOS_TRADITIONAL
209 # define ttyname(a) (char*)not_here("ttyname")
210 # define tzset() not_here("tzset")
215 # include <sys/times.h>
217 # include <sys/utsname.h>
219 # include <sys/wait.h>
224 #endif /* WIN32 || NETWARE */
228 typedef long SysRetLong;
229 typedef sigset_t* POSIX__SigSet;
230 typedef HV* POSIX__SigAction;
232 typedef struct termios* POSIX__Termios;
233 #else /* Define termios types to int, and call not_here for the functions.*/
234 #define POSIX__Termios int
238 #define cfgetispeed(x) not_here("cfgetispeed")
239 #define cfgetospeed(x) not_here("cfgetospeed")
240 #define tcdrain(x) not_here("tcdrain")
241 #define tcflush(x,y) not_here("tcflush")
242 #define tcsendbreak(x,y) not_here("tcsendbreak")
243 #define cfsetispeed(x,y) not_here("cfsetispeed")
244 #define cfsetospeed(x,y) not_here("cfsetospeed")
245 #define ctermid(x) (char *) not_here("ctermid")
246 #define tcflow(x,y) not_here("tcflow")
247 #define tcgetattr(x,y) not_here("tcgetattr")
248 #define tcsetattr(x,y,z) not_here("tcsetattr")
251 /* Possibly needed prototypes */
252 char *cuserid (char *);
254 double strtod (const char *, char **);
255 long strtol (const char *, char **, int);
256 unsigned long strtoul (const char *, char **, int);
260 #define cuserid(a) (char *) not_here("cuserid")
264 #define difftime(a,b) not_here("difftime")
267 #ifndef HAS_FPATHCONF
268 #define fpathconf(f,n) (SysRetLong) not_here("fpathconf")
271 #define mktime(a) not_here("mktime")
274 #define nice(a) not_here("nice")
277 #define pathconf(f,n) (SysRetLong) not_here("pathconf")
280 #define sysconf(n) (SysRetLong) not_here("sysconf")
283 #define readlink(a,b,c) not_here("readlink")
286 #define setpgid(a,b) not_here("setpgid")
289 #define setsid() not_here("setsid")
292 #define strcoll(s1,s2) not_here("strcoll")
295 #define strtod(s1,s2) not_here("strtod")
298 #define strtol(s1,s2,b) not_here("strtol")
301 #define strtoul(s1,s2,b) not_here("strtoul")
304 #define strxfrm(s1,s2,n) not_here("strxfrm")
306 #ifndef HAS_TCGETPGRP
307 #define tcgetpgrp(a) not_here("tcgetpgrp")
309 #ifndef HAS_TCSETPGRP
310 #define tcsetpgrp(a,b) not_here("tcsetpgrp")
314 #define times(a) not_here("times")
318 #define uname(a) not_here("uname")
321 #define waitpid(a,b,c) not_here("waitpid")
326 #define mblen(a,b) not_here("mblen")
330 #define mbstowcs(s, pwcs, n) not_here("mbstowcs")
333 #define mbtowc(pwc, s, n) not_here("mbtowc")
336 #define wcstombs(s, pwcs, n) not_here("wcstombs")
339 #define wctomb(s, wchar) not_here("wcstombs")
341 #if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
342 /* If we don't have these functions, then we wouldn't have gotten a typedef
343 for wchar_t, the wide character type. Defining wchar_t allows the
344 functions referencing it to compile. Its actual type is then meaningless,
345 since without the above functions, all sections using it end up calling
346 not_here() and croak. --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
352 #ifndef HAS_LOCALECONV
353 #define localeconv() not_here("localeconv")
356 #ifdef HAS_LONG_DOUBLE
357 # if LONG_DOUBLESIZE > NVSIZE
358 # undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */
362 #ifndef HAS_LONG_DOUBLE
374 /* Background: in most systems the low byte of the wait status
375 * is the signal (the lowest 7 bits) and the coredump flag is
376 * the eight bit, and the second lowest byte is the exit status.
377 * BeOS bucks the trend and has the bytes in different order.
378 * See beos/beos.c for how the reality is bent even in BeOS
379 * to follow the traditional. However, to make the POSIX
380 * wait W*() macros to work in BeOS, we need to unbend the
381 * reality back in place. --jhi */
383 # define WMUNGE(x) (((x) & 0xFF00) >> 8 | ((x) & 0x00FF) << 8)
385 # define WMUNGE(x) (x)
389 not_here(const char *s)
391 croak("POSIX::%s not implemented on this architecture", s);
395 #include "const-c.inc"
397 /* These were implemented in the old "constant" subroutine. They are actually
398 macros that take an integer argument and return an integer result. */
400 int_macro_int (const char *name, STRLEN len, IV *arg_result) {
401 /* Initially switch on the length of the name. */
402 /* This code has been edited from a "constant" function generated by:
404 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
406 my $types = {map {($_, 1)} qw(IV)};
407 my @names = (qw(WEXITSTATUS WIFEXITED
408 WIFSIGNALED WIFSTOPPED WSTOPSIG WTERMSIG));
410 print constant_types(); # macro defs
411 foreach (C_constant ("POSIX", 'int_macro_int', 'IV', $types, undef, 5, @names) ) {
412 print $_, "\n"; # C constant subs
414 print "#### XS Section:\n";
415 print XS_constant ("POSIX", $types);
420 /* Names all of length 8. */
421 /* WSTOPSIG WTERMSIG */
422 /* Offset 1 gives the best switch position. */
425 if (memEQ(name, "WSTOPSIG", 8)) {
429 *arg_result = WSTOPSIG(WMUNGE(i));
430 return PERL_constant_ISIV;
432 return PERL_constant_NOTDEF;
437 if (memEQ(name, "WTERMSIG", 8)) {
441 *arg_result = WTERMSIG(WMUNGE(i));
442 return PERL_constant_ISIV;
444 return PERL_constant_NOTDEF;
451 if (memEQ(name, "WIFEXITED", 9)) {
454 *arg_result = WIFEXITED(WMUNGE(i));
455 return PERL_constant_ISIV;
457 return PERL_constant_NOTDEF;
462 if (memEQ(name, "WIFSTOPPED", 10)) {
465 *arg_result = WIFSTOPPED(WMUNGE(i));
466 return PERL_constant_ISIV;
468 return PERL_constant_NOTDEF;
473 /* Names all of length 11. */
474 /* WEXITSTATUS WIFSIGNALED */
475 /* Offset 1 gives the best switch position. */
478 if (memEQ(name, "WEXITSTATUS", 11)) {
482 *arg_result = WEXITSTATUS(WMUNGE(i));
483 return PERL_constant_ISIV;
485 return PERL_constant_NOTDEF;
490 if (memEQ(name, "WIFSIGNALED", 11)) {
494 *arg_result = WIFSIGNALED(WMUNGE(i));
495 return PERL_constant_ISIV;
497 return PERL_constant_NOTDEF;
504 return PERL_constant_NOTFOUND;
508 restore_sigmask(pTHX_ SV *osset_sv)
510 /* Fortunately, restoring the signal mask can't fail, because
511 * there's nothing we can do about it if it does -- we're not
512 * supposed to return -1 from sigaction unless the disposition
515 sigset_t *ossetp = (sigset_t *) SvPV_nolen( osset_sv );
516 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
519 MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
522 new(packname = "POSIX::SigSet", ...)
523 const char * packname
527 Newx(RETVAL, 1, sigset_t);
529 for (i = 1; i < items; i++)
530 sigaddset(RETVAL, SvIV(ST(i)));
542 sigaddset(sigset, sig)
547 sigdelset(sigset, sig)
560 sigismember(sigset, sig)
564 MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
567 new(packname = "POSIX::Termios", ...)
568 const char * packname
572 Newx(RETVAL, 1, struct termios);
583 POSIX::Termios termios_ref
586 Safefree(termios_ref);
592 getattr(termios_ref, fd = 0)
593 POSIX::Termios termios_ref
596 RETVAL = tcgetattr(fd, termios_ref);
601 setattr(termios_ref, fd = 0, optional_actions = 0)
602 POSIX::Termios termios_ref
606 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
611 cfgetispeed(termios_ref)
612 POSIX::Termios termios_ref
615 cfgetospeed(termios_ref)
616 POSIX::Termios termios_ref
619 getiflag(termios_ref)
620 POSIX::Termios termios_ref
622 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
623 RETVAL = termios_ref->c_iflag;
625 not_here("getiflag");
632 getoflag(termios_ref)
633 POSIX::Termios termios_ref
635 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
636 RETVAL = termios_ref->c_oflag;
638 not_here("getoflag");
645 getcflag(termios_ref)
646 POSIX::Termios termios_ref
648 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
649 RETVAL = termios_ref->c_cflag;
651 not_here("getcflag");
658 getlflag(termios_ref)
659 POSIX::Termios termios_ref
661 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
662 RETVAL = termios_ref->c_lflag;
664 not_here("getlflag");
671 getcc(termios_ref, ccix)
672 POSIX::Termios termios_ref
675 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
677 croak("Bad getcc subscript");
678 RETVAL = termios_ref->c_cc[ccix];
687 cfsetispeed(termios_ref, speed)
688 POSIX::Termios termios_ref
692 cfsetospeed(termios_ref, speed)
693 POSIX::Termios termios_ref
697 setiflag(termios_ref, iflag)
698 POSIX::Termios termios_ref
701 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
702 termios_ref->c_iflag = iflag;
704 not_here("setiflag");
708 setoflag(termios_ref, oflag)
709 POSIX::Termios termios_ref
712 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
713 termios_ref->c_oflag = oflag;
715 not_here("setoflag");
719 setcflag(termios_ref, cflag)
720 POSIX::Termios termios_ref
723 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
724 termios_ref->c_cflag = cflag;
726 not_here("setcflag");
730 setlflag(termios_ref, lflag)
731 POSIX::Termios termios_ref
734 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
735 termios_ref->c_lflag = lflag;
737 not_here("setlflag");
741 setcc(termios_ref, ccix, cc)
742 POSIX::Termios termios_ref
746 #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
748 croak("Bad setcc subscript");
749 termios_ref->c_cc[ccix] = cc;
755 MODULE = POSIX PACKAGE = POSIX
757 INCLUDE: const-xs.inc
760 int_macro_int(sv, iv)
767 const char * s = SvPV(sv, len);
770 /* Change this to int_macro_int(s, len, &iv, &nv);
771 if you need to return both NVs and IVs */
772 type = int_macro_int(s, len, &iv);
773 /* Return 1 or 2 items. First is error message, or undef if no error.
774 Second, if present, is found value */
776 case PERL_constant_NOTFOUND:
777 sv = sv_2mortal(newSVpvf("%s is not a valid POSIX macro", s));
782 case PERL_constant_NOTDEF:
783 sv = sv_2mortal(newSVpvf(
784 "Your vendor has not defined POSIX macro %s, used", s));
789 case PERL_constant_ISIV:
793 sv = sv_2mortal(newSVpvf(
794 "Unexpected return type %d while processing POSIX macro %s, used",
807 unsigned char *s = (unsigned char *) SvPV(charstring, len);
808 unsigned char *e = s + len;
809 for (RETVAL = 1; RETVAL && s < e; s++)
821 unsigned char *s = (unsigned char *) SvPV(charstring, len);
822 unsigned char *e = s + len;
823 for (RETVAL = 1; RETVAL && s < e; s++)
835 unsigned char *s = (unsigned char *) SvPV(charstring, len);
836 unsigned char *e = s + len;
837 for (RETVAL = 1; RETVAL && s < e; s++)
849 unsigned char *s = (unsigned char *) SvPV(charstring, len);
850 unsigned char *e = s + len;
851 for (RETVAL = 1; RETVAL && s < e; s++)
863 unsigned char *s = (unsigned char *) SvPV(charstring, len);
864 unsigned char *e = s + len;
865 for (RETVAL = 1; RETVAL && s < e; s++)
877 unsigned char *s = (unsigned char *) SvPV(charstring, len);
878 unsigned char *e = s + len;
879 for (RETVAL = 1; RETVAL && s < e; s++)
891 unsigned char *s = (unsigned char *) SvPV(charstring, len);
892 unsigned char *e = s + len;
893 for (RETVAL = 1; RETVAL && s < e; s++)
905 unsigned char *s = (unsigned char *) SvPV(charstring, len);
906 unsigned char *e = s + len;
907 for (RETVAL = 1; RETVAL && s < e; s++)
919 unsigned char *s = (unsigned char *) SvPV(charstring, len);
920 unsigned char *e = s + len;
921 for (RETVAL = 1; RETVAL && s < e; s++)
933 unsigned char *s = (unsigned char *) SvPV(charstring, len);
934 unsigned char *e = s + len;
935 for (RETVAL = 1; RETVAL && s < e; s++)
947 unsigned char *s = (unsigned char *) SvPV(charstring, len);
948 unsigned char *e = s + len;
949 for (RETVAL = 1; RETVAL && s < e; s++)
956 open(filename, flags = O_RDONLY, mode = 0666)
961 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
962 TAINT_PROPER("open");
963 RETVAL = open(filename, flags, mode);
971 #ifdef HAS_LOCALECONV
974 sv_2mortal((SV*)RETVAL);
975 if ((lcbuf = localeconv())) {
977 if (lcbuf->decimal_point && *lcbuf->decimal_point)
978 hv_store(RETVAL, "decimal_point", 13,
979 newSVpv(lcbuf->decimal_point, 0), 0);
980 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
981 hv_store(RETVAL, "thousands_sep", 13,
982 newSVpv(lcbuf->thousands_sep, 0), 0);
983 #ifndef NO_LOCALECONV_GROUPING
984 if (lcbuf->grouping && *lcbuf->grouping)
985 hv_store(RETVAL, "grouping", 8,
986 newSVpv(lcbuf->grouping, 0), 0);
988 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
989 hv_store(RETVAL, "int_curr_symbol", 15,
990 newSVpv(lcbuf->int_curr_symbol, 0), 0);
991 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
992 hv_store(RETVAL, "currency_symbol", 15,
993 newSVpv(lcbuf->currency_symbol, 0), 0);
994 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
995 hv_store(RETVAL, "mon_decimal_point", 17,
996 newSVpv(lcbuf->mon_decimal_point, 0), 0);
997 #ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
998 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
999 hv_store(RETVAL, "mon_thousands_sep", 17,
1000 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
1002 #ifndef NO_LOCALECONV_MON_GROUPING
1003 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
1004 hv_store(RETVAL, "mon_grouping", 12,
1005 newSVpv(lcbuf->mon_grouping, 0), 0);
1007 if (lcbuf->positive_sign && *lcbuf->positive_sign)
1008 hv_store(RETVAL, "positive_sign", 13,
1009 newSVpv(lcbuf->positive_sign, 0), 0);
1010 if (lcbuf->negative_sign && *lcbuf->negative_sign)
1011 hv_store(RETVAL, "negative_sign", 13,
1012 newSVpv(lcbuf->negative_sign, 0), 0);
1014 if (lcbuf->int_frac_digits != CHAR_MAX)
1015 hv_store(RETVAL, "int_frac_digits", 15,
1016 newSViv(lcbuf->int_frac_digits), 0);
1017 if (lcbuf->frac_digits != CHAR_MAX)
1018 hv_store(RETVAL, "frac_digits", 11,
1019 newSViv(lcbuf->frac_digits), 0);
1020 if (lcbuf->p_cs_precedes != CHAR_MAX)
1021 hv_store(RETVAL, "p_cs_precedes", 13,
1022 newSViv(lcbuf->p_cs_precedes), 0);
1023 if (lcbuf->p_sep_by_space != CHAR_MAX)
1024 hv_store(RETVAL, "p_sep_by_space", 14,
1025 newSViv(lcbuf->p_sep_by_space), 0);
1026 if (lcbuf->n_cs_precedes != CHAR_MAX)
1027 hv_store(RETVAL, "n_cs_precedes", 13,
1028 newSViv(lcbuf->n_cs_precedes), 0);
1029 if (lcbuf->n_sep_by_space != CHAR_MAX)
1030 hv_store(RETVAL, "n_sep_by_space", 14,
1031 newSViv(lcbuf->n_sep_by_space), 0);
1032 if (lcbuf->p_sign_posn != CHAR_MAX)
1033 hv_store(RETVAL, "p_sign_posn", 11,
1034 newSViv(lcbuf->p_sign_posn), 0);
1035 if (lcbuf->n_sign_posn != CHAR_MAX)
1036 hv_store(RETVAL, "n_sign_posn", 11,
1037 newSViv(lcbuf->n_sign_posn), 0);
1040 localeconv(); /* A stub to call not_here(). */
1046 setlocale(category, locale = 0)
1052 retval = setlocale(category, locale);
1054 /* Save retval since subsequent setlocale() calls
1055 * may overwrite it. */
1056 RETVAL = savepv(retval);
1057 #ifdef USE_LOCALE_CTYPE
1058 if (category == LC_CTYPE
1060 || category == LC_ALL
1066 if (category == LC_ALL)
1067 newctype = setlocale(LC_CTYPE, NULL);
1071 new_ctype(newctype);
1073 #endif /* USE_LOCALE_CTYPE */
1074 #ifdef USE_LOCALE_COLLATE
1075 if (category == LC_COLLATE
1077 || category == LC_ALL
1083 if (category == LC_ALL)
1084 newcoll = setlocale(LC_COLLATE, NULL);
1088 new_collate(newcoll);
1090 #endif /* USE_LOCALE_COLLATE */
1091 #ifdef USE_LOCALE_NUMERIC
1092 if (category == LC_NUMERIC
1094 || category == LC_ALL
1100 if (category == LC_ALL)
1101 newnum = setlocale(LC_NUMERIC, NULL);
1105 new_numeric(newnum);
1107 #endif /* USE_LOCALE_NUMERIC */
1151 /* (We already know stack is long enough.) */
1152 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
1153 PUSHs(sv_2mortal(newSViv(expvar)));
1169 /* (We already know stack is long enough.) */
1170 PUSHs(sv_2mortal(newSVnv(Perl_modf(x,&intvar))));
1171 PUSHs(sv_2mortal(newSVnv(intvar)));
1186 sigaction(sig, optaction, oldaction = 0)
1189 POSIX::SigAction oldaction
1191 #if defined(WIN32) || defined(NETWARE)
1192 RETVAL = not_here("sigaction");
1194 # This code is really grody because we're trying to make the signal
1195 # interface look beautiful, which is hard.
1199 POSIX__SigAction action;
1200 GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
1201 struct sigaction act;
1202 struct sigaction oact;
1206 POSIX__SigSet sigset;
1211 croak("Negative signals are not allowed");
1214 if (sig == 0 && SvPOK(ST(0))) {
1215 const char *s = SvPVX_const(ST(0));
1216 int i = whichsig(s);
1218 if (i < 0 && memEQ(s, "SIG", 3))
1219 i = whichsig(s + 3);
1221 if (ckWARN(WARN_SIGNAL))
1222 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1223 "No such signal: SIG%s", s);
1230 if (sig > NSIG) { /* NSIG - 1 is still okay. */
1231 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1232 "No such signal: %d", sig);
1236 sigsvp = hv_fetch(GvHVn(siggv),
1238 strlen(PL_sig_name[sig]),
1241 /* Check optaction and set action */
1242 if(SvTRUE(optaction)) {
1243 if(sv_isa(optaction, "POSIX::SigAction"))
1244 action = (HV*)SvRV(optaction);
1246 croak("action is not of type POSIX::SigAction");
1252 /* sigaction() is supposed to look atomic. In particular, any
1253 * signal handler invoked during a sigaction() call should
1254 * see either the old or the new disposition, and not something
1255 * in between. We use sigprocmask() to make it so.
1258 RETVAL=sigprocmask(SIG_BLOCK, &sset, &osset);
1262 /* Restore signal mask no matter how we exit this block. */
1263 osset_sv = newSVpv((char *)(&osset), sizeof(sigset_t));
1264 SAVEFREESV( osset_sv );
1265 SAVEDESTRUCTOR_X(restore_sigmask, osset_sv);
1267 RETVAL=-1; /* In case both oldaction and action are 0. */
1269 /* Remember old disposition if desired. */
1271 svp = hv_fetchs(oldaction, "HANDLER", TRUE);
1273 croak("Can't supply an oldaction without a HANDLER");
1274 if(SvTRUE(*sigsvp)) { /* TBD: what if "0"? */
1275 sv_setsv(*svp, *sigsvp);
1278 sv_setpv(*svp, "DEFAULT");
1280 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
1283 /* Get back the mask. */
1284 svp = hv_fetchs(oldaction, "MASK", TRUE);
1285 if (sv_isa(*svp, "POSIX::SigSet")) {
1286 IV tmp = SvIV((SV*)SvRV(*svp));
1287 sigset = INT2PTR(sigset_t*, tmp);
1290 Newx(sigset, 1, sigset_t);
1291 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
1293 *sigset = oact.sa_mask;
1295 /* Get back the flags. */
1296 svp = hv_fetchs(oldaction, "FLAGS", TRUE);
1297 sv_setiv(*svp, oact.sa_flags);
1299 /* Get back whether the old handler used safe signals. */
1300 svp = hv_fetchs(oldaction, "SAFE", TRUE);
1302 /* compare incompatible pointers by casting to integer */
1303 PTR2nat(oact.sa_handler) == PTR2nat(PL_csighandlerp));
1307 /* Safe signals use "csighandler", which vectors through the
1308 PL_sighandlerp pointer when it's safe to do so.
1309 (BTW, "csighandler" is very different from "sighandler".) */
1310 svp = hv_fetchs(action, "SAFE", FALSE);
1314 (*svp && SvTRUE(*svp))
1315 ? PL_csighandlerp : PL_sighandlerp
1318 /* Vector new Perl handler through %SIG.
1319 (The core signal handlers read %SIG to dispatch.) */
1320 svp = hv_fetchs(action, "HANDLER", FALSE);
1322 croak("Can't supply an action without a HANDLER");
1323 sv_setsv(*sigsvp, *svp);
1325 /* This call actually calls sigaction() with almost the
1326 right settings, including appropriate interpretation
1327 of DEFAULT and IGNORE. However, why are we doing
1328 this when we're about to do it again just below? XXX */
1331 /* And here again we duplicate -- DEFAULT/IGNORE checking. */
1333 const char *s=SvPVX_const(*svp);
1334 if(strEQ(s,"IGNORE")) {
1335 act.sa_handler = SIG_IGN;
1337 else if(strEQ(s,"DEFAULT")) {
1338 act.sa_handler = SIG_DFL;
1342 /* Set up any desired mask. */
1343 svp = hv_fetchs(action, "MASK", FALSE);
1344 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
1345 IV tmp = SvIV((SV*)SvRV(*svp));
1346 sigset = INT2PTR(sigset_t*, tmp);
1347 act.sa_mask = *sigset;
1350 sigemptyset(& act.sa_mask);
1352 /* Set up any desired flags. */
1353 svp = hv_fetchs(action, "FLAGS", FALSE);
1354 act.sa_flags = svp ? SvIV(*svp) : 0;
1356 /* Don't worry about cleaning up *sigsvp if this fails,
1357 * because that means we tried to disposition a
1358 * nonblockable signal, in which case *sigsvp is
1359 * essentially meaningless anyway.
1361 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
1374 POSIX::SigSet sigset
1377 sigprocmask(how, sigset, oldsigset = 0)
1379 POSIX::SigSet sigset = NO_INIT
1380 POSIX::SigSet oldsigset = NO_INIT
1382 if (! SvOK(ST(1))) {
1384 } else if (sv_isa(ST(1), "POSIX::SigSet")) {
1385 IV tmp = SvIV((SV*)SvRV(ST(1)));
1386 sigset = INT2PTR(POSIX__SigSet,tmp);
1388 croak("sigset is not of type POSIX::SigSet");
1391 if (items < 3 || ! SvOK(ST(2))) {
1393 } else if (sv_isa(ST(2), "POSIX::SigSet")) {
1394 IV tmp = SvIV((SV*)SvRV(ST(2)));
1395 oldsigset = INT2PTR(POSIX__SigSet,tmp);
1397 croak("oldsigset is not of type POSIX::SigSet");
1401 sigsuspend(signal_mask)
1402 POSIX::SigSet signal_mask
1422 lseek(fd, offset, whence)
1427 Off_t pos = PerlLIO_lseek(fd, offset, whence);
1428 RETVAL = sizeof(Off_t) > sizeof(IV)
1429 ? newSVnv((NV)pos) : newSViv((IV)pos);
1438 if ((incr = nice(incr)) != -1 || errno == 0) {
1440 XPUSHs(sv_2mortal(newSVpvn("0 but true", 10)));
1442 XPUSHs(sv_2mortal(newSViv(incr)));
1449 if (pipe(fds) != -1) {
1451 PUSHs(sv_2mortal(newSViv(fds[0])));
1452 PUSHs(sv_2mortal(newSViv(fds[1])));
1456 read(fd, buffer, nbytes)
1458 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
1462 char * buffer = sv_grow( sv_buffer, nbytes+1 );
1465 SvCUR_set(sv_buffer, RETVAL);
1466 SvPOK_only(sv_buffer);
1467 *SvEND(sv_buffer) = '\0';
1468 SvTAINTED_on(sv_buffer);
1484 tcsetpgrp(fd, pgrp_id)
1493 if (uname(&buf) >= 0) {
1495 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
1496 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
1497 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
1498 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
1499 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
1502 uname((char *) 0); /* A stub to call not_here(). */
1506 write(fd, buffer, nbytes)
1517 RETVAL = newSVpvn("", 0);
1518 SvGROW(RETVAL, L_tmpnam);
1519 len = strlen(tmpnam(SvPV(RETVAL, i)));
1520 SvCUR_set(RETVAL, len);
1533 mbstowcs(s, pwcs, n)
1545 wcstombs(s, pwcs, n)
1567 SET_NUMERIC_LOCAL();
1568 num = strtod(str, &unparsed);
1569 PUSHs(sv_2mortal(newSVnv(num)));
1570 if (GIMME == G_ARRAY) {
1573 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1575 PUSHs(&PL_sv_undef);
1579 strtol(str, base = 0)
1586 num = strtol(str, &unparsed, base);
1587 #if IVSIZE <= LONGSIZE
1588 if (num < IV_MIN || num > IV_MAX)
1589 PUSHs(sv_2mortal(newSVnv((double)num)));
1592 PUSHs(sv_2mortal(newSViv((IV)num)));
1593 if (GIMME == G_ARRAY) {
1596 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1598 PUSHs(&PL_sv_undef);
1602 strtoul(str, base = 0)
1609 num = strtoul(str, &unparsed, base);
1610 #if IVSIZE <= LONGSIZE
1612 PUSHs(sv_2mortal(newSVnv((double)num)));
1615 PUSHs(sv_2mortal(newSViv((IV)num)));
1616 if (GIMME == G_ARRAY) {
1619 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1621 PUSHs(&PL_sv_undef);
1631 char *p = SvPV(src,srclen);
1633 ST(0) = sv_2mortal(newSV(srclen*4+1));
1634 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
1635 if (dstlen > srclen) {
1637 SvGROW(ST(0), dstlen);
1638 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
1641 SvCUR_set(ST(0), dstlen);
1646 mkfifo(filename, mode)
1650 TAINT_PROPER("mkfifo");
1651 RETVAL = mkfifo(filename, mode);
1667 tcflush(fd, queue_selector)
1672 tcsendbreak(fd, duration)
1677 asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = -1)
1690 init_tm(&mytm); /* XXX workaround - see init_tm() above */
1693 mytm.tm_hour = hour;
1694 mytm.tm_mday = mday;
1696 mytm.tm_year = year;
1697 mytm.tm_wday = wday;
1698 mytm.tm_yday = yday;
1699 mytm.tm_isdst = isdst;
1700 RETVAL = asctime(&mytm);
1717 realtime = times( &tms );
1719 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
1720 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
1721 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
1722 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
1723 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
1726 difftime(time1, time2)
1731 mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = -1)
1744 init_tm(&mytm); /* XXX workaround - see init_tm() above */
1747 mytm.tm_hour = hour;
1748 mytm.tm_mday = mday;
1750 mytm.tm_year = year;
1751 mytm.tm_wday = wday;
1752 mytm.tm_yday = yday;
1753 mytm.tm_isdst = isdst;
1754 RETVAL = (SysRetLong) mktime(&mytm);
1759 #XXX: if $xsubpp::WantOptimize is always the default
1760 # sv_setpv(TARG, ...) could be used rather than
1761 # ST(0) = sv_2mortal(newSVpv(...))
1763 strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
1776 char *buf = my_strftime(fmt, sec, min, hour, mday, mon, year, wday, yday, isdst);
1778 ST(0) = sv_2mortal(newSVpv(buf, 0));
1790 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
1791 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
1794 access(filename, mode)
1802 #ifdef HAS_CTERMID_R
1803 s = (char *) safemalloc((size_t) L_ctermid);
1805 RETVAL = ctermid(s);
1809 #ifdef HAS_CTERMID_R
1823 pathconf(filename, name)
1837 PL_egid = getegid();
1848 PL_euid = geteuid();
1866 XSprePUSH; PUSHTARG;
1870 lchown(uid, gid, path)
1876 /* yes, the order of arguments is different,
1877 * but consistent with CORE::chown() */
1878 RETVAL = lchown(path, uid, gid);
1880 RETVAL = not_here("lchown");