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