xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/ext/POSIX/POSIX.pm (revision 0:68f95e015346)
1package POSIX;
2
3our(@ISA, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD) = ();
4
5our $VERSION = "1.08";
6
7use AutoLoader;
8
9use XSLoader ();
10
11# Grandfather old foo_h form to new :foo_h form
12my $loaded;
13
14sub import {
15    load_imports() unless $loaded++;
16    my $this = shift;
17    my @list = map { m/^\w+_h$/ ? ":$_" : $_ } @_;
18    local $Exporter::ExportLevel = 1;
19    Exporter::import($this,@list);
20}
21
22sub croak { require Carp;  goto &Carp::croak }
23# declare usage to assist AutoLoad
24sub usage;
25
26XSLoader::load 'POSIX', $VERSION;
27
28my %NON_CONSTS = (map {($_,1)}
29                  qw(S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG WEXITSTATUS
30                     WIFEXITED WIFSIGNALED WIFSTOPPED WSTOPSIG WTERMSIG));
31
32sub AUTOLOAD {
33    if ($AUTOLOAD =~ /::(_?[a-z])/) {
34	# require AutoLoader;
35	$AutoLoader::AUTOLOAD = $AUTOLOAD;
36	goto &AutoLoader::AUTOLOAD
37    }
38    local $! = 0;
39    my $constname = $AUTOLOAD;
40    $constname =~ s/.*:://;
41    if ($NON_CONSTS{$constname}) {
42        my ($val, $error) = &int_macro_int($constname, $_[0]);
43        croak $error if $error;
44        *$AUTOLOAD = sub { &int_macro_int($constname, $_[0]) };
45    } else {
46        my ($error, $val) = constant($constname);
47        croak $error if $error;
48	*$AUTOLOAD = sub { $val };
49    }
50
51    goto &$AUTOLOAD;
52}
53
54package POSIX::SigAction;
55
56use AutoLoader 'AUTOLOAD';
57sub new { bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0, SAFE => 0}, $_[0] }
58
59package POSIX;
60
611;
62__END__
63
64sub usage {
65    my ($mess) = @_;
66    croak "Usage: POSIX::$mess";
67}
68
69sub redef {
70    my ($mess) = @_;
71    croak "Use method $mess instead";
72}
73
74sub unimpl {
75    my ($mess) = @_;
76    $mess =~ s/xxx//;
77    croak "Unimplemented: POSIX::$mess";
78}
79
80sub assert {
81    usage "assert(expr)" if @_ != 1;
82    if (!$_[0]) {
83	croak "Assertion failed";
84    }
85}
86
87sub tolower {
88    usage "tolower(string)" if @_ != 1;
89    lc($_[0]);
90}
91
92sub toupper {
93    usage "toupper(string)" if @_ != 1;
94    uc($_[0]);
95}
96
97sub closedir {
98    usage "closedir(dirhandle)" if @_ != 1;
99    CORE::closedir($_[0]);
100}
101
102sub opendir {
103    usage "opendir(directory)" if @_ != 1;
104    my $dirhandle;
105    CORE::opendir($dirhandle, $_[0])
106	? $dirhandle
107	: undef;
108}
109
110sub readdir {
111    usage "readdir(dirhandle)" if @_ != 1;
112    CORE::readdir($_[0]);
113}
114
115sub rewinddir {
116    usage "rewinddir(dirhandle)" if @_ != 1;
117    CORE::rewinddir($_[0]);
118}
119
120sub errno {
121    usage "errno()" if @_ != 0;
122    $! + 0;
123}
124
125sub creat {
126    usage "creat(filename, mode)" if @_ != 2;
127    &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1]);
128}
129
130sub fcntl {
131    usage "fcntl(filehandle, cmd, arg)" if @_ != 3;
132    CORE::fcntl($_[0], $_[1], $_[2]);
133}
134
135sub getgrgid {
136    usage "getgrgid(gid)" if @_ != 1;
137    CORE::getgrgid($_[0]);
138}
139
140sub getgrnam {
141    usage "getgrnam(name)" if @_ != 1;
142    CORE::getgrnam($_[0]);
143}
144
145sub atan2 {
146    usage "atan2(x,y)" if @_ != 2;
147    CORE::atan2($_[0], $_[1]);
148}
149
150sub cos {
151    usage "cos(x)" if @_ != 1;
152    CORE::cos($_[0]);
153}
154
155sub exp {
156    usage "exp(x)" if @_ != 1;
157    CORE::exp($_[0]);
158}
159
160sub fabs {
161    usage "fabs(x)" if @_ != 1;
162    CORE::abs($_[0]);
163}
164
165sub log {
166    usage "log(x)" if @_ != 1;
167    CORE::log($_[0]);
168}
169
170sub pow {
171    usage "pow(x,exponent)" if @_ != 2;
172    $_[0] ** $_[1];
173}
174
175sub sin {
176    usage "sin(x)" if @_ != 1;
177    CORE::sin($_[0]);
178}
179
180sub sqrt {
181    usage "sqrt(x)" if @_ != 1;
182    CORE::sqrt($_[0]);
183}
184
185sub getpwnam {
186    usage "getpwnam(name)" if @_ != 1;
187    CORE::getpwnam($_[0]);
188}
189
190sub getpwuid {
191    usage "getpwuid(uid)" if @_ != 1;
192    CORE::getpwuid($_[0]);
193}
194
195sub longjmp {
196    unimpl "longjmp() is C-specific: use die instead";
197}
198
199sub setjmp {
200    unimpl "setjmp() is C-specific: use eval {} instead";
201}
202
203sub siglongjmp {
204    unimpl "siglongjmp() is C-specific: use die instead";
205}
206
207sub sigsetjmp {
208    unimpl "sigsetjmp() is C-specific: use eval {} instead";
209}
210
211sub kill {
212    usage "kill(pid, sig)" if @_ != 2;
213    CORE::kill $_[1], $_[0];
214}
215
216sub raise {
217    usage "raise(sig)" if @_ != 1;
218    CORE::kill $_[0], $$;	# Is this good enough?
219}
220
221sub offsetof {
222    unimpl "offsetof() is C-specific, stopped";
223}
224
225sub clearerr {
226    redef "IO::Handle::clearerr()";
227}
228
229sub fclose {
230    redef "IO::Handle::close()";
231}
232
233sub fdopen {
234    redef "IO::Handle::new_from_fd()";
235}
236
237sub feof {
238    redef "IO::Handle::eof()";
239}
240
241sub fgetc {
242    redef "IO::Handle::getc()";
243}
244
245sub fgets {
246    redef "IO::Handle::gets()";
247}
248
249sub fileno {
250    redef "IO::Handle::fileno()";
251}
252
253sub fopen {
254    redef "IO::File::open()";
255}
256
257sub fprintf {
258    unimpl "fprintf() is C-specific--use printf instead";
259}
260
261sub fputc {
262    unimpl "fputc() is C-specific--use print instead";
263}
264
265sub fputs {
266    unimpl "fputs() is C-specific--use print instead";
267}
268
269sub fread {
270    unimpl "fread() is C-specific--use read instead";
271}
272
273sub freopen {
274    unimpl "freopen() is C-specific--use open instead";
275}
276
277sub fscanf {
278    unimpl "fscanf() is C-specific--use <> and regular expressions instead";
279}
280
281sub fseek {
282    redef "IO::Seekable::seek()";
283}
284
285sub fsync {
286    redef "IO::Handle::sync()";
287}
288
289sub ferror {
290    redef "IO::Handle::error()";
291}
292
293sub fflush {
294    redef "IO::Handle::flush()";
295}
296
297sub fgetpos {
298    redef "IO::Seekable::getpos()";
299}
300
301sub fsetpos {
302    redef "IO::Seekable::setpos()";
303}
304
305sub ftell {
306    redef "IO::Seekable::tell()";
307}
308
309sub fwrite {
310    unimpl "fwrite() is C-specific--use print instead";
311}
312
313sub getc {
314    usage "getc(handle)" if @_ != 1;
315    CORE::getc($_[0]);
316}
317
318sub getchar {
319    usage "getchar()" if @_ != 0;
320    CORE::getc(STDIN);
321}
322
323sub gets {
324    usage "gets()" if @_ != 0;
325    scalar <STDIN>;
326}
327
328sub perror {
329    print STDERR "@_: " if @_;
330    print STDERR $!,"\n";
331}
332
333sub printf {
334    usage "printf(pattern, args...)" if @_ < 1;
335    CORE::printf STDOUT @_;
336}
337
338sub putc {
339    unimpl "putc() is C-specific--use print instead";
340}
341
342sub putchar {
343    unimpl "putchar() is C-specific--use print instead";
344}
345
346sub puts {
347    unimpl "puts() is C-specific--use print instead";
348}
349
350sub remove {
351    usage "remove(filename)" if @_ != 1;
352    CORE::unlink($_[0]);
353}
354
355sub rename {
356    usage "rename(oldfilename, newfilename)" if @_ != 2;
357    CORE::rename($_[0], $_[1]);
358}
359
360sub rewind {
361    usage "rewind(filehandle)" if @_ != 1;
362    CORE::seek($_[0],0,0);
363}
364
365sub scanf {
366    unimpl "scanf() is C-specific--use <> and regular expressions instead";
367}
368
369sub sprintf {
370    usage "sprintf(pattern,args)" if @_ == 0;
371    CORE::sprintf(shift,@_);
372}
373
374sub sscanf {
375    unimpl "sscanf() is C-specific--use regular expressions instead";
376}
377
378sub tmpfile {
379    redef "IO::File::new_tmpfile()";
380}
381
382sub ungetc {
383    redef "IO::Handle::ungetc()";
384}
385
386sub vfprintf {
387    unimpl "vfprintf() is C-specific";
388}
389
390sub vprintf {
391    unimpl "vprintf() is C-specific";
392}
393
394sub vsprintf {
395    unimpl "vsprintf() is C-specific";
396}
397
398sub abs {
399    usage "abs(x)" if @_ != 1;
400    CORE::abs($_[0]);
401}
402
403sub atexit {
404    unimpl "atexit() is C-specific: use END {} instead";
405}
406
407sub atof {
408    unimpl "atof() is C-specific, stopped";
409}
410
411sub atoi {
412    unimpl "atoi() is C-specific, stopped";
413}
414
415sub atol {
416    unimpl "atol() is C-specific, stopped";
417}
418
419sub bsearch {
420    unimpl "bsearch() not supplied";
421}
422
423sub calloc {
424    unimpl "calloc() is C-specific, stopped";
425}
426
427sub div {
428    unimpl "div() is C-specific, use /, % and int instead";
429}
430
431sub exit {
432    usage "exit(status)" if @_ != 1;
433    CORE::exit($_[0]);
434}
435
436sub free {
437    unimpl "free() is C-specific, stopped";
438}
439
440sub getenv {
441    usage "getenv(name)" if @_ != 1;
442    $ENV{$_[0]};
443}
444
445sub labs {
446    unimpl "labs() is C-specific, use abs instead";
447}
448
449sub ldiv {
450    unimpl "ldiv() is C-specific, use /, % and int instead";
451}
452
453sub malloc {
454    unimpl "malloc() is C-specific, stopped";
455}
456
457sub qsort {
458    unimpl "qsort() is C-specific, use sort instead";
459}
460
461sub rand {
462    unimpl "rand() is non-portable, use Perl's rand instead";
463}
464
465sub realloc {
466    unimpl "realloc() is C-specific, stopped";
467}
468
469sub srand {
470    unimpl "srand()";
471}
472
473sub system {
474    usage "system(command)" if @_ != 1;
475    CORE::system($_[0]);
476}
477
478sub memchr {
479    unimpl "memchr() is C-specific, use index() instead";
480}
481
482sub memcmp {
483    unimpl "memcmp() is C-specific, use eq instead";
484}
485
486sub memcpy {
487    unimpl "memcpy() is C-specific, use = instead";
488}
489
490sub memmove {
491    unimpl "memmove() is C-specific, use = instead";
492}
493
494sub memset {
495    unimpl "memset() is C-specific, use x instead";
496}
497
498sub strcat {
499    unimpl "strcat() is C-specific, use .= instead";
500}
501
502sub strchr {
503    unimpl "strchr() is C-specific, use index() instead";
504}
505
506sub strcmp {
507    unimpl "strcmp() is C-specific, use eq instead";
508}
509
510sub strcpy {
511    unimpl "strcpy() is C-specific, use = instead";
512}
513
514sub strcspn {
515    unimpl "strcspn() is C-specific, use regular expressions instead";
516}
517
518sub strerror {
519    usage "strerror(errno)" if @_ != 1;
520    local $! = $_[0];
521    $! . "";
522}
523
524sub strlen {
525    unimpl "strlen() is C-specific, use length instead";
526}
527
528sub strncat {
529    unimpl "strncat() is C-specific, use .= instead";
530}
531
532sub strncmp {
533    unimpl "strncmp() is C-specific, use eq instead";
534}
535
536sub strncpy {
537    unimpl "strncpy() is C-specific, use = instead";
538}
539
540sub strpbrk {
541    unimpl "strpbrk() is C-specific, stopped";
542}
543
544sub strrchr {
545    unimpl "strrchr() is C-specific, use rindex() instead";
546}
547
548sub strspn {
549    unimpl "strspn() is C-specific, stopped";
550}
551
552sub strstr {
553    usage "strstr(big, little)" if @_ != 2;
554    CORE::index($_[0], $_[1]);
555}
556
557sub strtok {
558    unimpl "strtok() is C-specific, stopped";
559}
560
561sub chmod {
562    usage "chmod(mode, filename)" if @_ != 2;
563    CORE::chmod($_[0], $_[1]);
564}
565
566sub fstat {
567    usage "fstat(fd)" if @_ != 1;
568    local *TMP;
569    CORE::open(TMP, "<&$_[0]");		# Gross.
570    my @l = CORE::stat(TMP);
571    CORE::close(TMP);
572    @l;
573}
574
575sub mkdir {
576    usage "mkdir(directoryname, mode)" if @_ != 2;
577    CORE::mkdir($_[0], $_[1]);
578}
579
580sub stat {
581    usage "stat(filename)" if @_ != 1;
582    CORE::stat($_[0]);
583}
584
585sub umask {
586    usage "umask(mask)" if @_ != 1;
587    CORE::umask($_[0]);
588}
589
590sub wait {
591    usage "wait()" if @_ != 0;
592    CORE::wait();
593}
594
595sub waitpid {
596    usage "waitpid(pid, options)" if @_ != 2;
597    CORE::waitpid($_[0], $_[1]);
598}
599
600sub gmtime {
601    usage "gmtime(time)" if @_ != 1;
602    CORE::gmtime($_[0]);
603}
604
605sub localtime {
606    usage "localtime(time)" if @_ != 1;
607    CORE::localtime($_[0]);
608}
609
610sub time {
611    usage "time()" if @_ != 0;
612    CORE::time;
613}
614
615sub alarm {
616    usage "alarm(seconds)" if @_ != 1;
617    CORE::alarm($_[0]);
618}
619
620sub chdir {
621    usage "chdir(directory)" if @_ != 1;
622    CORE::chdir($_[0]);
623}
624
625sub chown {
626    usage "chown(uid, gid, filename)" if @_ != 3;
627    CORE::chown($_[0], $_[1], $_[2]);
628}
629
630sub execl {
631    unimpl "execl() is C-specific, stopped";
632}
633
634sub execle {
635    unimpl "execle() is C-specific, stopped";
636}
637
638sub execlp {
639    unimpl "execlp() is C-specific, stopped";
640}
641
642sub execv {
643    unimpl "execv() is C-specific, stopped";
644}
645
646sub execve {
647    unimpl "execve() is C-specific, stopped";
648}
649
650sub execvp {
651    unimpl "execvp() is C-specific, stopped";
652}
653
654sub fork {
655    usage "fork()" if @_ != 0;
656    CORE::fork;
657}
658
659sub getegid {
660    usage "getegid()" if @_ != 0;
661    $) + 0;
662}
663
664sub geteuid {
665    usage "geteuid()" if @_ != 0;
666    $> + 0;
667}
668
669sub getgid {
670    usage "getgid()" if @_ != 0;
671    $( + 0;
672}
673
674sub getgroups {
675    usage "getgroups()" if @_ != 0;
676    my %seen;
677    grep(!$seen{$_}++, split(' ', $) ));
678}
679
680sub getlogin {
681    usage "getlogin()" if @_ != 0;
682    CORE::getlogin();
683}
684
685sub getpgrp {
686    usage "getpgrp()" if @_ != 0;
687    CORE::getpgrp;
688}
689
690sub getpid {
691    usage "getpid()" if @_ != 0;
692    $$;
693}
694
695sub getppid {
696    usage "getppid()" if @_ != 0;
697    CORE::getppid;
698}
699
700sub getuid {
701    usage "getuid()" if @_ != 0;
702    $<;
703}
704
705sub isatty {
706    usage "isatty(filehandle)" if @_ != 1;
707    -t $_[0];
708}
709
710sub link {
711    usage "link(oldfilename, newfilename)" if @_ != 2;
712    CORE::link($_[0], $_[1]);
713}
714
715sub rmdir {
716    usage "rmdir(directoryname)" if @_ != 1;
717    CORE::rmdir($_[0]);
718}
719
720sub setbuf {
721    redef "IO::Handle::setbuf()";
722}
723
724sub setvbuf {
725    redef "IO::Handle::setvbuf()";
726}
727
728sub sleep {
729    usage "sleep(seconds)" if @_ != 1;
730    $_[0] - CORE::sleep($_[0]);
731}
732
733sub unlink {
734    usage "unlink(filename)" if @_ != 1;
735    CORE::unlink($_[0]);
736}
737
738sub utime {
739    usage "utime(filename, atime, mtime)" if @_ != 3;
740    CORE::utime($_[1], $_[2], $_[0]);
741}
742
743sub load_imports {
744%EXPORT_TAGS = (
745
746    assert_h =>	[qw(assert NDEBUG)],
747
748    ctype_h =>	[qw(isalnum isalpha iscntrl isdigit isgraph islower
749		isprint ispunct isspace isupper isxdigit tolower toupper)],
750
751    dirent_h =>	[],
752
753    errno_h =>	[qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
754		EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
755		ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
756		EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
757		EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
758		EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
759		ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
760		ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
761		ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
762		EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
763		ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
764		ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
765		EUSERS EWOULDBLOCK EXDEV errno)],
766
767    fcntl_h =>	[qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK
768		F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK
769		O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK
770		O_RDONLY O_RDWR O_TRUNC O_WRONLY
771		creat
772		SEEK_CUR SEEK_END SEEK_SET
773		S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
774		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID
775		S_IWGRP S_IWOTH S_IWUSR)],
776
777    float_h =>	[qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG
778		DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP
779		DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP
780		FLT_DIG FLT_EPSILON FLT_MANT_DIG
781		FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP
782		FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP
783		FLT_RADIX FLT_ROUNDS
784		LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG
785		LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP
786		LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)],
787
788    grp_h =>	[],
789
790    limits_h =>	[qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX
791		INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON
792		MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX
793		PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN
794		SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX
795		ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX
796		_POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT
797		_POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX
798		_POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX
799		_POSIX_STREAM_MAX _POSIX_TZNAME_MAX)],
800
801    locale_h =>	[qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES
802		    LC_MONETARY LC_NUMERIC LC_TIME NULL
803		    localeconv setlocale)],
804
805    math_h =>	[qw(HUGE_VAL acos asin atan ceil cosh fabs floor fmod
806		frexp ldexp log10 modf pow sinh tan tanh)],
807
808    pwd_h =>	[],
809
810    setjmp_h =>	[qw(longjmp setjmp siglongjmp sigsetjmp)],
811
812    signal_h =>	[qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
813		SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
814		SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL
815		SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN
816		SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK SIG_DFL SIG_ERR
817		SIG_IGN SIG_SETMASK SIG_UNBLOCK raise sigaction signal
818		sigpending sigprocmask sigsuspend)],
819
820    stdarg_h =>	[],
821
822    stddef_h =>	[qw(NULL offsetof)],
823
824    stdio_h =>	[qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid
825		L_tmpname NULL SEEK_CUR SEEK_END SEEK_SET
826		STREAM_MAX TMP_MAX stderr stdin stdout
827		clearerr fclose fdopen feof ferror fflush fgetc fgetpos
828		fgets fopen fprintf fputc fputs fread freopen
829		fscanf fseek fsetpos ftell fwrite getchar gets
830		perror putc putchar puts remove rewind
831		scanf setbuf setvbuf sscanf tmpfile tmpnam
832		ungetc vfprintf vprintf vsprintf)],
833
834    stdlib_h =>	[qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX
835		abort atexit atof atoi atol bsearch calloc div
836		free getenv labs ldiv malloc mblen mbstowcs mbtowc
837		qsort realloc strtod strtol strtoul wcstombs wctomb)],
838
839    string_h =>	[qw(NULL memchr memcmp memcpy memmove memset strcat
840		strchr strcmp strcoll strcpy strcspn strerror strlen
841		strncat strncmp strncpy strpbrk strrchr strspn strstr
842		strtok strxfrm)],
843
844    sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU
845		S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG
846		S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR
847		fstat mkfifo)],
848
849    sys_times_h => [],
850
851    sys_types_h => [],
852
853    sys_utsname_h => [qw(uname)],
854
855    sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED
856		WNOHANG WSTOPSIG WTERMSIG WUNTRACED)],
857
858    termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400
859		B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL
860		CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK
861		ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR
862		INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST
863		PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION
864		TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW
865		TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART
866		VSTOP VSUSP VTIME
867		cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain
868		tcflow tcflush tcgetattr tcsendbreak tcsetattr )],
869
870    time_h =>	[qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime
871		difftime mktime strftime tzset tzname)],
872
873    unistd_h =>	[qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET
874		STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK
875		_PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON
876		_PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX
877		_PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED
878		_POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS
879		_POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX
880		_SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
881		_SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS
882		_SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION
883		_exit access ctermid cuserid
884		dup2 dup execl execle execlp execv execve execvp
885		fpathconf fsync getcwd getegid geteuid getgid getgroups
886		getpid getuid isatty lseek pathconf pause setgid setpgid
887		setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)],
888
889    utime_h =>	[],
890
891);
892
893# Exporter::export_tags();
894for (values %EXPORT_TAGS) {
895  push @EXPORT, @$_;
896}
897
898@EXPORT_OK = qw(
899		abs
900		alarm
901		atan2
902		chdir
903		chmod
904		chown
905		close
906		closedir
907		cos
908		exit
909		exp
910		fcntl
911		fileno
912		fork
913		getc
914		getgrgid
915		getgrnam
916		getlogin
917		getpgrp
918		getppid
919		getpwnam
920		getpwuid
921		gmtime
922		isatty
923		kill
924		lchown
925		link
926		localtime
927		log
928		mkdir
929		nice
930		open
931		opendir
932		pipe
933		printf
934		rand
935		read
936		readdir
937		rename
938		rewinddir
939		rmdir
940		sin
941		sleep
942		sprintf
943		sqrt
944		srand
945		stat
946		system
947		time
948		times
949		umask
950		unlink
951		utime
952		wait
953		waitpid
954		write
955);
956
957require Exporter;
958}
959
960package POSIX::SigAction;
961
962sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} };
963sub mask    { $_[0]->{MASK}    = $_[1] if @_ > 1; $_[0]->{MASK} };
964sub flags   { $_[0]->{FLAGS}   = $_[1] if @_ > 1; $_[0]->{FLAGS} };
965sub safe    { $_[0]->{SAFE}    = $_[1] if @_ > 1; $_[0]->{SAFE} };
966