This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
067c0612efd8d6a2201386be291021a96a903476
[perl5.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<fcntl.h> file.
15 Unlike the old mechanism of requiring a translated F<fcntl.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 BEGIN {
64   $VERSION = "1.05";
65 }
66
67 # Items to export into callers namespace by default
68 # (move infrequently used names to @EXPORT_OK below)
69 @EXPORT =
70   qw(
71         FD_CLOEXEC
72         F_ALLOCSP
73         F_ALLOCSP64
74         F_COMPAT
75         F_DUP2FD
76         F_DUPFD
77         F_EXLCK
78         F_FREESP
79         F_FREESP64
80         F_FSYNC
81         F_FSYNC64
82         F_GETFD
83         F_GETFL
84         F_GETLK
85         F_GETLK64
86         F_GETOWN
87         F_NODNY
88         F_POSIX
89         F_RDACC
90         F_RDDNY
91         F_RDLCK
92         F_RWACC
93         F_RWDNY
94         F_SETFD
95         F_SETFL
96         F_SETLK
97         F_SETLK64
98         F_SETLKW
99         F_SETLKW64
100         F_SETOWN
101         F_SHARE
102         F_SHLCK
103         F_UNLCK
104         F_UNSHARE
105         F_WRACC
106         F_WRDNY
107         F_WRLCK
108         O_ACCMODE
109         O_ALIAS
110         O_APPEND
111         O_ASYNC
112         O_BINARY
113         O_CREAT
114         O_DEFER
115         O_DIRECT
116         O_DIRECTORY
117         O_DSYNC
118         O_EXCL
119         O_EXLOCK
120         O_LARGEFILE
121         O_NDELAY
122         O_NOCTTY
123         O_NOFOLLOW
124         O_NOINHERIT
125         O_NONBLOCK
126         O_RANDOM
127         O_RAW
128         O_RDONLY
129         O_RDWR
130         O_RSRC
131         O_RSYNC
132         O_SEQUENTIAL
133         O_SHLOCK
134         O_SYNC
135         O_TEMPORARY
136         O_TEXT
137         O_TRUNC
138         O_WRONLY
139      );
140
141 # Other items we are prepared to export if requested
142 @EXPORT_OK = qw(
143         DN_ACCESS
144         DN_ATTRIB
145         DN_CREATE
146         DN_DELETE
147         DN_MODIFY
148         DN_MULTISHOT
149         DN_RENAME
150         FAPPEND
151         FASYNC
152         FCREAT
153         FDEFER
154         FDSYNC
155         FEXCL
156         FLARGEFILE
157         FNDELAY
158         FNONBLOCK
159         FRSYNC
160         FSYNC
161         FTRUNC
162         F_GETLEASE
163         F_GETSIG
164         F_NOTIFY
165         F_SETLEASE
166         F_SETSIG
167         LOCK_EX
168         LOCK_MAND
169         LOCK_NB
170         LOCK_READ
171         LOCK_RW
172         LOCK_SH
173         LOCK_UN
174         LOCK_WRITE
175         O_IGNORE_CTTY
176         O_NOATIME
177         O_NOLINK
178         O_NOTRANS
179         SEEK_CUR
180         SEEK_END
181         SEEK_SET
182         S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
183         S_IREAD S_IWRITE S_IEXEC
184         S_IRGRP S_IWGRP S_IXGRP S_IRWXG
185         S_IROTH S_IWOTH S_IXOTH S_IRWXO
186         S_IRUSR S_IWUSR S_IXUSR S_IRWXU
187         S_ISUID S_ISGID S_ISVTX S_ISTXT
188         _S_IFMT S_IFREG S_IFDIR S_IFLNK
189         &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
190         &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
191 );
192 # Named groups of exports
193 %EXPORT_TAGS = (
194     'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
195     'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
196                      FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
197     'seek'    => [qw(SEEK_SET SEEK_CUR SEEK_END)],
198     'mode'    => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
199                      _S_IFMT S_IFREG S_IFDIR S_IFLNK
200                      S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
201                      S_IRUSR S_IWUSR S_IXUSR S_IRWXU
202                      S_IRGRP S_IWGRP S_IXGRP S_IRWXG
203                      S_IROTH S_IWOTH S_IXOTH S_IRWXO
204                      S_IREAD S_IWRITE S_IEXEC
205                      S_ISREG S_ISDIR S_ISLNK S_ISSOCK
206                      S_ISBLK S_ISCHR S_ISFIFO
207                      S_ISWHT S_ISENFMT          
208                      S_IFMT S_IMODE
209                   )],
210 );
211
212 # Force the constants to become inlined
213 BEGIN {
214   XSLoader::load 'Fcntl', $VERSION;
215 }
216
217 sub S_IFMT  { @_ ? ( $_[0] & _S_IFMT ) : _S_IFMT  }
218 sub S_IMODE { $_[0] & 07777 }
219
220 sub S_ISREG    { ( $_[0] & _S_IFMT ) == S_IFREG   }
221 sub S_ISDIR    { ( $_[0] & _S_IFMT ) == S_IFDIR   }
222 sub S_ISLNK    { ( $_[0] & _S_IFMT ) == S_IFLNK   }
223 sub S_ISSOCK   { ( $_[0] & _S_IFMT ) == S_IFSOCK  }
224 sub S_ISBLK    { ( $_[0] & _S_IFMT ) == S_IFBLK   }
225 sub S_ISCHR    { ( $_[0] & _S_IFMT ) == S_IFCHR   }
226 sub S_ISFIFO   { ( $_[0] & _S_IFMT ) == S_IFIFO   }
227 sub S_ISWHT    { ( $_[0] & _S_IFMT ) == S_IFWHT   }
228 sub S_ISENFMT  { ( $_[0] & _S_IFMT ) == S_IFENFMT }
229
230 sub AUTOLOAD {
231     (my $constname = $AUTOLOAD) =~ s/.*:://;
232     die "&Fcntl::constant not defined" if $constname eq 'constant';
233     my ($error, $val) = constant($constname);
234     if ($error) {
235         my (undef,$file,$line) = caller;
236         die "$error at $file line $line.\n";
237     }
238     *$AUTOLOAD = sub { $val };
239     goto &$AUTOLOAD;
240 }
241
242 1;