blob: 6447e5686ba9fc0f6888f3b086f0acdd2cf513f6 [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 }
Christian Heimes217cfd12007-12-02 14:31:20 +000076 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,
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{
Thomas Wouters477c8d52006-05-27 19:21:47 +000098#define IOCTL_BUFSZ 1024
Guido van Rossum02975121992-08-17 08:55:12 +000099 int fd;
Christian Heimese25f35e2008-03-20 10:49:03 +0000100 /* In PyArg_ParseTuple below, we use the unsigned non-checked 'I'
101 format for the 'code' parameter because Python turns 0x8000000
102 into either a large positive number (PyLong or PyInt on 64-bit
103 platforms) or a negative number on others (32-bit PyInt)
104 whereas the system expects it to be a 32bit bit field value
105 regardless of it being passed as an int or unsigned long on
106 various platforms. See the termios.TIOCSWINSZ constant across
107 platforms for an example of thise.
108
109 If any of the 64bit platforms ever decide to use more than 32bits
110 in their unsigned long ioctl codes this will break and need
111 special casing based on the platform being built on.
112 */
113 unsigned int code;
Guido van Rossum02975121992-08-17 08:55:12 +0000114 int arg;
115 int ret;
116 char *str;
Thomas Wouters26cc63f2006-03-02 00:21:10 +0000117 Py_ssize_t len;
Michael W. Hudson02d74f62004-11-30 14:31:54 +0000118 int mutate_arg = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119 char buf[IOCTL_BUFSZ+1]; /* argument plus NUL byte */
Guido van Rossum02975121992-08-17 08:55:12 +0000120
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000121 if (PyArg_ParseTuple(args, "O&Iw#|i:ioctl",
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000122 conv_descriptor, &fd, &code,
123 &str, &len, &mutate_arg)) {
124 char *arg;
125
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000126 if (mutate_arg) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127 if (len <= IOCTL_BUFSZ) {
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000128 memcpy(buf, str, len);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 buf[len] = '\0';
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000130 arg = buf;
131 }
132 else {
133 arg = str;
134 }
135 }
136 else {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000137 if (len > IOCTL_BUFSZ) {
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000138 PyErr_SetString(PyExc_ValueError,
139 "ioctl string arg too long");
140 return NULL;
141 }
142 else {
143 memcpy(buf, str, len);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000144 buf[len] = '\0';
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000145 arg = buf;
146 }
147 }
148 if (buf == arg) {
149 Py_BEGIN_ALLOW_THREADS /* think array.resize() */
150 ret = ioctl(fd, code, arg);
151 Py_END_ALLOW_THREADS
152 }
153 else {
154 ret = ioctl(fd, code, arg);
155 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000156 if (mutate_arg && (len < IOCTL_BUFSZ)) {
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000157 memcpy(str, buf, len);
158 }
159 if (ret < 0) {
160 PyErr_SetFromErrno(PyExc_IOError);
161 return NULL;
162 }
163 if (mutate_arg) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000164 return PyLong_FromLong(ret);
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000165 }
166 else {
167 return PyString_FromStringAndSize(buf, len);
168 }
169 }
170
171 PyErr_Clear();
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000172 if (PyArg_ParseTuple(args, "O&Is#:ioctl",
Fred Drake152a25e2001-05-09 21:02:02 +0000173 conv_descriptor, &fd, &code, &str, &len)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174 if (len > IOCTL_BUFSZ) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000175 PyErr_SetString(PyExc_ValueError,
176 "ioctl string arg too long");
Guido van Rossum02975121992-08-17 08:55:12 +0000177 return NULL;
178 }
179 memcpy(buf, str, len);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 buf[len] = '\0';
Roger E. Masse919213a1996-12-17 17:42:22 +0000181 Py_BEGIN_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000182 ret = ioctl(fd, code, buf);
Roger E. Masse919213a1996-12-17 17:42:22 +0000183 Py_END_ALLOW_THREADS
Guido van Rossum903f4871995-10-07 19:18:22 +0000184 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000185 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000186 return NULL;
187 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000188 return PyString_FromStringAndSize(buf, len);
Guido van Rossum02975121992-08-17 08:55:12 +0000189 }
190
Roger E. Masse919213a1996-12-17 17:42:22 +0000191 PyErr_Clear();
Guido van Rossuma2214c32000-08-02 20:46:51 +0000192 arg = 0;
Fred Drake460f0692001-05-14 21:02:36 +0000193 if (!PyArg_ParseTuple(args,
Michael W. Hudson8137bea2005-07-27 20:24:40 +0000194 "O&I|i;ioctl requires a file or file descriptor,"
Hye-Shik Chang97bb8ad2005-07-28 05:57:19 +0000195 " an integer and optionally an integer or buffer argument",
Fred Drake152a25e2001-05-09 21:02:02 +0000196 conv_descriptor, &fd, &code, &arg)) {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000197 return NULL;
Guido van Rossum02975121992-08-17 08:55:12 +0000198 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000199 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000200#ifdef __VMS
201 ret = ioctl(fd, code, (void *)arg);
202#else
Guido van Rossum02975121992-08-17 08:55:12 +0000203 ret = ioctl(fd, code, arg);
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000204#endif
Roger E. Masse919213a1996-12-17 17:42:22 +0000205 Py_END_ALLOW_THREADS
Guido van Rossum02975121992-08-17 08:55:12 +0000206 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000207 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum02975121992-08-17 08:55:12 +0000208 return NULL;
209 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000210 return PyLong_FromLong((long)ret);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000211#undef IOCTL_BUFSZ
Guido van Rossum02975121992-08-17 08:55:12 +0000212}
213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000214PyDoc_STRVAR(ioctl_doc,
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000215"ioctl(fd, opt[, arg[, mutate_flag]])\n\
Guido van Rossum185ead61998-11-23 15:32:55 +0000216\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000217Perform the requested operation on file descriptor fd. The operation is\n\
Neal Norwitz47308802003-06-30 01:54:04 +0000218defined by opt and is operating system dependent. Typically these codes are\n\
Michael W. Hudsonf0089982003-03-03 12:29:42 +0000219retrieved from the fcntl or termios library modules.\n\
220\n\
221The argument arg is optional, and defaults to 0; it may be an int or a\n\
222buffer containing character data (most likely a string or an array). \n\
223\n\
224If the argument is a mutable buffer (such as an array) and if the\n\
225mutate_flag argument (which is only allowed in this case) is true then the\n\
226buffer is (in effect) passed to the operating system and changes made by\n\
227the OS will be reflected in the contents of the buffer after the call has\n\
228returned. The return value is the integer returned by the ioctl system\n\
229call.\n\
230\n\
231If the argument is a mutable buffer and the mutable_flag argument is not\n\
232passed or is false, the behavior is as if a string had been passed. This\n\
233behavior will change in future releases of Python.\n\
234\n\
235If the argument is an immutable buffer (most likely a string) then a copy\n\
236of the buffer is passed to the operating system and the return value is a\n\
237string of the same length containing whatever the operating system put in\n\
238the buffer. The length of the arg buffer in this case is not allowed to\n\
239exceed 1024 bytes.\n\
240\n\
241If the arg given is an integer or if none is specified, the result value is\n\
242an integer corresponding to the return value of the ioctl call in the C\n\
243code.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000244
Guido van Rossum02975121992-08-17 08:55:12 +0000245
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000246/* flock(fd, operation) */
247
Roger E. Masse919213a1996-12-17 17:42:22 +0000248static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000249fcntl_flock(PyObject *self, PyObject *args)
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000250{
251 int fd;
252 int code;
253 int ret;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000254
Fred Drake152a25e2001-05-09 21:02:02 +0000255 if (!PyArg_ParseTuple(args, "O&i:flock",
256 conv_descriptor, &fd, &code))
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000257 return NULL;
258
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000259#ifdef HAVE_FLOCK
Guido van Rossum056bad91999-01-06 18:44:23 +0000260 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000261 ret = flock(fd, code);
Guido van Rossum056bad91999-01-06 18:44:23 +0000262 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000263#else
264
265#ifndef LOCK_SH
266#define LOCK_SH 1 /* shared lock */
267#define LOCK_EX 2 /* exclusive lock */
268#define LOCK_NB 4 /* don't block when locking */
269#define LOCK_UN 8 /* unlock */
270#endif
271 {
272 struct flock l;
273 if (code == LOCK_UN)
274 l.l_type = F_UNLCK;
275 else if (code & LOCK_SH)
276 l.l_type = F_RDLCK;
277 else if (code & LOCK_EX)
278 l.l_type = F_WRLCK;
279 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000280 PyErr_SetString(PyExc_ValueError,
281 "unrecognized flock argument");
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000282 return NULL;
283 }
284 l.l_whence = l.l_start = l.l_len = 0;
Guido van Rossum056bad91999-01-06 18:44:23 +0000285 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000286 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000287 Py_END_ALLOW_THREADS
Guido van Rossum3c0b79c1996-06-11 15:11:34 +0000288 }
289#endif /* HAVE_FLOCK */
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000290 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000291 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000292 return NULL;
293 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000294 Py_INCREF(Py_None);
295 return Py_None;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000296}
297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000298PyDoc_STRVAR(flock_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000299"flock(fd, operation)\n\
300\n\
301Perform the lock operation op on file descriptor fd. See the Unix \n\
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000302manual page for flock(3) for details. (On some systems, this function is\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000303emulated using fcntl().)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000304
305
Guido van Rossumc8643641996-09-11 23:17:20 +0000306/* lockf(fd, operation) */
Roger E. Masse919213a1996-12-17 17:42:22 +0000307static PyObject *
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000308fcntl_lockf(PyObject *self, PyObject *args)
Guido van Rossumc8643641996-09-11 23:17:20 +0000309{
Guido van Rossum056bad91999-01-06 18:44:23 +0000310 int fd, code, ret, whence = 0;
311 PyObject *lenobj = NULL, *startobj = NULL;
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000312
Fred Drake152a25e2001-05-09 21:02:02 +0000313 if (!PyArg_ParseTuple(args, "O&i|OOi:lockf",
314 conv_descriptor, &fd, &code,
Guido van Rossum056bad91999-01-06 18:44:23 +0000315 &lenobj, &startobj, &whence))
Guido van Rossumc8643641996-09-11 23:17:20 +0000316 return NULL;
317
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000318#if defined(PYOS_OS2) && defined(PYCC_GCC)
319 PyErr_SetString(PyExc_NotImplementedError,
320 "lockf not supported on OS/2 (EMX)");
321 return NULL;
322#else
Guido van Rossumc8643641996-09-11 23:17:20 +0000323#ifndef LOCK_SH
324#define LOCK_SH 1 /* shared lock */
325#define LOCK_EX 2 /* exclusive lock */
326#define LOCK_NB 4 /* don't block when locking */
327#define LOCK_UN 8 /* unlock */
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000328#endif /* LOCK_SH */
Guido van Rossumc8643641996-09-11 23:17:20 +0000329 {
330 struct flock l;
331 if (code == LOCK_UN)
332 l.l_type = F_UNLCK;
333 else if (code & LOCK_SH)
334 l.l_type = F_RDLCK;
335 else if (code & LOCK_EX)
336 l.l_type = F_WRLCK;
337 else {
Roger E. Masse919213a1996-12-17 17:42:22 +0000338 PyErr_SetString(PyExc_ValueError,
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000339 "unrecognized lockf argument");
Guido van Rossumc8643641996-09-11 23:17:20 +0000340 return NULL;
341 }
Guido van Rossum056bad91999-01-06 18:44:23 +0000342 l.l_start = l.l_len = 0;
343 if (startobj != NULL) {
344#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +0000345 l.l_start = PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000346#else
347 l.l_start = PyLong_Check(startobj) ?
348 PyLong_AsLongLong(startobj) :
Christian Heimes217cfd12007-12-02 14:31:20 +0000349 PyLong_AsLong(startobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000350#endif
351 if (PyErr_Occurred())
352 return NULL;
353 }
354 if (lenobj != NULL) {
355#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +0000356 l.l_len = PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000357#else
358 l.l_len = PyLong_Check(lenobj) ?
359 PyLong_AsLongLong(lenobj) :
Christian Heimes217cfd12007-12-02 14:31:20 +0000360 PyLong_AsLong(lenobj);
Guido van Rossum056bad91999-01-06 18:44:23 +0000361#endif
362 if (PyErr_Occurred())
363 return NULL;
364 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000365 l.l_whence = whence;
Guido van Rossum056bad91999-01-06 18:44:23 +0000366 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000367 ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
Guido van Rossum056bad91999-01-06 18:44:23 +0000368 Py_END_ALLOW_THREADS
Guido van Rossumc8643641996-09-11 23:17:20 +0000369 }
Guido van Rossumc8643641996-09-11 23:17:20 +0000370 if (ret < 0) {
Roger E. Masse919213a1996-12-17 17:42:22 +0000371 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossumc8643641996-09-11 23:17:20 +0000372 return NULL;
373 }
Roger E. Masse919213a1996-12-17 17:42:22 +0000374 Py_INCREF(Py_None);
375 return Py_None;
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000376#endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */
Guido van Rossumc8643641996-09-11 23:17:20 +0000377}
Guido van Rossum3539b1e1996-05-23 22:56:38 +0000378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000379PyDoc_STRVAR(lockf_doc,
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000380"lockf (fd, operation, length=0, start=0, whence=0)\n\
381\n\
382This is essentially a wrapper around the fcntl() locking calls. fd is the\n\
383file descriptor of the file to lock or unlock, and operation is one of the\n\
384following values:\n\
385\n\
386 LOCK_UN - unlock\n\
387 LOCK_SH - acquire a shared lock\n\
388 LOCK_EX - acquire an exclusive lock\n\
389\n\
Christian Heimesfaf2f632008-01-06 16:59:19 +0000390When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with\n\
Sjoerd Mullender82e00d62001-01-25 10:10:39 +0000391LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and the\n\
392lock cannot be acquired, an IOError will be raised and the exception will\n\
393have an errno attribute set to EACCES or EAGAIN (depending on the operating\n\
394system -- for portability, check for either value).\n\
395\n\
396length is the number of bytes to lock, with the default meaning to lock to\n\
397EOF. start is the byte offset, relative to whence, to that the lock\n\
398starts. whence is as with fileobj.seek(), specifically:\n\
399\n\
400 0 - relative to the start of the file (SEEK_SET)\n\
401 1 - relative to the current buffer position (SEEK_CUR)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000402 2 - relative to the end of the file (SEEK_END)");
Guido van Rossum185ead61998-11-23 15:32:55 +0000403
Guido van Rossum02975121992-08-17 08:55:12 +0000404/* List of functions */
405
Roger E. Masse919213a1996-12-17 17:42:22 +0000406static PyMethodDef fcntl_methods[] = {
Guido van Rossuma2214c32000-08-02 20:46:51 +0000407 {"fcntl", fcntl_fcntl, METH_VARARGS, fcntl_doc},
408 {"ioctl", fcntl_ioctl, METH_VARARGS, ioctl_doc},
409 {"flock", fcntl_flock, METH_VARARGS, flock_doc},
410 {"lockf", fcntl_lockf, METH_VARARGS, lockf_doc},
Guido van Rossum02975121992-08-17 08:55:12 +0000411 {NULL, NULL} /* sentinel */
412};
413
414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000415PyDoc_STRVAR(module_doc,
Guido van Rossum185ead61998-11-23 15:32:55 +0000416"This module performs file control and I/O control on file \n\
417descriptors. It is an interface to the fcntl() and ioctl() Unix\n\
418routines. File descriptors can be obtained with the fileno() method of\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000419a file or socket object.");
Guido van Rossum185ead61998-11-23 15:32:55 +0000420
Guido van Rossum02975121992-08-17 08:55:12 +0000421/* Module initialisation */
422
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000423static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000424ins(PyObject* d, char* symbol, long value)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000425{
Christian Heimes217cfd12007-12-02 14:31:20 +0000426 PyObject* v = PyLong_FromLong(value);
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000427 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
428 return -1;
429
430 Py_DECREF(v);
431 return 0;
432}
433
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000434#define INS(x) if (ins(d, #x, (long)x)) return -1
435
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000436static int
Peter Schneider-Kamp8bc8f0d2000-07-10 17:15:07 +0000437all_ins(PyObject* d)
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000438{
439 if (ins(d, "LOCK_SH", (long)LOCK_SH)) return -1;
440 if (ins(d, "LOCK_EX", (long)LOCK_EX)) return -1;
441 if (ins(d, "LOCK_NB", (long)LOCK_NB)) return -1;
442 if (ins(d, "LOCK_UN", (long)LOCK_UN)) return -1;
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000443/* GNU extensions, as of glibc 2.2.4 */
444#ifdef LOCK_MAND
445 if (ins(d, "LOCK_MAND", (long)LOCK_MAND)) return -1;
446#endif
447#ifdef LOCK_READ
448 if (ins(d, "LOCK_READ", (long)LOCK_READ)) return -1;
449#endif
450#ifdef LOCK_WRITE
451 if (ins(d, "LOCK_WRITE", (long)LOCK_WRITE)) return -1;
452#endif
453#ifdef LOCK_RW
454 if (ins(d, "LOCK_RW", (long)LOCK_RW)) return -1;
455#endif
456
Fred Drake152a25e2001-05-09 21:02:02 +0000457#ifdef F_DUPFD
458 if (ins(d, "F_DUPFD", (long)F_DUPFD)) return -1;
459#endif
460#ifdef F_GETFD
461 if (ins(d, "F_GETFD", (long)F_GETFD)) return -1;
462#endif
463#ifdef F_SETFD
464 if (ins(d, "F_SETFD", (long)F_SETFD)) return -1;
465#endif
466#ifdef F_GETFL
467 if (ins(d, "F_GETFL", (long)F_GETFL)) return -1;
468#endif
469#ifdef F_SETFL
470 if (ins(d, "F_SETFL", (long)F_SETFL)) return -1;
471#endif
472#ifdef F_GETLK
473 if (ins(d, "F_GETLK", (long)F_GETLK)) return -1;
474#endif
475#ifdef F_SETLK
476 if (ins(d, "F_SETLK", (long)F_SETLK)) return -1;
477#endif
478#ifdef F_SETLKW
479 if (ins(d, "F_SETLKW", (long)F_SETLKW)) return -1;
480#endif
481#ifdef F_GETOWN
482 if (ins(d, "F_GETOWN", (long)F_GETOWN)) return -1;
483#endif
484#ifdef F_SETOWN
485 if (ins(d, "F_SETOWN", (long)F_SETOWN)) return -1;
486#endif
487#ifdef F_GETSIG
488 if (ins(d, "F_GETSIG", (long)F_GETSIG)) return -1;
489#endif
490#ifdef F_SETSIG
491 if (ins(d, "F_SETSIG", (long)F_SETSIG)) return -1;
492#endif
493#ifdef F_RDLCK
494 if (ins(d, "F_RDLCK", (long)F_RDLCK)) return -1;
495#endif
496#ifdef F_WRLCK
497 if (ins(d, "F_WRLCK", (long)F_WRLCK)) return -1;
498#endif
499#ifdef F_UNLCK
500 if (ins(d, "F_UNLCK", (long)F_UNLCK)) return -1;
501#endif
Martin v. Löwis1baeba62001-12-28 21:08:12 +0000502/* LFS constants */
503#ifdef F_GETLK64
504 if (ins(d, "F_GETLK64", (long)F_GETLK64)) return -1;
505#endif
506#ifdef F_SETLK64
507 if (ins(d, "F_SETLK64", (long)F_SETLK64)) return -1;
508#endif
509#ifdef F_SETLKW64
510 if (ins(d, "F_SETLKW64", (long)F_SETLKW64)) return -1;
511#endif
512/* GNU extensions, as of glibc 2.2.4. */
513#ifdef F_SETLEASE
514 if (ins(d, "F_SETLEASE", (long)F_SETLEASE)) return -1;
515#endif
516#ifdef F_GETLEASE
517 if (ins(d, "F_GETLEASE", (long)F_GETLEASE)) return -1;
518#endif
519#ifdef F_NOTIFY
520 if (ins(d, "F_NOTIFY", (long)F_NOTIFY)) return -1;
521#endif
522/* Old BSD flock(). */
523#ifdef F_EXLCK
524 if (ins(d, "F_EXLCK", (long)F_EXLCK)) return -1;
525#endif
526#ifdef F_SHLCK
527 if (ins(d, "F_SHLCK", (long)F_SHLCK)) return -1;
528#endif
529
530/* For F_{GET|SET}FL */
531#ifdef FD_CLOEXEC
532 if (ins(d, "FD_CLOEXEC", (long)FD_CLOEXEC)) return -1;
533#endif
534
535/* For F_NOTIFY */
536#ifdef DN_ACCESS
537 if (ins(d, "DN_ACCESS", (long)DN_ACCESS)) return -1;
538#endif
539#ifdef DN_MODIFY
540 if (ins(d, "DN_MODIFY", (long)DN_MODIFY)) return -1;
541#endif
542#ifdef DN_CREATE
543 if (ins(d, "DN_CREATE", (long)DN_CREATE)) return -1;
544#endif
545#ifdef DN_DELETE
546 if (ins(d, "DN_DELETE", (long)DN_DELETE)) return -1;
547#endif
548#ifdef DN_RENAME
549 if (ins(d, "DN_RENAME", (long)DN_RENAME)) return -1;
550#endif
551#ifdef DN_ATTRIB
552 if (ins(d, "DN_ATTRIB", (long)DN_ATTRIB)) return -1;
553#endif
554#ifdef DN_MULTISHOT
555 if (ins(d, "DN_MULTISHOT", (long)DN_MULTISHOT)) return -1;
556#endif
557
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000558#ifdef HAVE_STROPTS_H
559 /* Unix 98 guarantees that these are in stropts.h. */
560 INS(I_PUSH);
561 INS(I_POP);
562 INS(I_LOOK);
563 INS(I_FLUSH);
564 INS(I_FLUSHBAND);
565 INS(I_SETSIG);
566 INS(I_GETSIG);
567 INS(I_FIND);
568 INS(I_PEEK);
569 INS(I_SRDOPT);
570 INS(I_GRDOPT);
571 INS(I_NREAD);
572 INS(I_FDINSERT);
573 INS(I_STR);
574 INS(I_SWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000575#ifdef I_GWROPT
576 /* despite the comment above, old-ish glibcs miss a couple... */
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000577 INS(I_GWROPT);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000578#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000579 INS(I_SENDFD);
580 INS(I_RECVFD);
581 INS(I_LIST);
582 INS(I_ATMARK);
583 INS(I_CKBAND);
584 INS(I_GETBAND);
585 INS(I_CANPUT);
586 INS(I_SETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000587#ifdef I_GETCLTIME
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000588 INS(I_GETCLTIME);
Michael W. Hudson505c4c22003-05-09 10:45:20 +0000589#endif
Martin v. Löwis14e73b12003-01-01 09:51:12 +0000590 INS(I_LINK);
591 INS(I_UNLINK);
592 INS(I_PLINK);
593 INS(I_PUNLINK);
594#endif
595
Guido van Rossum7c141031997-08-15 02:52:08 +0000596 return 0;
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000597}
598
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000599PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000600initfcntl(void)
Guido van Rossum02975121992-08-17 08:55:12 +0000601{
Roger E. Masse919213a1996-12-17 17:42:22 +0000602 PyObject *m, *d;
Guido van Rossum02975121992-08-17 08:55:12 +0000603
Guido van Rossum185ead61998-11-23 15:32:55 +0000604 /* Create the module and add the functions and documentation */
605 m = Py_InitModule3("fcntl", fcntl_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000606 if (m == NULL)
607 return;
Guido van Rossum02975121992-08-17 08:55:12 +0000608
609 /* Add some symbolic constants to the module */
Roger E. Masse919213a1996-12-17 17:42:22 +0000610 d = PyModule_GetDict(m);
Guido van Rossumf4e32c71997-07-31 19:39:54 +0000611 all_ins(d);
Guido van Rossum02975121992-08-17 08:55:12 +0000612}