summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c281
1 files changed, 157 insertions, 124 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 4085b92..2157cbb 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -6947,23 +6947,46 @@ os_getpid_impl(PyObject *module)
#ifdef HAVE_GETGROUPLIST
-/* AC 3.5: funny apple logic below */
-PyDoc_STRVAR(posix_getgrouplist__doc__,
-"getgrouplist(user, group) -> list of groups to which a user belongs\n\n\
-Returns a list of groups to which a user belongs.\n\n\
- user: username to lookup\n\
- group: base group id of the user");
+#ifdef __APPLE__
+/*[clinic input]
+os.getgrouplist
+
+ user: str
+ username to lookup
+ group as basegid: int
+ base group id of the user
+ /
+
+Returns a list of groups to which a user belongs.
+[clinic start generated code]*/
static PyObject *
-posix_getgrouplist(PyObject *self, PyObject *args)
+os_getgrouplist_impl(PyObject *module, const char *user, int basegid)
+/*[clinic end generated code: output=6e734697b8c26de0 input=f8d870374b09a490]*/
+#else
+/*[clinic input]
+os.getgrouplist
+
+ user: str
+ username to lookup
+ group as basegid: gid_t
+ base group id of the user
+ /
+
+Returns a list of groups to which a user belongs.
+[clinic start generated code]*/
+
+static PyObject *
+os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid)
+/*[clinic end generated code: output=0ebd7fb70115575b input=cc61d5c20b08958d]*/
+#endif
{
- const char *user;
int i, ngroups;
PyObject *list;
#ifdef __APPLE__
- int *groups, basegid;
+ int *groups;
#else
- gid_t *groups, basegid;
+ gid_t *groups;
#endif
/*
@@ -6976,15 +6999,6 @@ posix_getgrouplist(PyObject *self, PyObject *args)
*/
ngroups = 1 + MAX_GROUPS;
-#ifdef __APPLE__
- if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid))
- return NULL;
-#else
- if (!PyArg_ParseTuple(args, "sO&:getgrouplist", &user,
- _Py_Gid_Converter, &basegid))
- return NULL;
-#endif
-
while (1) {
#ifdef __APPLE__
groups = PyMem_New(int, ngroups);
@@ -7155,40 +7169,47 @@ os_getgroups_impl(PyObject *module)
#endif /* HAVE_GETGROUPS */
#ifdef HAVE_INITGROUPS
-PyDoc_STRVAR(posix_initgroups__doc__,
-"initgroups(username, gid) -> None\n\n\
-Call the system initgroups() to initialize the group access list with all of\n\
-the groups of which the specified username is a member, plus the specified\n\
-group id.");
+#ifdef __APPLE__
+/*[clinic input]
+os.initgroups
+
+ username as oname: FSConverter
+ gid: int
+ /
+
+Initialize the group access list.
+
+Call the system initgroups() to initialize the group access list with all of
+the groups of which the specified username is a member, plus the specified
+group id.
+[clinic start generated code]*/
-/* AC 3.5: funny apple logic */
static PyObject *
-posix_initgroups(PyObject *self, PyObject *args)
-{
- PyObject *oname;
- const char *username;
- int res;
-#ifdef __APPLE__
- int gid;
+os_initgroups_impl(PyObject *module, PyObject *oname, int gid)
+/*[clinic end generated code: output=7f074d30a425fd3a input=df3d54331b0af204]*/
#else
- gid_t gid;
-#endif
+/*[clinic input]
+os.initgroups
-#ifdef __APPLE__
- if (!PyArg_ParseTuple(args, "O&i:initgroups",
- PyUnicode_FSConverter, &oname,
- &gid))
-#else
- if (!PyArg_ParseTuple(args, "O&O&:initgroups",
- PyUnicode_FSConverter, &oname,
- _Py_Gid_Converter, &gid))
+ username as oname: FSConverter
+ gid: gid_t
+ /
+
+Initialize the group access list.
+
+Call the system initgroups() to initialize the group access list with all of
+the groups of which the specified username is a member, plus the specified
+group id.
+[clinic start generated code]*/
+
+static PyObject *
+os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid)
+/*[clinic end generated code: output=59341244521a9e3f input=0cb91bdc59a4c564]*/
#endif
- return NULL;
- username = PyBytes_AS_STRING(oname);
+{
+ const char *username = PyBytes_AS_STRING(oname);
- res = initgroups(username, gid);
- Py_DECREF(oname);
- if (res == -1)
+ if (initgroups(username, gid) == -1)
return PyErr_SetFromErrno(PyExc_OSError);
Py_RETURN_NONE;
@@ -9220,46 +9241,77 @@ os_write_impl(PyObject *module, int fd, Py_buffer *data)
}
#ifdef HAVE_SENDFILE
-PyDoc_STRVAR(posix_sendfile__doc__,
-"sendfile(out_fd, in_fd, offset, count) -> byteswritten\n\
-sendfile(out_fd, in_fd, offset, count[, headers][, trailers], flags=0)\n\
- -> byteswritten\n\
-Copy count bytes from file descriptor in_fd to file descriptor out_fd.");
+#ifdef __APPLE__
+/*[clinic input]
+os.sendfile
+
+ out_fd: int
+ in_fd: int
+ offset: Py_off_t
+ count as sbytes: Py_off_t
+ headers: object(c_default="NULL") = ()
+ trailers: object(c_default="NULL") = ()
+ flags: int = 0
+
+Copy count bytes from file descriptor in_fd to file descriptor out_fd.
+[clinic start generated code]*/
-/* AC 3.5: don't bother converting, has optional group*/
static PyObject *
-posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
+os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset,
+ Py_off_t sbytes, PyObject *headers, PyObject *trailers,
+ int flags)
+/*[clinic end generated code: output=81c4bcd143f5c82b input=b0d72579d4c69afa]*/
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
+/*[clinic input]
+os.sendfile
+
+ out_fd: int
+ in_fd: int
+ offset: Py_off_t
+ count: Py_ssize_t
+ headers: object(c_default="NULL") = ()
+ trailers: object(c_default="NULL") = ()
+ flags: int = 0
+
+Copy count bytes from file descriptor in_fd to file descriptor out_fd.
+[clinic start generated code]*/
+
+static PyObject *
+os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset,
+ Py_ssize_t count, PyObject *headers, PyObject *trailers,
+ int flags)
+/*[clinic end generated code: output=329ea009bdd55afc input=338adb8ff84ae8cd]*/
+#else
+/*[clinic input]
+os.sendfile
+
+ out_fd: int
+ in_fd: int
+ offset as offobj: object
+ count: Py_ssize_t
+
+Copy count bytes from file descriptor in_fd to file descriptor out_fd.
+[clinic start generated code]*/
+
+static PyObject *
+os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj,
+ Py_ssize_t count)
+/*[clinic end generated code: output=ae81216e40f167d8 input=76d64058c74477ba]*/
+#endif
{
- int in, out;
Py_ssize_t ret;
int async_err = 0;
- off_t offset;
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__)
#ifndef __APPLE__
- Py_ssize_t len;
+ off_t sbytes;
#endif
- PyObject *headers = NULL, *trailers = NULL;
Py_buffer *hbuf, *tbuf;
- off_t sbytes;
struct sf_hdtr sf;
- int flags = 0;
- static char *keywords[] = {"out_fd", "in_fd",
- "offset", "count",
- "headers", "trailers", "flags", NULL};
sf.headers = NULL;
sf.trailers = NULL;
-#ifdef __APPLE__
- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&O&|OOi:sendfile",
- keywords, &out, &in, Py_off_t_converter, &offset, Py_off_t_converter, &sbytes,
-#else
- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&n|OOi:sendfile",
- keywords, &out, &in, Py_off_t_converter, &offset, &len,
-#endif
- &headers, &trailers, &flags))
- return NULL;
if (headers != NULL) {
if (!PySequence_Check(headers)) {
PyErr_SetString(PyExc_TypeError,
@@ -9321,9 +9373,9 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict)
do {
Py_BEGIN_ALLOW_THREADS
#ifdef __APPLE__
- ret = sendfile(in, out, offset, &sbytes, &sf, flags);
+ ret = sendfile(in_fd, out_fd, offset, &sbytes, &sf, flags);
#else
- ret = sendfile(in, out, offset, len, &sf, &sbytes, flags);
+ ret = sendfile(in_fd, out_fd, offset, count, &sf, &sbytes, flags);
#endif
Py_END_ALLOW_THREADS
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
@@ -9358,18 +9410,11 @@ done:
#endif
#else
- Py_ssize_t count;
- PyObject *offobj;
- static char *keywords[] = {"out_fd", "in_fd",
- "offset", "count", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiOn:sendfile",
- keywords, &out, &in, &offobj, &count))
- return NULL;
#ifdef __linux__
if (offobj == Py_None) {
do {
Py_BEGIN_ALLOW_THREADS
- ret = sendfile(out, in, NULL, count);
+ ret = sendfile(out_fd, in_fd, NULL, count);
Py_END_ALLOW_THREADS
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
if (ret < 0)
@@ -9377,12 +9422,13 @@ done:
return Py_BuildValue("n", ret);
}
#endif
+ off_t offset;
if (!Py_off_t_converter(offobj, &offset))
return NULL;
do {
Py_BEGIN_ALLOW_THREADS
- ret = sendfile(out, in, &offset, count);
+ ret = sendfile(out_fd, in_fd, &offset, count);
Py_END_ALLOW_THREADS
} while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
if (ret < 0)
@@ -12360,29 +12406,34 @@ static PyStructSequence_Desc TerminalSize_desc = {
};
#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)
-/* AC 3.5: fd should accept None */
-PyDoc_STRVAR(termsize__doc__,
- "Return the size of the terminal window as (columns, lines).\n" \
- "\n" \
- "The optional argument fd (default standard output) specifies\n" \
- "which file descriptor should be queried.\n" \
- "\n" \
- "If the file descriptor is not connected to a terminal, an OSError\n" \
- "is thrown.\n" \
- "\n" \
- "This function will only be defined if an implementation is\n" \
- "available for this system.\n" \
- "\n" \
- "shutil.get_terminal_size is the high-level function which should\n" \
- "normally be used, os.get_terminal_size is the low-level implementation.");
+/*[clinic input]
+os.get_terminal_size
-static PyObject*
-get_terminal_size(PyObject *self, PyObject *args)
+ fd: int(c_default="fileno(stdout)", py_default="<unrepresentable>") = -1
+ /
+
+Return the size of the terminal window as (columns, lines).
+
+The optional argument fd (default standard output) specifies
+which file descriptor should be queried.
+
+If the file descriptor is not connected to a terminal, an OSError
+is thrown.
+
+This function will only be defined if an implementation is
+available for this system.
+
+shutil.get_terminal_size is the high-level function which should
+normally be used, os.get_terminal_size is the low-level implementation.
+[clinic start generated code]*/
+
+static PyObject *
+os_get_terminal_size_impl(PyObject *module, int fd)
+/*[clinic end generated code: output=fbab93acef980508 input=ead5679b82ddb920]*/
{
int columns, lines;
PyObject *termsize;
- int fd = fileno(stdout);
/* Under some conditions stdout may not be connected and
* fileno(stdout) may point to an invalid file descriptor. For example
* GUI apps don't have valid standard streams by default.
@@ -12391,9 +12442,6 @@ get_terminal_size(PyObject *self, PyObject *args)
* the ioctl below will fail returning EBADF. This is what we want.
*/
- if (!PyArg_ParseTuple(args, "|i", &fd))
- return NULL;
-
#ifdef TERMSIZE_USE_IOCTL
{
struct winsize w;
@@ -12433,7 +12481,7 @@ get_terminal_size(PyObject *self, PyObject *args)
}
#endif /* TERMSIZE_USE_CONIO */
- PyObject *TerminalSizeType = get_posix_state(self)->TerminalSizeType;
+ PyObject *TerminalSizeType = get_posix_state(module)->TerminalSizeType;
termsize = PyStructSequence_New((PyTypeObject *)TerminalSizeType);
if (termsize == NULL)
return NULL;
@@ -13912,9 +13960,7 @@ static PyMethodDef posix_methods[] = {
OS_GETEGID_METHODDEF
OS_GETEUID_METHODDEF
OS_GETGID_METHODDEF
-#ifdef HAVE_GETGROUPLIST
- {"getgrouplist", posix_getgrouplist, METH_VARARGS, posix_getgrouplist__doc__},
-#endif
+ OS_GETGROUPLIST_METHODDEF
OS_GETGROUPS_METHODDEF
OS_GETPID_METHODDEF
OS_GETPGRP_METHODDEF
@@ -13924,9 +13970,7 @@ static PyMethodDef posix_methods[] = {
OS_KILL_METHODDEF
OS_KILLPG_METHODDEF
OS_PLOCK_METHODDEF
-#ifdef MS_WINDOWS
OS_STARTFILE_METHODDEF
-#endif
OS_SETUID_METHODDEF
OS_SETEUID_METHODDEF
OS_SETREUID_METHODDEF
@@ -13934,9 +13978,7 @@ static PyMethodDef posix_methods[] = {
OS_SETEGID_METHODDEF
OS_SETREGID_METHODDEF
OS_SETGROUPS_METHODDEF
-#ifdef HAVE_INITGROUPS
- {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__},
-#endif /* HAVE_INITGROUPS */
+ OS_INITGROUPS_METHODDEF
OS_GETPGID_METHODDEF
OS_SETPGRP_METHODDEF
OS_WAIT_METHODDEF
@@ -13966,10 +14008,7 @@ static PyMethodDef posix_methods[] = {
OS_WRITEV_METHODDEF
OS_PWRITE_METHODDEF
OS_PWRITEV_METHODDEF
-#ifdef HAVE_SENDFILE
- {"sendfile", (PyCFunction)(void(*)(void))posix_sendfile, METH_VARARGS | METH_KEYWORDS,
- posix_sendfile__doc__},
-#endif
+ OS_SENDFILE_METHODDEF
OS_FSTAT_METHODDEF
OS_ISATTY_METHODDEF
OS_PIPE_METHODDEF
@@ -14021,26 +14060,20 @@ static PyMethodDef posix_methods[] = {
OS_REMOVEXATTR_METHODDEF
OS_LISTXATTR_METHODDEF
-#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)
- {"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__},
-#endif
+ OS_GET_TERMINAL_SIZE_METHODDEF
OS_CPU_COUNT_METHODDEF
OS_GET_INHERITABLE_METHODDEF
OS_SET_INHERITABLE_METHODDEF
OS_GET_HANDLE_INHERITABLE_METHODDEF
OS_SET_HANDLE_INHERITABLE_METHODDEF
-#ifndef MS_WINDOWS
OS_GET_BLOCKING_METHODDEF
OS_SET_BLOCKING_METHODDEF
-#endif
OS_SCANDIR_METHODDEF
OS_FSPATH_METHODDEF
OS_GETRANDOM_METHODDEF
OS_MEMFD_CREATE_METHODDEF
-#ifdef MS_WINDOWS
OS__ADD_DLL_DIRECTORY_METHODDEF
OS__REMOVE_DLL_DIRECTORY_METHODDEF
-#endif
OS_WAITSTATUS_TO_EXITCODE_METHODDEF
{NULL, NULL} /* Sentinel */
};