Quick integration of mainline changes to date
[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 use XSLoader ();
49 @ISA = qw(Exporter);
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         O_ALIAS
114         O_RSRC
115         SEEK_SET
116         SEEK_CUR
117         SEEK_END
118      );
119
120 # Other items we are prepared to export if requested
121 @EXPORT_OK = qw(
122         FAPPEND
123         FASYNC
124         FCREAT
125         FDEFER
126         FDSYNC
127         FEXCL
128         FLARGEFILE
129         FNDELAY
130         FNONBLOCK
131         FRSYNC
132         FSYNC
133         FTRUNC
134         LOCK_EX
135         LOCK_NB
136         LOCK_SH
137         LOCK_UN
138 );
139 # Named groups of exports
140 %EXPORT_TAGS = (
141     'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
142     'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
143                      FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
144 );
145
146 sub AUTOLOAD {
147     (my $constname = $AUTOLOAD) =~ s/.*:://;
148     my $val = constant($constname, 0);
149     if ($! != 0) {
150         if ($! =~ /Invalid/ || $!{EINVAL}) {
151             $AutoLoader::AUTOLOAD = $AUTOLOAD;
152             goto &AutoLoader::AUTOLOAD;
153         }
154         else {
155             my ($pack,$file,$line) = caller;
156             die "Your vendor has not defined Fcntl macro $constname, used at $file line $line.
157 ";
158         }
159     }
160     *$AUTOLOAD = sub { $val };
161     goto &$AUTOLOAD;
162 }
163
164 XSLoader::load 'Fcntl', $VERSION;
165
166 1;