blob: 93259409652c931741c96ab5c544b57a9098c256 [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;
Serhiy Storchakad915b082014-11-10 10:42:26 +020037 int arg;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 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,
Serhiy Storchakad915b082014-11-10 10:42:26 +020064 "O&i|I;fcntl requires a file or file descriptor,"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 " 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 ret = ioctl(fd, code, arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 Py_END_ALLOW_THREADS
213 if (ret < 0) {
214 PyErr_SetFromErrno(PyExc_IOError);
215 return NULL;
216 }
217 return PyLong_FromLong((long)ret);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000218#undef IOCTL_BUFSZ
Guido van Rossum02975121992-08-17 08:55:12 +0000219}
220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000221PyDoc_STRVAR(ioctl_doc,
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500222"ioctl(fd, op[, arg[, mutate_flag]])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +0000223\n\
R David Murrayd5a2f0b2013-11-07 10:51:07 -0500224Perform the operation op on file descriptor fd. The values used for op\n\
225are operating system dependent, and are available as constants in the\n\
226fcntl or termios library modules, using the same names as used in the\n\
227relevant C header files.\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000228\n\
229The argument arg is optional, and defaults to 0; it may be an int or a\n\
230buffer containing character data (most likely a string or an array). \n\
231\n\
232If the argument is a mutable buffer (such as an array) and if the\n\
233mutate_flag argument (which is only allowed in this case) is true then the\n\
234buffer is (in effect) passed to the operating system and changes made by\n\
235the OS will be reflected in the contents of the buffer after the call has\n\
236returned. The return value is the integer returned by the ioctl system\n\
237call.\n\
238\n\
239If the argument is a mutable buffer and the mutable_flag argument is not\n\
240passed or is false, the behavior is as if a string had been passed. This\n\
241behavior will change in future releases of Python.\n\
242\n\
243If the argument is an immutable buffer (most likely a string) then a copy\n\
244of the buffer is passed to the operating system and the return value is a\n\
245string of the same length containing whatever the operating system put in\n\
246the buffer. The length of the arg buffer in this case is not allowed to\n\
247exceed 1024 bytes.\n\
248\n\
249If the arg given is an integer or if none is specified, the result value is\n\
250an integer corresponding to the return value of the ioctl call in the C\n\
251code.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000252
Guido van Rossum02975121992-08-17 08:55:12 +0000253
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000254/* flock(fd, operation) */
255
Roger E. Masse919213a1996-12-17 17:42:22 +0000256static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000257fcntl_flock(PyObject *self, PyObject *args)
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 int fd;
260 int code;
261 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 if (!PyArg_ParseTuple(args, "O&i:flock",
264 conv_descriptor, &fd, &code))
265 return NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000266
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000267#ifdef HAVE_FLOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 Py_BEGIN_ALLOW_THREADS
269 ret = flock(fd, code);
270 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000271#else
272
273#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274#define LOCK_SH 1 /* shared lock */
275#define LOCK_EX 2 /* exclusive lock */
276#define LOCK_NB 4 /* don't block when locking */
277#define LOCK_UN 8 /* unlock */
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 {
280 struct flock l;
281 if (code == LOCK_UN)
282 l.l_type = F_UNLCK;
283 else if (code & LOCK_SH)
284 l.l_type = F_RDLCK;
285 else if (code & LOCK_EX)
286 l.l_type = F_WRLCK;
287 else {
288 PyErr_SetString(PyExc_ValueError,
289 "unrecognized flock argument");
290 return NULL;
291 }
292 l.l_whence = l.l_start = l.l_len = 0;
293 Py_BEGIN_ALLOW_THREADS
294 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
295 Py_END_ALLOW_THREADS
296 }
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000297#endif /* HAVE_FLOCK */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 if (ret < 0) {
299 PyErr_SetFromErrno(PyExc_IOError);
300 return NULL;
301 }
302 Py_INCREF(Py_None);
303 return Py_None;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000304}
305
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000306PyDoc_STRVAR(flock_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000307"flock(fd, operation)\n\
308\n\
309Perform the lock operation op on file descriptor fd. See the Unix \n\
Ned Deily2a8b3f22013-10-02 12:20:46 -0700310manual page for flock(2) for details. (On some systems, this function is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000311emulated using fcntl().)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000312
313
Guido van Rossumc8643641996-09-11 23:17:20 +0000314/* lockf(fd, operation) */
Roger E. Masse919213a1996-12-17 17:42:22 +0000315static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000316fcntl_lockf(PyObject *self, PyObject *args)
Guido van Rossumc8643641996-09-11 23:17:20 +0000317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 int fd, code, ret, whence = 0;
319 PyObject *lenobj = NULL, *startobj = NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 if (!PyArg_ParseTuple(args, "O&i|OOi:lockf",
322 conv_descriptor, &fd, &code,
323 &lenobj, &startobj, &whence))
324 return NULL;
Guido van Rossumc8643641996-09-11 23:17:20 +0000325
Guido van Rossumc8643641996-09-11 23:17:20 +0000326#ifndef LOCK_SH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327#define LOCK_SH 1 /* shared lock */
328#define LOCK_EX 2 /* exclusive lock */
329#define LOCK_NB 4 /* don't block when locking */
330#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000331#endif /* LOCK_SH */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 {
333 struct flock l;
334 if (code == LOCK_UN)
335 l.l_type = F_UNLCK;
336 else if (code & LOCK_SH)
337 l.l_type = F_RDLCK;
338 else if (code & LOCK_EX)
339 l.l_type = F_WRLCK;
340 else {
341 PyErr_SetString(PyExc_ValueError,
342 "unrecognized lockf argument");
343 return NULL;
344 }
345 l.l_start = l.l_len = 0;
346 if (startobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000347#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 l.l_start = PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 l.l_start = PyLong_Check(startobj) ?
351 PyLong_AsLongLong(startobj) :
352 PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (PyErr_Occurred())
355 return NULL;
356 }
357 if (lenobj != NULL) {
Guido van Rossum056bad91999-01-06 18:44:23 +0000358#if !defined(HAVE_LARGEFILE_SUPPORT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 l.l_len = PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000360#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 l.l_len = PyLong_Check(lenobj) ?
362 PyLong_AsLongLong(lenobj) :
363 PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 if (PyErr_Occurred())
366 return NULL;
367 }
368 l.l_whence = whence;
369 Py_BEGIN_ALLOW_THREADS
370 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
371 Py_END_ALLOW_THREADS
372 }
373 if (ret < 0) {
374 PyErr_SetFromErrno(PyExc_IOError);
375 return NULL;
376 }
377 Py_INCREF(Py_None);
378 return Py_None;
Guido van Rossumc8643641996-09-11 23:17:20 +0000379}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000381PyDoc_STRVAR(lockf_doc,
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000382"lockf (fd, operation, length=0, start=0, whence=0)\n\
383\n\
384This is essentially a wrapper around the fcntl() locking calls. fd is the\n\
385file descriptor of the file to lock or unlock, and operation is one of the\n\
386following values:\n\
387\n\
388 LOCK_UN - unlock\n\
389 LOCK_SH - acquire a shared lock\n\
390 LOCK_EX - acquire an exclusive lock\n\
391\n\
Christian Heimesfaf2f632008-01-06 16:59:19 +0000392When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with\n\
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000393LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n\
394lock cannot be acquired, an IOError will be raised and the exception will\n\
395have an errno attribute set to EACCES or EAGAIN (depending on the operating\n\
396system -- for portability, check for either value).\n\
397\n\
398length is the number of bytes to lock, with the default meaning to lock to\n\
399EOF. start is the byte offset, relative to whence, to that the lock\n\
400starts. whence is as with fileobj.seek(), specifically:\n\
401\n\
402 0 - relative to the start of the file (SEEK_SET)\n\
403 1 - relative to the current buffer position (SEEK_CUR)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000404 2 - relative to the end of the file (SEEK_END)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000405
Guido van Rossum02975121992-08-17 08:55:12 +0000406/* List of functions */
407
Roger E. Masse919213a1996-12-17 17:42:22 +0000408static PyMethodDef fcntl_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 {"fcntl", fcntl_fcntl, METH_VARARGS, fcntl_doc},
410 {"ioctl", fcntl_ioctl, METH_VARARGS, ioctl_doc},
411 {"flock", fcntl_flock, METH_VARARGS, flock_doc},
412 {"lockf", fcntl_lockf, METH_VARARGS, lockf_doc},
413 {NULL, NULL} /* sentinel */
Guido van Rossum02975121992-08-17 08:55:12 +0000414};
415
416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000417PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000418"This module performs file control and I/O control on file \n\
419descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
420routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000421a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000422
Guido van Rossum02975121992-08-17 08:55:12 +0000423/* Module initialisation */
424
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000425
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000426static int
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200427all_ins(PyObject* m)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000428{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200429 if (PyModule_AddIntMacro(m, LOCK_SH)) return -1;
430 if (PyModule_AddIntMacro(m, LOCK_EX)) return -1;
431 if (PyModule_AddIntMacro(m, LOCK_NB)) return -1;
432 if (PyModule_AddIntMacro(m, LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000433/* GNU extensions, as of glibc 2.2.4 */
434#ifdef LOCK_MAND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200435 if (PyModule_AddIntMacro(m, LOCK_MAND)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000436#endif
437#ifdef LOCK_READ
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200438 if (PyModule_AddIntMacro(m, LOCK_READ)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000439#endif
440#ifdef LOCK_WRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200441 if (PyModule_AddIntMacro(m, LOCK_WRITE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000442#endif
443#ifdef LOCK_RW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200444 if (PyModule_AddIntMacro(m, LOCK_RW)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000445#endif
446
Fred Drake152a25e2001-05-09 21:02:02 +0000447#ifdef F_DUPFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200448 if (PyModule_AddIntMacro(m, F_DUPFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000449#endif
Victor Stinner2716d532013-01-08 00:52:40 +0100450#ifdef F_DUPFD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200451 if (PyModule_AddIntMacro(m, F_DUPFD_CLOEXEC)) return -1;
Victor Stinner2716d532013-01-08 00:52:40 +0100452#endif
Fred Drake152a25e2001-05-09 21:02:02 +0000453#ifdef F_GETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200454 if (PyModule_AddIntMacro(m, F_GETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000455#endif
456#ifdef F_SETFD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200457 if (PyModule_AddIntMacro(m, F_SETFD)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000458#endif
459#ifdef F_GETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200460 if (PyModule_AddIntMacro(m, F_GETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000461#endif
462#ifdef F_SETFL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200463 if (PyModule_AddIntMacro(m, F_SETFL)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000464#endif
465#ifdef F_GETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200466 if (PyModule_AddIntMacro(m, F_GETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000467#endif
468#ifdef F_SETLK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200469 if (PyModule_AddIntMacro(m, F_SETLK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000470#endif
471#ifdef F_SETLKW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200472 if (PyModule_AddIntMacro(m, F_SETLKW)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000473#endif
474#ifdef F_GETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200475 if (PyModule_AddIntMacro(m, F_GETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000476#endif
477#ifdef F_SETOWN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200478 if (PyModule_AddIntMacro(m, F_SETOWN)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000479#endif
480#ifdef F_GETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200481 if (PyModule_AddIntMacro(m, F_GETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000482#endif
483#ifdef F_SETSIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200484 if (PyModule_AddIntMacro(m, F_SETSIG)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000485#endif
486#ifdef F_RDLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200487 if (PyModule_AddIntMacro(m, F_RDLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000488#endif
489#ifdef F_WRLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200490 if (PyModule_AddIntMacro(m, F_WRLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000491#endif
492#ifdef F_UNLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200493 if (PyModule_AddIntMacro(m, F_UNLCK)) return -1;
Fred Drake152a25e2001-05-09 21:02:02 +0000494#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000495/* LFS constants */
496#ifdef F_GETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200497 if (PyModule_AddIntMacro(m, F_GETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000498#endif
499#ifdef F_SETLK64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200500 if (PyModule_AddIntMacro(m, F_SETLK64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000501#endif
502#ifdef F_SETLKW64
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200503 if (PyModule_AddIntMacro(m, F_SETLKW64)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000504#endif
505/* GNU extensions, as of glibc 2.2.4. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000506#ifdef FASYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200507 if (PyModule_AddIntMacro(m, FASYNC)) return -1;
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000508#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000509#ifdef F_SETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200510 if (PyModule_AddIntMacro(m, F_SETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000511#endif
512#ifdef F_GETLEASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200513 if (PyModule_AddIntMacro(m, F_GETLEASE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000514#endif
515#ifdef F_NOTIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200516 if (PyModule_AddIntMacro(m, F_NOTIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000517#endif
518/* Old BSD flock(). */
519#ifdef F_EXLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200520 if (PyModule_AddIntMacro(m, F_EXLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000521#endif
522#ifdef F_SHLCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200523 if (PyModule_AddIntMacro(m, F_SHLCK)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000524#endif
525
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100526/* OS X specifics */
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000527#ifdef F_FULLFSYNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200528 if (PyModule_AddIntMacro(m, F_FULLFSYNC)) return -1;
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000529#endif
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100530#ifdef F_NOCACHE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200531 if (PyModule_AddIntMacro(m, F_NOCACHE)) return -1;
Charles-François Natali23e1ecb2011-11-02 18:58:25 +0100532#endif
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000533
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000534/* For F_{GET|SET}FL */
535#ifdef FD_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200536 if (PyModule_AddIntMacro(m, FD_CLOEXEC)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000537#endif
538
539/* For F_NOTIFY */
540#ifdef DN_ACCESS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200541 if (PyModule_AddIntMacro(m, DN_ACCESS)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000542#endif
543#ifdef DN_MODIFY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200544 if (PyModule_AddIntMacro(m, DN_MODIFY)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000545#endif
546#ifdef DN_CREATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200547 if (PyModule_AddIntMacro(m, DN_CREATE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000548#endif
549#ifdef DN_DELETE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200550 if (PyModule_AddIntMacro(m, DN_DELETE)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000551#endif
552#ifdef DN_RENAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200553 if (PyModule_AddIntMacro(m, DN_RENAME)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000554#endif
555#ifdef DN_ATTRIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200556 if (PyModule_AddIntMacro(m, DN_ATTRIB)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000557#endif
558#ifdef DN_MULTISHOT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200559 if (PyModule_AddIntMacro(m, DN_MULTISHOT)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000560#endif
561
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000562#ifdef HAVE_STROPTS_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 /* Unix 98 guarantees that these are in stropts.h. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200564 if (PyModule_AddIntMacro(m, I_PUSH)) return -1;
565 if (PyModule_AddIntMacro(m, I_POP)) return -1;
566 if (PyModule_AddIntMacro(m, I_LOOK)) return -1;
567 if (PyModule_AddIntMacro(m, I_FLUSH)) return -1;
568 if (PyModule_AddIntMacro(m, I_FLUSHBAND)) return -1;
569 if (PyModule_AddIntMacro(m, I_SETSIG)) return -1;
570 if (PyModule_AddIntMacro(m, I_GETSIG)) return -1;
571 if (PyModule_AddIntMacro(m, I_FIND)) return -1;
572 if (PyModule_AddIntMacro(m, I_PEEK)) return -1;
573 if (PyModule_AddIntMacro(m, I_SRDOPT)) return -1;
574 if (PyModule_AddIntMacro(m, I_GRDOPT)) return -1;
575 if (PyModule_AddIntMacro(m, I_NREAD)) return -1;
576 if (PyModule_AddIntMacro(m, I_FDINSERT)) return -1;
577 if (PyModule_AddIntMacro(m, I_STR)) return -1;
578 if (PyModule_AddIntMacro(m, I_SWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000579#ifdef I_GWROPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 /* despite the comment above, old-ish glibcs miss a couple... */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200581 if (PyModule_AddIntMacro(m, I_GWROPT)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000582#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200583 if (PyModule_AddIntMacro(m, I_SENDFD)) return -1;
584 if (PyModule_AddIntMacro(m, I_RECVFD)) return -1;
585 if (PyModule_AddIntMacro(m, I_LIST)) return -1;
586 if (PyModule_AddIntMacro(m, I_ATMARK)) return -1;
587 if (PyModule_AddIntMacro(m, I_CKBAND)) return -1;
588 if (PyModule_AddIntMacro(m, I_GETBAND)) return -1;
589 if (PyModule_AddIntMacro(m, I_CANPUT)) return -1;
590 if (PyModule_AddIntMacro(m, I_SETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000591#ifdef I_GETCLTIME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200592 if (PyModule_AddIntMacro(m, I_GETCLTIME)) return -1;
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000593#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200594 if (PyModule_AddIntMacro(m, I_LINK)) return -1;
595 if (PyModule_AddIntMacro(m, I_UNLINK)) return -1;
596 if (PyModule_AddIntMacro(m, I_PLINK)) return -1;
597 if (PyModule_AddIntMacro(m, I_PUNLINK)) return -1;
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599
600 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000601}
602
Martin v. Löwis1a214512008-06-11 05:26:20 +0000603
604static struct PyModuleDef fcntlmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 PyModuleDef_HEAD_INIT,
606 "fcntl",
607 module_doc,
608 -1,
609 fcntl_methods,
610 NULL,
611 NULL,
612 NULL,
613 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000614};
615
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000616PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +0000617PyInit_fcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000618{
Charles-Francois Natali74ca8862013-05-20 19:13:19 +0200619 PyObject *m;
Guido van Rossum02975121992-08-17 08:55:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* Create the module and add the functions and documentation */
622 m = PyModule_Create(&fcntlmodule);
623 if (m == NULL)
624 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* Add some symbolic constants to the module */
Charles-François Natali5abca142013-12-01 14:30:47 +0100627 if (all_ins(m) < 0)
628 return NULL;
629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 return m;
Guido van Rossum02975121992-08-17 08:55:12 +0000631}