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