diff options
-rw-r--r-- | Doc/lib/libos.tex | 7 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/posixmodule.c | 48 | ||||
-rwxr-xr-x | configure | 4 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | pyconfig.h.in | 3 |
6 files changed, 62 insertions, 4 deletions
diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex index 8adcbd5..70552c4 100644 --- a/Doc/lib/libos.tex +++ b/Doc/lib/libos.tex @@ -204,6 +204,13 @@ Set the current process' group id. Availability: \UNIX{}. \end{funcdesc} +\begin{funcdesc}{setgroups}{groups} +Set list of supplemental group ids associated with the current +process to \var{groups}. +Availability: \UNIX{}. +\versionadded{2.2} +\end{funcdesc} + \begin{funcdesc}{setpgrp}{} Calls the system call \cfunction{setpgrp()} or \cfunction{setpgrp(0, 0)} depending on which version is implemented (if any). See the @@ -44,7 +44,7 @@ Extension modules - readline now supports setting the startup_hook and the pre_event_hook. -- posix supports chroot where available. +- posix supports chroot and setgroups where available. - Decompression objects in the zlib module now accept an optional second parameter to decompress() that specifies the maximum amount diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c21f7f8..b26c89e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3127,6 +3127,51 @@ posix_setgid(PyObject *self, PyObject *args) } #endif /* HAVE_SETGID */ +#ifdef HAVE_SETGROUPS +static char posix_setgroups__doc__[] = +"setgroups(list) -> None\n\ +Set the groups of the current process to list."; + +static PyObject * +posix_setgroups(PyObject *self, PyObject *args) +{ + PyObject *groups; + int i, len; + gid_t grouplist[MAX_GROUPS]; + + if (!PyArg_ParseTuple(args, "O:setgid", &groups)) + return NULL; + if (!PySequence_Check(groups)) { + PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence"); + return NULL; + } + len = PySequence_Size(groups); + if (len > MAX_GROUPS) { + PyErr_SetString(PyExc_ValueError, "too many groups"); + return NULL; + } + for(i = 0; i < len; i++) { + PyObject *elem; + elem = PySequence_GetItem(groups, i); + if (!elem) + return NULL; + if (!PyInt_Check(elem)) { + PyErr_SetString(PyExc_TypeError, + "groups must be integers"); + Py_DECREF(elem); + return NULL; + } + /* XXX: check that value fits into gid_t. */ + grouplist[i] = PyInt_AsLong(elem); + Py_DECREF(elem); + } + + if (setgroups(len, grouplist) < 0) + return posix_error(); + Py_INCREF(Py_None); + return Py_None; +} +#endif /* HAVE_SETGROUPS */ #ifdef HAVE_WAITPID static char posix_waitpid__doc__[] = @@ -5467,6 +5512,9 @@ static PyMethodDef posix_methods[] = { #ifdef HAVE_SETGID {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__}, #endif /* HAVE_SETGID */ +#ifdef HAVE_SETGROUPS + {"setgroups", posix_setgroups, METH_VARARGS, posix_setgroups__doc__}, +#endif /* HAVE_SETGROUPS */ #ifdef HAVE_SETPGRP {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__}, #endif /* HAVE_SETPGRP */ @@ -1,6 +1,6 @@ #! /bin/sh -# From configure.in Revision: 1.268 +# From configure.in Revision: 1.269 # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 @@ -4804,7 +4804,7 @@ for ac_func in alarm chown chroot clock confstr ctermid ctermid_r execv \ hstrerror inet_pton kill link lstat mkfifo mktime mremap \ nice pathconf pause plock poll pthread_init \ putenv readlink \ - select setegid seteuid setgid \ + select setegid seteuid setgid setgroups \ setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \ sigaction siginterrupt sigrelse strftime strptime symlink sysconf \ tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ diff --git a/configure.in b/configure.in index 108d239..1c2f459 100644 --- a/configure.in +++ b/configure.in @@ -1391,7 +1391,7 @@ AC_CHECK_FUNCS(alarm chown chroot clock confstr ctermid ctermid_r execv \ hstrerror inet_pton kill link lstat mkfifo mktime mremap \ nice pathconf pause plock poll pthread_init \ putenv readlink \ - select setegid seteuid setgid \ + select setegid seteuid setgid setgroups \ setlocale setregid setreuid setsid setpgid setuid setvbuf snprintf \ sigaction siginterrupt sigrelse strftime strptime symlink sysconf \ tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ diff --git a/pyconfig.h.in b/pyconfig.h.in index 7057895..8967cc6 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -498,6 +498,9 @@ /* Define if you have the setgid function. */ #undef HAVE_SETGID +/* Define if you have the setgroups function. */ +#undef HAVE_SETGROUPS + /* Define if you have the setlocale function. */ #undef HAVE_SETLOCALE |