Commit | Line | Data |
---|---|---|
920dae64 AT |
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 | $VERSION = "1.05"; | |
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; |