138 lines
2.8 KiB
Perl
138 lines
2.8 KiB
Perl
|
package Fcntl;
|
||
|
|
||
|
=head1 NAME
|
||
|
|
||
|
Fcntl - load the C Fcntl.h defines
|
||
|
|
||
|
=head1 SYNOPSIS
|
||
|
|
||
|
use Fcntl;
|
||
|
use Fcntl qw(:DEFAULT :flock);
|
||
|
|
||
|
=head1 DESCRIPTION
|
||
|
|
||
|
This module is just a translation of the C F<fnctl.h> file.
|
||
|
Unlike the old mechanism of requiring a translated F<fnctl.ph>
|
||
|
file, this uses the B<h2xs> program (see the Perl source distribution)
|
||
|
and your native C compiler. This means that it has a
|
||
|
far more likely chance of getting the numbers right.
|
||
|
|
||
|
=head1 NOTE
|
||
|
|
||
|
Only C<#define> symbols get translated; you must still correctly
|
||
|
pack up your own arguments to pass as args for locking functions, etc.
|
||
|
|
||
|
=head1 EXPORTED SYMBOLS
|
||
|
|
||
|
By default your system's F_* and O_* constants (eg, F_DUPFD and
|
||
|
O_CREAT) and the FD_CLOEXEC constant are exported into your namespace.
|
||
|
|
||
|
You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB
|
||
|
and LOCK_UN) be provided by using the tag C<:flock>. See L<Exporter>.
|
||
|
|
||
|
You can request that the old constants (FAPPEND, FASYNC, FCREAT,
|
||
|
FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for
|
||
|
compatibility reasons by using the tag C<:Fcompat>. For new
|
||
|
applications the newer versions of these constants are suggested
|
||
|
(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
|
||
|
O_SYNC, O_TRUNC).
|
||
|
|
||
|
Please refer to your native fcntl() and open() documentation to see
|
||
|
what constants are implemented in your system.
|
||
|
|
||
|
=cut
|
||
|
|
||
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
|
||
|
|
||
|
require Exporter;
|
||
|
require DynaLoader;
|
||
|
@ISA = qw(Exporter DynaLoader);
|
||
|
$VERSION = "1.03";
|
||
|
# Items to export into callers namespace by default
|
||
|
# (move infrequently used names to @EXPORT_OK below)
|
||
|
@EXPORT =
|
||
|
qw(
|
||
|
FD_CLOEXEC
|
||
|
F_DUPFD
|
||
|
F_EXLCK
|
||
|
F_GETFD
|
||
|
F_GETFL
|
||
|
F_GETLK
|
||
|
F_GETOWN
|
||
|
F_POSIX
|
||
|
F_RDLCK
|
||
|
F_SETFD
|
||
|
F_SETFL
|
||
|
F_SETLK
|
||
|
F_SETLKW
|
||
|
F_SETOWN
|
||
|
F_SHLCK
|
||
|
F_UNLCK
|
||
|
F_WRLCK
|
||
|
O_ACCMODE
|
||
|
O_APPEND
|
||
|
O_ASYNC
|
||
|
O_BINARY
|
||
|
O_CREAT
|
||
|
O_DEFER
|
||
|
O_DSYNC
|
||
|
O_EXCL
|
||
|
O_EXLOCK
|
||
|
O_NDELAY
|
||
|
O_NOCTTY
|
||
|
O_NONBLOCK
|
||
|
O_RDONLY
|
||
|
O_RDWR
|
||
|
O_RSYNC
|
||
|
O_SHLOCK
|
||
|
O_SYNC
|
||
|
O_TEXT
|
||
|
O_TRUNC
|
||
|
O_WRONLY
|
||
|
);
|
||
|
|
||
|
# Other items we are prepared to export if requested
|
||
|
@EXPORT_OK = qw(
|
||
|
FAPPEND
|
||
|
FASYNC
|
||
|
FCREAT
|
||
|
FDEFER
|
||
|
FEXCL
|
||
|
FNDELAY
|
||
|
FNONBLOCK
|
||
|
FSYNC
|
||
|
FTRUNC
|
||
|
LOCK_EX
|
||
|
LOCK_NB
|
||
|
LOCK_SH
|
||
|
LOCK_UN
|
||
|
);
|
||
|
# Named groups of exports
|
||
|
%EXPORT_TAGS = (
|
||
|
'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
|
||
|
'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FEXCL
|
||
|
FNDELAY FNONBLOCK FSYNC FTRUNC)],
|
||
|
);
|
||
|
|
||
|
sub AUTOLOAD {
|
||
|
(my $constname = $AUTOLOAD) =~ s/.*:://;
|
||
|
my $val = constant($constname, 0);
|
||
|
if ($! != 0) {
|
||
|
if ($! =~ /Invalid/) {
|
||
|
$AutoLoader::AUTOLOAD = $AUTOLOAD;
|
||
|
goto &AutoLoader::AUTOLOAD;
|
||
|
}
|
||
|
else {
|
||
|
my ($pack,$file,$line) = caller;
|
||
|
die "Your vendor has not defined Fcntl macro $constname, used at $file line $line.
|
||
|
";
|
||
|
}
|
||
|
}
|
||
|
*$AUTOLOAD = sub { $val };
|
||
|
goto &$AUTOLOAD;
|
||
|
}
|
||
|
|
||
|
bootstrap Fcntl $VERSION;
|
||
|
|
||
|
1;
|