/************************************************ fcntl.c - $Author$ created at: Mon Apr 7 18:53:05 JST 1997 Copyright (C) 1997-2001 Yukihiro Matsumoto ************************************************/ /************************************************ = NAME fcntl - load the C fcntl.h defines = DESCRIPTION This module is just a translation of the C file. = NOTE Only #define symbols get translated; you must still correctly pack up your own arguments to pass as args for locking functions, etc. ************************************************/ #include "ruby.h" #include /* Fcntl loads the constants defined in the system's C header * file, and used with both the fcntl(2) and open(2) POSIX system calls. * * To perform a fcntl(2) operation, use IO::fcntl. * * To perform an open(2) operation, use IO::sysopen. * * The set of operations and constants available depends upon specific * operating system. Some values listed below may not be supported on your * system. * * See your fcntl(2) man page for complete details. * * Open /tmp/tempfile as a write-only file that is created if it doesn't * exist: * * require 'fcntl' * * fd = IO.sysopen('/tmp/tempfile', * Fcntl::O_WRONLY | Fcntl::O_EXCL | Fcntl::O_CREAT) * f = IO.open(fd) * f.syswrite("TEMP DATA") * f.close * * Get the flags on file +s+: * * m = s.fcntl(Fcntl::F_GETFL, 0) * * Set the non-blocking flag on +f+ in addition to the existing flags in +m+. * * f.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK|m) * */ #define FCNTL_VERSION "1.0.2" void Init_fcntl(void) { VALUE mFcntl = rb_define_module("Fcntl"); rb_define_const(mFcntl, "VERSION", rb_str_new_cstr(FCNTL_VERSION)); #ifdef F_DUPFD /* Document-const: F_DUPFD * * Duplicate a file descriptor to the minimum unused file descriptor * greater than or equal to the argument. * * The close-on-exec flag of the duplicated file descriptor is set. * (Ruby uses F_DUPFD_CLOEXEC internally if available to avoid race * condition. F_SETFD is used if F_DUPFD_CLOEXEC is not available.) */ rb_define_const(mFcntl, "F_DUPFD", INT2NUM(F_DUPFD)); #endif #ifdef F_GETFD /* Document-const: F_GETFD * * Read the close-on-exec flag of a file descriptor. */ rb_define_const(mFcntl, "F_GETFD", INT2NUM(F_GETFD)); #endif #ifdef F_GETLK /* Document-const: F_GETLK * * Determine whether a given region of a file is locked. This uses one of * the F_*LK flags. */ rb_define_const(mFcntl, "F_GETLK", INT2NUM(F_GETLK)); #endif #ifdef F_SETFD /* Document-const: F_SETFD * * Set the close-on-exec flag of a file descriptor. */ rb_define_const(mFcntl, "F_SETFD", INT2NUM(F_SETFD)); #endif #ifdef F_GETFL /* Document-const: F_GETFL * * Get the file descriptor flags. This will be one or more of the O_* * flags. */ rb_define_const(mFcntl, "F_GETFL", INT2NUM(F_GETFL)); #endif #ifdef F_SETFL /* Document-const: F_SETFL * * Set the file descriptor flags. This will be one or more of the O_* * flags. */ rb_define_const(mFcntl, "F_SETFL", INT2NUM(F_SETFL)); #endif #ifdef F_SETLK /* Document-const: F_SETLK * * Acquire a lock on a region of a file. This uses one of the F_*LCK * flags. */ rb_define_const(mFcntl, "F_SETLK", INT2NUM(F_SETLK)); #endif #ifdef F_SETLKW /* Document-const: F_SETLKW * * Acquire a lock on a region of a file, waiting if necessary. This uses * one of the F_*LCK flags */ rb_define_const(mFcntl, "F_SETLKW", INT2NUM(F_SETLKW)); #endif #ifdef FD_CLOEXEC /* Document-const: FD_CLOEXEC * * the value of the close-on-exec flag. */ rb_define_const(mFcntl, "FD_CLOEXEC", INT2NUM(FD_CLOEXEC)); #endif #ifdef F_RDLCK /* Document-const: F_RDLCK * * Read lock for a region of a file */ rb_define_const(mFcntl, "F_RDLCK", INT2NUM(F_RDLCK)); #endif #ifdef F_UNLCK /* Document-const: F_UNLCK * * Remove lock for a region of a file */ rb_define_const(mFcntl, "F_UNLCK", INT2NUM(F_UNLCK)); #endif #ifdef F_WRLCK /* Document-const: F_WRLCK * * Write lock for a region of a file */ rb_define_const(mFcntl, "F_WRLCK", INT2NUM(F_WRLCK)); #endif #ifdef F_SETPIPE_SZ /* Document-const: F_SETPIPE_SZ * * Change the capacity of the pipe referred to by fd to be at least arg bytes. */ rb_define_const(mFcntl, "F_SETPIPE_SZ", INT2NUM(F_SETPIPE_SZ)); #endif #ifdef F_GETPIPE_SZ /* Document-const: F_GETPIPE_SZ * * Return (as the function result) the capacity of the pipe referred to by fd. */ rb_define_const(mFcntl, "F_GETPIPE_SZ", INT2NUM(F_GETPIPE_SZ)); #endif #ifdef O_CREAT /* Document-const: O_CREAT * * Create the file if it doesn't exist */ rb_define_const(mFcntl, "O_CREAT", INT2NUM(O_CREAT)); #endif #ifdef O_EXCL /* Document-const: O_EXCL * * Used with O_CREAT, fail if the file exists */ rb_define_const(mFcntl, "O_EXCL", INT2NUM(O_EXCL)); #endif #ifdef O_NOCTTY /* Document-const: O_NOCTTY * * Open TTY without it becoming the controlling TTY */ rb_define_const(mFcntl, "O_NOCTTY", INT2NUM(O_NOCTTY)); #endif #ifdef O_TRUNC /* Document-const: O_TRUNC * * Truncate the file on open */ rb_define_const(mFcntl, "O_TRUNC", INT2NUM(O_TRUNC)); #endif #ifdef O_APPEND /* Document-const: O_APPEND * * Open the file in append mode */ rb_define_const(mFcntl, "O_APPEND", INT2NUM(O_APPEND)); #endif #ifdef O_NONBLOCK /* Document-const: O_NONBLOCK * * Open the file in non-blocking mode */ rb_define_const(mFcntl, "O_NONBLOCK", INT2NUM(O_NONBLOCK)); #endif #ifdef O_NDELAY /* Document-const: O_NDELAY * * Open the file in non-blocking mode */ rb_define_const(mFcntl, "O_NDELAY", INT2NUM(O_NDELAY)); #endif #ifdef O_RDONLY /* Document-const: O_RDONLY * * Open the file in read-only mode */ rb_define_const(mFcntl, "O_RDONLY", INT2NUM(O_RDONLY)); #endif #ifdef O_RDWR /* Document-const: O_RDWR * * Open the file in read-write mode */ rb_define_const(mFcntl, "O_RDWR", INT2NUM(O_RDWR)); #endif #ifdef O_WRONLY /* Document-const: O_WRONLY * * Open the file in write-only mode. */ rb_define_const(mFcntl, "O_WRONLY", INT2NUM(O_WRONLY)); #endif #ifdef O_ACCMODE /* Document-const: O_ACCMODE * * Mask to extract the read/write flags */ rb_define_const(mFcntl, "O_ACCMODE", INT2FIX(O_ACCMODE)); #else /* Document-const: O_ACCMODE * * Mask to extract the read/write flags */ rb_define_const(mFcntl, "O_ACCMODE", INT2FIX(O_RDONLY | O_WRONLY | O_RDWR)); #endif #ifdef F_DUP2FD /* Document-const: F_DUP2FD * * It is a FreeBSD specific constant and equivalent * to dup2 call. */ rb_define_const(mFcntl, "F_DUP2FD", INT2NUM(F_DUP2FD)); #endif #ifdef F_DUP2FD_CLOEXEC /* Document-const: F_DUP2FD_CLOEXEC * * It is a FreeBSD specific constant and acts * similarly as F_DUP2FD but set the FD_CLOEXEC * flag in addition. */ rb_define_const(mFcntl, "F_DUP2FD_CLOEXEC", INT2NUM(F_DUP2FD_CLOEXEC)); #endif }