summaryrefslogtreecommitdiff
path: root/ext/POSIX/mkposixman.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ext/POSIX/mkposixman.pl')
-rw-r--r--ext/POSIX/mkposixman.pl1134
1 files changed, 1134 insertions, 0 deletions
diff --git a/ext/POSIX/mkposixman.pl b/ext/POSIX/mkposixman.pl
new file mode 100644
index 0000000000..3daa1bff7b
--- /dev/null
+++ b/ext/POSIX/mkposixman.pl
@@ -0,0 +1,1134 @@
+#!/tmp/perl5 -w
+#!/tmp/perl5
+
+# Ramrodded by Dean Roehrich.
+#
+# Submissions for function descriptions are needed. Don't write a tutorial,
+# and don't repeat things that can be found in the system's manpages,
+# just give a quick 2-3 line note and a one-line example.
+#
+# Check the latest version of the Perl5 Module List for Dean's current
+# email address (listed as DMR).
+#
+my $VERS = 951129; # yymmdd
+
+local *main::XS;
+local *main::PM;
+
+open( XS, "<POSIX.xs" ) || die "Unable to open POSIX.xs";
+open( PM, "<POSIX.pm" ) || die "Unable to open POSIX.pm";
+close STDOUT;
+open( STDOUT, ">POSIX.pod" ) || die "Unable to open POSIX.pod";
+
+print <<'EOQ';
+=head1 NAME
+
+POSIX - Perl interface to IEEE Std 1003.1
+
+=head1 SYNOPSIS
+
+ use POSIX;
+ use POSIX qw(setsid);
+ use POSIX qw(:errno_h :fcntl_h);
+
+ printf "EINTR is %d\n", EINTR;
+
+ $sess_id = POSIX::setsid();
+
+ $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644);
+ # note: that's a filedescriptor, *NOT* a filehandle
+
+=head1 DESCRIPTION
+
+The POSIX module permits you to access all (or nearly all) the standard
+POSIX 1003.1 identifiers. Many of these identifiers have been given Perl-ish
+interfaces. Things which are C<#defines> in C, like EINTR or O_NDELAY, are
+automatically exported into your namespace. All functions are only exported
+if you ask for them explicitly. Most likely people will prefer to use the
+fully-qualified function names.
+
+This document gives a condensed list of the features available in the POSIX
+module. Consult your operating system's manpages for general information on
+most features. Consult L<perlfunc> for functions which are noted as being
+identical to Perl's builtin functions.
+
+The first section describes POSIX functions from the 1003.1 specification.
+The second section describes some classes for signal objects, TTY objects,
+and other miscellaneous objects. The remaining sections list various
+constants and macros in an organization which roughly follows IEEE Std
+1003.1b-1993.
+
+=head1 NOTE
+
+The POSIX module is probably the most complex Perl module supplied with
+the standard distribution. It incorporates autoloading, namespace games,
+and dynamic loading of code that's in Perl, C, or both. It's a great
+source of wisdom.
+
+=head1 CAVEATS
+
+A few functions are not implemented because they are C specific. If you
+attempt to call these, they will print a message telling you that they
+aren't implemented, and suggest using the Perl equivalent should one
+exist. For example, trying to access the setjmp() call will elicit the
+message "setjmp() is C-specific: use eval {} instead".
+
+Furthermore, some evil vendors will claim 1003.1 compliance, but in fact
+are not so: they will not pass the PCTS (POSIX Compliance Test Suites).
+For example, one vendor may not define EDEADLK, or the semantics of the
+errno values set by open(2) might not be quite right. Perl does not
+attempt to verify POSIX compliance. That means you can currently
+successfully say "use POSIX", and then later in your program you find
+that your vendor has been lax and there's no usable ICANON macro after
+all. This could be construed to be a bug.
+
+EOQ
+
+use strict;
+
+
+my $constants = {};
+my $macros = {};
+my $packages = [];
+my $posixpack = Package->new( 'POSIX' );
+my $descriptions = Description->new;
+
+get_constants( 'XS', $constants, $macros );
+get_functions( 'XS', $packages, $posixpack );
+get_PMfunctions( 'PM', $packages, $posixpack, $descriptions );
+
+
+# It is possible that the matches of setup_*() may depend on
+# the matches of an earlier setup_*(). If you change the order,
+# be careful that you're getting only what you want, and no more.
+#
+my $termios_flags = setup_termios( $constants );
+my $wait_stuff = setup_wait( $constants, $macros );
+my $stat = setup_file_char( $constants, $macros );
+my $port = setup_pat( $constants, '^_POSIX' );
+my $sc = setup_pat( $constants, '^_SC_' );
+my $pc = setup_pat( $constants, '^_PC_' );
+my $fcntl = setup_pat( $constants, '^([FO]_|FD_)' );
+my $sigs = setup_pat( $constants, '^(SIG|SA_)' );
+my $float = setup_pat( $constants, '^(L?DBL_|FLT_)' );
+my $locale = setup_pat( $constants, '^LC_' );
+my $stdio = setup_pat( $constants, '(^BUFSIZ$)|(^L_)|(^_IO...$)|(^EOF$)|(^FILENAME_MAX$)|(^TMP_MAX$)' );
+my $stdlib = setup_pat( $constants, '(^EXIT_)|(^MB_CUR_MAX$)|(^RAND_MAX$)' );
+my $limits = setup_pat( $constants, '(_MAX$)|(_MIN$)|(_BIT$)|(^MAX_)|(_BUF$)' );
+my $math = setup_pat( $constants, '^HUGE_VAL$' );
+my $time = setup_pat( $constants, '^CL' );
+my $unistd = setup_pat( $constants, '(_FILENO$)|(^SEEK_...$)|(^._OK$)' );
+my $errno = setup_pat( $constants, '^E' );
+
+print_posix( $posixpack, $descriptions );
+print_classes( $packages, $constants, $termios_flags, $descriptions );
+print_misc( 'Pathname Constants', $pc );
+print_misc( 'POSIX Constants', $port );
+print_misc( 'System Configuration', $sc );
+print_misc( 'Errno', $errno );
+print_misc( 'Fcntl', $fcntl );
+print_misc( 'Float', $float );
+print_misc( 'Limits', $limits );
+print_misc( 'Locale', $locale );
+print_misc( 'Math', $math );
+print_misc( 'Signal', $sigs );
+print_misc( 'Stat', $stat );
+print_misc( 'Stdlib', $stdlib );
+print_misc( 'Stdio', $stdio );
+print_misc( 'Time', $time );
+print_misc( 'Unistd', $unistd );
+print_misc( 'Wait', $wait_stuff );
+
+print_vers( $VERS );
+
+dregs( $macros, $constants );
+
+exit(0);
+
+Unimplemented.
+
+sub dregs {
+ my $macros = shift;
+ my $constants = shift;
+
+ foreach (keys %$macros){
+ warn "Unknown macro $_ in the POSIX.xs module.\n";
+ }
+ foreach (keys %$constants){
+ warn "Unknown constant $_ in the POSIX.xs module.\n";
+ }
+}
+
+sub get_constants {
+ no strict 'refs';
+ my $fh = shift;
+ my $constants = shift;
+ my $macros = shift;
+ my $v;
+
+ while(<$fh>){
+ last if /^constant/;
+ }
+ while(<$fh>){ # }{{
+ last if /^}/;
+ if( /return\s+([^;]+)/ ){
+ $v = $1;
+ # skip non-symbols
+ if( $v !~ /^\d+$/ ){
+ # remove any C casts
+ $v =~ s,\(.*?\)\s*(\w),$1,;
+ # is it a macro?
+ if( $v =~ s/(\(.*?\))// ){
+ $macros->{$v} = $1;
+ }
+ else{
+ $constants->{$v} = 1;
+ }
+ }
+ }
+ }
+}
+
+Close the file. This uses file descriptors such as those obtained by calling
+C<POSIX::open>.
+
+ $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+ POSIX::close( $fd );
+
+sub get_functions {
+ no strict 'refs';
+ my $fh = shift;
+ my $packages = shift;
+ my $posixpack = shift;
+ my $header = 0;
+ my $pack = '';
+ my $prefix = '';
+ my( $x, $y );
+ my( $curfuncs, $curpack );
+ my $ret;
+
+ while(<$fh>){
+ if( /^MODULE.*?PACKAGE\s*=\s*([^\s]+)/ ){
+ $pack = $1;
+ $prefix = '';
+ if( /PREFIX\s*=\s*([^\n]+)/ ){
+ $prefix = $1;
+ }
+ #print "package($pack) prefix($prefix)\n";
+ if( $pack eq 'POSIX' ){
+ $curpack = $posixpack;
+ }
+ else{
+ $curpack = Package->new( $pack );
+ push @$packages, $curpack;
+ }
+ $curfuncs = $curpack->curfuncs;
+ next;
+ }
+
+ chop;
+ # find function header
+ if( /^[^\s]/ && ! /^#/ ){
+ $ret = /^SysRet/ ? 2 : 1;
+ chop($x = <$fh>);
+ next if( $pack eq 'POSIX' and $x =~ /^constant/ );
+ $x =~ /^(.*?)\s*\((.*?)\)/;
+ ($x,$y) = ($1, $2); # func,sig
+ $x =~ s/^$prefix//;
+ $curfuncs->{$x} = $ret;
+ ++$header
+ }
+ # leave function header
+ else{
+ $header = 0;
+ }
+ }
+}
+
+
+sub get_PMfunctions {
+ no strict 'refs';
+ my $fh = shift;
+ my $packages = shift;
+ my $posixpack = shift;
+ my $desc = shift;
+ my $pack = '';
+ my( $curfuncs, $curpack );
+ my $y;
+ my $x;
+ my $sub = '';
+
+ # find the second package statement.
+ while(<$fh>){
+ if( /^package\s+(.*?);/ ){
+ $pack = $1;
+ last if $pack ne 'POSIX';
+ }
+ }
+
+ # Check if this package is already
+ # being used.
+ $curpack = '';
+ foreach (@$packages){
+ if( $_->name eq $pack ){
+ $curpack = $_;
+ last;
+ }
+ }
+ # maybe start a new package.
+ if( $curpack eq '' ){
+ $curpack = Package->new( $pack );
+ push @$packages, $curpack;
+ }
+ $curfuncs = $curpack->curfuncs;
+
+ # now fetch functions
+ while(<$fh>){
+ if( /^package\s+(.*?);/ ){
+ $pack = $1;
+ if( $pack eq 'POSIX' ){
+ $curpack = $posixpack;
+ }
+ else{
+ # Check if this package is already
+ # being used.
+ $curpack = '';
+ foreach (@$packages){
+ if( $_->name() eq $pack ){
+ $curpack = $_;
+ last;
+ }
+ }
+ # maybe start a new package.
+ if( $curpack eq '' ){
+ $curpack = Package->new( $pack );
+ push @$packages, $curpack;
+ }
+ }
+ $curfuncs = $curpack->curfuncs;
+ next;
+ }
+ if( /^sub\s+(.*?)\s/ ){
+ $sub = $1;
+
+ # special cases
+ if( $pack eq 'POSIX::SigAction' and
+ $sub eq 'new' ){
+ $curfuncs->{$sub} = 1;
+ }
+ elsif( $pack eq 'POSIX' and $sub eq 'perror' ){
+ $curfuncs->{$sub} = 1;
+ }
+
+ next;
+ }
+ if( /usage.*?\((.*?)\)/ ){
+ $y = $1;
+ $curfuncs->{$sub} = 1;
+ next;
+ }
+ if( /^\s+unimpl\s+"(.*?)"/ ){
+ $y = $1;
+ $y =~ s/, stopped//;
+ $desc->append( $pack, $sub, $y );
+ $curfuncs->{$sub} = 1;
+ next;
+ }
+ if( /^\s+redef\s+"(.*?)"/ ){
+ $x = $1;
+ $y = "Use method C<$x> instead";
+ $desc->append( $pack, $sub, $y );
+ $curfuncs->{$sub} = 1;
+ next;
+ }
+ }
+}
+
+Retrieves the value of a configurable limit on a file or directory. This
+uses file descriptors such as those obtained by calling C<POSIX::open>.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</tmp/foo>.
+
+ $fd = POSIX::open( "/tmp/foo", &POSIX::O_RDONLY );
+ $path_max = POSIX::fpathconf( $fd, &POSIX::_PC_PATH_MAX );
+Return the mantissa and exponent of a floating-point number.
+
+ ($mantissa, $exponent) = POSIX::frexp( 3.14 );
+Get file status. This uses file descriptors such as those obtained by
+calling C<POSIX::open>. The data returned is identical to the data from
+Perl's builtin C<stat> function.
+
+ $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+ @stats = POSIX::fstat( $fd );
+
+sub print_posix {
+ my $pack = shift;
+ my $desc = shift;
+
+ print "=head1 FUNCTIONS\n\n";
+ print "=over 8\n\n";
+ dumpfuncs( $pack, $desc );
+ print "=back\n\n";
+}
+
+sub print_classes {
+ my $packages = shift;
+ my $constants = shift;
+ my $termios = shift;
+ my $desc = shift;
+ my $pack;
+ my @pkgs;
+
+ print "=head1 CLASSES\n\n";
+ @pkgs = sort { $main::a->name() cmp $main::b->name() } @$packages;
+ while( @pkgs ){
+ $pack = shift @pkgs;
+ print "=head2 ", $pack->name(), "\n\n";
+ print "=over 8\n\n";
+
+ dumpfuncs( $pack, $desc );
+
+ if( $pack->name() =~ /termios/i ){
+ dumpflags( $termios );
+ }
+ print "=back\n\n";
+ }
+}
+
+sub setup_termios {
+ my $constants = shift;
+ my $obj;
+
+ $obj = {
+ 'c_iflag field' => [qw( BRKINT ICRNL IGNBRK IGNCR IGNPAR
+ INLCR INPCK ISTRIP IXOFF IXON
+ PARMRK )],
+ 'c_oflag field' => [qw( OPOST )],
+ 'c_cflag field' => [qw( CLOCAL CREAD CSIZE CS5 CS6 CS7 CS8
+ CSTOPB HUPCL PARENB PARODD )],
+ 'c_lflag field' => [qw( ECHO ECHOE ECHOK ECHONL ICANON
+ IEXTEN ISIG NOFLSH TOSTOP )],
+ 'c_cc field' => [qw( VEOF VEOL VERASE VINTR VKILL VQUIT
+ VSUSP VSTART VSTOP VMIN VTIME NCCS )],
+ 'Baud rate' => [],
+ 'Terminal interface' => [],
+ };
+ # look for baud rates in constants, add to termios
+ foreach (keys %$constants){
+ if( /^B\d+$/ ){
+ push @{$obj->{'Baud rate'}}, $_;
+ }
+ }
+ # look for TC* in constants, add to termios
+ foreach (keys %$constants){
+ if( /^TC/ ){
+ push @{$obj->{'Terminal interface'}}, $_;
+ }
+ }
+ # trim the constants
+ foreach (keys %$obj){
+ trim_hash( 'Constant', $obj->{$_}, $constants );
+ }
+ return $obj;
+}
+
+
+sub dumpfuncs {
+ my $pack = shift;
+ my $desc = shift;
+ my $curfuncs = $pack->curfuncs;
+ my $pname = $pack->name;
+ my $func;
+ my @funcs = sort keys %$curfuncs;
+
+ if( exists $curfuncs->{'new'} ){ # do new first
+ @funcs = grep( $_ ne 'new', @funcs );
+ unshift @funcs, 'new';
+ }
+ while( @funcs ){
+ $func = shift @funcs;
+ if( $func eq 'DESTROY' ){
+ next; # don't do DESTROY
+ }
+ print "=item $func\n\n";
+ if( $desc->print( $pname, $func, $curfuncs->{$func} ) ){
+ # if it was printed, note that
+ delete $curfuncs->{$func};
+ }
+ }
+}
+
+sub dumpflags {
+ my $flags = shift;
+ my $field;
+
+ foreach $field (sort keys %$flags){
+ print "=item $field values\n\n";
+ print join( ' ', @{$flags->{$field}} ), "\n\n";
+ }
+}
+
+sub setup_wait {
+ my $constants = shift;
+ my $macros = shift;
+ my $obj;
+
+ $obj = {
+ 'Macros' => [qw( WIFEXITED WEXITSTATUS WIFSIGNALED
+ WTERMSIG WIFSTOPPED WSTOPSIG )],
+ 'Constants' => [qw( WNOHANG WUNTRACED )],
+ };
+ trim_hash( 'Constant', $obj->{Constants}, $constants );
+ trim_hash( 'Macro', $obj->{Macros}, $macros );
+ return $obj;
+}
+
+sub setup_file_char {
+ my $constants = shift;
+ my $macros = shift;
+ my $obj;
+
+ $obj = {
+ 'Macros' => [],
+ 'Constants' => [],
+ };
+ # find S_* constants and add to object.
+ foreach (sort keys %$constants){
+ if( /^S_/ ){
+ push @{$obj->{'Constants'}}, $_;
+ }
+ }
+ # find S_* macros and add to object.
+ foreach (sort keys %$macros){
+ if( /^S_/ ){
+ push @{$obj->{'Macros'}}, $_;
+ }
+ }
+ # trim the hashes
+ trim_hash( 'Constant', $obj->{Constants}, $constants );
+ trim_hash( 'Macro', $obj->{Macros}, $macros );
+ return $obj;
+}
+
+
+sub setup_pat {
+ my $constants = shift;
+ my $pat = shift;
+ my $obj;
+
+ $obj = { 'Constants' => [] };
+ foreach (sort keys %$constants){
+ if( /$pat/ ){
+ push @{$obj->{'Constants'}}, $_;
+ }
+ }
+ trim_hash( 'Constant', $obj->{Constants}, $constants );
+ return $obj;
+}
+
+Get numeric formatting information. Returns a reference to a hash
+containing the current locale formatting values.
+
+The database for the B<de> (Deutsch or German) locale.
+
+ $loc = POSIX::setlocale( &POSIX::LC_ALL, "de" );
+ print "Locale = $loc\n";
+ $lconv = POSIX::localeconv();
+ print "decimal_point = ", $lconv->{decimal_point}, "\n";
+ print "thousands_sep = ", $lconv->{thousands_sep}, "\n";
+ print "grouping = ", $lconv->{grouping}, "\n";
+ print "int_curr_symbol = ", $lconv->{int_curr_symbol}, "\n";
+ print "currency_symbol = ", $lconv->{currency_symbol}, "\n";
+ print "mon_decimal_point = ", $lconv->{mon_decimal_point}, "\n";
+ print "mon_thousands_sep = ", $lconv->{mon_thousands_sep}, "\n";
+ print "mon_grouping = ", $lconv->{mon_grouping}, "\n";
+ print "positive_sign = ", $lconv->{positive_sign}, "\n";
+ print "negative_sign = ", $lconv->{negative_sign}, "\n";
+ print "int_frac_digits = ", $lconv->{int_frac_digits}, "\n";
+ print "frac_digits = ", $lconv->{frac_digits}, "\n";
+ print "p_cs_precedes = ", $lconv->{p_cs_precedes}, "\n";
+ print "p_sep_by_space = ", $lconv->{p_sep_by_space}, "\n";
+ print "n_cs_precedes = ", $lconv->{n_cs_precedes}, "\n";
+ print "n_sep_by_space = ", $lconv->{n_sep_by_space}, "\n";
+ print "p_sign_posn = ", $lconv->{p_sign_posn}, "\n";
+ print "n_sign_posn = ", $lconv->{n_sign_posn}, "\n";
+Move the read/write file pointer. This uses file descriptors such as
+those obtained by calling C<POSIX::open>.
+
+ $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+ $off_t = POSIX::lseek( $fd, 0, &POSIX::SEEK_SET );
+
+sub print_vers {
+ my $vers = shift;
+
+ print "=head1 CREATION\n\n";
+ print "This document generated by $0 version $vers.\n\n";
+}
+
+sub print_misc {
+ my $hdr = shift;
+ my $obj = shift;
+ my $item;
+
+ print "=head1 ", uc($hdr), "\n\n";
+ print "=over 8\n\n";
+ foreach $item (sort keys %$obj){
+ print "=item $item\n\n";
+ print join( ' ', @{$obj->{$item}}), "\n\n";
+ }
+ print "=back\n\n";
+}
+
+sub trim_hash {
+ my $name = shift;
+ my $av = shift;
+ my $hv = shift;
+
+ foreach (@$av){
+ if( exists $hv->{$_} ){
+ delete $hv->{$_};
+ }
+ else{
+ warn "$name $_ is not in the POSIX.xs module";
+ }
+ }
+}
+
+{ package Package; ## Package package
+
+ sub new {
+ my $type = shift;
+ my $pack = shift || die;
+ my $self = [ $pack, {} ];
+ bless $self, $type;
+ }
+ sub name {
+ my $self = shift;
+ $self->[0];
+ }
+ sub curfuncs {
+ my $self = shift;
+ $self->[1];
+ }
+ sub DESTROY {
+ my $self = shift;
+ my $pack = $self->name;
+ foreach (keys %{$self->curfuncs}){
+ if( $_ eq 'DESTROY' ){
+ next; # don't expect much on DESTROY
+ }
+ warn "Function ". $pack . "::$_ did not have a description.\n";
+ }
+ }
+}
+{ package Description; ## Function description
+
+ sub new {
+ my $type = shift;
+ my $self = {};
+ bless $self, $type;
+ $self->fetch;
+ return $self;
+ }
+ sub fetch {
+ my $self = shift;
+ my $pack = '';
+ my $c;
+ my( $sub, $as );
+
+ while(<main::DATA>){
+ next if /^#/;
+ $sub = $as = '';
+ if( /^==(.*)/ ){
+ $pack = $1;
+ next;
+ }
+ if( /^=([^\+]+)\+\+/ ){
+ $sub = $1;
+ $as = $sub;
+ }
+ elsif( /^=([^\+]+)\+C/ ){
+ $sub = $1;
+ $as = 'C';
+ }
+ elsif( /^=([^\+]+)\+(\w+)/ ){
+ $sub = $1;
+ $as = $2;
+ }
+ elsif( /^=(.*)/ ){
+ $sub = $1;
+ }
+
+ if( $sub ne '' ){
+ $sub = $1;
+ $self->{$pack."::$sub"} = '';
+ $c = \($self->{$pack."::$sub"});
+ if( $as eq 'C' ){
+ $$c .= "This is identical to the C function C<$sub()>.\n";
+ }
+ elsif( $as ne '' ){
+ $$c .= "This is identical to Perl's builtin C<$as()> function.\n";
+ }
+ next;
+ }
+ $$c .= $_;
+ }
+ }
+ sub DESTROY {
+ my $self = shift;
+ foreach (keys %$self){
+ warn "Function $_ is not in the POSIX.xs module.\n";
+ }
+ }
+ sub append {
+ my $self = shift;
+ my $pack = shift;
+ my $sub = shift;
+ my $str = shift || die;
+
+ if( exists $self->{$pack."::$sub"} ){
+ $self->{$pack."::$sub"} .= "\n$str.\n";
+ }
+ else{
+ $self->{$pack."::$sub"} = "$str.\n";
+ }
+ }
+ sub print {
+ my $self = shift;
+ my $pack = shift;
+ my $sub = shift;
+ my $rtype = shift || die;
+ my $ret = 0;
+
+ if( exists $self->{$pack."::$sub"} ){
+ if( $rtype > 1 ){
+ $self->{$pack."::$sub"} =~ s/identical/similar/;
+ }
+ print $self->{$pack."::$sub"}, "\n";
+ delete $self->{$pack."::$sub"};
+ if( $rtype > 1 ){
+ print "Returns C<undef> on failure.\n\n";
+ }
+ $ret = 1;
+ }
+ $ret;
+ }
+}
+
+Create an interprocess channel. This returns file descriptors like those
+returned by C<POSIX::open>.
+
+ ($fd0, $fd1) = POSIX::pipe();
+ POSIX::write( $fd0, "hello", 5 );
+ POSIX::read( $fd1, $buf, 5 );
+Read from a file. This uses file descriptors such as those obtained by
+calling C<POSIX::open>. If the buffer C<$buf> is not large enough for the
+read then Perl will extend it to make room for the request.
+
+ $fd = POSIX::open( "foo", &POSIX::O_RDONLY );
+ $bytes = POSIX::read( $fd, $buf, 3 );
+This is similar to the C function C<setpgid()>.
+Detailed signal management. This uses C<POSIX::SigAction> objects for the
+C<action> and C<oldaction> arguments. Consult your system's C<sigaction>
+manpage for details.
+
+Synopsis:
+
+ sigaction(sig, action, oldaction = 0)
+Install a signal mask and suspend process until signal arrives. This uses
+C<POSIX::SigSet> objects for the C<signal_mask> argument. Consult your
+system's C<sigsuspend> manpage for details.
+
+Synopsis:
+
+ sigsuspend(signal_mask)
+This is identical to Perl's builtin C<sprintf()> function.
+Convert date and time information to string. Returns the string.
+
+Synopsis:
+
+ strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)
+
+The month (C<mon>), weekday (C<wday>), and yearday (C<yday>) begin at zero.
+I.e. January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The
+year (C<year>) is given in years since 1900. I.e. The year 1995 is 95; the
+year 2001 is 101. Consult your system's C<strftime()> manpage for details
+about these and the other arguments.
+
+The string for Tuesday, December 12, 1995.
+
+ $str = POSIX::strftime( "%A, %B %d, %Y", 0, 0, 0, 12, 11, 95, 2 );
+ print "$str\n";
+String transformation. Returns the transformed string.
+
+ $dst = POSIX::strxfrm( $src );
+Get name of current operating system.
+
+ ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname();
+Returns the current file position, in bytes.
+
+ $pos = $fh->tell;
+Get terminal control attributes.
+
+Obtain the attributes for stdin.
+
+ $termios->getattr()
+
+Obtain the attributes for stdout.
+
+ $termios->getattr( 1 )
+Set terminal control attributes.
+
+Set attributes immediately for stdout.
+
+ $termios->setattr( 1, &POSIX::TCSANOW );
+
+__END__
+##########
+==POSIX::SigSet
+=new
+Create a new SigSet object. This object will be destroyed automatically
+when it is no longer needed. Arguments may be supplied to initialize the
+set.
+
+Create an empty set.
+
+ $sigset = POSIX::SigSet->new;
+
+Create a set with SIGUSR1.
+
+ $sigset = POSIX::SigSet->new( &POSIX::SIGUSR1 );
+=addset
+Add a signal to a SigSet object.
+
+ $sigset->addset( &POSIX::SIGUSR2 );
+=delset
+Remove a signal from the SigSet object.
+
+ $sigset->delset( &POSIX::SIGUSR2 );
+=emptyset
+Initialize the SigSet object to be empty.
+
+ $sigset->emptyset();
+=fillset
+Initialize the SigSet object to include all signals.
+
+ $sigset->fillset();
+=ismember
+Tests the SigSet object to see if it contains a specific signal.
+
+ if( $sigset->ismember( &POSIX::SIGUSR1 ) ){
+ print "contains SIGUSR1\n";
+ }
+##########
+==POSIX::Termios
+=new
+Create a new Termios object. This object will be destroyed automatically
+when it is no longer needed.
+
+ $termios = POSIX::Termios->new;
+=getiflag
+Retrieve the c_iflag field of a termios object.
+
+ $c_iflag = $termios->getiflag;
+=getoflag
+Retrieve the c_oflag field of a termios object.
+
+ $c_oflag = $termios->getoflag;
+=getcflag
+Retrieve the c_cflag field of a termios object.
+
+ $c_cflag = $termios->getcflag;
+=getlflag
+Retrieve the c_lflag field of a termios object.
+
+ $c_lflag = $termios->getlflag;
+=getcc
+Retrieve a value from the c_cc field of a termios object. The c_cc field is
+an array so an index must be specified.
+
+ $c_cc[1] = $termios->getcc(1);
+=getospeed
+Retrieve the output baud rate.
+
+ $ospeed = $termios->getospeed;
+=getispeed
+Retrieve the input baud rate.
+
+ $ispeed = $termios->getispeed;
+=setiflag
+Set the c_iflag field of a termios object.
+
+ $termios->setiflag( &POSIX::BRKINT );
+=setoflag
+Set the c_oflag field of a termios object.
+
+ $termios->setoflag( &POSIX::OPOST );
+=setcflag
+Set the c_cflag field of a termios object.
+
+ $termios->setcflag( &POSIX::CLOCAL );
+=setlflag
+Set the c_lflag field of a termios object.
+
+ $termios->setlflag( &POSIX::ECHO );
+=setcc
+Set a value in the c_cc field of a termios object. The c_cc field is an
+array so an index must be specified.
+
+ $termios->setcc( 1, &POSIX::VEOF );
+=setospeed
+Set the output baud rate.
+
+ $termios->setospeed( &POSIX::B9600 );
+=setispeed
+Set the input baud rate.
+
+ $termios->setispeed( &POSIX::B9600 );
+##
+=setattr
+=getattr
+##########
+==FileHandle
+=new
+=new_from_fd
+=flush
+=getc
+=ungetc
+=seek
+=setbuf
+=error
+=clearerr
+=tell
+=getpos
+=gets
+=close
+=new_tmpfile
+=eof
+=fileno
+=setpos
+=setvbuf
+##########
+==POSIX
+=tolower+lc
+=toupper+uc
+=remove+unlink
+=fabs+abs
+=strstr+index
+##
+=closedir++
+=readdir++
+=rewinddir++
+=fcntl++
+=getgrgid++
+=getgrnam++
+=atan2++
+=cos++
+=exp++
+=abs++
+=log++
+=sin++
+=sqrt++
+=getpwnam++
+=getpwuid++
+=kill++
+=getc++
+=rename++
+=exit++
+=system++
+=chmod++
+=mkdir++
+=stat++
+=umask++
+=gmtime++
+=localtime++
+=time++
+=alarm++
+=chdir++
+=chown++
+=fork++
+=getlogin++
+=getpgrp++
+=getppid++
+=link++
+=rmdir++
+=sleep++
+=unlink++
+=utime++
+##
+=perror+C
+=pause+C
+=tzset+C
+=difftime+C
+=ctime+C
+=clock+C
+=asctime+C
+=strcoll+C
+=abort+C
+=tcgetpgrp+C
+=setsid+C
+=_exit+C
+=tanh+C
+=tan+C
+=sinh+C
+=log10+C
+=ldexp+C
+=fmod+C
+=floor+C
+=cosh+C
+=ceil+C
+=atan+C
+=asin+C
+=acos+C
+##
+=isatty
+Returns a boolean indicating whether the specified filehandle is connected
+to a tty.
+=setuid
+Sets the real user id for this process.
+=setgid
+Sets the real group id for this process.
+=getpid
+Returns the process's id.
+=getuid
+Returns the user's id.
+=getegid
+Returns the effective group id.
+=geteuid
+Returns the effective user id.
+=getgid
+Returns the user's real group id.
+=getgroups
+Returns the ids of the user's supplementary groups.
+=getcwd
+Returns the name of the current working directory.
+=strerror
+Returns the error string for the specified errno.
+=getenv
+Returns the value of the specified enironment variable.
+=getchar
+Returns one character from STDIN.
+=raise
+Sends the specified signal to the current process.
+=gets
+Returns one line from STDIN.
+=printf
+Prints the specified arguments to STDOUT.
+=rewind
+Seeks to the beginning of the file.
+##
+=tmpnam
+Returns a name for a temporary file.
+
+ $tmpfile = POSIX::tmpnam();
+=cuserid
+Get the character login name of the user.
+
+ $name = POSIX::cuserid();
+=ctermid
+Generates the path name for controlling terminal.
+
+ $path = POSIX::ctermid();
+=times
+The times() function returns elapsed realtime since some point in the past
+(such as system startup), user and system times for this process, and user
+and system times used by child processes. All times are returned in clock
+ticks.
+
+ ($realtime, $user, $system, $cuser, $csystem) = POSIX::times();
+
+Note: Perl's builtin C<times()> function returns four values, measured in
+seconds.
+=pow
+Computes $x raised to the power $exponent.
+
+ $ret = POSIX::pow( $x, $exponent );
+=errno
+Returns the value of errno.
+
+ $errno = POSIX::errno();
+=sysconf
+Retrieves values of system configurable variables.
+
+The following will get the machine's clock speed.
+
+ $clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK );
+=pathconf
+Retrieves the value of a configurable limit on a file or directory.
+
+The following will determine the maximum length of the longest allowable
+pathname on the filesystem which holds C</tmp>.
+
+ $path_max = POSIX::pathconf( "/tmp", &POSIX::_PC_PATH_MAX );
+=access
+Determines the accessibility of a file.
+
+ if( POSIX::access( "/", &POSIX::R_OK ) ){
+ print "have read permission\n";
+ }
+=setlocale
+Modifies and queries program's locale.
+
+The following will set the traditional UNIX system locale behavior.
+
+This document generated by ./mkposixman.PL version 19951212.
+##
+=waitpid
+=wait
+=fstat
+=sprintf
+=opendir
+=creat
+=ttyname
+=tzname
+=fpathconf
+=mktime
+=tcsendbreak
+=tcflush
+=tcflow
+=tcdrain
+=tcsetpgrp
+=mkfifo
+=strxfrm
+=wctomb
+=wcstombs
+=mbtowc
+=mbstowcs
+=mblen
+=write
+=uname
+=setpgid
+=read
+=pipe
+=nice
+=lseek
+=dup2
+=dup
+=close
+=sigsuspend
+=sigprocmask
+=sigpending
+=sigaction
+=modf
+=frexp
+=localeconv
+=open
+=isxdigit
+=isupper
+=isspace
+=ispunct
+=isprint
+=isgraph
+=isdigit
+=iscntrl
+=isalpha
+=isalnum
+=islower
+=assert
+=strftime
+##########
+==POSIX::SigAction
+=new
+Creates a new SigAction object. This object will be destroyed automatically
+when it is no longer needed.