Fcntl: more O_ constants, move SEEK_ to @EXPORT_OK
[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 For ease of use also the SEEK_* constants (for seek() and sysseek(),
41 e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are
42 available for import.  They can be imported either separately or using
43 the tags C<:seek> and C<:mode>.
44
45 Please refer to your native fcntl(2), open(2), fseek(3), lseek(2)
46 (equal to Perl's seek() and sysseek(), respectively), and chmod(2)
47 documentation to see what constants are implemented in your system.
48
49 See L<perlopentut> to learn about the uses of the O_* constants
50 with sysopen().
51
52 See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants.
53
54 See L<perlfunc/stat> about the S_I* constants.
55
56 =cut
57
58 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);
59
60 require Exporter;
61 use XSLoader ();
62 @ISA = qw(Exporter);
63 $VERSION = "1.03";
64 # Items to export into callers namespace by default
65 # (move infrequently used names to @EXPORT_OK below)
66 @EXPORT =
67   qw(
68         FD_CLOEXEC
69         F_ALLOCSP
70         F_ALLOCSP64
71         F_COMPAT
72         F_DUP2FD
73         F_DUPFD
74         F_EXLCK
75         F_FREESP
76         F_FREESP64
77         F_FSYNC
78         F_FSYNC64
79         F_GETFD
80         F_GETFL
81         F_GETLK
82         F_GETLK64
83         F_GETOWN
84         F_NODNY
85         F_POSIX
86         F_RDACC
87         F_RDDNY
88         F_RDLCK
89         F_RWACC
90         F_RWDNY
91         F_SETFD
92         F_SETFL
93         F_SETLK
94         F_SETLK64
95         F_SETLKW
96         F_SETLKW64
97         F_SETOWN
98         F_SHARE
99         F_SHLCK
100         F_UNLCK
101         F_UNSHARE
102         F_WRACC
103         F_WRDNY
104         F_WRLCK
105         O_ACCMODE
106         O_ALIAS
107         O_APPEND
108         O_ASYNC
109         O_BINARY
110         O_CREAT
111         O_DEFER
112         O_DIRECT
113         O_DIRECTORY
114         O_DSYNC
115         O_EXCL
116         O_EXLOCK
117         O_LARGEFILE
118         O_NDELAY
119         O_NOCTTY
120         O_NOFOLLOW
121         O_NONBLOCK
122         O_RDONLY
123         O_RDWR
124         O_RSRC
125         O_RSYNC
126         O_SHLOCK
127         O_SYNC
128         O_TEMPORARY
129         O_TEXT
130         O_TRUNC
131         O_WRONLY
132      );
133
134 # Other items we are prepared to export if requested
135 @EXPORT_OK = qw(
136         FAPPEND
137         FASYNC
138         FCREAT
139         FDEFER
140         FDSYNC
141         FEXCL
142         FLARGEFILE
143         FNDELAY
144         FNONBLOCK
145         FRSYNC
146         FSYNC
147         FTRUNC
148         LOCK_EX
149         LOCK_NB
150         LOCK_SH
151         LOCK_UN
152         S_ISUID S_ISGID S_ISVTX S_ISTXT
153         _S_IFMT S_IFREG S_IFDIR S_IFLNK
154         S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
155         S_IRUSR S_IWUSR S_IXUSR S_IRWXU
156         S_IRGRP S_IWGRP S_IXGRP S_IRWXG
157         S_IROTH S_IWOTH S_IXOTH S_IRWXO
158         S_IREAD S_IWRITE S_IEXEC
159         &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
160         &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
161         SEEK_SET
162         SEEK_CUR
163         SEEK_END
164 );
165 # Named groups of exports
166 %EXPORT_TAGS = (
167     'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
168     'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
169                      FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
170     'seek'    => [qw(SEEK_SET SEEK_CUR SEEK_END)],
171     'mode'    => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
172                      _S_IFMT S_IFREG S_IFDIR S_IFLNK
173                      S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
174                      S_IRUSR S_IWUSR S_IXUSR S_IRWXU
175                      S_IRGRP S_IWGRP S_IXGRP S_IRWXG
176                      S_IROTH S_IWOTH S_IXOTH S_IRWXO
177                      S_IREAD S_IWRITE S_IEXEC
178                      &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK
179                      &S_ISBLK &S_ISCHR &S_ISFIFO
180                      &S_ISWHT &S_ISENFMT                
181                      &S_IFMT &S_IMODE
182                   )],
183 );
184
185 sub FD_CLOEXEC  ();
186
187 sub F_ALLOCSP   ();
188 sub F_ALLOCSP64 ();
189 sub F_COMPAT    ();
190 sub F_DUP2FD    ();
191 sub F_DUPFD     ();
192 sub F_EXLCK     ();
193 sub F_FREESP    ();
194 sub F_FREESP64  ();
195 sub F_FSYNC     ();
196 sub F_FSYNC64   ();
197 sub F_GETFD     ();
198 sub F_GETFL     ();
199 sub F_GETLK     ();
200 sub F_GETLK64   ();
201 sub F_GETOWN    ();
202 sub F_NODNY     ();
203 sub F_POSIX     ();
204 sub F_RDACC     ();
205 sub F_RDDNY     ();
206 sub F_RDLCK     ();
207 sub F_RWACC     ();
208 sub F_RWDNY     ();
209 sub F_SETFD     ();
210 sub F_SETFL     ();
211 sub F_SETLK     ();
212 sub F_SETLK64   ();
213 sub F_SETLKW    ();
214 sub F_SETLKW64  ();
215 sub F_SETOWN    ();
216 sub F_SHARE     ();
217 sub F_SHLCK     ();
218 sub F_UNLCK     ();
219 sub F_UNSHARE   ();
220 sub F_WRACC     ();
221 sub F_WRDNY     ();
222 sub F_WRLCK     ();
223
224 sub O_ACCMODE   ();
225 sub O_ALIAS     ();
226 sub O_APPEND    ();
227 sub O_ASYNC     ();
228 sub O_BINARY    ();
229 sub O_CREAT     ();
230 sub O_DEFER     ();
231 sub O_DIRECT    ();
232 sub O_DIRECTORY ();
233 sub O_DSYNC     ();
234 sub O_EXCL      ();
235 sub O_EXLOCK    ();
236 sub O_LARGEFILE ();
237 sub O_NDELAY    ();
238 sub O_NOCTTY    ();
239 sub O_NOFOLLOW  ();
240 sub O_NONBLOCK  ();
241 sub O_RDONLY    ();
242 sub O_RDWR      ();
243 sub O_RSRC      ();
244 sub O_RSYNC     ();
245 sub O_SHLOCK    ();
246 sub O_SYNC      ();
247 sub O_TEMPORARY ();
248 sub O_TEXT      ();
249 sub O_TRUNC     ();
250 sub O_WRONLY    ();
251
252 sub FAPPEND     ();
253 sub FASYNC      ();
254 sub FCREAT      ();
255 sub FDEFER      ();
256 sub FDSYNC      ();
257 sub FEXCL       ();
258 sub FLARGEFILE  ();
259 sub FNDELAY     ();
260 sub FNONBLOCK   ();
261 sub FRSYNC      ();
262 sub FSYNC       ();
263 sub FTRUNC      ();
264
265 sub LOCK_EX     ();
266 sub LOCK_NB     ();
267 sub LOCK_SH     ();
268 sub LOCK_UN     ();
269
270 sub SEEK_SET    ();
271 sub SEEK_CUR    ();
272 sub SEEK_END    ();
273
274 sub S_ISUID  ();
275 sub S_ISGID  ();
276 sub S_ISVTX  ();
277 sub S_ISTXT  ();
278 sub _S_IFMT  ();
279 sub S_IFMT   (;$);
280 sub S_IMODE  ($);
281 sub S_IFREG  ();
282 sub S_IFDIR  ();
283 sub S_IFLNK  ();
284 sub S_IFSOCK ();
285 sub S_IFBLK  ();
286 sub S_IFCHR  ();
287 sub S_IFIFO  ();
288 sub S_IFWHT  ();
289 sub S_ENFMT  ();
290 sub S_IRUSR  ();
291 sub S_IWUSR  ();
292 sub S_IXUSR  ();
293 sub S_IRWXU  ();
294 sub S_IRGRP  ();
295 sub S_IWGRP  ();
296 sub S_IXGRP  ();
297 sub S_IRWXG  ();
298 sub S_IROTH  ();
299 sub S_IWOTH  ();
300 sub S_IXOTH  ();
301 sub S_IRWXO  ();
302 sub S_IREAD  ();
303 sub S_IWRITE ();
304 sub S_IEXEC  ();
305
306 sub S_IFREG   ();
307 sub S_IFDIR   ();
308 sub S_IFLNK   ();
309 sub S_IFSOCK  ();
310 sub S_IFBLK   ();
311 sub S_IFCHR   ();
312 sub S_IFIFO   ();
313 sub S_IFWHT   ();
314 sub S_IFENFMT ();
315
316 sub S_IFMT  (;$) { @_ ? ( $_[0] & _S_IFMT ) : _S_IFMT  }
317 sub S_IMODE ($)  { $_[0] & 07777 }
318
319 sub S_ISREG    ($) { ( $_[0] & _S_IFMT ) == S_IFREG   }
320 sub S_ISDIR    ($) { ( $_[0] & _S_IFMT ) == S_IFDIR   }
321 sub S_ISLNK    ($) { ( $_[0] & _S_IFMT ) == S_IFLNK   }
322 sub S_ISSOCK   ($) { ( $_[0] & _S_IFMT ) == S_IFSOCK  }
323 sub S_ISBLK    ($) { ( $_[0] & _S_IFMT ) == S_IFBLK   }
324 sub S_ISCHR    ($) { ( $_[0] & _S_IFMT ) == S_IFCHR   }
325 sub S_ISFIFO   ($) { ( $_[0] & _S_IFMT ) == S_IFIFO   }
326 sub S_ISWHT    ($) { ( $_[0] & _S_IFMT ) == S_ISWHT   }
327 sub S_ISENFMT  ($) { ( $_[0] & _S_IFMT ) == S_ISENFMT }
328
329 sub AUTOLOAD {
330     (my $constname = $AUTOLOAD) =~ s/.*:://;
331     my $val = constant($constname, 0);
332     if ($! != 0) {
333         if ($! =~ /Invalid/ || $!{EINVAL}) {
334             $AutoLoader::AUTOLOAD = $AUTOLOAD;
335             goto &AutoLoader::AUTOLOAD;
336         }
337         else {
338             my ($pack,$file,$line) = caller;
339             die "Your vendor has not defined Fcntl macro $constname, used at $file line $line.
340 ";
341         }
342     }
343     *$AUTOLOAD = sub () { $val };
344     goto &$AUTOLOAD;
345 }
346
347 XSLoader::load 'Fcntl', $VERSION;
348
349 1;