699ee4a517761051e3183a48c1182e054386e52a
[p5sagit/p5-mst-13.2.git] / ext / Fcntl / Fcntl.pm
1 package Fcntl;
2
3 =head1 NAME
4
5 Fcntl - load the C Fcntl.h defines
6
7 =head1 SYNOPSIS
8
9     use Fcntl;
10     use Fcntl qw(:DEFAULT :flock);
11
12 =head1 DESCRIPTION
13
14 This module is just a translation of the C F<fnctl.h> file.
15 Unlike the old mechanism of requiring a translated F<fnctl.ph>
16 file, this uses the B<h2xs> program (see the Perl source distribution)
17 and your native C compiler.  This means that it has a 
18 far more likely chance of getting the numbers right.
19
20 =head1 NOTE
21
22 Only C<#define> symbols get translated; you must still correctly
23 pack up your own arguments to pass as args for locking functions, etc.
24
25 =head1 EXPORTED SYMBOLS
26
27 By default your system's F_* and O_* constants (eg, F_DUPFD and
28 O_CREAT) and the FD_CLOEXEC constant are exported into your namespace.
29
30 You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB
31 and LOCK_UN) be provided by using the tag C<:flock>.  See L<Exporter>.
32
33 You can request that the old constants (FAPPEND, FASYNC, FCREAT,
34 FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for
35 compatibility reasons by using the tag C<:Fcompat>.  For new
36 applications the newer versions of these constants are suggested
37 (O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
38 O_SYNC, O_TRUNC).
39
40 Please refer to your native fcntl() and open() documentation to see
41 what constants are implemented in your system.
42
43 =cut
44
45 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);
46
47 require Exporter;
48 require DynaLoader;
49 @ISA = qw(Exporter DynaLoader);
50 $VERSION = "1.03";
51 # Items to export into callers namespace by default
52 # (move infrequently used names to @EXPORT_OK below)
53 @EXPORT =
54   qw(
55         FD_CLOEXEC
56         F_ALLOCSP
57         F_ALLOCSP64
58         F_COMPAT
59         F_DUP2FD
60         F_DUPFD
61         F_EXLCK
62         F_FREESP
63         F_FREESP64
64         F_FSYNC
65         F_FSYNC64
66         F_GETFD
67         F_GETFL
68         F_GETLK
69         F_GETLK64
70         F_GETOWN
71         F_NODNY
72         F_POSIX
73         F_RDACC
74         F_RDDNY
75         F_RDLCK
76         F_RWACC
77         F_RWDNY
78         F_SETFD
79         F_SETFL
80         F_SETLK
81         F_SETLK64
82         F_SETLKW
83         F_SETLKW64
84         F_SETOWN
85         F_SHARE
86         F_SHLCK
87         F_UNLCK
88         F_UNSHARE
89         F_WRACC
90         F_WRDNY
91         F_WRLCK
92         O_ACCMODE
93         O_APPEND
94         O_ASYNC
95         O_BINARY
96         O_CREAT
97         O_DEFER
98         O_DSYNC
99         O_EXCL
100         O_EXLOCK
101         O_LARGEFILE
102         O_NDELAY
103         O_NOCTTY
104         O_NONBLOCK
105         O_RDONLY
106         O_RDWR
107         O_RSYNC
108         O_SHLOCK
109         O_SYNC
110         O_TEXT
111         O_TRUNC
112         O_WRONLY
113         SEEK_SET
114         SEEK_CUR
115         SEEK_END
116      );
117
118 # Other items we are prepared to export if requested
119 @EXPORT_OK = qw(
120         FAPPEND
121         FASYNC
122         FCREAT
123         FDEFER
124         FDSYNC
125         FEXCL
126         FLARGEFILE
127         FNDELAY
128         FNONBLOCK
129         FRSYNC
130         FSYNC
131         FTRUNC
132         LOCK_EX
133         LOCK_NB
134         LOCK_SH
135         LOCK_UN
136 );
137 # Named groups of exports
138 %EXPORT_TAGS = (
139     'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
140     'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
141                      FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
142 );
143
144 sub AUTOLOAD {
145     (my $constname = $AUTOLOAD) =~ s/.*:://;
146     my $val = constant($constname, 0);
147     if ($! != 0) {
148         if ($! =~ /Invalid/ || $!{EINVAL}) {
149             $AutoLoader::AUTOLOAD = $AUTOLOAD;
150             goto &AutoLoader::AUTOLOAD;
151         }
152         else {
153             my ($pack,$file,$line) = caller;
154             die "Your vendor has not defined Fcntl macro $constname, used at $file line $line.
155 ";
156         }
157     }
158     *$AUTOLOAD = sub { $val };
159     goto &$AUTOLOAD;
160 }
161
162 bootstrap Fcntl $VERSION;
163
164 1;