package Fcntl; =head1 NAME Fcntl - various flag constants and helper functions from C's fcntl.h =head1 SYNOPSIS use Fcntl; use Fcntl qw(:DEFAULT :flock); use Fcntl qw(F_GETFD F_SETFD FD_CLOEXEC); =head1 DESCRIPTION This module provides flags and helper functions for use with L<perlfunc/chmod> (S_*), L<perlfunc/fcntl> (F_*), L<perlfunc/flock> (LOCK_*), L<perlfunc/seek> (SEEK_*), L<perlfunc/stat> (S_*), L<perlfunc/sysopen> (O_*), and L<perlfunc/sysseek> (SEEK_*). They correspond to the C macros defined in F<fcntl.h>. Not all symbols are available on all systems. Except where noted otherwise, the constants and functions provided by this module will throw a runtime exception if the corresponding C macro is not available. Consult your system documentation to see the full description of each symbol and whether it is available on your platform: L<chmod(2)>, L<fcntl(2)>, L<flock(2)>, L<lseek(2)>, L<open(2)>, L<stat(2)>. (In particular, some of the F_* symbols are highly non-portable because they only exist on a single platform or require system-specific C data structures to be passed as the third argument to C<fcntl>, which can't be portably constructed in pure Perl.) =head1 EXPORTED SYMBOLS =head2 Default exports and export tags The full list of default exports can be found below in L</APPENDIX A>. In addition, the following export tags are available (see L<Exporter> for more information on export tags): =over =item C<:DEFAULT> Equivalent to the list of default export symbols (see L</APPENDIX A>). =item C<:flock> Equivalent to all LOCK_* symbols listed below. =item C<:mode> Equivalent to all S_* symbols listed below. =item C<:seek> Equivalent to all SEEK_* symbols listed below. =item C<:Fcompat> Equivalent to C<qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)>. These only exist for compatibility with old code (if your platform defines them at all) and should not be used in new code. =back =head2 Symbols for use with C<fcntl> =over =item C<F_ALLOCSP> File storage manipulation. =item C<F_ALLOCSP64> File storage manipulation. =item C<F_DUP2FD> Duplicate a file descriptor to the number specified in the third argument to C<fcntl> (if it refers to an open file, it is automatically closed first). =item C<F_DUPFD> Duplicate a file descriptor to the lowest unused number greater than or equal to the third argument of C<fcntl>. =item C<F_FREESP> File storage manipulation. =item C<F_FREESP64> File storage manipulation. =item C<F_FSYNC> Synchronize file data to disk. =item C<F_FSYNC64> Synchronize file data to disk. =item C<F_GETFD> Return (as a number) the set of file descriptor flags, in which the following bits may be set: =over =item C<FD_CLOEXEC> During a successful C<exec> call, the file descriptor will be closed automatically. =back =item C<F_GETFL> Return (as a number) the set of file description status flags (O_*) as set by C<open> and C<fcntl>. To determine the file access mode, perform a bitwise AND with L</C<O_ACCMODE>> and see whether the result is equal to C<O_RDONLY>, C<O_WRONLY>, or C<O_RDWR>. =item C<F_GETLEASE> Indicate the type of lease associated with the filehandle (if any) by returning one of the following flags: =over =item C<F_RDLCK> A read lease. =item C<F_WRLCK> A write lease. =item C<F_UNLCK> No lease. =back =item C<F_GETLK> Test for the existence of record locks on the file. =item C<F_GETLK64> Test for the existence of record locks on the file. =item C<F_GETOWN> Return the ID of the process (as a positive number) or group (as a negative number) that is currently receiving signals for events on the file descriptor. =item C<F_GETPIPE_SZ> Return the capacity of the pipe associated with the filehandle. =item C<F_GETSIG> Return the number of the signal sent when input or output becomes possible on the filehandle. A return value of C<0> means C<SIGIO>. =item C<F_NOTIFY> File and directory change notification with signals. =over =item C<DN_ACCESS> =item C<DN_ATTRIB> =item C<DN_CREATE> =item C<DN_DELETE> =item C<DN_MODIFY> =item C<DN_MULTISHOT> =item C<DN_RENAME> =back Z<> =item C<F_SETFD> Set the file descriptor flags. See L</C<F_GETFD>> for the list of available flags. =item C<F_SETFL> Set the file description status flags (O_*). Only some flags can be changed this way. =item C<F_SETLEASE> Set a file lease as specified by the third C<fnctl> argument, which must be one of the following: =over =item C<F_RDLCK> Set a read lease. =item C<F_WRLCK> Set a write lease. =item C<F_UNLCK> Remove a lease. =back =item C<F_SETLK> Acquire a record lock. =item C<F_SETLK64> Acquire a record lock. =item C<F_SETLKW> Acquire a record lock and wait for conflicting locks to be released. =item C<F_SETLKW64> Acquire a record lock and wait for conflicting locks to be released. =item C<F_SETOWN> Set the ID of the process (as a positive number) or group (as a negative number) that will receive signals for events on the file descriptor. =item C<F_SETPIPE_SZ> Set the capacity of the pipe associated with the filehandle. Return the actual capacity reserved for the pipe, which may be higher than requested. =item C<F_SETSIG> Set the number of the signal sent when input or output becomes possible on the filehandle. An argument of C<0> means C<SIGIO>. =item C<F_SHARE> Set share reservation. =item C<F_UNSHARE> Remove share reservation. =item C<F_COMPAT> =item C<F_EXLCK> =item C<F_NODNY> =item C<F_POSIX> =item C<F_RDACC> =item C<F_RDDNY> =item C<F_RWACC> =item C<F_RWDNY> =item C<F_SHLCK> =item C<F_WRACC> =item C<F_WRDNY> =back =head2 Symbols for use with C<flock> =over =item C<LOCK_EX> Request an exclusive lock. =item C<LOCK_MAND> Request a mandatory lock. =item C<LOCK_NB> Make lock request non-blocking (can be combined with other LOCK_* flags using bitwise OR). =item C<LOCK_READ> With C<LOCK_MAND>: Allow concurrent reads. =item C<LOCK_RW> With C<LOCK_MAND>: Allow concurrent reads and writes. =item C<LOCK_SH> Request a shared lock. =item C<LOCK_UN> Release a held lock. =item C<LOCK_WRITE> With C<LOCK_MAND>: Allow concurrent writes. =back =head2 Symbols for use with C<sysopen> =over =item C<O_ACCMODE> Bit mask for extracting the file access mode (read-only, write-only, or read/write) from the other flags. This is mainly useful in combination with L</C<F_GETFL>>. =item C<O_ALIAS> (Mac OS) Open alias file (instead of the file that the alias refers to). =item C<O_ALT_IO> (NetBSD) Use alternative I/O semantics. =item C<O_APPEND> Open the file in append mode. Writes always go to the end of the file. =item C<O_ASYNC> Enable signal-based I/O. When the file becomes readable or writable, a signal is sent. =item C<O_BINARY> (Windows) Open the file in binary mode. =item C<O_CREAT> If the file to be opened does not exist yet, create it. =item C<O_DEFER> (AIX) Changes to the file are kept in memory and not written to disk until the program performs an explicit L<< C<< $fh->sync() >>|IO::Handle/$io->sync >>. =item C<O_DIRECT> Perform direct I/O to/from user-space buffers; avoid caching at the OS level. =item C<O_DIRECTORY> Fail if the filename to be opened does not refer to a directory. =item C<O_DSYNC> Synchronize file data immediately, like calling L<fdatasync(2)> after each write. =item C<O_EVTONLY> (Mac OS) Open the file for event notifications, not reading or writing. =item C<O_EXCL> If the file already exists, fail and set C<$!> to L<C<EEXIST>|Errno> (this only makes sense in combination with C<O_CREAT>). =item C<O_EXLOCK> When the file is opened, atomically obtain an exclusive lock. =item C<O_IGNORE_CTTY> (Hurd) If the file to be opened is the controlling terminal for this process, don't recognize it as such. Operations on this filehandle won't trigger job control signals. =item C<O_LARGEFILE> On 32-bit platforms, allow opening files whose size exceeds 2 GiB (2,147,483,647 bytes). =item C<O_NDELAY> Compatibility symbol. Use C<O_NONBLOCK> instead. =item C<O_NOATIME> Don't update the access time of the file when reading from it. =item C<O_NOCTTY> If the process does not have a controlling terminal and the file to be opened is a terminal device, don't make it the controlling terminal of the process. =item C<O_NOFOLLOW> If the final component of the filename is a symbolic link, fail and set C<$!> to L<C<ELOOP>|Errno>. =item C<O_NOINHERIT> (Windows) Don't let child processes inherit the opened file descriptor. =item C<O_NOLINK> (Hurd) If the file to be opened is a symbolic link, don't follow it; open the link itself. =item C<O_NONBLOCK> Open the file in non-blocking mode. Neither the open itself nor any read/write operations on the filehandle will block. (This is mainly useful for pipes and sockets. It has no effect on regular files.) =item C<O_NOSIGPIPE> If the file to be opened is a pipe, then don't raise C<SIGPIPE> for write operations when the read end of the pipe is closed; make the write fail with C<EPIPE> instead. =item C<O_NOTRANS> (Hurd) If the file to be opened is specially translated, don't invoke the translator; open the bare file itself. =item C<O_RANDOM> (Windows) Indicate that the program intends to access the file contents randomly (without a predictable pattern). This is an optimization hint for the file cache (but may cause excessive memory use on large files). =item C<O_RAW> (Windows) Same as C<O_BINARY>. =item C<O_RDONLY> Open the file for reading (only). =item C<O_RDWR> Open the file for reading and writing. =item C<O_RSRC> (Mac OS) Open the resource fork of the file. =item C<O_RSYNC> Extend the effects of C<O_SYNC> and C<O_DSYNC> to read operations. In particular, reading from a filehandle opened with C<O_SYNC | O_RSYNC> will wait until the access time of the file has been modified on disk. =item C<O_SEQUENTIAL> (Windows) Indicate that the program intends to access the file contents sequentially. This is an optimization hint for the file cache. =item C<O_SHLOCK> When the file is opened, atomically obtain a shared lock. =item C<O_SYMLINK> If the file to be opened is a symbolic link, don't follow it; open the link itself. =item C<O_SYNC> Synchronize file data and metadata immediately, like calling L<fsync(2)> after each write. =item C<O_TEMPORARY> (Windows) Delete the file when its last open file descriptor is closed. =item C<O_TEXT> (Windows) Open the file in text mode. =item C<O_TMPFILE> Create an unnamed temporary file. The filename argument specifies the directory the unnamed file should be placed in. =item C<O_TRUNC> If the file already exists, truncate its contents to length 0. =item C<O_TTY_INIT> If the file to be opened is a terminal that is not already open in any process, initialize its L<termios|POSIX/C<POSIX::Termios>> parameters. =item C<O_WRONLY> Open the file for writing (only). =item C<FAPPEND> Compatibility symbol. Use C<O_APPEND> instead. =item C<FASYNC> Compatibility symbol. Use C<O_ASYNC> instead. =item C<FCREAT> Compatibility symbol. Use C<O_CREAT> instead. =item C<FDEFER> Compatibility symbol. Use C<O_DEFER> instead. =item C<FDSYNC> Compatibility symbol. Use C<O_DSYNC> instead. =item C<FEXCL> Compatibility symbol. Use C<O_EXCL> instead. =item C<FLARGEFILE> Compatibility symbol. Use C<O_LARGEFILE> instead. =item C<FNDELAY> Compatibility symbol. Use C<O_NDELAY> instead. =item C<FNONBLOCK> Compatibility symbol. Use C<O_NONBLOCK> instead. =item C<FRSYNC> Compatibility symbol. Use C<O_RSYNC> instead. =item C<FSYNC> Compatibility symbol. Use C<O_SYNC> instead. =item C<FTRUNC> Compatibility symbol. Use C<O_TRUNC> instead. =back =head2 Symbols for use with C<seek> and C<sysseek> =over =item C<SEEK_CUR> File offsets are relative to the current position in the file. =item C<SEEK_END> File offsets are relative to the end of the file (i.e. mostly negative). =item C<SEEK_SET> File offsets are absolute (i.e. relative to the beginning of the file). =back =head2 Symbols for use with C<stat> and C<chmod> =over =item C<S_ENFMT> Enforce mandatory file locks. (This symbol typically shares its value with C<S_ISGID>.) =item C<S_IEXEC> Compatibility symbol. Use C<S_IXUSR> instead. =item C<S_IFBLK> File type: Block device. =item C<S_IFCHR> File type: Character device. =item C<S_IFDIR> File type: Directory. =item C<S_IFIFO> File type: Fifo/pipe. =item C<S_IFLNK> File type: Symbolic link. =item C<S_IFMT> Bit mask for extracting the file type bits. This symbol can also be used as a function: C<S_IFMT($mode)> acts like C<$mode & S_IFMT>. The result will be equal to one of the other S_IF* constants. =item C<_S_IFMT> Bit mask for extracting the file type bits. This symbol is an actual constant and cannot be used as a function; otherwise it is identical to C<S_IFMT>. =item C<S_IFREG> File type: Regular file. =item C<S_IFSOCK> File type: Socket. =item C<S_IFWHT> File type: Whiteout file (used to mark the absence/deletion of a file in overlays). =item C<S_IMODE> Function for extracting the permission bits from a file mode. =item C<S_IREAD> Compatibility symbol. Use C<S_IRUSR> instead. =item C<S_IRGRP> Permissions: Readable by group. =item C<S_IROTH> Permissions: Readable by others. =item C<S_IRUSR> Permissions: Readable by owner. =item C<S_IRWXG> Bit mask for extracting group permissions. =item C<S_IRWXO> Bit mask for extracting other permissions. =item C<S_IRWXU> Bit mask for extracting owner ("user") permissions. =item C<S_ISBLK> Convenience function to check for block devices: C<S_ISBLK($mode)> is equivalent to C<S_IFMT($mode) == S_IFBLK>. =item C<S_ISCHR> Convenience function to check for character devices: C<S_ISCHR($mode)> is equivalent to C<S_IFMT($mode) == S_IFCHR>. =item C<S_ISDIR> Convenience function to check for directories: C<S_ISDIR($mode)> is equivalent to C<S_IFMT($mode) == S_IFDIR>. =item C<S_ISENFMT> Broken function; do not use. (C<S_ISENFMT($mode)> should always return false, anyway.) =item C<S_ISFIFO> Convenience function to check for fifos: C<S_ISFIFO($mode)> is equivalent to C<S_IFMT($mode) == S_IFIFO>. =item C<S_ISGID> Permissions: Set effective group ID from file (when running executables); mandatory locking (on non-group-executable files); new files inherit their group from the directory (on directories). =item C<S_ISLNK> Convenience function to check for symbolic links: C<S_ISLNK($mode)> is equivalent to C<S_IFMT($mode) == S_IFLNK>. =item C<S_ISREG> Convenience function to check for regular files: C<S_ISREG($mode)> is equivalent to C<S_IFMT($mode) == S_IFREG>. =item C<S_ISSOCK> Convenience function to check for sockets: C<S_ISSOCK($mode)> is equivalent to C<S_IFMT($mode) == S_IFSOCK>. =item C<S_ISTXT> Compatibility symbol. Use C<S_ISVTX> instead. =item C<S_ISUID> Permissions: Set effective user ID from file (when running executables). =item C<S_ISVTX> Permissions: Files in this directory can only be deleted/renamed by their owner (or the directory's owner), even if other users have write permissions to the directory ("sticky bit"). =item C<S_ISWHT> Convenience function to check for whiteout files: C<S_ISWHT($mode)> is equivalent to C<S_IFMT($mode) == S_IFWHT>. =item C<S_IWGRP> Permissions: Writable by group. =item C<S_IWOTH> Permissions: Writable by others. =item C<S_IWRITE> Compatibility symbol. Use C<S_IWUSR> instead. =item C<S_IWUSR> Permissions: Writable by owner. =item C<S_IXGRP> Permissions: Executable/searchable by group. =item C<S_IXOTH> Permissions: Executable/searchable by others. =item C<S_IXUSR> Permissions: Executable/searchable by owner. =back =head1 SEE ALSO L<perlfunc/chmod>, L<chmod(2)>, L<perlfunc/fcntl>, L<fcntl(2)>, L<perlfunc/flock>, L<flock(2)>, L<perlfunc/seek>, L<fseek(3)>, L<perlfunc/stat>, L<stat(2)>, L<perlfunc/sysopen>, L<open(2)>, L<perlfunc/sysseek>, L<lseek(2)> =head1 APPENDIX A By default, if you say C<use Fcntl;>, the following symbols are exported: 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_NOINHERIT O_NONBLOCK O_RANDOM O_RAW O_RDONLY O_RDWR O_RSRC O_RSYNC O_SEQUENTIAL O_SHLOCK O_SYNC O_TEMPORARY O_TEXT O_TRUNC O_WRONLY =cut use strict; use Exporter 'import'; require XSLoader; our $VERSION = '1.18'; XSLoader::load(); # Named groups of exports our %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 )], ); # Items to export into callers namespace by default # (move infrequently used names to @EXPORT_OK below) our @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_NOINHERIT O_NONBLOCK O_RANDOM O_RAW O_RDONLY O_RDWR O_RSRC O_RSYNC O_SEQUENTIAL O_SHLOCK O_SYNC O_TEMPORARY O_TEXT O_TRUNC O_WRONLY ); # Other items we are prepared to export if requested our @EXPORT_OK = (qw( DN_ACCESS DN_ATTRIB DN_CREATE DN_DELETE DN_MODIFY DN_MULTISHOT DN_RENAME F_ADD_SEALS F_GETLEASE F_GETPIPE_SZ F_GET_SEALS F_GETSIG F_NOTIFY F_SEAL_FUTURE_WRITE F_SEAL_GROW F_SEAL_SEAL F_SEAL_SHRINK F_SEAL_WRITE F_SETLEASE F_SETPIPE_SZ F_SETSIG LOCK_MAND LOCK_READ LOCK_RW LOCK_WRITE O_ALT_IO O_EVTONLY O_IGNORE_CTTY O_NOATIME O_NOLINK O_NOSIGPIPE O_NOTRANS O_SYMLINK O_TMPFILE O_TTY_INIT ), map {@{$_}} values %EXPORT_TAGS); 1;