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