| /*[clinic input] |
| preserve |
| [clinic start generated code]*/ |
| |
| #include "pycore_modsupport.h" // _PyArg_CheckPositional() |
| |
| PyDoc_STRVAR(fcntl_fcntl__doc__, |
| "fcntl($module, fd, cmd, arg=0, /)\n" |
| "--\n" |
| "\n" |
| "Perform the operation cmd on file descriptor fd.\n" |
| "\n" |
| "The values used for cmd are operating system dependent, and are\n" |
| "available as constants in the fcntl module, using the same names as used\n" |
| "in the relevant C header files. The argument arg is optional, and\n" |
| "defaults to 0; it may be an integer, a bytes-like object or a string.\n" |
| "If arg is given as a string, it will be encoded to binary using the\n" |
| "UTF-8 encoding.\n" |
| "\n" |
| "If the arg given is an integer or if none is specified, the result value\n" |
| "is an integer corresponding to the return value of the fcntl() call in\n" |
| "the C code.\n" |
| "\n" |
| "If arg is given as a bytes-like object, the return value of fcntl() is a\n" |
| "bytes object of that length, containing the resulting value put in the\n" |
| "arg buffer by the operating system."); |
| |
| #define FCNTL_FCNTL_METHODDEF \ |
| {"fcntl", _PyCFunction_CAST(fcntl_fcntl), METH_FASTCALL, fcntl_fcntl__doc__}, |
| |
| static PyObject * |
| fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg); |
| |
| static PyObject * |
| fcntl_fcntl(PyObject *module, PyObject *const *args, Py_ssize_t nargs) |
| { |
| PyObject *return_value = NULL; |
| int fd; |
| int code; |
| PyObject *arg = NULL; |
| |
| if (!_PyArg_CheckPositional("fcntl", nargs, 2, 3)) { |
| goto exit; |
| } |
| fd = PyObject_AsFileDescriptor(args[0]); |
| if (fd < 0) { |
| goto exit; |
| } |
| code = PyLong_AsInt(args[1]); |
| if (code == -1 && PyErr_Occurred()) { |
| goto exit; |
| } |
| if (nargs < 3) { |
| goto skip_optional; |
| } |
| arg = args[2]; |
| skip_optional: |
| return_value = fcntl_fcntl_impl(module, fd, code, arg); |
| |
| exit: |
| return return_value; |
| } |
| |
| PyDoc_STRVAR(fcntl_ioctl__doc__, |
| "ioctl($module, fd, request, arg=0, mutate_flag=True, /)\n" |
| "--\n" |
| "\n" |
| "Perform the operation request on file descriptor fd.\n" |
| "\n" |
| "The values used for request are operating system dependent, and are\n" |
| "available as constants in the fcntl or termios library modules, using\n" |
| "the same names as used in the relevant C header files.\n" |
| "\n" |
| "The argument arg is optional, and defaults to 0; it may be an integer, a\n" |
| "bytes-like object or a string. If arg is given as a string, it will be\n" |
| "encoded to binary using the UTF-8 encoding.\n" |
| "\n" |
| "If the arg given is an integer or if none is specified, the result value\n" |
| "is an integer corresponding to the return value of the ioctl() call in\n" |
| "the C code.\n" |
| "\n" |
| "If the argument is a mutable buffer (such as a bytearray) and the\n" |
| "mutate_flag argument is true (default) then the buffer is (in effect)\n" |
| "passed to the operating system and changes made by the OS will be\n" |
| "reflected in the contents of the buffer after the call has returned.\n" |
| "The return value is the integer returned by the ioctl() system call.\n" |
| "\n" |
| "If the argument is a mutable buffer and the mutable_flag argument is\n" |
| "false, the behavior is as if an immutable buffer had been passed.\n" |
| "\n" |
| "If the argument is an immutable buffer then a copy of the buffer is\n" |
| "passed to the operating system and the return value is a bytes object of\n" |
| "the same length containing whatever the operating system put in the\n" |
| "buffer."); |
| |
| #define FCNTL_IOCTL_METHODDEF \ |
| {"ioctl", _PyCFunction_CAST(fcntl_ioctl), METH_FASTCALL, fcntl_ioctl__doc__}, |
| |
| static PyObject * |
| fcntl_ioctl_impl(PyObject *module, int fd, unsigned long code, PyObject *arg, |
| int mutate_arg); |
| |
| static PyObject * |
| fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs) |
| { |
| PyObject *return_value = NULL; |
| int fd; |
| unsigned long code; |
| PyObject *arg = NULL; |
| int mutate_arg = 1; |
| |
| if (!_PyArg_CheckPositional("ioctl", nargs, 2, 4)) { |
| goto exit; |
| } |
| fd = PyObject_AsFileDescriptor(args[0]); |
| if (fd < 0) { |
| goto exit; |
| } |
| if (!PyIndex_Check(args[1])) { |
| _PyArg_BadArgument("ioctl", "argument 2", "int", args[1]); |
| goto exit; |
| } |
| { |
| Py_ssize_t _bytes = PyLong_AsNativeBytes(args[1], &code, sizeof(unsigned long), |
| Py_ASNATIVEBYTES_NATIVE_ENDIAN | |
| Py_ASNATIVEBYTES_ALLOW_INDEX | |
| Py_ASNATIVEBYTES_UNSIGNED_BUFFER); |
| if (_bytes < 0) { |
| goto exit; |
| } |
| if ((size_t)_bytes > sizeof(unsigned long)) { |
| if (PyErr_WarnEx(PyExc_DeprecationWarning, |
| "integer value out of range", 1) < 0) |
| { |
| goto exit; |
| } |
| } |
| } |
| if (nargs < 3) { |
| goto skip_optional; |
| } |
| arg = args[2]; |
| if (nargs < 4) { |
| goto skip_optional; |
| } |
| mutate_arg = PyObject_IsTrue(args[3]); |
| if (mutate_arg < 0) { |
| goto exit; |
| } |
| skip_optional: |
| return_value = fcntl_ioctl_impl(module, fd, code, arg, mutate_arg); |
| |
| exit: |
| return return_value; |
| } |
| |
| PyDoc_STRVAR(fcntl_flock__doc__, |
| "flock($module, fd, operation, /)\n" |
| "--\n" |
| "\n" |
| "Perform the lock operation on file descriptor fd.\n" |
| "\n" |
| "See the Unix manual page for flock(2) for details (On some systems, this\n" |
| "function is emulated using fcntl())."); |
| |
| #define FCNTL_FLOCK_METHODDEF \ |
| {"flock", _PyCFunction_CAST(fcntl_flock), METH_FASTCALL, fcntl_flock__doc__}, |
| |
| static PyObject * |
| fcntl_flock_impl(PyObject *module, int fd, int code); |
| |
| static PyObject * |
| fcntl_flock(PyObject *module, PyObject *const *args, Py_ssize_t nargs) |
| { |
| PyObject *return_value = NULL; |
| int fd; |
| int code; |
| |
| if (!_PyArg_CheckPositional("flock", nargs, 2, 2)) { |
| goto exit; |
| } |
| fd = PyObject_AsFileDescriptor(args[0]); |
| if (fd < 0) { |
| goto exit; |
| } |
| code = PyLong_AsInt(args[1]); |
| if (code == -1 && PyErr_Occurred()) { |
| goto exit; |
| } |
| return_value = fcntl_flock_impl(module, fd, code); |
| |
| exit: |
| return return_value; |
| } |
| |
| PyDoc_STRVAR(fcntl_lockf__doc__, |
| "lockf($module, fd, cmd, len=0, start=0, whence=0, /)\n" |
| "--\n" |
| "\n" |
| "A wrapper around the fcntl() locking calls.\n" |
| "\n" |
| "fd is the file descriptor of the file to lock or unlock, and operation\n" |
| "is one of the following values:\n" |
| "\n" |
| " LOCK_UN - unlock\n" |
| " LOCK_SH - acquire a shared lock\n" |
| " LOCK_EX - acquire an exclusive lock\n" |
| "\n" |
| "When operation is LOCK_SH or LOCK_EX, it can also be bitwise ORed with\n" |
| "LOCK_NB to avoid blocking on lock acquisition. If LOCK_NB is used and\n" |
| "the lock cannot be acquired, an OSError will be raised and the exception\n" |
| "will have an errno attribute set to EACCES or EAGAIN (depending on the\n" |
| "operating system -- for portability, check for either value).\n" |
| "\n" |
| "len is the number of bytes to lock, with the default meaning to lock to\n" |
| "EOF. start is the byte offset, relative to whence, to that the lock\n" |
| "starts. whence is as with fileobj.seek(), specifically:\n" |
| "\n" |
| " 0 - relative to the start of the file (SEEK_SET)\n" |
| " 1 - relative to the current buffer position (SEEK_CUR)\n" |
| " 2 - relative to the end of the file (SEEK_END)"); |
| |
| #define FCNTL_LOCKF_METHODDEF \ |
| {"lockf", _PyCFunction_CAST(fcntl_lockf), METH_FASTCALL, fcntl_lockf__doc__}, |
| |
| static PyObject * |
| fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, |
| PyObject *startobj, int whence); |
| |
| static PyObject * |
| fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs) |
| { |
| PyObject *return_value = NULL; |
| int fd; |
| int code; |
| PyObject *lenobj = NULL; |
| PyObject *startobj = NULL; |
| int whence = 0; |
| |
| if (!_PyArg_CheckPositional("lockf", nargs, 2, 5)) { |
| goto exit; |
| } |
| fd = PyObject_AsFileDescriptor(args[0]); |
| if (fd < 0) { |
| goto exit; |
| } |
| code = PyLong_AsInt(args[1]); |
| if (code == -1 && PyErr_Occurred()) { |
| goto exit; |
| } |
| if (nargs < 3) { |
| goto skip_optional; |
| } |
| lenobj = args[2]; |
| if (nargs < 4) { |
| goto skip_optional; |
| } |
| startobj = args[3]; |
| if (nargs < 5) { |
| goto skip_optional; |
| } |
| whence = PyLong_AsInt(args[4]); |
| if (whence == -1 && PyErr_Occurred()) { |
| goto exit; |
| } |
| skip_optional: |
| return_value = fcntl_lockf_impl(module, fd, code, lenobj, startobj, whence); |
| |
| exit: |
| return return_value; |
| } |
| /*[clinic end generated code: output=c782fcf9dd6690e0 input=a9049054013a1b77]*/ |