blob: e54c8e042a51a3e2735c1ec613449a2f735c9d32 [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
Fred Drake152a25e2001-05-09 21:02:02 +000018static int
19conv_descriptor(PyObject *object, int *target)
20{
21 int fd = PyObject_AsFileDescriptor(object);
22
23 if (fd < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000024 return 0;
Fred Drake152a25e2001-05-09 21:02:02 +000025 *target = fd;
26 return 1;
27}
28
29
R David Murrayd5a2f0b2013-11-07 10:51:07 -050030/* fcntl(fd, op, [arg]) */
Guido van Rossum02975121992-08-17 08:55:12 +000031
Roger E. Masse919213a1996-12-17 17:42:22 +000032static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +000033fcntl_fcntl(PyObject *self, PyObject *args)
Guido van Rossum02975121992-08-17 08:55:12 +000034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 int fd;
36 int code;
37 long arg;
38 int ret;
39 char *str;
40 Py_ssize_t len;
41 char buf[1024];
Guido van Rossum02975121992-08-17 08:55:12 +000042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 if (PyArg_ParseTuple(args, "O&is#:fcntl",
44 conv_descriptor, &fd, &code, &str, &len)) {
45 if (len > sizeof buf) {
46 PyErr_SetString(PyExc_ValueError,
47 "fcntl string arg too long");
48 return NULL;
49 }
50 memcpy(buf, str, len);
51 Py_BEGIN_ALLOW_THREADS
52 ret = fcntl(fd, code, buf);
53 Py_END_ALLOW_THREADS
54 if (ret < 0) {
55 PyErr_SetFromErrno(PyExc_IOError);
56 return NULL;
57 }
58 return PyBytes_FromStringAndSize(buf, len);
59 }
Guido van Rossum02975121992-08-17 08:55:12 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 PyErr_Clear();
62 arg = 0;
63 if (!PyArg_ParseTuple(args,
64 "O&i|l;fcntl requires a file or file descriptor,"
65 " an integer and optionally a third integer or a string",
66 conv_descriptor, &fd, &code, &arg)) {
67 return NULL;
68 }
69 Py_BEGIN_ALLOW_THREADS
70 ret = fcntl(fd, code, arg);
71 Py_END_ALLOW_THREADS
72 if (ret < 0) {
73 PyErr_SetFromErrno(PyExc_IOError);
74 return NULL;
75 }
76 return PyLong_FromLong((long)ret);
Guido van Rossum02975121992-08-17 08:55:12 +000077}
78
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000079PyDoc_STRVAR(fcntl_doc,
R David Murrayd5a2f0b2013-11-07 10:51:07 -050080"fcntl(fd, op, [arg])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +000081\n\
R David Murrayd5a2f0b2013-11-07 10:51:07 -050082Perform the operation op on file descriptor fd. The values used\n\
83for op are operating system dependent, and are available\n\
84as constants in the fcntl module, using the same names as used in\n\
85the relevant C header files. The argument arg is optional, and\n\
Georg Brandl1f94cd02010-09-05 17:09:18 +000086defaults to 0; it may be an int or a string. If arg is given as a string,\n\
Fred Drake1d531992001-05-10 15:54:32 +000087the return value of fcntl is a string of that length, containing the\n\
Georg Brandl1f94cd02010-09-05 17:09:18 +000088resulting value put in the arg buffer by the operating system. The length\n\
89of the arg string is not allowed to exceed 1024 bytes. If the arg given\n\
Fred Drake1d531992001-05-10 15:54:32 +000090is an integer or if none is specified, the result value is an integer\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000091corresponding to the return value of the fcntl call in the C code.");
Guido van Rossum185ead61998-11-23 15:32:55 +000092
Guido van Rossum02975121992-08-17 08:55:12 +000093
R David Murrayd5a2f0b2013-11-07 10:51:07 -050094/* ioctl(fd, op, [arg]) */
Guido van Rossum02975121992-08-17 08:55:12 +000095
Roger E. Masse919213a1996-12-17 17:42:22 +000096static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +000097fcntl_ioctl(PyObject *self, PyObject *args)
Guido van Rossum02975121992-08-17 08:55:12 +000098{
Thomas Wouters477c8d52006-05-27 19:21:47 +000099#define IOCTL_BUFSZ 1024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 int fd;
101 /* In PyArg_ParseTuple below, we use the unsigned non-checked 'I'
102 format for the 'code' parameter because Python turns 0x8000000
103 into either a large positive number (PyLong or PyInt on 64-bit
104 platforms) or a negative number on others (32-bit PyInt)
105 whereas the system expects it to be a 32bit bit field value
106 regardless of it being passed as an int or unsigned long on
107 various platforms. See the termios.TIOCSWINSZ constant across
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500108 platforms for an example of this.
Christian Heimese25f35e2008-03-20 10:49:03 +0000109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 If any of the 64bit platforms ever decide to use more than 32bits
111 in their unsigned long ioctl codes this will break and need
112 special casing based on the platform being built on.
113 */
114 unsigned int code;
115 int arg;
116 int ret;
117 Py_buffer pstr;
118 char *str;
119 Py_ssize_t len;
120 int mutate_arg = 1;
121 char buf[IOCTL_BUFSZ+1]; /* argument plus NUL byte */
Guido van Rossum02975121992-08-17 08:55:12 +0000122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 if (PyArg_ParseTuple(args, "O&Iw*|i:ioctl",
124 conv_descriptor, &fd, &code,
125 &pstr, &mutate_arg)) {
126 char *arg;
127 str = pstr.buf;
128 len = pstr.len;
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 if (mutate_arg) {
131 if (len <= IOCTL_BUFSZ) {
132 memcpy(buf, str, len);
133 buf[len] = '\0';
134 arg = buf;
135 }
136 else {
137 arg = str;
138 }
139 }
140 else {
141 if (len > IOCTL_BUFSZ) {
142 PyBuffer_Release(&pstr);
143 PyErr_SetString(PyExc_ValueError,
144 "ioctl string arg too long");
145 return NULL;
146 }
147 else {
148 memcpy(buf, str, len);
149 buf[len] = '\0';
150 arg = buf;
151 }
152 }
153 if (buf == arg) {
154 Py_BEGIN_ALLOW_THREADS /* think array.resize() */
155 ret = ioctl(fd, code, arg);
156 Py_END_ALLOW_THREADS
157 }
158 else {
159 ret = ioctl(fd, code, arg);
160 }
Antoine Pitrou5e38aae2010-09-07 16:30:09 +0000161 if (mutate_arg && (len <= IOCTL_BUFSZ)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 memcpy(str, buf, len);
163 }
164 PyBuffer_Release(&pstr); /* No further access to str below this point */
165 if (ret < 0) {
166 PyErr_SetFromErrno(PyExc_IOError);
167 return NULL;
168 }
169 if (mutate_arg) {
170 return PyLong_FromLong(ret);
171 }
172 else {
173 return PyBytes_FromStringAndSize(buf, len);
174 }
175 }
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 PyErr_Clear();
178 if (PyArg_ParseTuple(args, "O&Is*:ioctl",
179 conv_descriptor, &fd, &code, &pstr)) {
180 str = pstr.buf;
181 len = pstr.len;
182 if (len > IOCTL_BUFSZ) {
183 PyBuffer_Release(&pstr);
184 PyErr_SetString(PyExc_ValueError,
185 "ioctl string arg too long");
186 return NULL;
187 }
188 memcpy(buf, str, len);
189 buf[len] = '\0';
190 Py_BEGIN_ALLOW_THREADS
191 ret = ioctl(fd, code, buf);
192 Py_END_ALLOW_THREADS
193 if (ret < 0) {
194 PyBuffer_Release(&pstr);
195 PyErr_SetFromErrno(PyExc_IOError);
196 return NULL;
197 }
198 PyBuffer_Release(&pstr);
199 return PyBytes_FromStringAndSize(buf, len);
200 }
Guido van Rossum02975121992-08-17 08:55:12 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 PyErr_Clear();
203 arg = 0;
204 if (!PyArg_ParseTuple(args,
205 "O&I|i;ioctl requires a file or file descriptor,"
206 " an integer and optionally an integer or buffer argument",
207 conv_descriptor, &fd, &code, &arg)) {
208 return NULL;
209 }
210 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000211#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 ret = ioctl(fd, code, (void *)arg);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000213#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 ret = ioctl(fd, code, arg);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 Py_END_ALLOW_THREADS
217 if (ret < 0) {
218 PyErr_SetFromErrno(PyExc_IOError);
219 return NULL;
220 }
221 return PyLong_FromLong((long)ret);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000222#undef IOCTL_BUFSZ
Guido van Rossum02975121992-08-17 08:55:12 +0000223}
224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000225PyDoc_STRVAR(ioctl_doc,
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500226"ioctl(fd, op[, arg[, mutate_flag]])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +0000227\n\
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500228Perform the operation op on file descriptor fd. The values used for op\n\
229are operating system dependent, and are available as constants in the\n\
230fcntl or termios library modules, using the same names as used in the\n\
231relevant C header files.\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000232\n\
233The argument arg is optional, and defaults to 0; it may be an int or a\n\
234buffer containing character data (most likely a string or an array). \n\
235\n\
236If the argument is a mutable buffer (such as an array) and if the\n\
237mutate_flag argument (which is only allowed in this case) is true then the\n\
238buffer is (in effect) passed to the operating system and changes made by\n\
239the OS will be reflected in the contents of the buffer after the call has\n\
240returned. The return value is the integer returned by the ioctl system\n\
241call.\n\
242\n\
243If the argument is a mutable buffer and the mutable_flag argument is not\n\
244passed or is false, the behavior is as if a string had been passed. This\n\
245behavior will change in future releases of Python.\n\
246\n\
247If the argument is an immutable buffer (most likely a string) then a copy\n\
248of the buffer is passed to the operating system and the return value is a\n\
249string of the same length containing whatever the operating system put in\n\
250the buffer. The length of the arg buffer in this case is not allowed to\n\
251exceed 1024 bytes.\n\
252\n\
253If the arg given is an integer or if none is specified, the result value is\n\
254an integer corresponding to the return value of the ioctl call in the C\n\
255code.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000256
Guido van Rossum02975121992-08-17 08:55:12 +0000257
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000258/* flock(fd, operation) */
259
Roger E. Masse919213a1996-12-17 17:42:22 +0000260static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000261fcntl_flock(PyObject *self, PyObject *args)
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 int fd;
264 int code;
265 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 if (!PyArg_ParseTuple(args, "O&i:flock",
268 conv_descriptor, &fd, &code))
269 return NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000270
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000271#ifdef HAVE_FLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 Py_BEGIN_ALLOW_THREADS
273 ret = flock(fd, code);
274 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000275#else
276
277#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278#define LOCK_SH 1 /* shared lock */
279#define LOCK_EX 2 /* exclusive lock */
280#define LOCK_NB 4 /* don't block when locking */
281#define LOCK_UN 8 /* unlock */
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 {
284 struct flock l;
285 if (code == LOCK_UN)
286 l.l_type = F_UNLCK;
287 else if (code & LOCK_SH)
288 l.l_type = F_RDLCK;
289 else if (code & LOCK_EX)
290 l.l_type = F_WRLCK;
291 else {
292 PyErr_SetString(PyExc_ValueError,
293 "unrecognized flock argument");
294 return NULL;
295 }
296 l.l_whence = l.l_start = l.l_len = 0;
297 Py_BEGIN_ALLOW_THREADS
298 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
299 Py_END_ALLOW_THREADS
300 }
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000301#endif /* HAVE_FLOCK */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 if (ret < 0) {
303 PyErr_SetFromErrno(PyExc_IOError);
304 return NULL;
305 }
306 Py_INCREF(Py_None);
307 return Py_None;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000308}
309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000310PyDoc_STRVAR(flock_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000311"flock(fd, operation)\n\
312\n\
313Perform the lock operation op on file descriptor fd. See the Unix \n\
Ned Deily2a8b3f22013-10-02 12:20:46 -0700314manual page for flock(2) for details. (On some systems, this function is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000315emulated using fcntl().)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000316
317
Guido van Rossumc8643641996-09-11 23:17:20 +0000318/* lockf(fd, operation) */
Roger E. Masse919213a1996-12-17 17:42:22 +0000319static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000320fcntl_lockf(PyObject *self, PyObject *args)
Guido van Rossumc8643641996-09-11 23:17:20 +0000321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 int fd, code, ret, whence = 0;
323 PyObject *lenobj = NULL, *startobj = NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 if (!PyArg_ParseTuple(args, "O&i|OOi:lockf",
326 conv_descriptor, &fd, &code,
327 &lenobj, &startobj, &whence))
328 return NULL;
Guido van Rossumc8643641996-09-11 23:17:20 +0000329
Guido van Rossumc8643641996-09-11 23:17:20 +0000330#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331#define LOCK_SH 1 /* shared lock */
332#define LOCK_EX 2 /* exclusive lock */
333#define LOCK_NB 4 /* don't block when locking */
334#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000335#endif /* LOCK_SH */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 {
337 struct flock l;
338 if (code == LOCK_UN)
339 l.l_type = F_UNLCK;
340 else if (code & LOCK_SH)
341 l.l_type = F_RDLCK;
342 else if (code & LOCK_EX)
343 l.l_type = F_WRLCK;
344 else {
345 PyErr_SetString(PyExc_ValueError,
346 "unrecognized lockf argument");
347 return NULL;
348 }
349 l.l_start = l.l_len = 0;
350 if (startobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000351#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 l.l_start = PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000353#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 l.l_start = PyLong_Check(startobj) ?
355 PyLong_AsLongLong(startobj) :
356 PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 if (PyErr_Occurred())
359 return NULL;
360 }
361 if (lenobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000362#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 l.l_len = PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000364#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 l.l_len = PyLong_Check(lenobj) ?
366 PyLong_AsLongLong(lenobj) :
367 PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 if (PyErr_Occurred())
370 return NULL;
371 }
372 l.l_whence = whence;
373 Py_BEGIN_ALLOW_THREADS
374 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
375 Py_END_ALLOW_THREADS
376 }
377 if (ret < 0) {
378 PyErr_SetFromErrno(PyExc_IOError);
379 return NULL;
380 }
381 Py_INCREF(Py_None);
382 return Py_None;
Guido van Rossumc8643641996-09-11 23:17:20 +0000383}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000385PyDoc_STRVAR(lockf_doc,
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000386"lockf (fd, operation, length=0, start=0, whence=0)\n\
387\n\
388This is essentially a wrapper around the fcntl() locking calls. fd is the\n\
389file descriptor of the file to lock or unlock, and operation is one of the\n\
390following values:\n\
391\n\
392 LOCK_UN - unlock\n\
393 LOCK_SH - acquire a shared lock\n\
394 LOCK_EX - acquire an exclusive lock\n\
395\n\
Christian Heimesfaf2f632008-01-06 16:59:19 +0000396When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with\n\
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000397LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n\
398lock cannot be acquired, an IOError will be raised and the exception will\n\
399have an errno attribute set to EACCES or EAGAIN (depending on the operating\n\
400system -- for portability, check for either value).\n\
401\n\
402length is the number of bytes to lock, with the default meaning to lock to\n\
403EOF. start is the byte offset, relative to whence, to that the lock\n\
404starts. whence is as with fileobj.seek(), specifically:\n\
405\n\
406 0 - relative to the start of the file (SEEK_SET)\n\
407 1 - relative to the current buffer position (SEEK_CUR)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000408 2 - relative to the end of the file (SEEK_END)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000409
Guido van Rossum02975121992-08-17 08:55:12 +0000410/* List of functions */
411
Roger E. Masse919213a1996-12-17 17:42:22 +0000412static PyMethodDef fcntl_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 {"fcntl", fcntl_fcntl, METH_VARARGS, fcntl_doc},
414 {"ioctl", fcntl_ioctl, METH_VARARGS, ioctl_doc},
415 {"flock", fcntl_flock, METH_VARARGS, flock_doc},
416 {"lockf", fcntl_lockf, METH_VARARGS, lockf_doc},
417 {NULL, NULL} /* sentinel */
Guido van Rossum02975121992-08-17 08:55:12 +0000418};
419
420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000421PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000422"This module performs file control and I/O control on file \n\
423descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
424routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000425a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000426
Guido van Rossum02975121992-08-17 08:55:12 +0000427/* Module initialisation */
428
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000429
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000430static int
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200431all_ins(PyObject* m)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000432{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200433 if (PyModule_AddIntMacro(m, LOCK_SH)) return -1;
434 if (PyModule_AddIntMacro(m, LOCK_EX)) return -1;
435 if (PyModule_AddIntMacro(m, LOCK_NB)) return -1;
436 if (PyModule_AddIntMacro(m, LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000437/* GNU extensions, as of glibc 2.2.4 */
438#ifdef LOCK_MAND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200439 if (PyModule_AddIntMacro(m, LOCK_MAND)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000440#endif
441#ifdef LOCK_READ
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200442 if (PyModule_AddIntMacro(m, LOCK_READ)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000443#endif
444#ifdef LOCK_WRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200445 if (PyModule_AddIntMacro(m, LOCK_WRITE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000446#endif
447#ifdef LOCK_RW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200448 if (PyModule_AddIntMacro(m, LOCK_RW)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000449#endif
450
Fred Drake152a25e2001-05-09 21:02:02 +0000451#ifdef F_DUPFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200452 if (PyModule_AddIntMacro(m, F_DUPFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000453#endif
Victor Stinner2716d532013-01-08 00:52:40 +0100454#ifdef F_DUPFD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200455 if (PyModule_AddIntMacro(m, F_DUPFD_CLOEXEC)) return -1;
Victor Stinner2716d532013-01-08 00:52:40 +0100456#endif
Fred Drake152a25e2001-05-09 21:02:02 +0000457#ifdef F_GETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200458 if (PyModule_AddIntMacro(m, F_GETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000459#endif
460#ifdef F_SETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200461 if (PyModule_AddIntMacro(m, F_SETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000462#endif
463#ifdef F_GETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200464 if (PyModule_AddIntMacro(m, F_GETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000465#endif
466#ifdef F_SETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200467 if (PyModule_AddIntMacro(m, F_SETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000468#endif
469#ifdef F_GETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200470 if (PyModule_AddIntMacro(m, F_GETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000471#endif
472#ifdef F_SETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200473 if (PyModule_AddIntMacro(m, F_SETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000474#endif
475#ifdef F_SETLKW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200476 if (PyModule_AddIntMacro(m, F_SETLKW)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000477#endif
478#ifdef F_GETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200479 if (PyModule_AddIntMacro(m, F_GETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000480#endif
481#ifdef F_SETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200482 if (PyModule_AddIntMacro(m, F_SETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000483#endif
484#ifdef F_GETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200485 if (PyModule_AddIntMacro(m, F_GETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000486#endif
487#ifdef F_SETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200488 if (PyModule_AddIntMacro(m, F_SETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000489#endif
490#ifdef F_RDLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200491 if (PyModule_AddIntMacro(m, F_RDLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000492#endif
493#ifdef F_WRLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200494 if (PyModule_AddIntMacro(m, F_WRLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000495#endif
496#ifdef F_UNLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200497 if (PyModule_AddIntMacro(m, F_UNLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000498#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000499/* LFS constants */
500#ifdef F_GETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200501 if (PyModule_AddIntMacro(m, F_GETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000502#endif
503#ifdef F_SETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200504 if (PyModule_AddIntMacro(m, F_SETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000505#endif
506#ifdef F_SETLKW64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200507 if (PyModule_AddIntMacro(m, F_SETLKW64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000508#endif
509/* GNU extensions, as of glibc 2.2.4. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000510#ifdef FASYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200511 if (PyModule_AddIntMacro(m, FASYNC)) return -1;
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000512#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000513#ifdef F_SETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200514 if (PyModule_AddIntMacro(m, F_SETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000515#endif
516#ifdef F_GETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200517 if (PyModule_AddIntMacro(m, F_GETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000518#endif
519#ifdef F_NOTIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200520 if (PyModule_AddIntMacro(m, F_NOTIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000521#endif
522/* Old BSD flock(). */
523#ifdef F_EXLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200524 if (PyModule_AddIntMacro(m, F_EXLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000525#endif
526#ifdef F_SHLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200527 if (PyModule_AddIntMacro(m, F_SHLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000528#endif
529
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100530/* OS X specifics */
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000531#ifdef F_FULLFSYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200532 if (PyModule_AddIntMacro(m, F_FULLFSYNC)) return -1;
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000533#endif
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100534#ifdef F_NOCACHE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200535 if (PyModule_AddIntMacro(m, F_NOCACHE)) return -1;
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100536#endif
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000537
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000538/* For F_{GET|SET}FL */
539#ifdef FD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200540 if (PyModule_AddIntMacro(m, FD_CLOEXEC)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000541#endif
542
543/* For F_NOTIFY */
544#ifdef DN_ACCESS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200545 if (PyModule_AddIntMacro(m, DN_ACCESS)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000546#endif
547#ifdef DN_MODIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200548 if (PyModule_AddIntMacro(m, DN_MODIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000549#endif
550#ifdef DN_CREATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200551 if (PyModule_AddIntMacro(m, DN_CREATE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000552#endif
553#ifdef DN_DELETE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200554 if (PyModule_AddIntMacro(m, DN_DELETE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000555#endif
556#ifdef DN_RENAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200557 if (PyModule_AddIntMacro(m, DN_RENAME)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000558#endif
559#ifdef DN_ATTRIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200560 if (PyModule_AddIntMacro(m, DN_ATTRIB)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000561#endif
562#ifdef DN_MULTISHOT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200563 if (PyModule_AddIntMacro(m, DN_MULTISHOT)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000564#endif
565
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000566#ifdef HAVE_STROPTS_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 /* Unix 98 guarantees that these are in stropts.h. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200568 if (PyModule_AddIntMacro(m, I_PUSH)) return -1;
569 if (PyModule_AddIntMacro(m, I_POP)) return -1;
570 if (PyModule_AddIntMacro(m, I_LOOK)) return -1;
571 if (PyModule_AddIntMacro(m, I_FLUSH)) return -1;
572 if (PyModule_AddIntMacro(m, I_FLUSHBAND)) return -1;
573 if (PyModule_AddIntMacro(m, I_SETSIG)) return -1;
574 if (PyModule_AddIntMacro(m, I_GETSIG)) return -1;
575 if (PyModule_AddIntMacro(m, I_FIND)) return -1;
576 if (PyModule_AddIntMacro(m, I_PEEK)) return -1;
577 if (PyModule_AddIntMacro(m, I_SRDOPT)) return -1;
578 if (PyModule_AddIntMacro(m, I_GRDOPT)) return -1;
579 if (PyModule_AddIntMacro(m, I_NREAD)) return -1;
580 if (PyModule_AddIntMacro(m, I_FDINSERT)) return -1;
581 if (PyModule_AddIntMacro(m, I_STR)) return -1;
582 if (PyModule_AddIntMacro(m, I_SWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000583#ifdef I_GWROPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* despite the comment above, old-ish glibcs miss a couple... */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200585 if (PyModule_AddIntMacro(m, I_GWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000586#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200587 if (PyModule_AddIntMacro(m, I_SENDFD)) return -1;
588 if (PyModule_AddIntMacro(m, I_RECVFD)) return -1;
589 if (PyModule_AddIntMacro(m, I_LIST)) return -1;
590 if (PyModule_AddIntMacro(m, I_ATMARK)) return -1;
591 if (PyModule_AddIntMacro(m, I_CKBAND)) return -1;
592 if (PyModule_AddIntMacro(m, I_GETBAND)) return -1;
593 if (PyModule_AddIntMacro(m, I_CANPUT)) return -1;
594 if (PyModule_AddIntMacro(m, I_SETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000595#ifdef I_GETCLTIME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200596 if (PyModule_AddIntMacro(m, I_GETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000597#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200598 if (PyModule_AddIntMacro(m, I_LINK)) return -1;
599 if (PyModule_AddIntMacro(m, I_UNLINK)) return -1;
600 if (PyModule_AddIntMacro(m, I_PLINK)) return -1;
601 if (PyModule_AddIntMacro(m, I_PUNLINK)) return -1;
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603
604 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000605}
606
Martin v. Löwis1a214512008-06-11 05:26:20 +0000607
608static struct PyModuleDef fcntlmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 PyModuleDef_HEAD_INIT,
610 "fcntl",
611 module_doc,
612 -1,
613 fcntl_methods,
614 NULL,
615 NULL,
616 NULL,
617 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000618};
619
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000620PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000621PyInit_fcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000622{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200623 PyObject *m;
Guido van Rossum02975121992-08-17 08:55:12 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Create the module and add the functions and documentation */
626 m = PyModule_Create(&fcntlmodule);
627 if (m == NULL)
628 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 /* Add some symbolic constants to the module */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200631 all_ins(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 return m;
Guido van Rossum02975121992-08-17 08:55:12 +0000633}