summaryrefslogtreecommitdiff
path: root/ext/fcntl/fcntl.c
blob: c93694c431ba8c4b403049aa866c0eeed21e5ec2 (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
/************************************************

  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 <fcntl.h> 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.h>

/* Fcntl loads the constants defined in the system's <fcntl.h> 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)
 *
 */
void
Init_fcntl(void)
{
    VALUE mFcntl = rb_define_module("Fcntl");
#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 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
}