blob: 9894c4307e04eb3b8459aeaeb025c073420e7e1e [file] [log] [blame]
Guido van Rossum02975121992-08-17 08:55:12 +00001
2/* fcntl module */
3
Roger E. Masse919213a1996-12-17 17:42:22 +00004#include "Python.h"
Guido van Rossum02975121992-08-17 08:55:12 +00005
Guido van Rossuma376cc51996-12-05 23:43:35 +00006#ifdef HAVE_SYS_FILE_H
7#include <sys/file.h>
8#endif
9
Guido van Rossum3d65fa31996-12-09 18:49:14 +000010#include <sys/ioctl.h>
Guido van Rossum3c0b79c1996-06-11 15:11:34 +000011#include <fcntl.h>
Martin v. Löwis14e73b12003-01-01 09:51:12 +000012#ifdef HAVE_STROPTS_H
13#include <stropts.h>
14#endif
Guido van Rossum02975121992-08-17 08:55:12 +000015
Fred Drake152a25e2001-05-09 21:02:02 +000016static int
17conv_descriptor(PyObject *object, int *target)
18{
19 int fd = PyObject_AsFileDescriptor(object);
20
21 if (fd < 0)
22 return 0;
23 *target = fd;
24 return 1;
25}
26
27
Guido van Rossum02975121992-08-17 08:55:12 +000028/* fcntl(fd, opt, [arg]) */
29
Roger E. Masse919213a1996-12-17 17:42:22 +000030static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +000031fcntl_fcntl(PyObject *self, PyObject *args)
Guido van Rossum02975121992-08-17 08:55:12 +000032{
33 int fd;
34 int code;
35 int arg;
36 int ret;
37 char *str;
38 int len;
39 char buf[1024];
40
Fred Drake152a25e2001-05-09 21:02:02 +000041 if (PyArg_ParseTuple(args, "O&is#:fcntl",
42 conv_descriptor, &fd, &code, &str, &len)) {
Guido van Rossum02975121992-08-17 08:55:12 +000043 if (len > sizeof buf) {
Roger E. Masse919213a1996-12-17 17:42:22 +000044 PyErr_SetString(PyExc_ValueError,
45 "fcntl string arg too long");
Guido van Rossum02975121992-08-17 08:55:12 +000046 return NULL;
47 }
48 memcpy(buf, str, len);
Roger E. Masse919213a1996-12-17 17:42:22 +000049 Py_BEGIN_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +000050 ret = fcntl(fd, code, buf);
Roger E. Masse919213a1996-12-17 17:42:22 +000051 Py_END_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +000052 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +000053 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +000054 return NULL;
55 }
Roger E. Masse919213a1996-12-17 17:42:22 +000056 return PyString_FromStringAndSize(buf, len);
Guido van Rossum02975121992-08-17 08:55:12 +000057 }
58
Roger E. Masse919213a1996-12-17 17:42:22 +000059 PyErr_Clear();
Guido van Rossuma2214c32000-08-02 20:46:51 +000060 arg = 0;
Fred Drake152a25e2001-05-09 21:02:02 +000061 if (!PyArg_ParseTuple(args,
62 "O&i|i;fcntl requires a file or file descriptor,"
63 " an integer and optionally a third integer or a string",
64 conv_descriptor, &fd, &code, &arg)) {
Guido van Rossuma2214c32000-08-02 20:46:51 +000065 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +000066 }
Roger E. Masse919213a1996-12-17 17:42:22 +000067 Py_BEGIN_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +000068 ret = fcntl(fd, code, arg);
Roger E. Masse919213a1996-12-17 17:42:22 +000069 Py_END_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +000070 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +000071 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +000072 return NULL;
73 }
Roger E. Masse919213a1996-12-17 17:42:22 +000074 return PyInt_FromLong((long)ret);
Guido van Rossum02975121992-08-17 08:55:12 +000075}
76
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000077PyDoc_STRVAR(fcntl_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +000078"fcntl(fd, opt, [arg])\n\
79\n\
80Perform the requested operation on file descriptor fd. The operation\n\
Fred Drake1d531992001-05-10 15:54:32 +000081is defined by op and is operating system dependent. These constants are\n\
82available from the fcntl module. The argument arg is optional, and\n\
83defaults to 0; it may be an int or a string. If arg is given as a string,\n\
84the return value of fcntl is a string of that length, containing the\n\
85resulting value put in the arg buffer by the operating system.The length\n\
86of the arg string is not allowed to exceed 1024 bytes. If the arg given\n\
87is an integer or if none is specified, the result value is an integer\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000088corresponding to the return value of the fcntl call in the C code.");
Guido van Rossum185ead61998-11-23 15:32:55 +000089
Guido van Rossum02975121992-08-17 08:55:12 +000090
91/* ioctl(fd, opt, [arg]) */
92
Roger E. Masse919213a1996-12-17 17:42:22 +000093static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +000094fcntl_ioctl(PyObject *self, PyObject *args)
Guido van Rossum02975121992-08-17 08:55:12 +000095{
96 int fd;
97 int code;
98 int arg;
99 int ret;
100 char *str;
101 int len;
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000102 int mutate_arg = 0;
Guido van Rossum02975121992-08-17 08:55:12 +0000103 char buf[1024];
104
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000105 if (PyArg_ParseTuple(args, "O&iw#|i:ioctl",
106 conv_descriptor, &fd, &code,
107 &str, &len, &mutate_arg)) {
108 char *arg;
109
110 if (PyTuple_Size(args) == 3) {
111 /* warning goes here in 2.4 */
112 mutate_arg = 0;
113 }
114 if (mutate_arg) {
115 if (len <= sizeof buf) {
116 memcpy(buf, str, len);
117 arg = buf;
118 }
119 else {
120 arg = str;
121 }
122 }
123 else {
124 if (len > sizeof buf) {
125 PyErr_SetString(PyExc_ValueError,
126 "ioctl string arg too long");
127 return NULL;
128 }
129 else {
130 memcpy(buf, str, len);
131 arg = buf;
132 }
133 }
134 if (buf == arg) {
135 Py_BEGIN_ALLOW_THREADS /* think array.resize() */
136 ret = ioctl(fd, code, arg);
137 Py_END_ALLOW_THREADS
138 }
139 else {
140 ret = ioctl(fd, code, arg);
141 }
142 if (mutate_arg && (len < sizeof buf)) {
143 memcpy(str, buf, len);
144 }
145 if (ret < 0) {
146 PyErr_SetFromErrno(PyExc_IOError);
147 return NULL;
148 }
149 if (mutate_arg) {
150 return PyInt_FromLong(ret);
151 }
152 else {
153 return PyString_FromStringAndSize(buf, len);
154 }
155 }
156
157 PyErr_Clear();
Fred Drake152a25e2001-05-09 21:02:02 +0000158 if (PyArg_ParseTuple(args, "O&is#:ioctl",
159 conv_descriptor, &fd, &code, &str, &len)) {
Guido van Rossum02975121992-08-17 08:55:12 +0000160 if (len > sizeof buf) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000161 PyErr_SetString(PyExc_ValueError,
162 "ioctl string arg too long");
Guido van Rossum02975121992-08-17 08:55:12 +0000163 return NULL;
164 }
165 memcpy(buf, str, len);
Roger E. Masse919213a1996-12-17 17:42:22 +0000166 Py_BEGIN_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000167 ret = ioctl(fd, code, buf);
Roger E. Masse919213a1996-12-17 17:42:22 +0000168 Py_END_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000169 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000170 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000171 return NULL;
172 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000173 return PyString_FromStringAndSize(buf, len);
Guido van Rossum02975121992-08-17 08:55:12 +0000174 }
175
Roger E. Masse919213a1996-12-17 17:42:22 +0000176 PyErr_Clear();
Guido van Rossuma2214c32000-08-02 20:46:51 +0000177 arg = 0;
Fred Drake460f0692001-05-14 21:02:36 +0000178 if (!PyArg_ParseTuple(args,
179 "O&i|i;ioctl requires a file or file descriptor,"
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000180 " an integer and optionally a integer or buffer argument",
Fred Drake152a25e2001-05-09 21:02:02 +0000181 conv_descriptor, &fd, &code, &arg)) {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000182 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000183 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000184 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000185#ifdef __VMS
186 ret = ioctl(fd, code, (void *)arg);
187#else
Guido van Rossum02975121992-08-17 08:55:12 +0000188 ret = ioctl(fd, code, arg);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000189#endif
Roger E. Masse919213a1996-12-17 17:42:22 +0000190 Py_END_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +0000191 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000192 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000193 return NULL;
194 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000195 return PyInt_FromLong((long)ret);
Guido van Rossum02975121992-08-17 08:55:12 +0000196}
197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000198PyDoc_STRVAR(ioctl_doc,
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000199"ioctl(fd, opt[, arg[, mutate_flag]])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +0000200\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000201Perform the requested operation on file descriptor fd. The operation is\n\
Neal Norwitz47308802003-06-30 01:54:04 +0000202defined by opt and is operating system dependent. Typically these codes are\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000203retrieved from the fcntl or termios library modules.\n\
204\n\
205The argument arg is optional, and defaults to 0; it may be an int or a\n\
206buffer containing character data (most likely a string or an array). \n\
207\n\
208If the argument is a mutable buffer (such as an array) and if the\n\
209mutate_flag argument (which is only allowed in this case) is true then the\n\
210buffer is (in effect) passed to the operating system and changes made by\n\
211the OS will be reflected in the contents of the buffer after the call has\n\
212returned. The return value is the integer returned by the ioctl system\n\
213call.\n\
214\n\
215If the argument is a mutable buffer and the mutable_flag argument is not\n\
216passed or is false, the behavior is as if a string had been passed. This\n\
217behavior will change in future releases of Python.\n\
218\n\
219If the argument is an immutable buffer (most likely a string) then a copy\n\
220of the buffer is passed to the operating system and the return value is a\n\
221string of the same length containing whatever the operating system put in\n\
222the buffer. The length of the arg buffer in this case is not allowed to\n\
223exceed 1024 bytes.\n\
224\n\
225If the arg given is an integer or if none is specified, the result value is\n\
226an integer corresponding to the return value of the ioctl call in the C\n\
227code.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000228
Guido van Rossum02975121992-08-17 08:55:12 +0000229
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000230/* flock(fd, operation) */
231
Roger E. Masse919213a1996-12-17 17:42:22 +0000232static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000233fcntl_flock(PyObject *self, PyObject *args)
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000234{
235 int fd;
236 int code;
237 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000238
Fred Drake152a25e2001-05-09 21:02:02 +0000239 if (!PyArg_ParseTuple(args, "O&i:flock",
240 conv_descriptor, &fd, &code))
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000241 return NULL;
242
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000243#ifdef HAVE_FLOCK
Guido van Rossum056bad91999-01-06 18:44:23 +0000244 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000245 ret = flock(fd, code);
Guido van Rossum056bad91999-01-06 18:44:23 +0000246 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000247#else
248
249#ifndef LOCK_SH
250#define LOCK_SH 1 /* shared lock */
251#define LOCK_EX 2 /* exclusive lock */
252#define LOCK_NB 4 /* don't block when locking */
253#define LOCK_UN 8 /* unlock */
254#endif
255 {
256 struct flock l;
257 if (code == LOCK_UN)
258 l.l_type = F_UNLCK;
259 else if (code & LOCK_SH)
260 l.l_type = F_RDLCK;
261 else if (code & LOCK_EX)
262 l.l_type = F_WRLCK;
263 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000264 PyErr_SetString(PyExc_ValueError,
265 "unrecognized flock argument");
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000266 return NULL;
267 }
268 l.l_whence = l.l_start = l.l_len = 0;
Guido van Rossum056bad91999-01-06 18:44:23 +0000269 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000270 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000271 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000272 }
273#endif /* HAVE_FLOCK */
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000274 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000275 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000276 return NULL;
277 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000278 Py_INCREF(Py_None);
279 return Py_None;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000280}
281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000282PyDoc_STRVAR(flock_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000283"flock(fd, operation)\n\
284\n\
285Perform the lock operation op on file descriptor fd. See the Unix \n\
286manual flock(3) for details. (On some systems, this function is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000287emulated using fcntl().)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000288
289
Guido van Rossumc8643641996-09-11 23:17:20 +0000290/* lockf(fd, operation) */
Roger E. Masse919213a1996-12-17 17:42:22 +0000291static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000292fcntl_lockf(PyObject *self, PyObject *args)
Guido van Rossumc8643641996-09-11 23:17:20 +0000293{
Guido van Rossum056bad91999-01-06 18:44:23 +0000294 int fd, code, ret, whence = 0;
295 PyObject *lenobj = NULL, *startobj = NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000296
Fred Drake152a25e2001-05-09 21:02:02 +0000297 if (!PyArg_ParseTuple(args, "O&i|OOi:lockf",
298 conv_descriptor, &fd, &code,
Guido van Rossum056bad91999-01-06 18:44:23 +0000299 &lenobj, &startobj, &whence))
Guido van Rossumc8643641996-09-11 23:17:20 +0000300 return NULL;
301
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000302#if defined(PYOS_OS2) && defined(PYCC_GCC)
303 PyErr_SetString(PyExc_NotImplementedError,
304 "lockf not supported on OS/2 (EMX)");
305 return NULL;
306#else
Guido van Rossumc8643641996-09-11 23:17:20 +0000307#ifndef LOCK_SH
308#define LOCK_SH 1 /* shared lock */
309#define LOCK_EX 2 /* exclusive lock */
310#define LOCK_NB 4 /* don't block when locking */
311#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000312#endif /* LOCK_SH */
Guido van Rossumc8643641996-09-11 23:17:20 +0000313 {
314 struct flock l;
315 if (code == LOCK_UN)
316 l.l_type = F_UNLCK;
317 else if (code & LOCK_SH)
318 l.l_type = F_RDLCK;
319 else if (code & LOCK_EX)
320 l.l_type = F_WRLCK;
321 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000322 PyErr_SetString(PyExc_ValueError,
323 "unrecognized flock argument");
Guido van Rossumc8643641996-09-11 23:17:20 +0000324 return NULL;
325 }
Guido van Rossum056bad91999-01-06 18:44:23 +0000326 l.l_start = l.l_len = 0;
327 if (startobj != NULL) {
328#if !defined(HAVE_LARGEFILE_SUPPORT)
329 l.l_start = PyInt_AsLong(startobj);
330#else
331 l.l_start = PyLong_Check(startobj) ?
332 PyLong_AsLongLong(startobj) :
333 PyInt_AsLong(startobj);
334#endif
335 if (PyErr_Occurred())
336 return NULL;
337 }
338 if (lenobj != NULL) {
339#if !defined(HAVE_LARGEFILE_SUPPORT)
340 l.l_len = PyInt_AsLong(lenobj);
341#else
342 l.l_len = PyLong_Check(lenobj) ?
343 PyLong_AsLongLong(lenobj) :
344 PyInt_AsLong(lenobj);
345#endif
346 if (PyErr_Occurred())
347 return NULL;
348 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000349 l.l_whence = whence;
Guido van Rossum056bad91999-01-06 18:44:23 +0000350 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000351 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000352 Py_END_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000353 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000354 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000355 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumc8643641996-09-11 23:17:20 +0000356 return NULL;
357 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000358 Py_INCREF(Py_None);
359 return Py_None;
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000360#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
Guido van Rossumc8643641996-09-11 23:17:20 +0000361}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000363PyDoc_STRVAR(lockf_doc,
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000364"lockf (fd, operation, length=0, start=0, whence=0)\n\
365\n\
366This is essentially a wrapper around the fcntl() locking calls. fd is the\n\
367file descriptor of the file to lock or unlock, and operation is one of the\n\
368following values:\n\
369\n\
370 LOCK_UN - unlock\n\
371 LOCK_SH - acquire a shared lock\n\
372 LOCK_EX - acquire an exclusive lock\n\
373\n\
374When operation is LOCK_SH or LOCK_EX, it can also be bit-wise OR'd with\n\
375LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n\
376lock cannot be acquired, an IOError will be raised and the exception will\n\
377have an errno attribute set to EACCES or EAGAIN (depending on the operating\n\
378system -- for portability, check for either value).\n\
379\n\
380length is the number of bytes to lock, with the default meaning to lock to\n\
381EOF. start is the byte offset, relative to whence, to that the lock\n\
382starts. whence is as with fileobj.seek(), specifically:\n\
383\n\
384 0 - relative to the start of the file (SEEK_SET)\n\
385 1 - relative to the current buffer position (SEEK_CUR)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000386 2 - relative to the end of the file (SEEK_END)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000387
Guido van Rossum02975121992-08-17 08:55:12 +0000388/* List of functions */
389
Roger E. Masse919213a1996-12-17 17:42:22 +0000390static PyMethodDef fcntl_methods[] = {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000391 {"fcntl", fcntl_fcntl, METH_VARARGS, fcntl_doc},
392 {"ioctl", fcntl_ioctl, METH_VARARGS, ioctl_doc},
393 {"flock", fcntl_flock, METH_VARARGS, flock_doc},
394 {"lockf", fcntl_lockf, METH_VARARGS, lockf_doc},
Guido van Rossum02975121992-08-17 08:55:12 +0000395 {NULL, NULL} /* sentinel */
396};
397
398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000399PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000400"This module performs file control and I/O control on file \n\
401descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
402routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000403a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000404
Guido van Rossum02975121992-08-17 08:55:12 +0000405/* Module initialisation */
406
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000407static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000408ins(PyObject* d, char* symbol, long value)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000409{
410 PyObject* v = PyInt_FromLong(value);
411 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
412 return -1;
413
414 Py_DECREF(v);
415 return 0;
416}
417
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000418#define INS(x) if (ins(d, #x, (long)x)) return -1
419
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000420static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000421all_ins(PyObject* d)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000422{
423 if (ins(d, "LOCK_SH", (long)LOCK_SH)) return -1;
424 if (ins(d, "LOCK_EX", (long)LOCK_EX)) return -1;
425 if (ins(d, "LOCK_NB", (long)LOCK_NB)) return -1;
426 if (ins(d, "LOCK_UN", (long)LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000427/* GNU extensions, as of glibc 2.2.4 */
428#ifdef LOCK_MAND
429 if (ins(d, "LOCK_MAND", (long)LOCK_MAND)) return -1;
430#endif
431#ifdef LOCK_READ
432 if (ins(d, "LOCK_READ", (long)LOCK_READ)) return -1;
433#endif
434#ifdef LOCK_WRITE
435 if (ins(d, "LOCK_WRITE", (long)LOCK_WRITE)) return -1;
436#endif
437#ifdef LOCK_RW
438 if (ins(d, "LOCK_RW", (long)LOCK_RW)) return -1;
439#endif
440
Fred Drake152a25e2001-05-09 21:02:02 +0000441#ifdef F_DUPFD
442 if (ins(d, "F_DUPFD", (long)F_DUPFD)) return -1;
443#endif
444#ifdef F_GETFD
445 if (ins(d, "F_GETFD", (long)F_GETFD)) return -1;
446#endif
447#ifdef F_SETFD
448 if (ins(d, "F_SETFD", (long)F_SETFD)) return -1;
449#endif
450#ifdef F_GETFL
451 if (ins(d, "F_GETFL", (long)F_GETFL)) return -1;
452#endif
453#ifdef F_SETFL
454 if (ins(d, "F_SETFL", (long)F_SETFL)) return -1;
455#endif
456#ifdef F_GETLK
457 if (ins(d, "F_GETLK", (long)F_GETLK)) return -1;
458#endif
459#ifdef F_SETLK
460 if (ins(d, "F_SETLK", (long)F_SETLK)) return -1;
461#endif
462#ifdef F_SETLKW
463 if (ins(d, "F_SETLKW", (long)F_SETLKW)) return -1;
464#endif
465#ifdef F_GETOWN
466 if (ins(d, "F_GETOWN", (long)F_GETOWN)) return -1;
467#endif
468#ifdef F_SETOWN
469 if (ins(d, "F_SETOWN", (long)F_SETOWN)) return -1;
470#endif
471#ifdef F_GETSIG
472 if (ins(d, "F_GETSIG", (long)F_GETSIG)) return -1;
473#endif
474#ifdef F_SETSIG
475 if (ins(d, "F_SETSIG", (long)F_SETSIG)) return -1;
476#endif
477#ifdef F_RDLCK
478 if (ins(d, "F_RDLCK", (long)F_RDLCK)) return -1;
479#endif
480#ifdef F_WRLCK
481 if (ins(d, "F_WRLCK", (long)F_WRLCK)) return -1;
482#endif
483#ifdef F_UNLCK
484 if (ins(d, "F_UNLCK", (long)F_UNLCK)) return -1;
485#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000486/* LFS constants */
487#ifdef F_GETLK64
488 if (ins(d, "F_GETLK64", (long)F_GETLK64)) return -1;
489#endif
490#ifdef F_SETLK64
491 if (ins(d, "F_SETLK64", (long)F_SETLK64)) return -1;
492#endif
493#ifdef F_SETLKW64
494 if (ins(d, "F_SETLKW64", (long)F_SETLKW64)) return -1;
495#endif
496/* GNU extensions, as of glibc 2.2.4. */
497#ifdef F_SETLEASE
498 if (ins(d, "F_SETLEASE", (long)F_SETLEASE)) return -1;
499#endif
500#ifdef F_GETLEASE
501 if (ins(d, "F_GETLEASE", (long)F_GETLEASE)) return -1;
502#endif
503#ifdef F_NOTIFY
504 if (ins(d, "F_NOTIFY", (long)F_NOTIFY)) return -1;
505#endif
506/* Old BSD flock(). */
507#ifdef F_EXLCK
508 if (ins(d, "F_EXLCK", (long)F_EXLCK)) return -1;
509#endif
510#ifdef F_SHLCK
511 if (ins(d, "F_SHLCK", (long)F_SHLCK)) return -1;
512#endif
513
514/* For F_{GET|SET}FL */
515#ifdef FD_CLOEXEC
516 if (ins(d, "FD_CLOEXEC", (long)FD_CLOEXEC)) return -1;
517#endif
518
519/* For F_NOTIFY */
520#ifdef DN_ACCESS
521 if (ins(d, "DN_ACCESS", (long)DN_ACCESS)) return -1;
522#endif
523#ifdef DN_MODIFY
524 if (ins(d, "DN_MODIFY", (long)DN_MODIFY)) return -1;
525#endif
526#ifdef DN_CREATE
527 if (ins(d, "DN_CREATE", (long)DN_CREATE)) return -1;
528#endif
529#ifdef DN_DELETE
530 if (ins(d, "DN_DELETE", (long)DN_DELETE)) return -1;
531#endif
532#ifdef DN_RENAME
533 if (ins(d, "DN_RENAME", (long)DN_RENAME)) return -1;
534#endif
535#ifdef DN_ATTRIB
536 if (ins(d, "DN_ATTRIB", (long)DN_ATTRIB)) return -1;
537#endif
538#ifdef DN_MULTISHOT
539 if (ins(d, "DN_MULTISHOT", (long)DN_MULTISHOT)) return -1;
540#endif
541
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000542#ifdef HAVE_STROPTS_H
543 /* Unix 98 guarantees that these are in stropts.h. */
544 INS(I_PUSH);
545 INS(I_POP);
546 INS(I_LOOK);
547 INS(I_FLUSH);
548 INS(I_FLUSHBAND);
549 INS(I_SETSIG);
550 INS(I_GETSIG);
551 INS(I_FIND);
552 INS(I_PEEK);
553 INS(I_SRDOPT);
554 INS(I_GRDOPT);
555 INS(I_NREAD);
556 INS(I_FDINSERT);
557 INS(I_STR);
558 INS(I_SWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000559#ifdef I_GWROPT
560 /* despite the comment above, old-ish glibcs miss a couple... */
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000561 INS(I_GWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000562#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000563 INS(I_SENDFD);
564 INS(I_RECVFD);
565 INS(I_LIST);
566 INS(I_ATMARK);
567 INS(I_CKBAND);
568 INS(I_GETBAND);
569 INS(I_CANPUT);
570 INS(I_SETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000571#ifdef I_GETCLTIME
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000572 INS(I_GETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000573#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000574 INS(I_LINK);
575 INS(I_UNLINK);
576 INS(I_PLINK);
577 INS(I_PUNLINK);
578#endif
579
Guido van Rossum7c141031997-08-15 02:52:08 +0000580 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000581}
582
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000583PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000584initfcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000585{
Roger E. Masse919213a1996-12-17 17:42:22 +0000586 PyObject *m, *d;
Guido van Rossum02975121992-08-17 08:55:12 +0000587
Guido van Rossum185ead61998-11-23 15:32:55 +0000588 /* Create the module and add the functions and documentation */
589 m = Py_InitModule3("fcntl", fcntl_methods, module_doc);
Guido van Rossum02975121992-08-17 08:55:12 +0000590
591 /* Add some symbolic constants to the module */
Roger E. Masse919213a1996-12-17 17:42:22 +0000592 d = PyModule_GetDict(m);
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000593 all_ins(d);
Guido van Rossum02975121992-08-17 08:55:12 +0000594}