summaryrefslogtreecommitdiff
path: root/ext/Fcntl/Fcntl.pm
blob: 8758359532bb412fef49eb437cc780a399737d26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
package Fcntl;

=head1 NAME

Fcntl - load the C Fcntl.h defines

=head1 SYNOPSIS

    use Fcntl;
    use Fcntl qw(:DEFAULT :flock);

=head1 DESCRIPTION

This module is just a translation of the C F<fnctl.h> file.
Unlike the old mechanism of requiring a translated F<fnctl.ph>
file, this uses the B<h2xs> program (see the Perl source distribution)
and your native C compiler.  This means that it has a 
far more likely chance of getting the numbers right.

=head1 NOTE

Only C<#define> symbols get translated; you must still correctly
pack up your own arguments to pass as args for locking functions, etc.

=head1 EXPORTED SYMBOLS

By default your system's F_* and O_* constants (eg, F_DUPFD and
O_CREAT) and the FD_CLOEXEC constant are exported into your namespace.

You can request that the flock() constants (LOCK_SH, LOCK_EX, LOCK_NB
and LOCK_UN) be provided by using the tag C<:flock>.  See L<Exporter>.

You can request that the old constants (FAPPEND, FASYNC, FCREAT,
FDEFER, FEXCL, FNDELAY, FNONBLOCK, FSYNC, FTRUNC) be provided for
compatibility reasons by using the tag C<:Fcompat>.  For new
applications the newer versions of these constants are suggested
(O_APPEND, O_ASYNC, O_CREAT, O_DEFER, O_EXCL, O_NDELAY, O_NONBLOCK,
O_SYNC, O_TRUNC).

For ease of use also the SEEK_* constants (for seek() and sysseek(),
e.g. SEEK_END) and the S_I* constants (for chmod() and stat()) are
available for import.  They can be imported either separately or using
the tags C<:seek> and C<:mode>.

Please refer to your native fcntl(2), open(2), fseek(3), lseek(2)
(equal to Perl's seek() and sysseek(), respectively), and chmod(2)
documentation to see what constants are implemented in your system.

See L<perlopentut> to learn about the uses of the O_* constants
with sysopen().

See L<perlfunc/seek> and L<perlfunc/sysseek> about the SEEK_* constants.

See L<perlfunc/stat> about the S_I* constants.

=cut

our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD);

require Exporter;
use XSLoader ();
@ISA = qw(Exporter);
$VERSION = "1.03";
# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)
@EXPORT =
  qw(
	FD_CLOEXEC
	F_ALLOCSP
	F_ALLOCSP64
	F_COMPAT
	F_DUP2FD
	F_DUPFD
	F_EXLCK
	F_FREESP
	F_FREESP64
	F_FSYNC
	F_FSYNC64
	F_GETFD
	F_GETFL
	F_GETLK
	F_GETLK64
	F_GETOWN
	F_NODNY
	F_POSIX
	F_RDACC
	F_RDDNY
	F_RDLCK
	F_RWACC
	F_RWDNY
	F_SETFD
	F_SETFL
	F_SETLK
	F_SETLK64
	F_SETLKW
	F_SETLKW64
	F_SETOWN
	F_SHARE
	F_SHLCK
	F_UNLCK
	F_UNSHARE
	F_WRACC
	F_WRDNY
	F_WRLCK
	O_ACCMODE
	O_ALIAS
	O_APPEND
	O_ASYNC
	O_BINARY
	O_CREAT
	O_DEFER
	O_DIRECT
	O_DIRECTORY
	O_DSYNC
	O_EXCL
	O_EXLOCK
	O_LARGEFILE
	O_NDELAY
	O_NOCTTY
	O_NOFOLLOW
	O_NONBLOCK
	O_RDONLY
	O_RDWR
	O_RSRC
	O_RSYNC
	O_SHLOCK
	O_SYNC
	O_TEMPORARY
	O_TEXT
	O_TRUNC
	O_WRONLY
     );

# Other items we are prepared to export if requested
@EXPORT_OK = qw(
	FAPPEND
	FASYNC
	FCREAT
	FDEFER
	FDSYNC
	FEXCL
	FLARGEFILE
	FNDELAY
	FNONBLOCK
	FRSYNC
	FSYNC
	FTRUNC
	LOCK_EX
	LOCK_NB
	LOCK_SH
	LOCK_UN
	S_ISUID S_ISGID S_ISVTX S_ISTXT
	_S_IFMT S_IFREG S_IFDIR S_IFLNK
	S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
	S_IRUSR S_IWUSR S_IXUSR S_IRWXU
	S_IRGRP S_IWGRP S_IXGRP S_IRWXG
	S_IROTH S_IWOTH S_IXOTH S_IRWXO
	S_IREAD S_IWRITE S_IEXEC
	&S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO
	&S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE
	SEEK_SET
	SEEK_CUR
	SEEK_END
);
# Named groups of exports
%EXPORT_TAGS = (
    'flock'   => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)],
    'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE
		     FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)],
    'seek'    => [qw(SEEK_SET SEEK_CUR SEEK_END)],
    'mode'    => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT
		     _S_IFMT S_IFREG S_IFDIR S_IFLNK
		     S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT
		     S_IRUSR S_IWUSR S_IXUSR S_IRWXU
		     S_IRGRP S_IWGRP S_IXGRP S_IRWXG
		     S_IROTH S_IWOTH S_IXOTH S_IRWXO
		     S_IREAD S_IWRITE S_IEXEC
		     &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK
		     &S_ISBLK &S_ISCHR &S_ISFIFO
		     &S_ISWHT &S_ISENFMT		
		     &S_IFMT &S_IMODE
                  )],
);

sub FD_CLOEXEC	();

sub F_ALLOCSP	();
sub F_ALLOCSP64	();
sub F_COMPAT	();
sub F_DUP2FD	();
sub F_DUPFD	();
sub F_EXLCK	();
sub F_FREESP	();
sub F_FREESP64	();
sub F_FSYNC	();
sub F_FSYNC64	();
sub F_GETFD	();
sub F_GETFL	();
sub F_GETLK	();
sub F_GETLK64	();
sub F_GETOWN	();
sub F_NODNY	();
sub F_POSIX	();
sub F_RDACC	();
sub F_RDDNY	();
sub F_RDLCK	();
sub F_RWACC	();
sub F_RWDNY	();
sub F_SETFD	();
sub F_SETFL	();
sub F_SETLK	();
sub F_SETLK64	();
sub F_SETLKW	();
sub F_SETLKW64	();
sub F_SETOWN	();
sub F_SHARE	();
sub F_SHLCK	();
sub F_UNLCK	();
sub F_UNSHARE	();
sub F_WRACC	();
sub F_WRDNY	();
sub F_WRLCK	();

sub O_ACCMODE	();
sub O_ALIAS	();
sub O_APPEND	();
sub O_ASYNC	();
sub O_BINARY	();
sub O_CREAT	();
sub O_DEFER	();
sub O_DIRECT	();
sub O_DIRECTORY	();
sub O_DSYNC	();
sub O_EXCL	();
sub O_EXLOCK	();
sub O_LARGEFILE	();
sub O_NDELAY	();
sub O_NOCTTY	();
sub O_NOFOLLOW	();
sub O_NONBLOCK	();
sub O_RDONLY	();
sub O_RDWR	();
sub O_RSRC	();
sub O_RSYNC	();
sub O_SHLOCK	();
sub O_SYNC	();
sub O_TEMPORARY	();
sub O_TEXT	();
sub O_TRUNC	();
sub O_WRONLY	();

sub FAPPEND	();
sub FASYNC	();
sub FCREAT	();
sub FDEFER	();
sub FDSYNC	();
sub FEXCL	();
sub FLARGEFILE	();
sub FNDELAY	();
sub FNONBLOCK	();
sub FRSYNC	();
sub FSYNC	();
sub FTRUNC	();

sub LOCK_EX	();
sub LOCK_NB	();
sub LOCK_SH	();
sub LOCK_UN	();

sub SEEK_SET	();
sub SEEK_CUR	();
sub SEEK_END	();

sub S_ISUID  ();
sub S_ISGID  ();
sub S_ISVTX  ();
sub S_ISTXT  ();
sub _S_IFMT  ();
sub S_IFMT   (;$);
sub S_IMODE  ($);
sub S_IFREG  ();
sub S_IFDIR  ();
sub S_IFLNK  ();
sub S_IFSOCK ();
sub S_IFBLK  ();
sub S_IFCHR  ();
sub S_IFIFO  ();
sub S_IFWHT  ();
sub S_ENFMT  ();
sub S_IRUSR  ();
sub S_IWUSR  ();
sub S_IXUSR  ();
sub S_IRWXU  ();
sub S_IRGRP  ();
sub S_IWGRP  ();
sub S_IXGRP  ();
sub S_IRWXG  ();
sub S_IROTH  ();
sub S_IWOTH  ();
sub S_IXOTH  ();
sub S_IRWXO  ();
sub S_IREAD  ();
sub S_IWRITE ();
sub S_IEXEC  ();

sub S_IFREG   ();
sub S_IFDIR   ();
sub S_IFLNK   ();
sub S_IFSOCK  ();
sub S_IFBLK   ();
sub S_IFCHR   ();
sub S_IFIFO   ();
sub S_IFWHT   ();
sub S_IFENFMT ();

sub S_IFMT  (;$) { @_ ? ( $_[0] & _S_IFMT ) : _S_IFMT  }
sub S_IMODE ($)  { $_[0] & 07777 }

sub S_ISREG    ($) { ( $_[0] & _S_IFMT ) == S_IFREG   }
sub S_ISDIR    ($) { ( $_[0] & _S_IFMT ) == S_IFDIR   }
sub S_ISLNK    ($) { ( $_[0] & _S_IFMT ) == S_IFLNK   }
sub S_ISSOCK   ($) { ( $_[0] & _S_IFMT ) == S_IFSOCK  }
sub S_ISBLK    ($) { ( $_[0] & _S_IFMT ) == S_IFBLK   }
sub S_ISCHR    ($) { ( $_[0] & _S_IFMT ) == S_IFCHR   }
sub S_ISFIFO   ($) { ( $_[0] & _S_IFMT ) == S_IFIFO   }
sub S_ISWHT    ($) { ( $_[0] & _S_IFMT ) == S_ISWHT   }
sub S_ISENFMT  ($) { ( $_[0] & _S_IFMT ) == S_ISENFMT }

sub AUTOLOAD {
    (my $constname = $AUTOLOAD) =~ s/.*:://;
    my $val = constant($constname, 0);
    if ($! != 0) {
	if ($! =~ /Invalid/ || $!{EINVAL}) {
	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
	    goto &AutoLoader::AUTOLOAD;
	}
	else {
	    my ($pack,$file,$line) = caller;
	    die "Your vendor has not defined Fcntl macro $constname, used at $file line $line.
";
	}
    }
    *$AUTOLOAD = sub () { $val };
    goto &$AUTOLOAD;
}

XSLoader::load 'Fcntl', $VERSION;

1;