This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Argument sanity checking.
[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<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.04";
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_NOINHERIT
122         O_NONBLOCK
123         O_RANDOM
124         O_RAW
125         O_RDONLY
126         O_RDWR
127         O_RSRC
128         O_RSYNC
129         O_SEQUENTIAL
130         O_SHLOCK
131         O_SYNC
132         O_TEMPORARY
133         O_TEXT
134         O_TRUNC
135         O_WRONLY
136      );
137
138 # Other items we are prepared to export if requested
139 @EXPORT_OK = qw(
140         DN_ACCESS
141         DN_ATTRIB
142         DN_CREATE
143         DN_DELETE
144         DN_MODIFY
145         DN_MULTISHOT
146         DN_RENAME
147         FAPPEND
148         FASYNC
149         FCREAT
150         FDEFER
151         FDSYNC
152         FEXCL
153         FLARGEFILE
154         FNDELAY
155         FNONBLOCK
156         FRSYNC
157         FSYNC
158         FTRUNC
159         F_GETLEASE
160         F_GETSIG
161         F_NOTIFY
162         F_SETLEASE
163         F_SETSIG
164         LOCK_EX
165         LOCK_MAND
166         LOCK_NB
167         LOCK_READ
168         LOCK_RW
169         LOCK_SH
170         LOCK_UN
171         LOCK_WRITE
172         O_IGNORE_CTTY
173         O_NOATIME
174         O_NOLINK
175         O_NOTRANS
176         SEEK_CUR
177         SEEK_END
178         SEEK_SET
179         S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
180         S_IREAD S_IWRITE S_IEXEC
181         S_IRGRP S_IWGRP S_IXGRP S_IRWXG
182         S_IROTH S_IWOTH S_IXOTH S_IRWXO
183         S_IRUSR S_IWUSR S_IXUSR S_IRWXU
184         S_ISUID S_ISGID S_ISVTX S_ISTXT
185         _S_IFMT S_IFREG S_IFDIR S_IFLNK
186         &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
187         &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
188 );
189 # Named groups of exports
190 %EXPORT_TAGS = (
191     'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
192     'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
193                      FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
194     'seek'    => [qw(SEEK_SET SEEK_CUR SEEK_END)],
195     'mode'    => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
196                      _S_IFMT S_IFREG S_IFDIR S_IFLNK
197                      S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
198                      S_IRUSR S_IWUSR S_IXUSR S_IRWXU
199                      S_IRGRP S_IWGRP S_IXGRP S_IRWXG
200                      S_IROTH S_IWOTH S_IXOTH S_IRWXO
201                      S_IREAD S_IWRITE S_IEXEC
202                      S_ISREG S_ISDIR S_ISLNK S_ISSOCK
203                      S_ISBLK S_ISCHR S_ISFIFO
204                      S_ISWHT S_ISENFMT          
205                      S_IFMT S_IMODE
206                   )],
207 );
208
209 sub S_IFMT  { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT()  }
210 sub S_IMODE { $_[0] & 07777 }
211
212 sub S_ISREG    { ( $_[0] & _S_IFMT() ) == S_IFREG()   }
213 sub S_ISDIR    { ( $_[0] & _S_IFMT() ) == S_IFDIR()   }
214 sub S_ISLNK    { ( $_[0] & _S_IFMT() ) == S_IFLNK()   }
215 sub S_ISSOCK   { ( $_[0] & _S_IFMT() ) == S_IFSOCK()  }
216 sub S_ISBLK    { ( $_[0] & _S_IFMT() ) == S_IFBLK()   }
217 sub S_ISCHR    { ( $_[0] & _S_IFMT() ) == S_IFCHR()   }
218 sub S_ISFIFO   { ( $_[0] & _S_IFMT() ) == S_IFIFO()   }
219 sub S_ISWHT    { ( $_[0] & _S_IFMT() ) == S_IFWHT()   }
220 sub S_ISENFMT  { ( $_[0] & _S_IFMT() ) == S_IFENFMT() }
221
222 sub AUTOLOAD {
223     (my $constname = $AUTOLOAD) =~ s/.*:://;
224     die "&Fcntl::constant not defined" if $constname eq 'constant';
225     my ($error, $val) = constant($constname);
226     if ($error) {
227         my (undef,$file,$line) = caller;
228         die "$error at $file line $line.\n";
229     }
230     *$AUTOLOAD = sub { $val };
231     goto &$AUTOLOAD;
232 }
233
234 XSLoader::load 'Fcntl', $VERSION;
235
236 1;