blob: a368494c969681d53ae068a1062491d1109f25df [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)
24 return 0;
25 *target = fd;
26 return 1;
27}
28
29
Guido van Rossum02975121992-08-17 08:55:12 +000030/* fcntl(fd, opt, [arg]) */
31
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{
35 int fd;
36 int code;
37 int arg;
38 int ret;
39 char *str;
Thomas Wouters26cc63f2006-03-02 00:21:10 +000040 Py_ssize_t len;
Guido van Rossum02975121992-08-17 08:55:12 +000041 char buf[1024];
42
Fred Drake152a25e2001-05-09 21:02:02 +000043 if (PyArg_ParseTuple(args, "O&is#:fcntl",
44 conv_descriptor, &fd, &code, &str, &len)) {
Guido van Rossum02975121992-08-17 08:55:12 +000045 if (len > sizeof buf) {
Roger E. Masse919213a1996-12-17 17:42:22 +000046 PyErr_SetString(PyExc_ValueError,
47 "fcntl string arg too long");
Guido van Rossum02975121992-08-17 08:55:12 +000048 return NULL;
49 }
50 memcpy(buf, str, len);
Roger E. Masse919213a1996-12-17 17:42:22 +000051 Py_BEGIN_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +000052 ret = fcntl(fd, code, buf);
Roger E. Masse919213a1996-12-17 17:42:22 +000053 Py_END_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +000054 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +000055 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +000056 return NULL;
57 }
Roger E. Masse919213a1996-12-17 17:42:22 +000058 return PyString_FromStringAndSize(buf, len);
Guido van Rossum02975121992-08-17 08:55:12 +000059 }
60
Roger E. Masse919213a1996-12-17 17:42:22 +000061 PyErr_Clear();
Guido van Rossuma2214c32000-08-02 20:46:51 +000062 arg = 0;
Fred Drake152a25e2001-05-09 21:02:02 +000063 if (!PyArg_ParseTuple(args,
64 "O&i|i;fcntl requires a file or file descriptor,"
65 " an integer and optionally a third integer or a string",
66 conv_descriptor, &fd, &code, &arg)) {
Guido van Rossuma2214c32000-08-02 20:46:51 +000067 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +000068 }
Roger E. Masse919213a1996-12-17 17:42:22 +000069 Py_BEGIN_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +000070 ret = fcntl(fd, code, arg);
Roger E. Masse919213a1996-12-17 17:42:22 +000071 Py_END_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +000072 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +000073 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +000074 return NULL;
75 }
Roger E. Masse919213a1996-12-17 17:42:22 +000076 return PyInt_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,
Guido van Rossum185ead61998-11-23 15:32:55 +000080"fcntl(fd, opt, [arg])\n\
81\n\
82Perform the requested operation on file descriptor fd. The operation\n\
Fred Drake1d531992001-05-10 15:54:32 +000083is defined by op and is operating system dependent. These constants are\n\
84available from the fcntl module. The argument arg is optional, and\n\
85defaults to 0; it may be an int or a string. If arg is given as a string,\n\
86the return value of fcntl is a string of that length, containing the\n\
87resulting value put in the arg buffer by the operating system.The length\n\
88of the arg string is not allowed to exceed 1024 bytes. If the arg given\n\
89is an integer or if none is specified, the result value is an integer\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000090corresponding to the return value of the fcntl call in the C code.");
Guido van Rossum185ead61998-11-23 15:32:55 +000091
Guido van Rossum02975121992-08-17 08:55:12 +000092
93/* ioctl(fd, opt, [arg]) */
94
Roger E. Masse919213a1996-12-17 17:42:22 +000095static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +000096fcntl_ioctl(PyObject *self, PyObject *args)
Guido van Rossum02975121992-08-17 08:55:12 +000097{
98 int fd;
Thomas Wouters857b3002006-03-02 17:58:27 +000099 /* In PyArg_ParseTuple below, use the unsigned int 'I' format for
100 the signed int 'code' variable, because Python turns 0x8000000
101 into a large positive number (PyLong, or PyInt on 64-bit
102 platforms,) whereas C expects it to be a negative int */
Guido van Rossum02975121992-08-17 08:55:12 +0000103 int code;
104 int arg;
105 int ret;
106 char *str;
Thomas Wouters26cc63f2006-03-02 00:21:10 +0000107 Py_ssize_t len;
Michael W. Hudson02d74f62004-11-30 14:31:54 +0000108 int mutate_arg = 1;
Guido van Rossum02975121992-08-17 08:55:12 +0000109 char buf[1024];
110
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000111 if (PyArg_ParseTuple(args, "O&Iw#|i:ioctl",
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000112 conv_descriptor, &fd, &code,
113 &str, &len, &mutate_arg)) {
114 char *arg;
115
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000116 if (mutate_arg) {
117 if (len <= sizeof buf) {
118 memcpy(buf, str, len);
119 arg = buf;
120 }
121 else {
122 arg = str;
123 }
124 }
125 else {
126 if (len > sizeof buf) {
127 PyErr_SetString(PyExc_ValueError,
128 "ioctl string arg too long");
129 return NULL;
130 }
131 else {
132 memcpy(buf, str, len);
133 arg = buf;
134 }
135 }
136 if (buf == arg) {
137 Py_BEGIN_ALLOW_THREADS /* think array.resize() */
138 ret = ioctl(fd, code, arg);
139 Py_END_ALLOW_THREADS
140 }
141 else {
142 ret = ioctl(fd, code, arg);
143 }
144 if (mutate_arg && (len < sizeof buf)) {
145 memcpy(str, buf, len);
146 }
147 if (ret < 0) {
148 PyErr_SetFromErrno(PyExc_IOError);
149 return NULL;
150 }
151 if (mutate_arg) {
152 return PyInt_FromLong(ret);
153 }
154 else {
155 return PyString_FromStringAndSize(buf, len);
156 }
157 }
158
159 PyErr_Clear();
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000160 if (PyArg_ParseTuple(args, "O&Is#:ioctl",
Fred Drake152a25e2001-05-09 21:02:02 +0000161 conv_descriptor, &fd, &code, &str, &len)) {
Guido van Rossum02975121992-08-17 08:55:12 +0000162 if (len > sizeof buf) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000163 PyErr_SetString(PyExc_ValueError,
164 "ioctl string arg too long");
Guido van Rossum02975121992-08-17 08:55:12 +0000165 return NULL;
166 }
167 memcpy(buf, str, len);
Roger E. Masse919213a1996-12-17 17:42:22 +0000168 Py_BEGIN_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000169 ret = ioctl(fd, code, buf);
Roger E. Masse919213a1996-12-17 17:42:22 +0000170 Py_END_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000171 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000172 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000173 return NULL;
174 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000175 return PyString_FromStringAndSize(buf, len);
Guido van Rossum02975121992-08-17 08:55:12 +0000176 }
177
Roger E. Masse919213a1996-12-17 17:42:22 +0000178 PyErr_Clear();
Guido van Rossuma2214c32000-08-02 20:46:51 +0000179 arg = 0;
Fred Drake460f0692001-05-14 21:02:36 +0000180 if (!PyArg_ParseTuple(args,
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000181 "O&I|i;ioctl requires a file or file descriptor,"
Hye-Shik Chang97bb8ad2005-07-28 05:57:19 +0000182 " an integer and optionally an integer or buffer argument",
Fred Drake152a25e2001-05-09 21:02:02 +0000183 conv_descriptor, &fd, &code, &arg)) {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000184 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000185 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000186 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000187#ifdef __VMS
188 ret = ioctl(fd, code, (void *)arg);
189#else
Guido van Rossum02975121992-08-17 08:55:12 +0000190 ret = ioctl(fd, code, arg);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000191#endif
Roger E. Masse919213a1996-12-17 17:42:22 +0000192 Py_END_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +0000193 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000194 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000195 return NULL;
196 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000197 return PyInt_FromLong((long)ret);
Guido van Rossum02975121992-08-17 08:55:12 +0000198}
199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000200PyDoc_STRVAR(ioctl_doc,
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000201"ioctl(fd, opt[, arg[, mutate_flag]])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +0000202\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000203Perform the requested operation on file descriptor fd. The operation is\n\
Neal Norwitz47308802003-06-30 01:54:04 +0000204defined by opt and is operating system dependent. Typically these codes are\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000205retrieved from the fcntl or termios library modules.\n\
206\n\
207The argument arg is optional, and defaults to 0; it may be an int or a\n\
208buffer containing character data (most likely a string or an array). \n\
209\n\
210If the argument is a mutable buffer (such as an array) and if the\n\
211mutate_flag argument (which is only allowed in this case) is true then the\n\
212buffer is (in effect) passed to the operating system and changes made by\n\
213the OS will be reflected in the contents of the buffer after the call has\n\
214returned. The return value is the integer returned by the ioctl system\n\
215call.\n\
216\n\
217If the argument is a mutable buffer and the mutable_flag argument is not\n\
218passed or is false, the behavior is as if a string had been passed. This\n\
219behavior will change in future releases of Python.\n\
220\n\
221If the argument is an immutable buffer (most likely a string) then a copy\n\
222of the buffer is passed to the operating system and the return value is a\n\
223string of the same length containing whatever the operating system put in\n\
224the buffer. The length of the arg buffer in this case is not allowed to\n\
225exceed 1024 bytes.\n\
226\n\
227If the arg given is an integer or if none is specified, the result value is\n\
228an integer corresponding to the return value of the ioctl call in the C\n\
229code.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000230
Guido van Rossum02975121992-08-17 08:55:12 +0000231
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000232/* flock(fd, operation) */
233
Roger E. Masse919213a1996-12-17 17:42:22 +0000234static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000235fcntl_flock(PyObject *self, PyObject *args)
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000236{
237 int fd;
238 int code;
239 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000240
Fred Drake152a25e2001-05-09 21:02:02 +0000241 if (!PyArg_ParseTuple(args, "O&i:flock",
242 conv_descriptor, &fd, &code))
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000243 return NULL;
244
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000245#ifdef HAVE_FLOCK
Guido van Rossum056bad91999-01-06 18:44:23 +0000246 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000247 ret = flock(fd, code);
Guido van Rossum056bad91999-01-06 18:44:23 +0000248 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000249#else
250
251#ifndef LOCK_SH
252#define LOCK_SH 1 /* shared lock */
253#define LOCK_EX 2 /* exclusive lock */
254#define LOCK_NB 4 /* don't block when locking */
255#define LOCK_UN 8 /* unlock */
256#endif
257 {
258 struct flock l;
259 if (code == LOCK_UN)
260 l.l_type = F_UNLCK;
261 else if (code & LOCK_SH)
262 l.l_type = F_RDLCK;
263 else if (code & LOCK_EX)
264 l.l_type = F_WRLCK;
265 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000266 PyErr_SetString(PyExc_ValueError,
267 "unrecognized flock argument");
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000268 return NULL;
269 }
270 l.l_whence = l.l_start = l.l_len = 0;
Guido van Rossum056bad91999-01-06 18:44:23 +0000271 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000272 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000273 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000274 }
275#endif /* HAVE_FLOCK */
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000276 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000277 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000278 return NULL;
279 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000280 Py_INCREF(Py_None);
281 return Py_None;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000282}
283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000284PyDoc_STRVAR(flock_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000285"flock(fd, operation)\n\
286\n\
287Perform the lock operation op on file descriptor fd. See the Unix \n\
288manual flock(3) for details. (On some systems, this function is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000289emulated using fcntl().)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000290
291
Guido van Rossumc8643641996-09-11 23:17:20 +0000292/* lockf(fd, operation) */
Roger E. Masse919213a1996-12-17 17:42:22 +0000293static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000294fcntl_lockf(PyObject *self, PyObject *args)
Guido van Rossumc8643641996-09-11 23:17:20 +0000295{
Guido van Rossum056bad91999-01-06 18:44:23 +0000296 int fd, code, ret, whence = 0;
297 PyObject *lenobj = NULL, *startobj = NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000298
Fred Drake152a25e2001-05-09 21:02:02 +0000299 if (!PyArg_ParseTuple(args, "O&i|OOi:lockf",
300 conv_descriptor, &fd, &code,
Guido van Rossum056bad91999-01-06 18:44:23 +0000301 &lenobj, &startobj, &whence))
Guido van Rossumc8643641996-09-11 23:17:20 +0000302 return NULL;
303
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000304#if defined(PYOS_OS2) && defined(PYCC_GCC)
305 PyErr_SetString(PyExc_NotImplementedError,
306 "lockf not supported on OS/2 (EMX)");
307 return NULL;
308#else
Guido van Rossumc8643641996-09-11 23:17:20 +0000309#ifndef LOCK_SH
310#define LOCK_SH 1 /* shared lock */
311#define LOCK_EX 2 /* exclusive lock */
312#define LOCK_NB 4 /* don't block when locking */
313#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000314#endif /* LOCK_SH */
Guido van Rossumc8643641996-09-11 23:17:20 +0000315 {
316 struct flock l;
317 if (code == LOCK_UN)
318 l.l_type = F_UNLCK;
319 else if (code & LOCK_SH)
320 l.l_type = F_RDLCK;
321 else if (code & LOCK_EX)
322 l.l_type = F_WRLCK;
323 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000324 PyErr_SetString(PyExc_ValueError,
325 "unrecognized flock argument");
Guido van Rossumc8643641996-09-11 23:17:20 +0000326 return NULL;
327 }
Guido van Rossum056bad91999-01-06 18:44:23 +0000328 l.l_start = l.l_len = 0;
329 if (startobj != NULL) {
330#if !defined(HAVE_LARGEFILE_SUPPORT)
331 l.l_start = PyInt_AsLong(startobj);
332#else
333 l.l_start = PyLong_Check(startobj) ?
334 PyLong_AsLongLong(startobj) :
335 PyInt_AsLong(startobj);
336#endif
337 if (PyErr_Occurred())
338 return NULL;
339 }
340 if (lenobj != NULL) {
341#if !defined(HAVE_LARGEFILE_SUPPORT)
342 l.l_len = PyInt_AsLong(lenobj);
343#else
344 l.l_len = PyLong_Check(lenobj) ?
345 PyLong_AsLongLong(lenobj) :
346 PyInt_AsLong(lenobj);
347#endif
348 if (PyErr_Occurred())
349 return NULL;
350 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000351 l.l_whence = whence;
Guido van Rossum056bad91999-01-06 18:44:23 +0000352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000353 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000354 Py_END_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000355 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000356 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000357 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumc8643641996-09-11 23:17:20 +0000358 return NULL;
359 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000360 Py_INCREF(Py_None);
361 return Py_None;
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000362#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
Guido van Rossumc8643641996-09-11 23:17:20 +0000363}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000365PyDoc_STRVAR(lockf_doc,
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000366"lockf (fd, operation, length=0, start=0, whence=0)\n\
367\n\
368This is essentially a wrapper around the fcntl() locking calls. fd is the\n\
369file descriptor of the file to lock or unlock, and operation is one of the\n\
370following values:\n\
371\n\
372 LOCK_UN - unlock\n\
373 LOCK_SH - acquire a shared lock\n\
374 LOCK_EX - acquire an exclusive lock\n\
375\n\
376When operation is LOCK_SH or LOCK_EX, it can also be bit-wise OR'd with\n\
377LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n\
378lock cannot be acquired, an IOError will be raised and the exception will\n\
379have an errno attribute set to EACCES or EAGAIN (depending on the operating\n\
380system -- for portability, check for either value).\n\
381\n\
382length is the number of bytes to lock, with the default meaning to lock to\n\
383EOF. start is the byte offset, relative to whence, to that the lock\n\
384starts. whence is as with fileobj.seek(), specifically:\n\
385\n\
386 0 - relative to the start of the file (SEEK_SET)\n\
387 1 - relative to the current buffer position (SEEK_CUR)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000388 2 - relative to the end of the file (SEEK_END)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000389
Guido van Rossum02975121992-08-17 08:55:12 +0000390/* List of functions */
391
Roger E. Masse919213a1996-12-17 17:42:22 +0000392static PyMethodDef fcntl_methods[] = {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000393 {"fcntl", fcntl_fcntl, METH_VARARGS, fcntl_doc},
394 {"ioctl", fcntl_ioctl, METH_VARARGS, ioctl_doc},
395 {"flock", fcntl_flock, METH_VARARGS, flock_doc},
396 {"lockf", fcntl_lockf, METH_VARARGS, lockf_doc},
Guido van Rossum02975121992-08-17 08:55:12 +0000397 {NULL, NULL} /* sentinel */
398};
399
400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000401PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000402"This module performs file control and I/O control on file \n\
403descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
404routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000405a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000406
Guido van Rossum02975121992-08-17 08:55:12 +0000407/* Module initialisation */
408
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000409static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000410ins(PyObject* d, char* symbol, long value)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000411{
412 PyObject* v = PyInt_FromLong(value);
413 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
414 return -1;
415
416 Py_DECREF(v);
417 return 0;
418}
419
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000420#define INS(x) if (ins(d, #x, (long)x)) return -1
421
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000422static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000423all_ins(PyObject* d)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000424{
425 if (ins(d, "LOCK_SH", (long)LOCK_SH)) return -1;
426 if (ins(d, "LOCK_EX", (long)LOCK_EX)) return -1;
427 if (ins(d, "LOCK_NB", (long)LOCK_NB)) return -1;
428 if (ins(d, "LOCK_UN", (long)LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000429/* GNU extensions, as of glibc 2.2.4 */
430#ifdef LOCK_MAND
431 if (ins(d, "LOCK_MAND", (long)LOCK_MAND)) return -1;
432#endif
433#ifdef LOCK_READ
434 if (ins(d, "LOCK_READ", (long)LOCK_READ)) return -1;
435#endif
436#ifdef LOCK_WRITE
437 if (ins(d, "LOCK_WRITE", (long)LOCK_WRITE)) return -1;
438#endif
439#ifdef LOCK_RW
440 if (ins(d, "LOCK_RW", (long)LOCK_RW)) return -1;
441#endif
442
Fred Drake152a25e2001-05-09 21:02:02 +0000443#ifdef F_DUPFD
444 if (ins(d, "F_DUPFD", (long)F_DUPFD)) return -1;
445#endif
446#ifdef F_GETFD
447 if (ins(d, "F_GETFD", (long)F_GETFD)) return -1;
448#endif
449#ifdef F_SETFD
450 if (ins(d, "F_SETFD", (long)F_SETFD)) return -1;
451#endif
452#ifdef F_GETFL
453 if (ins(d, "F_GETFL", (long)F_GETFL)) return -1;
454#endif
455#ifdef F_SETFL
456 if (ins(d, "F_SETFL", (long)F_SETFL)) return -1;
457#endif
458#ifdef F_GETLK
459 if (ins(d, "F_GETLK", (long)F_GETLK)) return -1;
460#endif
461#ifdef F_SETLK
462 if (ins(d, "F_SETLK", (long)F_SETLK)) return -1;
463#endif
464#ifdef F_SETLKW
465 if (ins(d, "F_SETLKW", (long)F_SETLKW)) return -1;
466#endif
467#ifdef F_GETOWN
468 if (ins(d, "F_GETOWN", (long)F_GETOWN)) return -1;
469#endif
470#ifdef F_SETOWN
471 if (ins(d, "F_SETOWN", (long)F_SETOWN)) return -1;
472#endif
473#ifdef F_GETSIG
474 if (ins(d, "F_GETSIG", (long)F_GETSIG)) return -1;
475#endif
476#ifdef F_SETSIG
477 if (ins(d, "F_SETSIG", (long)F_SETSIG)) return -1;
478#endif
479#ifdef F_RDLCK
480 if (ins(d, "F_RDLCK", (long)F_RDLCK)) return -1;
481#endif
482#ifdef F_WRLCK
483 if (ins(d, "F_WRLCK", (long)F_WRLCK)) return -1;
484#endif
485#ifdef F_UNLCK
486 if (ins(d, "F_UNLCK", (long)F_UNLCK)) return -1;
487#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000488/* LFS constants */
489#ifdef F_GETLK64
490 if (ins(d, "F_GETLK64", (long)F_GETLK64)) return -1;
491#endif
492#ifdef F_SETLK64
493 if (ins(d, "F_SETLK64", (long)F_SETLK64)) return -1;
494#endif
495#ifdef F_SETLKW64
496 if (ins(d, "F_SETLKW64", (long)F_SETLKW64)) return -1;
497#endif
498/* GNU extensions, as of glibc 2.2.4. */
499#ifdef F_SETLEASE
500 if (ins(d, "F_SETLEASE", (long)F_SETLEASE)) return -1;
501#endif
502#ifdef F_GETLEASE
503 if (ins(d, "F_GETLEASE", (long)F_GETLEASE)) return -1;
504#endif
505#ifdef F_NOTIFY
506 if (ins(d, "F_NOTIFY", (long)F_NOTIFY)) return -1;
507#endif
508/* Old BSD flock(). */
509#ifdef F_EXLCK
510 if (ins(d, "F_EXLCK", (long)F_EXLCK)) return -1;
511#endif
512#ifdef F_SHLCK
513 if (ins(d, "F_SHLCK", (long)F_SHLCK)) return -1;
514#endif
515
516/* For F_{GET|SET}FL */
517#ifdef FD_CLOEXEC
518 if (ins(d, "FD_CLOEXEC", (long)FD_CLOEXEC)) return -1;
519#endif
520
521/* For F_NOTIFY */
522#ifdef DN_ACCESS
523 if (ins(d, "DN_ACCESS", (long)DN_ACCESS)) return -1;
524#endif
525#ifdef DN_MODIFY
526 if (ins(d, "DN_MODIFY", (long)DN_MODIFY)) return -1;
527#endif
528#ifdef DN_CREATE
529 if (ins(d, "DN_CREATE", (long)DN_CREATE)) return -1;
530#endif
531#ifdef DN_DELETE
532 if (ins(d, "DN_DELETE", (long)DN_DELETE)) return -1;
533#endif
534#ifdef DN_RENAME
535 if (ins(d, "DN_RENAME", (long)DN_RENAME)) return -1;
536#endif
537#ifdef DN_ATTRIB
538 if (ins(d, "DN_ATTRIB", (long)DN_ATTRIB)) return -1;
539#endif
540#ifdef DN_MULTISHOT
541 if (ins(d, "DN_MULTISHOT", (long)DN_MULTISHOT)) return -1;
542#endif
543
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000544#ifdef HAVE_STROPTS_H
545 /* Unix 98 guarantees that these are in stropts.h. */
546 INS(I_PUSH);
547 INS(I_POP);
548 INS(I_LOOK);
549 INS(I_FLUSH);
550 INS(I_FLUSHBAND);
551 INS(I_SETSIG);
552 INS(I_GETSIG);
553 INS(I_FIND);
554 INS(I_PEEK);
555 INS(I_SRDOPT);
556 INS(I_GRDOPT);
557 INS(I_NREAD);
558 INS(I_FDINSERT);
559 INS(I_STR);
560 INS(I_SWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000561#ifdef I_GWROPT
562 /* despite the comment above, old-ish glibcs miss a couple... */
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000563 INS(I_GWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000564#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000565 INS(I_SENDFD);
566 INS(I_RECVFD);
567 INS(I_LIST);
568 INS(I_ATMARK);
569 INS(I_CKBAND);
570 INS(I_GETBAND);
571 INS(I_CANPUT);
572 INS(I_SETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000573#ifdef I_GETCLTIME
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000574 INS(I_GETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000575#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000576 INS(I_LINK);
577 INS(I_UNLINK);
578 INS(I_PLINK);
579 INS(I_PUNLINK);
580#endif
581
Guido van Rossum7c141031997-08-15 02:52:08 +0000582 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000583}
584
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000585PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000586initfcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000587{
Roger E. Masse919213a1996-12-17 17:42:22 +0000588 PyObject *m, *d;
Guido van Rossum02975121992-08-17 08:55:12 +0000589
Guido van Rossum185ead61998-11-23 15:32:55 +0000590 /* Create the module and add the functions and documentation */
591 m = Py_InitModule3("fcntl", fcntl_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000592 if (m == NULL)
593 return;
Guido van Rossum02975121992-08-17 08:55:12 +0000594
595 /* Add some symbolic constants to the module */
Roger E. Masse919213a1996-12-17 17:42:22 +0000596 d = PyModule_GetDict(m);
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000597 all_ins(d);
Guido van Rossum02975121992-08-17 08:55:12 +0000598}