This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The CHECKOP macro was not invoked on some newly created ops
[perl5.git] / ext / POSIX / POSIX.xs
CommitLineData
6e22d046
JH
1#define PERL_EXT_POSIX
2
2986a63f
JH
3#ifdef NETWARE
4 #define _POSIX_
4efcf9a2
SB
5 /*
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
10 */
2986a63f
JH
11 #include <sys/utsname.h>
12#endif /* NETWARE */
13
c5be433b
GS
14#define PERL_NO_GET_CONTEXT
15
463ee0b2 16#include "EXTERN.h"
760ac839 17#define PERLIO_NOT_STDIO 1
463ee0b2
LW
18#include "perl.h"
19#include "XSUB.h"
acfe0abc 20#if defined(PERL_IMPLICIT_SYS)
873ef191
GS
21# undef signal
22# undef open
cd661bb6 23# undef setmode
35ff7856 24# define open PerlLIO_open3
873ef191 25#endif
2304df62 26#include <ctype.h>
a0d0e21e 27#ifdef I_DIRENT /* XXX maybe better to just rely on perl.h? */
2304df62 28#include <dirent.h>
a0d0e21e 29#endif
2304df62 30#include <errno.h>
2304df62
AD
31#ifdef I_FLOAT
32#include <float.h>
33#endif
a0d0e21e 34#ifdef I_LIMITS
2304df62 35#include <limits.h>
a0d0e21e 36#endif
2304df62
AD
37#include <locale.h>
38#include <math.h>
85e6fe83 39#ifdef I_PWD
2304df62 40#include <pwd.h>
85e6fe83 41#endif
2304df62
AD
42#include <setjmp.h>
43#include <signal.h>
2304df62 44#include <stdarg.h>
17c3b450 45
2304df62
AD
46#ifdef I_STDDEF
47#include <stddef.h>
48#endif
6990d991 49
b5846a0b
BS
50#ifdef I_UNISTD
51#include <unistd.h>
52#endif
53
a0d0e21e
LW
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
57*/
58#if defined(I_TERMIOS)
59#include <termios.h>
60#endif
a0d0e21e 61#ifdef I_STDLIB
2304df62 62#include <stdlib.h>
a0d0e21e 63#endif
2304df62
AD
64#include <string.h>
65#include <sys/stat.h>
2304df62 66#include <sys/types.h>
2304df62 67#include <time.h>
6dead956 68#ifdef I_UNISTD
1d2dff63 69#include <unistd.h>
6dead956 70#endif
bf4acbe4
GS
71#ifdef MACOS_TRADITIONAL
72#undef fdopen
73#endif
71be2cbc
PP
74#include <fcntl.h>
75
e2465f50 76#ifdef HAS_TZNAME
fb207d52 77# if !defined(WIN32) && !defined(__CYGWIN__) && !defined(NETWARE) && !defined(__UWIN__)
e2465f50
JH
78extern char *tzname[];
79# endif
80#else
fb207d52 81#if !defined(WIN32) && !defined(__UWIN__) || (defined(__MINGW32__) && !defined(tzname))
e2465f50
JH
82char *tzname[] = { "" , "" };
83#endif
cb2479a8
JH
84#endif
85
6c418a22 86#if defined(__VMS) && !defined(__POSIX_SOURCE)
6c418a22
PP
87# include <libdef.h> /* LIB$_INVARG constant */
88# include <lib$routines.h> /* prototype for lib$ediv() */
89# include <starlet.h> /* prototype for sys$gettim() */
774d564b 90# if DECC_VERSION < 50000000
86200d5c 91# define pid_t int /* old versions of DECC miss this in types.h */
774d564b 92# endif
6c418a22 93
6990d991 94# undef mkfifo
6c418a22
PP
95# define mkfifo(a,b) (not_here("mkfifo"),-1)
96# define tzset() not_here("tzset")
97
5f6761f9
DS
98#if ((__VMS_VER >= 70000000) && (__DECC_VER >= 50200000)) || (__CRTL_VER >= 70000000)
99# define HAS_TZNAME /* shows up in VMS 7.0 or Dec C 5.6 */
100# include <utsname.h>
5f6761f9 101# endif /* __VMS_VER >= 70000000 or Dec C 5.6 */
6c418a22
PP
102
103 /* The POSIX notion of ttyname() is better served by getname() under VMS */
104 static char ttnambuf[64];
105# define ttyname(fd) (isatty(fd) > 0 ? getname(fd,ttnambuf,0) : NULL)
106
107 /* The non-POSIX CRTL times() has void return type, so we just get the
108 current time directly */
34f7a5fe 109 clock_t vms_times(struct tms *bufptr) {
d28f7c37 110 dTHX;
6c418a22
PP
111 clock_t retval;
112 /* Get wall time and convert to 10 ms intervals to
113 * produce the return value that the POSIX standard expects */
114# if defined(__DECC) && defined (__ALPHA)
115# include <ints.h>
116 uint64 vmstime;
117 _ckvmssts(sys$gettim(&vmstime));
118 vmstime /= 100000;
119 retval = vmstime & 0x7fffffff;
120# else
121 /* (Older hw or ccs don't have an atomic 64-bit type, so we
122 * juggle 32-bit ints (and a float) to produce a time_t result
123 * with minimal loss of information.) */
124 long int vmstime[2],remainder,divisor = 100000;
125 _ckvmssts(sys$gettim((unsigned long int *)vmstime));
126 vmstime[1] &= 0x7fff; /* prevent overflow in EDIV */
127 _ckvmssts(lib$ediv(&divisor,vmstime,(long int *)&retval,&remainder));
128# endif
129 /* Fill in the struct tms using the CRTL routine . . .*/
34f7a5fe 130 times((tbuffer_t *)bufptr);
6c418a22
PP
131 return (clock_t) retval;
132 }
133# define times(t) vms_times(t)
134#else
d308986b 135#if defined (__CYGWIN__)
f89d6eaa
FE
136# define tzname _tzname
137#endif
2986a63f 138#if defined (WIN32) || defined (NETWARE)
6990d991 139# undef mkfifo
6dead956 140# define mkfifo(a,b) not_here("mkfifo")
873ef191 141# define ttyname(a) (char*)not_here("ttyname")
6dead956 142# define sigset_t long
86200d5c 143# define pid_t long
6dead956
GS
144# ifdef __BORLANDC__
145# define tzname _tzname
146# endif
147# ifdef _MSC_VER
148# define mode_t short
149# endif
62520c91
GS
150# ifdef __MINGW32__
151# define mode_t short
f6c6487a
GS
152# ifndef tzset
153# define tzset() not_here("tzset")
154# endif
155# ifndef _POSIX_OPEN_MAX
156# define _POSIX_OPEN_MAX FOPEN_MAX /* XXX bogus ? */
157# endif
62520c91 158# endif
6dead956
GS
159# define sigaction(a,b,c) not_here("sigaction")
160# define sigpending(a) not_here("sigpending")
161# define sigprocmask(a,b,c) not_here("sigprocmask")
162# define sigsuspend(a) not_here("sigsuspend")
163# define sigemptyset(a) not_here("sigemptyset")
164# define sigaddset(a,b) not_here("sigaddset")
165# define sigdelset(a,b) not_here("sigdelset")
166# define sigfillset(a) not_here("sigfillset")
167# define sigismember(a,b) not_here("sigismember")
2986a63f 168#ifndef NETWARE
6e22d046
JH
169# undef setuid
170# undef setgid
2986a63f
JH
171# define setuid(a) not_here("setuid")
172# define setgid(a) not_here("setgid")
173#endif /* NETWARE */
6dead956 174#else
6990d991
JH
175
176# ifndef HAS_MKFIFO
bf4acbe4 177# if defined(OS2) || defined(MACOS_TRADITIONAL)
d6a255e6
IZ
178# define mkfifo(a,b) not_here("mkfifo")
179# else /* !( defined OS2 ) */
180# ifndef mkfifo
181# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
182# endif
6990d991
JH
183# endif
184# endif /* !HAS_MKFIFO */
185
bf4acbe4 186# ifdef MACOS_TRADITIONAL
bf4acbe4
GS
187# define ttyname(a) (char*)not_here("ttyname")
188# define tzset() not_here("tzset")
189# else
190# include <grp.h>
191# include <sys/times.h>
192# ifdef HAS_UNAME
193# include <sys/utsname.h>
194# endif
195# include <sys/wait.h>
6c418a22 196# endif
6c418a22
PP
197# ifdef I_UTIME
198# include <utime.h>
199# endif
2986a63f 200#endif /* WIN32 || NETWARE */
6dead956 201#endif /* __VMS */
2304df62
AD
202
203typedef int SysRet;
a0d0e21e 204typedef long SysRetLong;
2304df62
AD
205typedef sigset_t* POSIX__SigSet;
206typedef HV* POSIX__SigAction;
a0d0e21e
LW
207#ifdef I_TERMIOS
208typedef struct termios* POSIX__Termios;
209#else /* Define termios types to int, and call not_here for the functions.*/
210#define POSIX__Termios int
211#define speed_t int
212#define tcflag_t int
213#define cc_t int
214#define cfgetispeed(x) not_here("cfgetispeed")
215#define cfgetospeed(x) not_here("cfgetospeed")
216#define tcdrain(x) not_here("tcdrain")
217#define tcflush(x,y) not_here("tcflush")
218#define tcsendbreak(x,y) not_here("tcsendbreak")
219#define cfsetispeed(x,y) not_here("cfsetispeed")
220#define cfsetospeed(x,y) not_here("cfsetospeed")
221#define ctermid(x) (char *) not_here("ctermid")
222#define tcflow(x,y) not_here("tcflow")
223#define tcgetattr(x,y) not_here("tcgetattr")
224#define tcsetattr(x,y,z) not_here("tcsetattr")
225#endif
226
227/* Possibly needed prototypes */
20ce7b12 228char *cuserid (char *);
6e22d046 229#ifndef WIN32
20ce7b12
GS
230double strtod (const char *, char **);
231long strtol (const char *, char **, int);
232unsigned long strtoul (const char *, char **, int);
6e22d046 233#endif
a0d0e21e
LW
234
235#ifndef HAS_CUSERID
236#define cuserid(a) (char *) not_here("cuserid")
237#endif
238#ifndef HAS_DIFFTIME
239#ifndef difftime
240#define difftime(a,b) not_here("difftime")
241#endif
242#endif
243#ifndef HAS_FPATHCONF
244#define fpathconf(f,n) (SysRetLong) not_here("fpathconf")
245#endif
246#ifndef HAS_MKTIME
247#define mktime(a) not_here("mktime")
8990e307
LW
248#endif
249#ifndef HAS_NICE
250#define nice(a) not_here("nice")
251#endif
a0d0e21e
LW
252#ifndef HAS_PATHCONF
253#define pathconf(f,n) (SysRetLong) not_here("pathconf")
254#endif
255#ifndef HAS_SYSCONF
256#define sysconf(n) (SysRetLong) not_here("sysconf")
257#endif
8990e307
LW
258#ifndef HAS_READLINK
259#define readlink(a,b,c) not_here("readlink")
260#endif
261#ifndef HAS_SETPGID
262#define setpgid(a,b) not_here("setpgid")
263#endif
8990e307
LW
264#ifndef HAS_SETSID
265#define setsid() not_here("setsid")
266#endif
a0d0e21e
LW
267#ifndef HAS_STRCOLL
268#define strcoll(s1,s2) not_here("strcoll")
269#endif
a89d8a78
DH
270#ifndef HAS_STRTOD
271#define strtod(s1,s2) not_here("strtod")
272#endif
273#ifndef HAS_STRTOL
274#define strtol(s1,s2,b) not_here("strtol")
275#endif
276#ifndef HAS_STRTOUL
277#define strtoul(s1,s2,b) not_here("strtoul")
278#endif
a0d0e21e
LW
279#ifndef HAS_STRXFRM
280#define strxfrm(s1,s2,n) not_here("strxfrm")
8990e307
LW
281#endif
282#ifndef HAS_TCGETPGRP
283#define tcgetpgrp(a) not_here("tcgetpgrp")
284#endif
285#ifndef HAS_TCSETPGRP
286#define tcsetpgrp(a,b) not_here("tcsetpgrp")
287#endif
288#ifndef HAS_TIMES
2986a63f 289#ifndef NETWARE
8990e307 290#define times(a) not_here("times")
2986a63f 291#endif /* NETWARE */
8990e307
LW
292#endif
293#ifndef HAS_UNAME
294#define uname(a) not_here("uname")
295#endif
296#ifndef HAS_WAITPID
297#define waitpid(a,b,c) not_here("waitpid")
298#endif
299
a0d0e21e
LW
300#ifndef HAS_MBLEN
301#ifndef mblen
302#define mblen(a,b) not_here("mblen")
303#endif
304#endif
305#ifndef HAS_MBSTOWCS
306#define mbstowcs(s, pwcs, n) not_here("mbstowcs")
307#endif
308#ifndef HAS_MBTOWC
309#define mbtowc(pwc, s, n) not_here("mbtowc")
310#endif
311#ifndef HAS_WCSTOMBS
312#define wcstombs(s, pwcs, n) not_here("wcstombs")
313#endif
314#ifndef HAS_WCTOMB
315#define wctomb(s, wchar) not_here("wcstombs")
316#endif
317#if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
318/* If we don't have these functions, then we wouldn't have gotten a typedef
319 for wchar_t, the wide character type. Defining wchar_t allows the
320 functions referencing it to compile. Its actual type is then meaningless,
321 since without the above functions, all sections using it end up calling
322 not_here() and croak. --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
323#ifndef wchar_t
324#define wchar_t char
325#endif
326#endif
327
328#ifndef HAS_LOCALECONV
329#define localeconv() not_here("localeconv")
330#endif
331
172ea7c8 332#ifdef HAS_LONG_DOUBLE
53796371 333# if LONG_DOUBLESIZE > NVSIZE
172ea7c8
JH
334# undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */
335# endif
336#endif
337
338#ifndef HAS_LONG_DOUBLE
339#ifdef LDBL_MAX
340#undef LDBL_MAX
341#endif
342#ifdef LDBL_MIN
343#undef LDBL_MIN
344#endif
345#ifdef LDBL_EPSILON
346#undef LDBL_EPSILON
347#endif
348#endif
349
ec193bec
JH
350/* Background: in most systems the low byte of the wait status
351 * is the signal (the lowest 7 bits) and the coredump flag is
352 * the eight bit, and the second lowest byte is the exit status.
353 * BeOS bucks the trend and has the bytes in different order.
354 * See beos/beos.c for how the reality is bent even in BeOS
355 * to follow the traditional. However, to make the POSIX
356 * wait W*() macros to work in BeOS, we need to unbend the
357 * reality back in place. --jhi */
358#ifdef __BEOS__
359# define WMUNGE(x) (((x) & 0xFF00) >> 8 | ((x) & 0x00FF) << 8)
360#else
361# define WMUNGE(x) (x)
362#endif
363
8990e307 364static int
f0f333f4 365not_here(char *s)
8990e307
LW
366{
367 croak("POSIX::%s not implemented on this architecture", s);
368 return -1;
369}
463ee0b2 370
1cb0fb50 371#include "const-c.inc"
a290f238
NC
372
373/* These were implemented in the old "constant" subroutine. They are actually
374 macros that take an integer argument and return an integer result. */
375static int
376int_macro_int (const char *name, STRLEN len, IV *arg_result) {
377 /* Initially switch on the length of the name. */
378 /* This code has been edited from a "constant" function generated by:
379
380use ExtUtils::Constant qw (constant_types C_constant XS_constant);
381
382my $types = {map {($_, 1)} qw(IV)};
383my @names = (qw(S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG WEXITSTATUS WIFEXITED
384 WIFSIGNALED WIFSTOPPED WSTOPSIG WTERMSIG));
385
386print constant_types(); # macro defs
387foreach (C_constant ("POSIX", 'int_macro_int', 'IV', $types, undef, 5, @names) ) {
388 print $_, "\n"; # C constant subs
389}
390print "#### XS Section:\n";
391print XS_constant ("POSIX", $types);
392__END__
393 */
394
395 switch (len) {
396 case 7:
397 /* Names all of length 7. */
398 /* S_ISBLK S_ISCHR S_ISDIR S_ISREG */
399 /* Offset 5 gives the best switch position. */
400 switch (name[5]) {
401 case 'E':
402 if (memEQ(name, "S_ISREG", 7)) {
403 /* ^ */
404#ifdef S_ISREG
405 *arg_result = S_ISREG(*arg_result);
406 return PERL_constant_ISIV;
2304df62 407#else
a290f238 408 return PERL_constant_NOTDEF;
2304df62 409#endif
a290f238
NC
410 }
411 break;
412 case 'H':
413 if (memEQ(name, "S_ISCHR", 7)) {
414 /* ^ */
415#ifdef S_ISCHR
416 *arg_result = S_ISCHR(*arg_result);
417 return PERL_constant_ISIV;
2304df62 418#else
a290f238 419 return PERL_constant_NOTDEF;
2304df62 420#endif
a290f238
NC
421 }
422 break;
423 case 'I':
424 if (memEQ(name, "S_ISDIR", 7)) {
425 /* ^ */
426#ifdef S_ISDIR
427 *arg_result = S_ISDIR(*arg_result);
428 return PERL_constant_ISIV;
2304df62 429#else
a290f238 430 return PERL_constant_NOTDEF;
2304df62 431#endif
a290f238
NC
432 }
433 break;
434 case 'L':
435 if (memEQ(name, "S_ISBLK", 7)) {
436 /* ^ */
437#ifdef S_ISBLK
438 *arg_result = S_ISBLK(*arg_result);
439 return PERL_constant_ISIV;
2304df62 440#else
a290f238 441 return PERL_constant_NOTDEF;
2304df62 442#endif
a290f238
NC
443 }
444 break;
445 }
446 break;
447 case 8:
448 /* Names all of length 8. */
449 /* S_ISFIFO WSTOPSIG WTERMSIG */
450 /* Offset 3 gives the best switch position. */
451 switch (name[3]) {
452 case 'O':
453 if (memEQ(name, "WSTOPSIG", 8)) {
454 /* ^ */
455#ifdef WSTOPSIG
bfbc3223
JH
456 int i = *arg_result;
457 *arg_result = WSTOPSIG(WMUNGE(i));
a290f238 458 return PERL_constant_ISIV;
2304df62 459#else
a290f238 460 return PERL_constant_NOTDEF;
2304df62 461#endif
a290f238
NC
462 }
463 break;
464 case 'R':
465 if (memEQ(name, "WTERMSIG", 8)) {
466 /* ^ */
467#ifdef WTERMSIG
bfbc3223
JH
468 int i = *arg_result;
469 *arg_result = WTERMSIG(WMUNGE(i));
a290f238 470 return PERL_constant_ISIV;
2304df62 471#else
a290f238 472 return PERL_constant_NOTDEF;
2304df62 473#endif
a290f238
NC
474 }
475 break;
476 case 'S':
477 if (memEQ(name, "S_ISFIFO", 8)) {
478 /* ^ */
479#ifdef S_ISFIFO
480 *arg_result = S_ISFIFO(*arg_result);
481 return PERL_constant_ISIV;
2304df62 482#else
a290f238 483 return PERL_constant_NOTDEF;
2304df62 484#endif
a290f238
NC
485 }
486 break;
487 }
488 break;
489 case 9:
490 if (memEQ(name, "WIFEXITED", 9)) {
491#ifdef WIFEXITED
bfbc3223
JH
492 int i = *arg_result;
493 *arg_result = WIFEXITED(WMUNGE(i));
a290f238 494 return PERL_constant_ISIV;
2304df62 495#else
a290f238 496 return PERL_constant_NOTDEF;
2304df62 497#endif
a290f238
NC
498 }
499 break;
500 case 10:
501 if (memEQ(name, "WIFSTOPPED", 10)) {
502#ifdef WIFSTOPPED
bfbc3223
JH
503 int i = *arg_result;
504 *arg_result = WIFSTOPPED(WMUNGE(i));
a290f238 505 return PERL_constant_ISIV;
2304df62 506#else
a290f238 507 return PERL_constant_NOTDEF;
2304df62 508#endif
a290f238
NC
509 }
510 break;
511 case 11:
512 /* Names all of length 11. */
513 /* WEXITSTATUS WIFSIGNALED */
514 /* Offset 1 gives the best switch position. */
515 switch (name[1]) {
516 case 'E':
517 if (memEQ(name, "WEXITSTATUS", 11)) {
518 /* ^ */
519#ifdef WEXITSTATUS
bfbc3223
JH
520 int i = *arg_result;
521 *arg_result = WEXITSTATUS(WMUNGE(i));
a290f238 522 return PERL_constant_ISIV;
2304df62 523#else
a290f238 524 return PERL_constant_NOTDEF;
2304df62 525#endif
a290f238
NC
526 }
527 break;
528 case 'I':
529 if (memEQ(name, "WIFSIGNALED", 11)) {
530 /* ^ */
531#ifdef WIFSIGNALED
bfbc3223
JH
532 int i = *arg_result;
533 *arg_result = WIFSIGNALED(WMUNGE(i));
a290f238 534 return PERL_constant_ISIV;
2304df62 535#else
a290f238 536 return PERL_constant_NOTDEF;
2304df62 537#endif
a290f238
NC
538 }
539 break;
540 }
541 break;
542 }
543 return PERL_constant_NOTFOUND;
544}
545
1dfe7606 546static void
40b7a5f5 547restore_sigmask(pTHX_ SV *osset_sv)
1dfe7606 548{
7feb700b
JH
549 /* Fortunately, restoring the signal mask can't fail, because
550 * there's nothing we can do about it if it does -- we're not
551 * supposed to return -1 from sigaction unless the disposition
552 * was unaffected.
553 */
7feb700b
JH
554 sigset_t *ossetp = (sigset_t *) SvPV_nolen( osset_sv );
555 (void)sigprocmask(SIG_SETMASK, ossetp, (sigset_t *)0);
1dfe7606 556}
557
2304df62
AD
558MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig
559
560POSIX::SigSet
561new(packname = "POSIX::SigSet", ...)
562 char * packname
563 CODE:
564 {
565 int i;
01667c76 566 New(0, RETVAL, 1, sigset_t);
2304df62 567 sigemptyset(RETVAL);
a0d0e21e 568 for (i = 1; i < items; i++)
2304df62
AD
569 sigaddset(RETVAL, SvIV(ST(i)));
570 }
571 OUTPUT:
572 RETVAL
463ee0b2 573
8990e307 574void
2304df62
AD
575DESTROY(sigset)
576 POSIX::SigSet sigset
577 CODE:
01667c76 578 Safefree(sigset);
2304df62
AD
579
580SysRet
581sigaddset(sigset, sig)
582 POSIX::SigSet sigset
583 int sig
584
585SysRet
586sigdelset(sigset, sig)
587 POSIX::SigSet sigset
588 int sig
589
590SysRet
591sigemptyset(sigset)
592 POSIX::SigSet sigset
593
594SysRet
595sigfillset(sigset)
596 POSIX::SigSet sigset
597
598int
599sigismember(sigset, sig)
600 POSIX::SigSet sigset
601 int sig
602
603
a0d0e21e
LW
604MODULE = Termios PACKAGE = POSIX::Termios PREFIX = cf
605
606POSIX::Termios
607new(packname = "POSIX::Termios", ...)
608 char * packname
609 CODE:
610 {
611#ifdef I_TERMIOS
01667c76 612 New(0, RETVAL, 1, struct termios);
a0d0e21e
LW
613#else
614 not_here("termios");
640cc986 615 RETVAL = 0;
a0d0e21e
LW
616#endif
617 }
618 OUTPUT:
619 RETVAL
620
621void
622DESTROY(termios_ref)
623 POSIX::Termios termios_ref
624 CODE:
625#ifdef I_TERMIOS
01667c76 626 Safefree(termios_ref);
a0d0e21e
LW
627#else
628 not_here("termios");
629#endif
630
631SysRet
632getattr(termios_ref, fd = 0)
633 POSIX::Termios termios_ref
634 int fd
635 CODE:
636 RETVAL = tcgetattr(fd, termios_ref);
637 OUTPUT:
638 RETVAL
639
640SysRet
641setattr(termios_ref, fd = 0, optional_actions = 0)
642 POSIX::Termios termios_ref
643 int fd
644 int optional_actions
645 CODE:
646 RETVAL = tcsetattr(fd, optional_actions, termios_ref);
647 OUTPUT:
648 RETVAL
649
650speed_t
651cfgetispeed(termios_ref)
652 POSIX::Termios termios_ref
653
654speed_t
655cfgetospeed(termios_ref)
656 POSIX::Termios termios_ref
657
658tcflag_t
659getiflag(termios_ref)
660 POSIX::Termios termios_ref
661 CODE:
662#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
663 RETVAL = termios_ref->c_iflag;
664#else
640cc986
HM
665 not_here("getiflag");
666 RETVAL = 0;
a0d0e21e
LW
667#endif
668 OUTPUT:
669 RETVAL
670
671tcflag_t
672getoflag(termios_ref)
673 POSIX::Termios termios_ref
674 CODE:
675#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
676 RETVAL = termios_ref->c_oflag;
677#else
640cc986
HM
678 not_here("getoflag");
679 RETVAL = 0;
a0d0e21e
LW
680#endif
681 OUTPUT:
682 RETVAL
683
684tcflag_t
685getcflag(termios_ref)
686 POSIX::Termios termios_ref
687 CODE:
688#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
689 RETVAL = termios_ref->c_cflag;
690#else
640cc986
HM
691 not_here("getcflag");
692 RETVAL = 0;
a0d0e21e
LW
693#endif
694 OUTPUT:
695 RETVAL
696
697tcflag_t
698getlflag(termios_ref)
699 POSIX::Termios termios_ref
700 CODE:
701#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
702 RETVAL = termios_ref->c_lflag;
703#else
640cc986
HM
704 not_here("getlflag");
705 RETVAL = 0;
a0d0e21e
LW
706#endif
707 OUTPUT:
708 RETVAL
709
710cc_t
711getcc(termios_ref, ccix)
712 POSIX::Termios termios_ref
713 int ccix
714 CODE:
715#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
716 if (ccix >= NCCS)
717 croak("Bad getcc subscript");
718 RETVAL = termios_ref->c_cc[ccix];
719#else
640cc986
HM
720 not_here("getcc");
721 RETVAL = 0;
a0d0e21e
LW
722#endif
723 OUTPUT:
724 RETVAL
725
726SysRet
727cfsetispeed(termios_ref, speed)
728 POSIX::Termios termios_ref
729 speed_t speed
730
731SysRet
732cfsetospeed(termios_ref, speed)
733 POSIX::Termios termios_ref
734 speed_t speed
735
736void
737setiflag(termios_ref, iflag)
738 POSIX::Termios termios_ref
739 tcflag_t iflag
740 CODE:
741#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
742 termios_ref->c_iflag = iflag;
743#else
744 not_here("setiflag");
745#endif
746
747void
748setoflag(termios_ref, oflag)
749 POSIX::Termios termios_ref
750 tcflag_t oflag
751 CODE:
752#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
753 termios_ref->c_oflag = oflag;
754#else
755 not_here("setoflag");
756#endif
757
758void
759setcflag(termios_ref, cflag)
760 POSIX::Termios termios_ref
761 tcflag_t cflag
762 CODE:
763#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
764 termios_ref->c_cflag = cflag;
765#else
766 not_here("setcflag");
767#endif
768
769void
770setlflag(termios_ref, lflag)
771 POSIX::Termios termios_ref
772 tcflag_t lflag
773 CODE:
774#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
775 termios_ref->c_lflag = lflag;
776#else
777 not_here("setlflag");
778#endif
779
780void
781setcc(termios_ref, ccix, cc)
782 POSIX::Termios termios_ref
783 int ccix
784 cc_t cc
785 CODE:
786#ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
787 if (ccix >= NCCS)
788 croak("Bad setcc subscript");
789 termios_ref->c_cc[ccix] = cc;
790#else
791 not_here("setcc");
792#endif
793
794
a0d0e21e
LW
795MODULE = POSIX PACKAGE = POSIX
796
1cb0fb50 797INCLUDE: const-xs.inc
a290f238
NC
798
799void
800int_macro_int(sv, iv)
801 PREINIT:
802 dXSTARG;
803 STRLEN len;
804 int type;
805 INPUT:
806 SV * sv;
807 const char * s = SvPV(sv, len);
808 IV iv;
809 PPCODE:
810 /* Change this to int_macro_int(s, len, &iv, &nv);
811 if you need to return both NVs and IVs */
812 type = int_macro_int(s, len, &iv);
813 /* Return 1 or 2 items. First is error message, or undef if no error.
814 Second, if present, is found value */
815 switch (type) {
816 case PERL_constant_NOTFOUND:
817 sv = sv_2mortal(newSVpvf("%s is not a valid POSIX macro", s));
818 EXTEND(SP, 1);
819 PUSHs(&PL_sv_undef);
820 PUSHs(sv);
821 break;
822 case PERL_constant_NOTDEF:
823 sv = sv_2mortal(newSVpvf(
824 "Your vendor has not defined POSIX macro %s, used", s));
825 EXTEND(SP, 1);
826 PUSHs(&PL_sv_undef);
827 PUSHs(sv);
828 break;
829 case PERL_constant_ISIV:
830 PUSHi(iv);
831 break;
832 default:
833 sv = sv_2mortal(newSVpvf(
834 "Unexpected return type %d while processing POSIX macro %s, used",
835 type, s));
836 EXTEND(SP, 1);
837 PUSHs(&PL_sv_undef);
838 PUSHs(sv);
839 }
2304df62
AD
840
841int
842isalnum(charstring)
5344da4e 843 unsigned char * charstring
2304df62 844 CODE:
5344da4e 845 unsigned char *s = charstring;
d4e900e0 846 unsigned char *e = s + SvCUR(ST(0));
5344da4e 847 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
848 if (!isalnum(*s))
849 RETVAL = 0;
850 OUTPUT:
851 RETVAL
852
853int
854isalpha(charstring)
5344da4e 855 unsigned char * charstring
2304df62 856 CODE:
5344da4e 857 unsigned char *s = charstring;
d4e900e0 858 unsigned char *e = s + SvCUR(ST(0));
5344da4e 859 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
860 if (!isalpha(*s))
861 RETVAL = 0;
862 OUTPUT:
863 RETVAL
864
865int
866iscntrl(charstring)
5344da4e 867 unsigned char * charstring
2304df62 868 CODE:
5344da4e 869 unsigned char *s = charstring;
d4e900e0 870 unsigned char *e = s + SvCUR(ST(0));
5344da4e 871 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
872 if (!iscntrl(*s))
873 RETVAL = 0;
874 OUTPUT:
875 RETVAL
876
877int
878isdigit(charstring)
5344da4e 879 unsigned char * charstring
2304df62 880 CODE:
5344da4e 881 unsigned char *s = charstring;
d4e900e0 882 unsigned char *e = s + SvCUR(ST(0));
5344da4e 883 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
884 if (!isdigit(*s))
885 RETVAL = 0;
886 OUTPUT:
887 RETVAL
888
889int
890isgraph(charstring)
5344da4e 891 unsigned char * charstring
2304df62 892 CODE:
5344da4e 893 unsigned char *s = charstring;
d4e900e0 894 unsigned char *e = s + SvCUR(ST(0));
5344da4e 895 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
896 if (!isgraph(*s))
897 RETVAL = 0;
898 OUTPUT:
899 RETVAL
900
901int
902islower(charstring)
5344da4e 903 unsigned char * charstring
2304df62 904 CODE:
5344da4e 905 unsigned char *s = charstring;
d4e900e0 906 unsigned char *e = s + SvCUR(ST(0));
5344da4e 907 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
908 if (!islower(*s))
909 RETVAL = 0;
910 OUTPUT:
911 RETVAL
912
913int
914isprint(charstring)
5344da4e 915 unsigned char * charstring
2304df62 916 CODE:
5344da4e 917 unsigned char *s = charstring;
d4e900e0 918 unsigned char *e = s + SvCUR(ST(0));
5344da4e 919 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
920 if (!isprint(*s))
921 RETVAL = 0;
922 OUTPUT:
923 RETVAL
924
925int
926ispunct(charstring)
5344da4e 927 unsigned char * charstring
2304df62 928 CODE:
5344da4e 929 unsigned char *s = charstring;
d4e900e0 930 unsigned char *e = s + SvCUR(ST(0));
5344da4e 931 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
932 if (!ispunct(*s))
933 RETVAL = 0;
934 OUTPUT:
935 RETVAL
936
937int
938isspace(charstring)
5344da4e 939 unsigned char * charstring
2304df62 940 CODE:
5344da4e 941 unsigned char *s = charstring;
d4e900e0 942 unsigned char *e = s + SvCUR(ST(0));
5344da4e 943 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
944 if (!isspace(*s))
945 RETVAL = 0;
946 OUTPUT:
947 RETVAL
8990e307
LW
948
949int
2304df62 950isupper(charstring)
5344da4e 951 unsigned char * charstring
2304df62 952 CODE:
5344da4e 953 unsigned char *s = charstring;
d4e900e0 954 unsigned char *e = s + SvCUR(ST(0));
5344da4e 955 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
956 if (!isupper(*s))
957 RETVAL = 0;
958 OUTPUT:
959 RETVAL
8990e307
LW
960
961int
2304df62 962isxdigit(charstring)
5344da4e 963 unsigned char * charstring
2304df62 964 CODE:
5344da4e 965 unsigned char *s = charstring;
d4e900e0 966 unsigned char *e = s + SvCUR(ST(0));
5344da4e 967 for (RETVAL = 1; RETVAL && s < e; s++)
2304df62
AD
968 if (!isxdigit(*s))
969 RETVAL = 0;
970 OUTPUT:
971 RETVAL
972
973SysRet
974open(filename, flags = O_RDONLY, mode = 0666)
975 char * filename
976 int flags
a0d0e21e 977 Mode_t mode
748a9306
LW
978 CODE:
979 if (flags & (O_APPEND|O_CREAT|O_TRUNC|O_RDWR|O_WRONLY|O_EXCL))
980 TAINT_PROPER("open");
981 RETVAL = open(filename, flags, mode);
982 OUTPUT:
983 RETVAL
984
2304df62
AD
985
986HV *
987localeconv()
988 CODE:
a0d0e21e 989#ifdef HAS_LOCALECONV
2304df62
AD
990 struct lconv *lcbuf;
991 RETVAL = newHV();
8063af02 992 if ((lcbuf = localeconv())) {
2304df62
AD
993 /* the strings */
994 if (lcbuf->decimal_point && *lcbuf->decimal_point)
995 hv_store(RETVAL, "decimal_point", 13,
996 newSVpv(lcbuf->decimal_point, 0), 0);
997 if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
998 hv_store(RETVAL, "thousands_sep", 13,
999 newSVpv(lcbuf->thousands_sep, 0), 0);
28e8609d 1000#ifndef NO_LOCALECONV_GROUPING
2304df62
AD
1001 if (lcbuf->grouping && *lcbuf->grouping)
1002 hv_store(RETVAL, "grouping", 8,
1003 newSVpv(lcbuf->grouping, 0), 0);
28e8609d 1004#endif
2304df62
AD
1005 if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
1006 hv_store(RETVAL, "int_curr_symbol", 15,
1007 newSVpv(lcbuf->int_curr_symbol, 0), 0);
1008 if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
1009 hv_store(RETVAL, "currency_symbol", 15,
1010 newSVpv(lcbuf->currency_symbol, 0), 0);
1011 if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
1012 hv_store(RETVAL, "mon_decimal_point", 17,
1013 newSVpv(lcbuf->mon_decimal_point, 0), 0);
39e571d4 1014#ifndef NO_LOCALECONV_MON_THOUSANDS_SEP
2304df62
AD
1015 if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
1016 hv_store(RETVAL, "mon_thousands_sep", 17,
1017 newSVpv(lcbuf->mon_thousands_sep, 0), 0);
39e571d4 1018#endif
28e8609d 1019#ifndef NO_LOCALECONV_MON_GROUPING
2304df62
AD
1020 if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
1021 hv_store(RETVAL, "mon_grouping", 12,
1022 newSVpv(lcbuf->mon_grouping, 0), 0);
28e8609d 1023#endif
2304df62
AD
1024 if (lcbuf->positive_sign && *lcbuf->positive_sign)
1025 hv_store(RETVAL, "positive_sign", 13,
1026 newSVpv(lcbuf->positive_sign, 0), 0);
1027 if (lcbuf->negative_sign && *lcbuf->negative_sign)
1028 hv_store(RETVAL, "negative_sign", 13,
1029 newSVpv(lcbuf->negative_sign, 0), 0);
1030 /* the integers */
1031 if (lcbuf->int_frac_digits != CHAR_MAX)
1032 hv_store(RETVAL, "int_frac_digits", 15,
1033 newSViv(lcbuf->int_frac_digits), 0);
1034 if (lcbuf->frac_digits != CHAR_MAX)
1035 hv_store(RETVAL, "frac_digits", 11,
1036 newSViv(lcbuf->frac_digits), 0);
1037 if (lcbuf->p_cs_precedes != CHAR_MAX)
1038 hv_store(RETVAL, "p_cs_precedes", 13,
1039 newSViv(lcbuf->p_cs_precedes), 0);
1040 if (lcbuf->p_sep_by_space != CHAR_MAX)
1041 hv_store(RETVAL, "p_sep_by_space", 14,
1042 newSViv(lcbuf->p_sep_by_space), 0);
1043 if (lcbuf->n_cs_precedes != CHAR_MAX)
1044 hv_store(RETVAL, "n_cs_precedes", 13,
1045 newSViv(lcbuf->n_cs_precedes), 0);
1046 if (lcbuf->n_sep_by_space != CHAR_MAX)
1047 hv_store(RETVAL, "n_sep_by_space", 14,
1048 newSViv(lcbuf->n_sep_by_space), 0);
1049 if (lcbuf->p_sign_posn != CHAR_MAX)
1050 hv_store(RETVAL, "p_sign_posn", 11,
1051 newSViv(lcbuf->p_sign_posn), 0);
1052 if (lcbuf->n_sign_posn != CHAR_MAX)
1053 hv_store(RETVAL, "n_sign_posn", 11,
1054 newSViv(lcbuf->n_sign_posn), 0);
1055 }
a0d0e21e
LW
1056#else
1057 localeconv(); /* A stub to call not_here(). */
1058#endif
2304df62
AD
1059 OUTPUT:
1060 RETVAL
1061
1062char *
c28ee57b 1063setlocale(category, locale = 0)
2304df62
AD
1064 int category
1065 char * locale
c28ee57b
JH
1066 CODE:
1067 RETVAL = setlocale(category, locale);
bbce6d69 1068 if (RETVAL) {
36477c24 1069#ifdef USE_LOCALE_CTYPE
bbce6d69
PP
1070 if (category == LC_CTYPE
1071#ifdef LC_ALL
1072 || category == LC_ALL
1073#endif
1074 )
1075 {
1076 char *newctype;
1077#ifdef LC_ALL
1078 if (category == LC_ALL)
1079 newctype = setlocale(LC_CTYPE, NULL);
1080 else
1081#endif
1082 newctype = RETVAL;
864dbfa3 1083 new_ctype(newctype);
bbce6d69 1084 }
36477c24
PP
1085#endif /* USE_LOCALE_CTYPE */
1086#ifdef USE_LOCALE_COLLATE
bbce6d69
PP
1087 if (category == LC_COLLATE
1088#ifdef LC_ALL
1089 || category == LC_ALL
1090#endif
1091 )
1092 {
1093 char *newcoll;
1094#ifdef LC_ALL
1095 if (category == LC_ALL)
1096 newcoll = setlocale(LC_COLLATE, NULL);
1097 else
1098#endif
1099 newcoll = RETVAL;
864dbfa3 1100 new_collate(newcoll);
bbce6d69 1101 }
36477c24
PP
1102#endif /* USE_LOCALE_COLLATE */
1103#ifdef USE_LOCALE_NUMERIC
bbce6d69
PP
1104 if (category == LC_NUMERIC
1105#ifdef LC_ALL
1106 || category == LC_ALL
1107#endif
1108 )
1109 {
1110 char *newnum;
1111#ifdef LC_ALL
1112 if (category == LC_ALL)
1113 newnum = setlocale(LC_NUMERIC, NULL);
1114 else
1115#endif
1116 newnum = RETVAL;
864dbfa3 1117 new_numeric(newnum);
bbce6d69 1118 }
36477c24 1119#endif /* USE_LOCALE_NUMERIC */
bbce6d69 1120 }
c28ee57b
JH
1121 OUTPUT:
1122 RETVAL
1123
2304df62 1124
e1ca407b 1125NV
2304df62 1126acos(x)
e1ca407b 1127 NV x
2304df62 1128
e1ca407b 1129NV
2304df62 1130asin(x)
e1ca407b 1131 NV x
2304df62 1132
e1ca407b 1133NV
2304df62 1134atan(x)
e1ca407b 1135 NV x
2304df62 1136
e1ca407b 1137NV
2304df62 1138ceil(x)
e1ca407b 1139 NV x
2304df62 1140
e1ca407b 1141NV
2304df62 1142cosh(x)
e1ca407b 1143 NV x
2304df62 1144
e1ca407b 1145NV
2304df62 1146floor(x)
e1ca407b 1147 NV x
2304df62 1148
e1ca407b 1149NV
2304df62 1150fmod(x,y)
e1ca407b
A
1151 NV x
1152 NV y
2304df62
AD
1153
1154void
1155frexp(x)
e1ca407b 1156 NV x
2304df62
AD
1157 PPCODE:
1158 int expvar;
2304df62
AD
1159 /* (We already know stack is long enough.) */
1160 PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
1161 PUSHs(sv_2mortal(newSViv(expvar)));
1162
e1ca407b 1163NV
2304df62 1164ldexp(x,exp)
e1ca407b 1165 NV x
2304df62
AD
1166 int exp
1167
e1ca407b 1168NV
2304df62 1169log10(x)
e1ca407b 1170 NV x
2304df62
AD
1171
1172void
1173modf(x)
e1ca407b 1174 NV x
2304df62 1175 PPCODE:
e1ca407b 1176 NV intvar;
2304df62 1177 /* (We already know stack is long enough.) */
bf4acbe4 1178 PUSHs(sv_2mortal(newSVnv(Perl_modf(x,&intvar))));
2304df62
AD
1179 PUSHs(sv_2mortal(newSVnv(intvar)));
1180
e1ca407b 1181NV
2304df62 1182sinh(x)
e1ca407b 1183 NV x
2304df62 1184
e1ca407b 1185NV
3b35bae3 1186tan(x)
e1ca407b 1187 NV x
3b35bae3 1188
e1ca407b 1189NV
2304df62 1190tanh(x)
e1ca407b 1191 NV x
2304df62
AD
1192
1193SysRet
1dfe7606 1194sigaction(sig, optaction, oldaction = 0)
2304df62 1195 int sig
1dfe7606 1196 SV * optaction
2304df62
AD
1197 POSIX::SigAction oldaction
1198 CODE:
2986a63f 1199#if defined(WIN32) || defined(NETWARE)
6dead956
GS
1200 RETVAL = not_here("sigaction");
1201#else
2304df62
AD
1202# This code is really grody because we're trying to make the signal
1203# interface look beautiful, which is hard.
1204
2304df62 1205 {
1dfe7606 1206 POSIX__SigAction action;
f4c556ac 1207 GV *siggv = gv_fetchpv("SIG", TRUE, SVt_PVHV);
2304df62
AD
1208 struct sigaction act;
1209 struct sigaction oact;
1dfe7606 1210 sigset_t sset;
183bde56 1211 SV *osset_sv;
27c1a449 1212 sigset_t osset;
2304df62
AD
1213 POSIX__SigSet sigset;
1214 SV** svp;
1d81eac9
JH
1215 SV** sigsvp;
1216 if (sig == 0 && SvPOK(ST(0))) {
1217 char *s = SvPVX(ST(0));
1218 int i = whichsig(s);
1219
1220 if (i < 0 && memEQ(s, "SIG", 3))
1221 i = whichsig(s + 3);
1222 if (i < 0) {
1223 if (ckWARN(WARN_SIGNAL))
1224 Perl_warner(aTHX_ packWARN(WARN_SIGNAL),
1225 "No such signal: SIG%s", s);
1226 XSRETURN_UNDEF;
1227 }
1228 else
1229 sig = i;
1230 }
1231 sigsvp = hv_fetch(GvHVn(siggv),
1232 PL_sig_name[sig],
1233 strlen(PL_sig_name[sig]),
1234 TRUE);
2304df62 1235
1dfe7606 1236 /* Check optaction and set action */
1237 if(SvTRUE(optaction)) {
1238 if(sv_isa(optaction, "POSIX::SigAction"))
1239 action = (HV*)SvRV(optaction);
1240 else
1241 croak("action is not of type POSIX::SigAction");
1242 }
1243 else {
1244 action=0;
1245 }
1246
1247 /* sigaction() is supposed to look atomic. In particular, any
1248 * signal handler invoked during a sigaction() call should
1249 * see either the old or the new disposition, and not something
1250 * in between. We use sigprocmask() to make it so.
1251 */
1252 sigfillset(&sset);
1253 RETVAL=sigprocmask(SIG_BLOCK, &sset, &osset);
1254 if(RETVAL == -1)
15c0d34a 1255 XSRETURN_UNDEF;
1dfe7606 1256 ENTER;
1257 /* Restore signal mask no matter how we exit this block. */
183bde56
NA
1258 osset_sv = newSVpv((char *)(&osset), sizeof(sigset_t));
1259 SAVEFREESV( osset_sv );
40b7a5f5 1260 SAVEDESTRUCTOR_X(restore_sigmask, osset_sv);
1dfe7606 1261
1262 RETVAL=-1; /* In case both oldaction and action are 0. */
1263
1264 /* Remember old disposition if desired. */
2304df62 1265 if (oldaction) {
2304df62 1266 svp = hv_fetch(oldaction, "HANDLER", 7, TRUE);
1dfe7606 1267 if(!svp)
1268 croak("Can't supply an oldaction without a HANDLER");
1269 if(SvTRUE(*sigsvp)) { /* TBD: what if "0"? */
1270 sv_setsv(*svp, *sigsvp);
1271 }
1272 else {
1273 sv_setpv(*svp, "DEFAULT");
1274 }
1275 RETVAL = sigaction(sig, (struct sigaction *)0, & oact);
1276 if(RETVAL == -1)
15c0d34a 1277 XSRETURN_UNDEF;
1dfe7606 1278 /* Get back the mask. */
1279 svp = hv_fetch(oldaction, "MASK", 4, TRUE);
1280 if (sv_isa(*svp, "POSIX::SigSet")) {
1281 IV tmp = SvIV((SV*)SvRV(*svp));
1282 sigset = INT2PTR(sigset_t*, tmp);
1283 }
1284 else {
1285 New(0, sigset, 1, sigset_t);
1286 sv_setptrobj(*svp, sigset, "POSIX::SigSet");
1287 }
1288 *sigset = oact.sa_mask;
1289
1290 /* Get back the flags. */
1291 svp = hv_fetch(oldaction, "FLAGS", 5, TRUE);
1292 sv_setiv(*svp, oact.sa_flags);
2304df62
AD
1293 }
1294
1295 if (action) {
1296 /* Vector new handler through %SIG. (We always use sighandler
1297 for the C signal handler, which reads %SIG to dispatch.) */
1298 svp = hv_fetch(action, "HANDLER", 7, FALSE);
1299 if (!svp)
1300 croak("Can't supply an action without a HANDLER");
1dfe7606 1301 sv_setsv(*sigsvp, *svp);
2304df62 1302 mg_set(*sigsvp); /* handles DEFAULT and IGNORE */
1dfe7606 1303 if(SvPOK(*svp)) {
1304 char *s=SvPVX(*svp);
1305 if(strEQ(s,"IGNORE")) {
1306 act.sa_handler = SIG_IGN;
1307 }
1308 else if(strEQ(s,"DEFAULT")) {
1309 act.sa_handler = SIG_DFL;
1310 }
1311 else {
1312 act.sa_handler = PL_sighandlerp;
1313 }
1314 }
1315 else {
1316 act.sa_handler = PL_sighandlerp;
1317 }
2304df62
AD
1318
1319 /* Set up any desired mask. */
1320 svp = hv_fetch(action, "MASK", 4, FALSE);
1321 if (svp && sv_isa(*svp, "POSIX::SigSet")) {
ac634a9a 1322 IV tmp = SvIV((SV*)SvRV(*svp));
1dfe7606 1323 sigset = INT2PTR(sigset_t*, tmp);
2304df62
AD
1324 act.sa_mask = *sigset;
1325 }
1326 else
85e6fe83 1327 sigemptyset(& act.sa_mask);
2304df62
AD
1328
1329 /* Set up any desired flags. */
1330 svp = hv_fetch(action, "FLAGS", 5, FALSE);
1331 act.sa_flags = svp ? SvIV(*svp) : 0;
2304df62 1332
1dfe7606 1333 /* Don't worry about cleaning up *sigsvp if this fails,
1334 * because that means we tried to disposition a
1335 * nonblockable signal, in which case *sigsvp is
1336 * essentially meaningless anyway.
1337 */
6c418a22 1338 RETVAL = sigaction(sig, & act, (struct sigaction *)0);
15c0d34a
CB
1339 if(RETVAL == -1)
1340 XSRETURN_UNDEF;
2304df62 1341 }
1dfe7606 1342
1343 LEAVE;
2304df62 1344 }
6dead956 1345#endif
2304df62
AD
1346 OUTPUT:
1347 RETVAL
1348
1349SysRet
1350sigpending(sigset)
1351 POSIX::SigSet sigset
1352
1353SysRet
1354sigprocmask(how, sigset, oldsigset = 0)
1355 int how
1356 POSIX::SigSet sigset
33c27489
GS
1357 POSIX::SigSet oldsigset = NO_INIT
1358INIT:
1359 if ( items < 3 ) {
1360 oldsigset = 0;
1361 }
1362 else if (sv_derived_from(ST(2), "POSIX::SigSet")) {
1363 IV tmp = SvIV((SV*)SvRV(ST(2)));
56431972 1364 oldsigset = INT2PTR(POSIX__SigSet,tmp);
33c27489
GS
1365 }
1366 else {
01667c76 1367 New(0, oldsigset, 1, sigset_t);
33c27489
GS
1368 sigemptyset(oldsigset);
1369 sv_setref_pv(ST(2), "POSIX::SigSet", (void*)oldsigset);
1370 }
2304df62
AD
1371
1372SysRet
1373sigsuspend(signal_mask)
1374 POSIX::SigSet signal_mask
1375
2304df62
AD
1376void
1377_exit(status)
1378 int status
8990e307 1379
85e6fe83 1380SysRet
8990e307
LW
1381close(fd)
1382 int fd
1383
85e6fe83 1384SysRet
8990e307
LW
1385dup(fd)
1386 int fd
1387
85e6fe83 1388SysRet
8990e307
LW
1389dup2(fd1, fd2)
1390 int fd1
1391 int fd2
1392
4a9d6100 1393SV *
a0d0e21e 1394lseek(fd, offset, whence)
85e6fe83
LW
1395 int fd
1396 Off_t offset
1397 int whence
4a9d6100
GS
1398 CODE:
1399 Off_t pos = PerlLIO_lseek(fd, offset, whence);
1400 RETVAL = sizeof(Off_t) > sizeof(IV)
1401 ? newSVnv((NV)pos) : newSViv((IV)pos);
1402 OUTPUT:
1403 RETVAL
8990e307 1404
c5661c80 1405void
8990e307
LW
1406nice(incr)
1407 int incr
15f0f28a
AE
1408 PPCODE:
1409 errno = 0;
1410 if ((incr = nice(incr)) != -1 || errno == 0) {
1411 if (incr == 0)
1412 XPUSHs(sv_2mortal(newSVpvn("0 but true", 10)));
1413 else
1414 XPUSHs(sv_2mortal(newSViv(incr)));
1415 }
8990e307 1416
8063af02 1417void
8990e307 1418pipe()
85e6fe83
LW
1419 PPCODE:
1420 int fds[2];
85e6fe83 1421 if (pipe(fds) != -1) {
924508f0 1422 EXTEND(SP,2);
85e6fe83
LW
1423 PUSHs(sv_2mortal(newSViv(fds[0])));
1424 PUSHs(sv_2mortal(newSViv(fds[1])));
1425 }
8990e307 1426
85e6fe83 1427SysRet
a0d0e21e 1428read(fd, buffer, nbytes)
7747499c
TB
1429 PREINIT:
1430 SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
1431 INPUT:
1432 int fd
1433 size_t nbytes
1434 char * buffer = sv_grow( sv_buffer, nbytes+1 );
a0d0e21e 1435 CLEANUP:
7747499c
TB
1436 if (RETVAL >= 0) {
1437 SvCUR(sv_buffer) = RETVAL;
1438 SvPOK_only(sv_buffer);
1439 *SvEND(sv_buffer) = '\0';
bbce6d69 1440 SvTAINTED_on(sv_buffer);
7747499c 1441 }
8990e307 1442
85e6fe83 1443SysRet
8990e307 1444setpgid(pid, pgid)
86200d5c
JH
1445 pid_t pid
1446 pid_t pgid
8990e307 1447
86200d5c 1448pid_t
8990e307
LW
1449setsid()
1450
86200d5c 1451pid_t
8990e307
LW
1452tcgetpgrp(fd)
1453 int fd
1454
85e6fe83 1455SysRet
8990e307
LW
1456tcsetpgrp(fd, pgrp_id)
1457 int fd
86200d5c 1458 pid_t pgrp_id
8990e307 1459
8063af02 1460void
8990e307 1461uname()
2304df62 1462 PPCODE:
a0d0e21e 1463#ifdef HAS_UNAME
85e6fe83 1464 struct utsname buf;
85e6fe83 1465 if (uname(&buf) >= 0) {
924508f0 1466 EXTEND(SP, 5);
85e6fe83
LW
1467 PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
1468 PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
1469 PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
1470 PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
1471 PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
8990e307 1472 }
a0d0e21e
LW
1473#else
1474 uname((char *) 0); /* A stub to call not_here(). */
1475#endif
8990e307 1476
85e6fe83 1477SysRet
a0d0e21e
LW
1478write(fd, buffer, nbytes)
1479 int fd
1480 char * buffer
1481 size_t nbytes
1482
33f01dd1
SH
1483SV *
1484tmpnam()
1485 PREINIT:
1486 STRLEN i;
1487 int len;
1488 CODE:
1489 RETVAL = newSVpvn("", 0);
1490 SvGROW(RETVAL, L_tmpnam);
1491 len = strlen(tmpnam(SvPV(RETVAL, i)));
1492 SvCUR_set(RETVAL, len);
1493 OUTPUT:
1494 RETVAL
a0d0e21e
LW
1495
1496void
1497abort()
1498
1499int
1500mblen(s, n)
1501 char * s
1502 size_t n
1503
1504size_t
1505mbstowcs(s, pwcs, n)
1506 wchar_t * s
1507 char * pwcs
1508 size_t n
1509
1510int
1511mbtowc(pwc, s, n)
1512 wchar_t * pwc
1513 char * s
1514 size_t n
1515
1516int
1517wcstombs(s, pwcs, n)
1518 char * s
1519 wchar_t * pwcs
1520 size_t n
1521
1522int
1523wctomb(s, wchar)
1524 char * s
1525 wchar_t wchar
1526
1527int
1528strcoll(s1, s2)
1529 char * s1
1530 char * s2
1531
a89d8a78
DH
1532void
1533strtod(str)
1534 char * str
1535 PREINIT:
1536 double num;
1537 char *unparsed;
1538 PPCODE:
36477c24 1539 SET_NUMERIC_LOCAL();
a89d8a78
DH
1540 num = strtod(str, &unparsed);
1541 PUSHs(sv_2mortal(newSVnv(num)));
1542 if (GIMME == G_ARRAY) {
924508f0 1543 EXTEND(SP, 1);
a89d8a78
DH
1544 if (unparsed)
1545 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1546 else
6b88bc9c 1547 PUSHs(&PL_sv_undef);
a89d8a78
DH
1548 }
1549
1550void
1551strtol(str, base = 0)
1552 char * str
1553 int base
1554 PREINIT:
1555 long num;
1556 char *unparsed;
1557 PPCODE:
1558 num = strtol(str, &unparsed, base);
42718184
RB
1559#if IVSIZE <= LONGSIZE
1560 if (num < IV_MIN || num > IV_MAX)
a89d8a78 1561 PUSHs(sv_2mortal(newSVnv((double)num)));
42718184
RB
1562 else
1563#endif
1564 PUSHs(sv_2mortal(newSViv((IV)num)));
a89d8a78 1565 if (GIMME == G_ARRAY) {
924508f0 1566 EXTEND(SP, 1);
a89d8a78
DH
1567 if (unparsed)
1568 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1569 else
6b88bc9c 1570 PUSHs(&PL_sv_undef);
a89d8a78
DH
1571 }
1572
1573void
1574strtoul(str, base = 0)
1575 char * str
1576 int base
1577 PREINIT:
1578 unsigned long num;
1579 char *unparsed;
1580 PPCODE:
1581 num = strtoul(str, &unparsed, base);
84c133a0
RB
1582#if IVSIZE <= LONGSIZE
1583 if (num > IV_MAX)
a89d8a78 1584 PUSHs(sv_2mortal(newSVnv((double)num)));
84c133a0
RB
1585 else
1586#endif
1587 PUSHs(sv_2mortal(newSViv((IV)num)));
a89d8a78 1588 if (GIMME == G_ARRAY) {
924508f0 1589 EXTEND(SP, 1);
a89d8a78
DH
1590 if (unparsed)
1591 PUSHs(sv_2mortal(newSViv(strlen(unparsed))));
1592 else
6b88bc9c 1593 PUSHs(&PL_sv_undef);
a89d8a78
DH
1594 }
1595
8063af02 1596void
a0d0e21e
LW
1597strxfrm(src)
1598 SV * src
85e6fe83 1599 CODE:
a0d0e21e
LW
1600 {
1601 STRLEN srclen;
1602 STRLEN dstlen;
1603 char *p = SvPV(src,srclen);
1604 srclen++;
37cda61e 1605 ST(0) = sv_2mortal(NEWSV(800,srclen*4+1));
a0d0e21e
LW
1606 dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
1607 if (dstlen > srclen) {
1608 dstlen++;
1609 SvGROW(ST(0), dstlen);
1610 strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
1611 dstlen--;
1612 }
1613 SvCUR(ST(0)) = dstlen;
1614 SvPOK_only(ST(0));
1615 }
1616
1617SysRet
1618mkfifo(filename, mode)
1619 char * filename
1620 Mode_t mode
748a9306
LW
1621 CODE:
1622 TAINT_PROPER("mkfifo");
1623 RETVAL = mkfifo(filename, mode);
1624 OUTPUT:
1625 RETVAL
a0d0e21e
LW
1626
1627SysRet
1628tcdrain(fd)
1629 int fd
1630
1631
1632SysRet
1633tcflow(fd, action)
1634 int fd
1635 int action
1636
1637
1638SysRet
1639tcflush(fd, queue_selector)
1640 int fd
1641 int queue_selector
1642
1643SysRet
1644tcsendbreak(fd, duration)
1645 int fd
1646 int duration
1647
1648char *
1649asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
1650 int sec
1651 int min
1652 int hour
1653 int mday
1654 int mon
1655 int year
1656 int wday
1657 int yday
1658 int isdst
1659 CODE:
1660 {
1661 struct tm mytm;
7747499c 1662 init_tm(&mytm); /* XXX workaround - see init_tm() above */
a0d0e21e
LW
1663 mytm.tm_sec = sec;
1664 mytm.tm_min = min;
1665 mytm.tm_hour = hour;
1666 mytm.tm_mday = mday;
1667 mytm.tm_mon = mon;
1668 mytm.tm_year = year;
1669 mytm.tm_wday = wday;
1670 mytm.tm_yday = yday;
1671 mytm.tm_isdst = isdst;
1672 RETVAL = asctime(&mytm);
1673 }
1674 OUTPUT:
1675 RETVAL
1676
1677long
1678clock()
1679
1680char *
1681ctime(time)
748a9306 1682 Time_t &time
8990e307 1683
37120919
AD
1684void
1685times()
1686 PPCODE:
1687 struct tms tms;
1688 clock_t realtime;
1689 realtime = times( &tms );
924508f0 1690 EXTEND(SP,5);
9607fc9c
PP
1691 PUSHs( sv_2mortal( newSViv( (IV) realtime ) ) );
1692 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_utime ) ) );
1693 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_stime ) ) );
1694 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cutime ) ) );
1695 PUSHs( sv_2mortal( newSViv( (IV) tms.tms_cstime ) ) );
37120919 1696
a0d0e21e
LW
1697double
1698difftime(time1, time2)
1699 Time_t time1
1700 Time_t time2
1701
1702SysRetLong
1703mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
1704 int sec
1705 int min
1706 int hour
1707 int mday
1708 int mon
1709 int year
1710 int wday
1711 int yday
1712 int isdst
1713 CODE:
1714 {
1715 struct tm mytm;
7747499c 1716 init_tm(&mytm); /* XXX workaround - see init_tm() above */
a0d0e21e
LW
1717 mytm.tm_sec = sec;
1718 mytm.tm_min = min;
1719 mytm.tm_hour = hour;
1720 mytm.tm_mday = mday;
1721 mytm.tm_mon = mon;
1722 mytm.tm_year = year;
1723 mytm.tm_wday = wday;
1724 mytm.tm_yday = yday;
1725 mytm.tm_isdst = isdst;
1726 RETVAL = mktime(&mytm);
1727 }
85e6fe83
LW
1728 OUTPUT:
1729 RETVAL
a0d0e21e 1730
8063af02
DM
1731#XXX: if $xsubpp::WantOptimize is always the default
1732# sv_setpv(TARG, ...) could be used rather than
1733# ST(0) = sv_2mortal(newSVpv(...))
1734void
e44f695e 1735strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1)
a0d0e21e
LW
1736 char * fmt
1737 int sec
1738 int min
1739 int hour
1740 int mday
1741 int mon
1742 int year
1743 int wday
1744 int yday
1745 int isdst
1746 CODE:
1747 {
b3c85772 1748 char *buf = my_strftime(fmt, sec, min, hour, mday, mon, year, wday, yday, isdst);
2a74cb2d
JH
1749 if (buf) {
1750 ST(0) = sv_2mortal(newSVpv(buf, 0));
bf8afc63 1751 Safefree(buf);
2a74cb2d 1752 }
a0d0e21e
LW
1753 }
1754
1755void
1756tzset()
1757
1758void
1759tzname()
1760 PPCODE:
924508f0 1761 EXTEND(SP,2);
79cb57f6
GS
1762 PUSHs(sv_2mortal(newSVpvn(tzname[0],strlen(tzname[0]))));
1763 PUSHs(sv_2mortal(newSVpvn(tzname[1],strlen(tzname[1]))));
a0d0e21e
LW
1764
1765SysRet
1766access(filename, mode)
1767 char * filename
1768 Mode_t mode
1769
1770char *
1771ctermid(s = 0)
1772 char * s = 0;
1773
1774char *
1775cuserid(s = 0)
1776 char * s = 0;
1777
1778SysRetLong
1779fpathconf(fd, name)
1780 int fd
1781 int name
1782
1783SysRetLong
1784pathconf(filename, name)
1785 char * filename
1786 int name
1787
1788SysRet
1789pause()
1790
a043a685
GW
1791SysRet
1792setgid(gid)
1793 Gid_t gid
1794
1795SysRet
1796setuid(uid)
1797 Uid_t uid
1798
a0d0e21e
LW
1799SysRetLong
1800sysconf(name)
1801 int name
1802
1803char *
1804ttyname(fd)
1805 int fd
a043a685 1806
c6c619a9 1807void
b5846a0b 1808getcwd()
8f95b30d
JH
1809 PPCODE:
1810 {
1811 dXSTARG;
89423764 1812 getcwd_sv(TARG);
8f95b30d
JH
1813 XSprePUSH; PUSHTARG;
1814 }
1815