blob: 1f1cef90eb22ce5add7248e54869df1503b6b687 [file] [log] [blame]
Guido van Rossum02975121992-08-17 08:55:12 +00001
2/* fcntl module */
3
Thomas Wouters26cc63f2006-03-02 00:21:10 +00004#define PY_SSIZE_T_CLEAN
5
Roger E. Masse919213a1996-12-17 17:42:22 +00006#include "Python.h"
Guido van Rossum02975121992-08-17 08:55:12 +00007
Guido van Rossuma376cc51996-12-05 23:43:35 +00008#ifdef HAVE_SYS_FILE_H
9#include <sys/file.h>
10#endif
11
Guido van Rossum3d65fa31996-12-09 18:49:14 +000012#include <sys/ioctl.h>
Guido van Rossum3c0b79c1996-06-11 15:11:34 +000013#include <fcntl.h>
Martin v. Löwis14e73b12003-01-01 09:51:12 +000014#ifdef HAVE_STROPTS_H
15#include <stropts.h>
16#endif
Guido van Rossum02975121992-08-17 08:55:12 +000017
Brett Cannonb7299dd2014-11-09 20:22:01 -050018/*[clinic input]
19output preset file
20module fcntl
21[clinic start generated code]*/
22/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c7356fdb126a904a]*/
23
Fred Drake152a25e2001-05-09 21:02:02 +000024static int
25conv_descriptor(PyObject *object, int *target)
26{
27 int fd = PyObject_AsFileDescriptor(object);
28
29 if (fd < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 return 0;
Fred Drake152a25e2001-05-09 21:02:02 +000031 *target = fd;
32 return 1;
33}
34
Brett Cannonb7299dd2014-11-09 20:22:01 -050035/* Must come after conv_descriptor definition. */
36#include "clinic/fcntlmodule.c.h"
Fred Drake152a25e2001-05-09 21:02:02 +000037
Brett Cannonb7299dd2014-11-09 20:22:01 -050038/*[clinic input]
39fcntl.fcntl
40
41 fd: object(type='int', converter='conv_descriptor')
42 code: int
43 arg: object = NULL
44 /
45
46Perform the operation `code` on file descriptor fd.
47
48The values used for `code` are operating system dependent, and are available
49as constants in the fcntl module, using the same names as used in
50the relevant C header files. The argument arg is optional, and
51defaults to 0; it may be an int or a string. If arg is given as a string,
52the return value of fcntl is a string of that length, containing the
53resulting value put in the arg buffer by the operating system. The length
54of the arg string is not allowed to exceed 1024 bytes. If the arg given
55is an integer or if none is specified, the result value is an integer
56corresponding to the return value of the fcntl call in the C code.
57[clinic start generated code]*/
Guido van Rossum02975121992-08-17 08:55:12 +000058
Roger E. Masse919213a1996-12-17 17:42:22 +000059static PyObject *
Brett Cannonb7299dd2014-11-09 20:22:01 -050060fcntl_fcntl_impl(PyModuleDef *module, int fd, int code, PyObject *arg)
61/*[clinic end generated code: output=afc5bfa74a03ef0d input=4850c13a41e86930]*/
Guido van Rossum02975121992-08-17 08:55:12 +000062{
Serhiy Storchaka5a8dacf2014-11-10 11:25:50 +020063 unsigned int int_arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 int ret;
65 char *str;
66 Py_ssize_t len;
67 char buf[1024];
Guido van Rossum02975121992-08-17 08:55:12 +000068
Brett Cannonb7299dd2014-11-09 20:22:01 -050069 if (arg != NULL) {
70 int parse_result;
71
72 if (PyArg_Parse(arg, "s#", &str, &len)) {
73 if ((size_t)len > sizeof buf) {
74 PyErr_SetString(PyExc_ValueError,
75 "fcntl string arg too long");
76 return NULL;
77 }
78 memcpy(buf, str, len);
79 Py_BEGIN_ALLOW_THREADS
80 ret = fcntl(fd, code, buf);
81 Py_END_ALLOW_THREADS
82 if (ret < 0) {
83 PyErr_SetFromErrno(PyExc_IOError);
84 return NULL;
85 }
86 return PyBytes_FromStringAndSize(buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 }
Brett Cannonb7299dd2014-11-09 20:22:01 -050088
89 PyErr_Clear();
90 parse_result = PyArg_Parse(arg,
Serhiy Storchaka5a8dacf2014-11-10 11:25:50 +020091 "I;fcntl requires a file or file descriptor,"
Brett Cannonb7299dd2014-11-09 20:22:01 -050092 " an integer and optionally a third integer or a string",
93 &int_arg);
94 if (!parse_result) {
95 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 }
Guido van Rossum02975121992-08-17 08:55:12 +000098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 Py_BEGIN_ALLOW_THREADS
Serhiy Storchaka5a8dacf2014-11-10 11:25:50 +0200100 ret = fcntl(fd, code, (int)int_arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 Py_END_ALLOW_THREADS
102 if (ret < 0) {
103 PyErr_SetFromErrno(PyExc_IOError);
104 return NULL;
105 }
106 return PyLong_FromLong((long)ret);
Guido van Rossum02975121992-08-17 08:55:12 +0000107}
108
Guido van Rossum185ead61998-11-23 15:32:55 +0000109
Brett Cannonb7299dd2014-11-09 20:22:01 -0500110/*[clinic input]
111fcntl.ioctl
Guido van Rossum02975121992-08-17 08:55:12 +0000112
Brett Cannonb7299dd2014-11-09 20:22:01 -0500113 fd: object(type='int', converter='conv_descriptor')
114 op as code: unsigned_int(bitwise=True)
115 arg as ob_arg: object = NULL
116 mutate_flag as mutate_arg: bool = True
117 /
118
119Perform the operation op on file descriptor fd.
120
121The values used for op are operating system dependent, and are available as
122constants in the fcntl or termios library modules, using the same names as
123used in the relevant C header files.
124
125The argument `arg` is optional, and defaults to 0; it may be an int or a
126buffer containing character data (most likely a string or an array).
127
128If the argument is a mutable buffer (such as an array) and if the
129mutate_flag argument (which is only allowed in this case) is true then the
130buffer is (in effect) passed to the operating system and changes made by
131the OS will be reflected in the contents of the buffer after the call has
132returned. The return value is the integer returned by the ioctl system
133call.
134
135If the argument is a mutable buffer and the mutable_flag argument is not
136passed or is false, the behavior is as if a string had been passed. This
137behavior will change in future releases of Python.
138
139If the argument is an immutable buffer (most likely a string) then a copy
140of the buffer is passed to the operating system and the return value is a
141string of the same length containing whatever the operating system put in
142the buffer. The length of the arg buffer in this case is not allowed to
143exceed 1024 bytes.
144
145If the arg given is an integer or if none is specified, the result value is
146an integer corresponding to the return value of the ioctl call in the C
147code.
148[clinic start generated code]*/
Guido van Rossum02975121992-08-17 08:55:12 +0000149
Roger E. Masse919213a1996-12-17 17:42:22 +0000150static PyObject *
Brett Cannonb7299dd2014-11-09 20:22:01 -0500151fcntl_ioctl_impl(PyModuleDef *module, int fd, unsigned int code, PyObject *ob_arg, int mutate_arg)
152/*[clinic end generated code: output=ad47738c118622bf input=a55a6ee8e494c449]*/
Guido van Rossum02975121992-08-17 08:55:12 +0000153{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000154#define IOCTL_BUFSZ 1024
Brett Cannonb7299dd2014-11-09 20:22:01 -0500155 /* We use the unsigned non-checked 'I'
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 format for the 'code' parameter because Python turns 0x8000000
157 into either a large positive number (PyLong or PyInt on 64-bit
158 platforms) or a negative number on others (32-bit PyInt)
159 whereas the system expects it to be a 32bit bit field value
160 regardless of it being passed as an int or unsigned long on
161 various platforms. See the termios.TIOCSWINSZ constant across
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500162 platforms for an example of this.
Christian Heimese25f35e2008-03-20 10:49:03 +0000163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 If any of the 64bit platforms ever decide to use more than 32bits
165 in their unsigned long ioctl codes this will break and need
166 special casing based on the platform being built on.
167 */
Brett Cannonb7299dd2014-11-09 20:22:01 -0500168 int arg = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 int ret;
170 Py_buffer pstr;
171 char *str;
172 Py_ssize_t len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 char buf[IOCTL_BUFSZ+1]; /* argument plus NUL byte */
Guido van Rossum02975121992-08-17 08:55:12 +0000174
Brett Cannonb7299dd2014-11-09 20:22:01 -0500175 if (ob_arg != NULL) {
176 if (PyArg_Parse(ob_arg, "w*:ioctl", &pstr)) {
177 char *arg;
178 str = pstr.buf;
179 len = pstr.len;
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000180
Brett Cannonb7299dd2014-11-09 20:22:01 -0500181 if (mutate_arg) {
182 if (len <= IOCTL_BUFSZ) {
183 memcpy(buf, str, len);
184 buf[len] = '\0';
185 arg = buf;
186 }
187 else {
188 arg = str;
189 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 }
191 else {
Brett Cannonb7299dd2014-11-09 20:22:01 -0500192 if (len > IOCTL_BUFSZ) {
193 PyBuffer_Release(&pstr);
194 PyErr_SetString(PyExc_ValueError,
195 "ioctl string arg too long");
196 return NULL;
197 }
198 else {
199 memcpy(buf, str, len);
200 buf[len] = '\0';
201 arg = buf;
202 }
203 }
204 if (buf == arg) {
205 Py_BEGIN_ALLOW_THREADS /* think array.resize() */
206 ret = ioctl(fd, code, arg);
207 Py_END_ALLOW_THREADS
208 }
209 else {
210 ret = ioctl(fd, code, arg);
211 }
212 if (mutate_arg && (len <= IOCTL_BUFSZ)) {
213 memcpy(str, buf, len);
214 }
215 PyBuffer_Release(&pstr); /* No further access to str below this point */
216 if (ret < 0) {
217 PyErr_SetFromErrno(PyExc_IOError);
218 return NULL;
219 }
220 if (mutate_arg) {
221 return PyLong_FromLong(ret);
222 }
223 else {
224 return PyBytes_FromStringAndSize(buf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 }
226 }
Brett Cannonb7299dd2014-11-09 20:22:01 -0500227
228 PyErr_Clear();
229 if (PyArg_Parse(ob_arg, "s*:ioctl", &pstr)) {
230 str = pstr.buf;
231 len = pstr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (len > IOCTL_BUFSZ) {
233 PyBuffer_Release(&pstr);
234 PyErr_SetString(PyExc_ValueError,
Brett Cannonb7299dd2014-11-09 20:22:01 -0500235 "ioctl string arg too long");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 return NULL;
237 }
Brett Cannonb7299dd2014-11-09 20:22:01 -0500238 memcpy(buf, str, len);
239 buf[len] = '\0';
240 Py_BEGIN_ALLOW_THREADS
241 ret = ioctl(fd, code, buf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 Py_END_ALLOW_THREADS
Brett Cannonb7299dd2014-11-09 20:22:01 -0500243 if (ret < 0) {
244 PyBuffer_Release(&pstr);
245 PyErr_SetFromErrno(PyExc_IOError);
246 return NULL;
247 }
248 PyBuffer_Release(&pstr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 return PyBytes_FromStringAndSize(buf, len);
250 }
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000251
Brett Cannonb7299dd2014-11-09 20:22:01 -0500252 PyErr_Clear();
253 if (!PyArg_Parse(ob_arg,
254 "i;ioctl requires a file or file descriptor,"
255 " an integer and optionally an integer or buffer argument",
256 &arg)) {
257 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 }
Brett Cannonb7299dd2014-11-09 20:22:01 -0500259 // Fall-through to outside the 'if' statement.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
261 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 ret = ioctl(fd, code, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 Py_END_ALLOW_THREADS
264 if (ret < 0) {
265 PyErr_SetFromErrno(PyExc_IOError);
266 return NULL;
267 }
268 return PyLong_FromLong((long)ret);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000269#undef IOCTL_BUFSZ
Guido van Rossum02975121992-08-17 08:55:12 +0000270}
271
Brett Cannonb7299dd2014-11-09 20:22:01 -0500272/*[clinic input]
273fcntl.flock
Guido van Rossum185ead61998-11-23 15:32:55 +0000274
Brett Cannonb7299dd2014-11-09 20:22:01 -0500275 fd: object(type='int', converter='conv_descriptor')
276 code: int
277 /
Guido van Rossum02975121992-08-17 08:55:12 +0000278
Brett Cannonb7299dd2014-11-09 20:22:01 -0500279Perform the lock operation op on file descriptor fd.
280
281See the Unix manual page for flock(2) for details (On some systems, this
282function is emulated using fcntl()).
283[clinic start generated code]*/
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000284
Roger E. Masse919213a1996-12-17 17:42:22 +0000285static PyObject *
Brett Cannonb7299dd2014-11-09 20:22:01 -0500286fcntl_flock_impl(PyModuleDef *module, int fd, int code)
287/*[clinic end generated code: output=c9035133a7dbfc96 input=b762aa9448d05e43]*/
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000290
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000291#ifdef HAVE_FLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 Py_BEGIN_ALLOW_THREADS
293 ret = flock(fd, code);
294 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000295#else
296
297#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298#define LOCK_SH 1 /* shared lock */
299#define LOCK_EX 2 /* exclusive lock */
300#define LOCK_NB 4 /* don't block when locking */
301#define LOCK_UN 8 /* unlock */
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 {
304 struct flock l;
305 if (code == LOCK_UN)
306 l.l_type = F_UNLCK;
307 else if (code & LOCK_SH)
308 l.l_type = F_RDLCK;
309 else if (code & LOCK_EX)
310 l.l_type = F_WRLCK;
311 else {
312 PyErr_SetString(PyExc_ValueError,
313 "unrecognized flock argument");
314 return NULL;
315 }
316 l.l_whence = l.l_start = l.l_len = 0;
317 Py_BEGIN_ALLOW_THREADS
318 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
319 Py_END_ALLOW_THREADS
320 }
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000321#endif /* HAVE_FLOCK */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 if (ret < 0) {
323 PyErr_SetFromErrno(PyExc_IOError);
324 return NULL;
325 }
Brett Cannonb7299dd2014-11-09 20:22:01 -0500326 Py_RETURN_NONE;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000327}
328
Guido van Rossum185ead61998-11-23 15:32:55 +0000329
Brett Cannonb7299dd2014-11-09 20:22:01 -0500330/*[clinic input]
331fcntl.lockf
Guido van Rossum185ead61998-11-23 15:32:55 +0000332
Brett Cannonb7299dd2014-11-09 20:22:01 -0500333 fd: object(type='int', converter='conv_descriptor')
334 code: int
335 lenobj: object = NULL
336 startobj: object = NULL
337 whence: int = 0
338 /
339
340A wrapper around the fcntl() locking calls.
341
342fd is the file descriptor of the file to lock or unlock, and operation is one
343of the following values:
344
345 LOCK_UN - unlock
346 LOCK_SH - acquire a shared lock
347 LOCK_EX - acquire an exclusive lock
348
349When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with
350LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the
351lock cannot be acquired, an IOError will be raised and the exception will
352have an errno attribute set to EACCES or EAGAIN (depending on the operating
353system -- for portability, check for either value).
354
355length is the number of bytes to lock, with the default meaning to lock to
356EOF. start is the byte offset, relative to whence, to that the lock
357starts. whence is as with fileobj.seek(), specifically:
358
359 0 - relative to the start of the file (SEEK_SET)
360 1 - relative to the current buffer position (SEEK_CUR)
361 2 - relative to the end of the file (SEEK_END)
362[clinic start generated code]*/
363
Roger E. Masse919213a1996-12-17 17:42:22 +0000364static PyObject *
Brett Cannonb7299dd2014-11-09 20:22:01 -0500365fcntl_lockf_impl(PyModuleDef *module, int fd, int code, PyObject *lenobj, PyObject *startobj, int whence)
366/*[clinic end generated code: output=5536df2892bf3ce9 input=44856fa06db36184]*/
Guido van Rossumc8643641996-09-11 23:17:20 +0000367{
Brett Cannonb7299dd2014-11-09 20:22:01 -0500368 int ret;
Guido van Rossumc8643641996-09-11 23:17:20 +0000369
Guido van Rossumc8643641996-09-11 23:17:20 +0000370#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371#define LOCK_SH 1 /* shared lock */
372#define LOCK_EX 2 /* exclusive lock */
373#define LOCK_NB 4 /* don't block when locking */
374#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000375#endif /* LOCK_SH */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 {
377 struct flock l;
378 if (code == LOCK_UN)
379 l.l_type = F_UNLCK;
380 else if (code & LOCK_SH)
381 l.l_type = F_RDLCK;
382 else if (code & LOCK_EX)
383 l.l_type = F_WRLCK;
384 else {
385 PyErr_SetString(PyExc_ValueError,
386 "unrecognized lockf argument");
387 return NULL;
388 }
389 l.l_start = l.l_len = 0;
390 if (startobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000391#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 l.l_start = PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000393#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 l.l_start = PyLong_Check(startobj) ?
395 PyLong_AsLongLong(startobj) :
396 PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 if (PyErr_Occurred())
399 return NULL;
400 }
401 if (lenobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000402#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 l.l_len = PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000404#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 l.l_len = PyLong_Check(lenobj) ?
406 PyLong_AsLongLong(lenobj) :
407 PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 if (PyErr_Occurred())
410 return NULL;
411 }
412 l.l_whence = whence;
413 Py_BEGIN_ALLOW_THREADS
414 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
415 Py_END_ALLOW_THREADS
416 }
417 if (ret < 0) {
418 PyErr_SetFromErrno(PyExc_IOError);
419 return NULL;
420 }
Brett Cannonb7299dd2014-11-09 20:22:01 -0500421 Py_RETURN_NONE;
Guido van Rossumc8643641996-09-11 23:17:20 +0000422}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000423
Guido van Rossum02975121992-08-17 08:55:12 +0000424/* List of functions */
425
Roger E. Masse919213a1996-12-17 17:42:22 +0000426static PyMethodDef fcntl_methods[] = {
Brett Cannonb7299dd2014-11-09 20:22:01 -0500427 FCNTL_FCNTL_METHODDEF
428 FCNTL_IOCTL_METHODDEF
429 FCNTL_FLOCK_METHODDEF
430 FCNTL_LOCKF_METHODDEF
431 {NULL, NULL} /* sentinel */
Guido van Rossum02975121992-08-17 08:55:12 +0000432};
433
434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000435PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000436"This module performs file control and I/O control on file \n\
437descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
438routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000439a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000440
Guido van Rossum02975121992-08-17 08:55:12 +0000441/* Module initialisation */
442
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000443
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000444static int
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200445all_ins(PyObject* m)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000446{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200447 if (PyModule_AddIntMacro(m, LOCK_SH)) return -1;
448 if (PyModule_AddIntMacro(m, LOCK_EX)) return -1;
449 if (PyModule_AddIntMacro(m, LOCK_NB)) return -1;
450 if (PyModule_AddIntMacro(m, LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000451/* GNU extensions, as of glibc 2.2.4 */
452#ifdef LOCK_MAND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200453 if (PyModule_AddIntMacro(m, LOCK_MAND)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000454#endif
455#ifdef LOCK_READ
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200456 if (PyModule_AddIntMacro(m, LOCK_READ)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000457#endif
458#ifdef LOCK_WRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200459 if (PyModule_AddIntMacro(m, LOCK_WRITE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000460#endif
461#ifdef LOCK_RW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200462 if (PyModule_AddIntMacro(m, LOCK_RW)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000463#endif
464
Fred Drake152a25e2001-05-09 21:02:02 +0000465#ifdef F_DUPFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200466 if (PyModule_AddIntMacro(m, F_DUPFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000467#endif
Victor Stinner2716d532013-01-08 00:52:40 +0100468#ifdef F_DUPFD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200469 if (PyModule_AddIntMacro(m, F_DUPFD_CLOEXEC)) return -1;
Victor Stinner2716d532013-01-08 00:52:40 +0100470#endif
Fred Drake152a25e2001-05-09 21:02:02 +0000471#ifdef F_GETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200472 if (PyModule_AddIntMacro(m, F_GETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000473#endif
474#ifdef F_SETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200475 if (PyModule_AddIntMacro(m, F_SETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000476#endif
477#ifdef F_GETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200478 if (PyModule_AddIntMacro(m, F_GETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000479#endif
480#ifdef F_SETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200481 if (PyModule_AddIntMacro(m, F_SETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000482#endif
483#ifdef F_GETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200484 if (PyModule_AddIntMacro(m, F_GETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000485#endif
486#ifdef F_SETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200487 if (PyModule_AddIntMacro(m, F_SETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000488#endif
489#ifdef F_SETLKW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200490 if (PyModule_AddIntMacro(m, F_SETLKW)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000491#endif
492#ifdef F_GETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200493 if (PyModule_AddIntMacro(m, F_GETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000494#endif
495#ifdef F_SETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200496 if (PyModule_AddIntMacro(m, F_SETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000497#endif
498#ifdef F_GETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200499 if (PyModule_AddIntMacro(m, F_GETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000500#endif
501#ifdef F_SETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200502 if (PyModule_AddIntMacro(m, F_SETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000503#endif
504#ifdef F_RDLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200505 if (PyModule_AddIntMacro(m, F_RDLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000506#endif
507#ifdef F_WRLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200508 if (PyModule_AddIntMacro(m, F_WRLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000509#endif
510#ifdef F_UNLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200511 if (PyModule_AddIntMacro(m, F_UNLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000512#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000513/* LFS constants */
514#ifdef F_GETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200515 if (PyModule_AddIntMacro(m, F_GETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000516#endif
517#ifdef F_SETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200518 if (PyModule_AddIntMacro(m, F_SETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000519#endif
520#ifdef F_SETLKW64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200521 if (PyModule_AddIntMacro(m, F_SETLKW64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000522#endif
523/* GNU extensions, as of glibc 2.2.4. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000524#ifdef FASYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200525 if (PyModule_AddIntMacro(m, FASYNC)) return -1;
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000526#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000527#ifdef F_SETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200528 if (PyModule_AddIntMacro(m, F_SETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000529#endif
530#ifdef F_GETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200531 if (PyModule_AddIntMacro(m, F_GETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000532#endif
533#ifdef F_NOTIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200534 if (PyModule_AddIntMacro(m, F_NOTIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000535#endif
536/* Old BSD flock(). */
537#ifdef F_EXLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200538 if (PyModule_AddIntMacro(m, F_EXLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000539#endif
540#ifdef F_SHLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200541 if (PyModule_AddIntMacro(m, F_SHLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000542#endif
543
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100544/* OS X specifics */
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000545#ifdef F_FULLFSYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200546 if (PyModule_AddIntMacro(m, F_FULLFSYNC)) return -1;
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000547#endif
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100548#ifdef F_NOCACHE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200549 if (PyModule_AddIntMacro(m, F_NOCACHE)) return -1;
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100550#endif
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000551
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000552/* For F_{GET|SET}FL */
553#ifdef FD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200554 if (PyModule_AddIntMacro(m, FD_CLOEXEC)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000555#endif
556
557/* For F_NOTIFY */
558#ifdef DN_ACCESS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200559 if (PyModule_AddIntMacro(m, DN_ACCESS)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000560#endif
561#ifdef DN_MODIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200562 if (PyModule_AddIntMacro(m, DN_MODIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000563#endif
564#ifdef DN_CREATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200565 if (PyModule_AddIntMacro(m, DN_CREATE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000566#endif
567#ifdef DN_DELETE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200568 if (PyModule_AddIntMacro(m, DN_DELETE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000569#endif
570#ifdef DN_RENAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200571 if (PyModule_AddIntMacro(m, DN_RENAME)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000572#endif
573#ifdef DN_ATTRIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200574 if (PyModule_AddIntMacro(m, DN_ATTRIB)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000575#endif
576#ifdef DN_MULTISHOT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200577 if (PyModule_AddIntMacro(m, DN_MULTISHOT)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000578#endif
579
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000580#ifdef HAVE_STROPTS_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 /* Unix 98 guarantees that these are in stropts.h. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200582 if (PyModule_AddIntMacro(m, I_PUSH)) return -1;
583 if (PyModule_AddIntMacro(m, I_POP)) return -1;
584 if (PyModule_AddIntMacro(m, I_LOOK)) return -1;
585 if (PyModule_AddIntMacro(m, I_FLUSH)) return -1;
586 if (PyModule_AddIntMacro(m, I_FLUSHBAND)) return -1;
587 if (PyModule_AddIntMacro(m, I_SETSIG)) return -1;
588 if (PyModule_AddIntMacro(m, I_GETSIG)) return -1;
589 if (PyModule_AddIntMacro(m, I_FIND)) return -1;
590 if (PyModule_AddIntMacro(m, I_PEEK)) return -1;
591 if (PyModule_AddIntMacro(m, I_SRDOPT)) return -1;
592 if (PyModule_AddIntMacro(m, I_GRDOPT)) return -1;
593 if (PyModule_AddIntMacro(m, I_NREAD)) return -1;
594 if (PyModule_AddIntMacro(m, I_FDINSERT)) return -1;
595 if (PyModule_AddIntMacro(m, I_STR)) return -1;
596 if (PyModule_AddIntMacro(m, I_SWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000597#ifdef I_GWROPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 /* despite the comment above, old-ish glibcs miss a couple... */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200599 if (PyModule_AddIntMacro(m, I_GWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000600#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200601 if (PyModule_AddIntMacro(m, I_SENDFD)) return -1;
602 if (PyModule_AddIntMacro(m, I_RECVFD)) return -1;
603 if (PyModule_AddIntMacro(m, I_LIST)) return -1;
604 if (PyModule_AddIntMacro(m, I_ATMARK)) return -1;
605 if (PyModule_AddIntMacro(m, I_CKBAND)) return -1;
606 if (PyModule_AddIntMacro(m, I_GETBAND)) return -1;
607 if (PyModule_AddIntMacro(m, I_CANPUT)) return -1;
608 if (PyModule_AddIntMacro(m, I_SETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000609#ifdef I_GETCLTIME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200610 if (PyModule_AddIntMacro(m, I_GETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000611#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200612 if (PyModule_AddIntMacro(m, I_LINK)) return -1;
613 if (PyModule_AddIntMacro(m, I_UNLINK)) return -1;
614 if (PyModule_AddIntMacro(m, I_PLINK)) return -1;
615 if (PyModule_AddIntMacro(m, I_PUNLINK)) return -1;
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617
618 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000619}
620
Martin v. Löwis1a214512008-06-11 05:26:20 +0000621
622static struct PyModuleDef fcntlmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 PyModuleDef_HEAD_INIT,
624 "fcntl",
625 module_doc,
626 -1,
627 fcntl_methods,
628 NULL,
629 NULL,
630 NULL,
631 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000632};
633
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000634PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000635PyInit_fcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000636{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200637 PyObject *m;
Guido van Rossum02975121992-08-17 08:55:12 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Create the module and add the functions and documentation */
640 m = PyModule_Create(&fcntlmodule);
641 if (m == NULL)
642 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 /* Add some symbolic constants to the module */
Charles-François Natali5abca142013-12-01 14:30:47 +0100645 if (all_ins(m) < 0)
646 return NULL;
647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 return m;
Guido van Rossum02975121992-08-17 08:55:12 +0000649}