2014-11-09 21:22:01 -04:00
|
|
|
/*[clinic input]
|
|
|
|
preserve
|
|
|
|
[clinic start generated code]*/
|
|
|
|
|
2022-08-11 18:25:49 -03:00
|
|
|
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
|
|
|
|
# include "pycore_gc.h" // PyGC_Head
|
|
|
|
# include "pycore_runtime.h" // _Py_ID()
|
|
|
|
#endif
|
|
|
|
|
2023-08-25 22:18:09 -03:00
|
|
|
#include "pycore_fileutils.h" // _PyLong_FileDescriptor_Converter()
|
2022-08-11 18:25:49 -03:00
|
|
|
|
2014-11-09 21:22:01 -04:00
|
|
|
PyDoc_STRVAR(fcntl_fcntl__doc__,
|
2015-03-20 15:04:21 -03:00
|
|
|
"fcntl($module, fd, cmd, arg=0, /)\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"--\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"Perform the operation `cmd` on file descriptor fd.\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"The values used for `cmd` are operating system dependent, and are available\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"as constants in the fcntl module, using the same names as used in\n"
|
|
|
|
"the relevant C header files. The argument arg is optional, and\n"
|
|
|
|
"defaults to 0; it may be an int or a string. If arg is given as a string,\n"
|
|
|
|
"the return value of fcntl is a string of that length, containing the\n"
|
|
|
|
"resulting value put in the arg buffer by the operating system. The length\n"
|
|
|
|
"of the arg string is not allowed to exceed 1024 bytes. If the arg given\n"
|
|
|
|
"is an integer or if none is specified, the result value is an integer\n"
|
|
|
|
"corresponding to the return value of the fcntl call in the C code.");
|
|
|
|
|
|
|
|
#define FCNTL_FCNTL_METHODDEF \
|
2022-05-03 15:25:41 -03:00
|
|
|
{"fcntl", _PyCFunction_CAST(fcntl_fcntl), METH_FASTCALL, fcntl_fcntl__doc__},
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2016-07-07 11:35:15 -03:00
|
|
|
fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg);
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2017-12-15 07:11:11 -04:00
|
|
|
fcntl_fcntl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
2014-11-09 21:22:01 -04:00
|
|
|
{
|
|
|
|
PyObject *return_value = NULL;
|
|
|
|
int fd;
|
|
|
|
int code;
|
|
|
|
PyObject *arg = NULL;
|
|
|
|
|
2019-01-11 10:01:14 -04:00
|
|
|
if (!_PyArg_CheckPositional("fcntl", nargs, 2, 3)) {
|
2017-01-16 20:35:17 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2020-10-09 17:00:45 -03:00
|
|
|
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
|
2019-01-11 10:01:14 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2023-08-24 19:51:22 -03:00
|
|
|
code = PyLong_AsInt(args[1]);
|
2019-01-11 10:01:14 -04:00
|
|
|
if (code == -1 && PyErr_Occurred()) {
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
if (nargs < 3) {
|
|
|
|
goto skip_optional;
|
|
|
|
}
|
|
|
|
arg = args[2];
|
|
|
|
skip_optional:
|
2014-11-09 21:22:01 -04:00
|
|
|
return_value = fcntl_fcntl_impl(module, fd, code, arg);
|
|
|
|
|
|
|
|
exit:
|
|
|
|
return return_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyDoc_STRVAR(fcntl_ioctl__doc__,
|
2015-03-20 15:04:21 -03:00
|
|
|
"ioctl($module, fd, request, arg=0, mutate_flag=True, /)\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"--\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"Perform the operation `request` on file descriptor `fd`.\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"The values used for `request` are operating system dependent, and are available\n"
|
|
|
|
"as constants in the fcntl or termios library modules, using the same names as\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"used in the relevant C header files.\n"
|
|
|
|
"\n"
|
|
|
|
"The argument `arg` is optional, and defaults to 0; it may be an int or a\n"
|
|
|
|
"buffer containing character data (most likely a string or an array).\n"
|
|
|
|
"\n"
|
|
|
|
"If the argument is a mutable buffer (such as an array) and if the\n"
|
|
|
|
"mutate_flag argument (which is only allowed in this case) is true then the\n"
|
|
|
|
"buffer is (in effect) passed to the operating system and changes made by\n"
|
|
|
|
"the OS will be reflected in the contents of the buffer after the call has\n"
|
|
|
|
"returned. The return value is the integer returned by the ioctl system\n"
|
|
|
|
"call.\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"If the argument is a mutable buffer and the mutable_flag argument is false,\n"
|
|
|
|
"the behavior is as if a string had been passed.\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"\n"
|
|
|
|
"If the argument is an immutable buffer (most likely a string) then a copy\n"
|
|
|
|
"of the buffer is passed to the operating system and the return value is a\n"
|
|
|
|
"string of the same length containing whatever the operating system put in\n"
|
|
|
|
"the buffer. The length of the arg buffer in this case is not allowed to\n"
|
|
|
|
"exceed 1024 bytes.\n"
|
|
|
|
"\n"
|
|
|
|
"If the arg given is an integer or if none is specified, the result value is\n"
|
|
|
|
"an integer corresponding to the return value of the ioctl call in the C\n"
|
|
|
|
"code.");
|
|
|
|
|
|
|
|
#define FCNTL_IOCTL_METHODDEF \
|
2022-05-03 15:25:41 -03:00
|
|
|
{"ioctl", _PyCFunction_CAST(fcntl_ioctl), METH_FASTCALL, fcntl_ioctl__doc__},
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2016-07-07 11:35:15 -03:00
|
|
|
fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
|
2015-04-14 19:07:59 -03:00
|
|
|
PyObject *ob_arg, int mutate_arg);
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2017-12-15 07:11:11 -04:00
|
|
|
fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
2014-11-09 21:22:01 -04:00
|
|
|
{
|
|
|
|
PyObject *return_value = NULL;
|
|
|
|
int fd;
|
|
|
|
unsigned int code;
|
|
|
|
PyObject *ob_arg = NULL;
|
|
|
|
int mutate_arg = 1;
|
|
|
|
|
2019-01-11 10:01:14 -04:00
|
|
|
if (!_PyArg_CheckPositional("ioctl", nargs, 2, 4)) {
|
|
|
|
goto exit;
|
|
|
|
}
|
2020-10-09 17:00:45 -03:00
|
|
|
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
|
2017-01-16 20:35:17 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2019-01-11 10:01:14 -04:00
|
|
|
code = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
|
|
|
|
if (code == (unsigned int)-1 && PyErr_Occurred()) {
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
if (nargs < 3) {
|
|
|
|
goto skip_optional;
|
|
|
|
}
|
|
|
|
ob_arg = args[2];
|
|
|
|
if (nargs < 4) {
|
|
|
|
goto skip_optional;
|
|
|
|
}
|
|
|
|
mutate_arg = PyObject_IsTrue(args[3]);
|
|
|
|
if (mutate_arg < 0) {
|
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
skip_optional:
|
2014-11-09 21:22:01 -04:00
|
|
|
return_value = fcntl_ioctl_impl(module, fd, code, ob_arg, mutate_arg);
|
|
|
|
|
|
|
|
exit:
|
|
|
|
return return_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyDoc_STRVAR(fcntl_flock__doc__,
|
2015-03-20 15:04:21 -03:00
|
|
|
"flock($module, fd, operation, /)\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"--\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"Perform the lock operation `operation` on file descriptor `fd`.\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"\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 \
|
2022-05-03 15:25:41 -03:00
|
|
|
{"flock", _PyCFunction_CAST(fcntl_flock), METH_FASTCALL, fcntl_flock__doc__},
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2016-07-07 11:35:15 -03:00
|
|
|
fcntl_flock_impl(PyObject *module, int fd, int code);
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2017-12-15 07:11:11 -04:00
|
|
|
fcntl_flock(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
2014-11-09 21:22:01 -04:00
|
|
|
{
|
|
|
|
PyObject *return_value = NULL;
|
|
|
|
int fd;
|
|
|
|
int code;
|
|
|
|
|
2019-01-11 10:01:14 -04:00
|
|
|
if (!_PyArg_CheckPositional("flock", nargs, 2, 2)) {
|
|
|
|
goto exit;
|
|
|
|
}
|
2020-10-09 17:00:45 -03:00
|
|
|
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
|
2019-01-11 10:01:14 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2023-08-24 19:51:22 -03:00
|
|
|
code = PyLong_AsInt(args[1]);
|
2019-01-11 10:01:14 -04:00
|
|
|
if (code == -1 && PyErr_Occurred()) {
|
2017-01-16 20:35:17 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2014-11-09 21:22:01 -04:00
|
|
|
return_value = fcntl_flock_impl(module, fd, code);
|
|
|
|
|
|
|
|
exit:
|
|
|
|
return return_value;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyDoc_STRVAR(fcntl_lockf__doc__,
|
2015-03-20 15:04:21 -03:00
|
|
|
"lockf($module, fd, cmd, len=0, start=0, whence=0, /)\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"--\n"
|
|
|
|
"\n"
|
|
|
|
"A wrapper around the fcntl() locking calls.\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"`fd` is the file descriptor of the file to lock or unlock, and operation is one\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"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 the\n"
|
2016-04-14 06:28:01 -03:00
|
|
|
"lock cannot be acquired, an OSError will be raised and the exception will\n"
|
2014-11-09 21:22:01 -04:00
|
|
|
"have an errno attribute set to EACCES or EAGAIN (depending on the operating\n"
|
|
|
|
"system -- for portability, check for either value).\n"
|
|
|
|
"\n"
|
2015-03-20 15:04:21 -03:00
|
|
|
"`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"
|
2014-11-09 21:22:01 -04:00
|
|
|
"\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 \
|
2022-05-03 15:25:41 -03:00
|
|
|
{"lockf", _PyCFunction_CAST(fcntl_lockf), METH_FASTCALL, fcntl_lockf__doc__},
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2016-07-07 11:35:15 -03:00
|
|
|
fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj,
|
2015-04-14 19:07:59 -03:00
|
|
|
PyObject *startobj, int whence);
|
2014-11-09 21:22:01 -04:00
|
|
|
|
|
|
|
static PyObject *
|
2017-12-15 07:11:11 -04:00
|
|
|
fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
|
2014-11-09 21:22:01 -04:00
|
|
|
{
|
|
|
|
PyObject *return_value = NULL;
|
|
|
|
int fd;
|
|
|
|
int code;
|
|
|
|
PyObject *lenobj = NULL;
|
|
|
|
PyObject *startobj = NULL;
|
|
|
|
int whence = 0;
|
|
|
|
|
2019-01-11 10:01:14 -04:00
|
|
|
if (!_PyArg_CheckPositional("lockf", nargs, 2, 5)) {
|
|
|
|
goto exit;
|
|
|
|
}
|
2020-10-09 17:00:45 -03:00
|
|
|
if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
|
2019-01-11 10:01:14 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2023-08-24 19:51:22 -03:00
|
|
|
code = PyLong_AsInt(args[1]);
|
2019-01-11 10:01:14 -04:00
|
|
|
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;
|
|
|
|
}
|
2023-08-24 19:51:22 -03:00
|
|
|
whence = PyLong_AsInt(args[4]);
|
2019-01-11 10:01:14 -04:00
|
|
|
if (whence == -1 && PyErr_Occurred()) {
|
2017-01-16 20:35:17 -04:00
|
|
|
goto exit;
|
|
|
|
}
|
2019-01-11 10:01:14 -04:00
|
|
|
skip_optional:
|
2014-11-09 21:22:01 -04:00
|
|
|
return_value = fcntl_lockf_impl(module, fd, code, lenobj, startobj, whence);
|
|
|
|
|
|
|
|
exit:
|
|
|
|
return return_value;
|
|
|
|
}
|
2023-08-25 22:18:09 -03:00
|
|
|
/*[clinic end generated code: output=5f096e8731fa38be input=a9049054013a1b77]*/
|