From 61c5edf6fc9a87089c85f5a53e91e99da51ba38c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Thu, 18 Oct 2001 04:06:00 +0000 Subject: [PATCH] Expose setgroups. Fixes feature request #468116. --- Doc/lib/libos.tex | 7 +++++++ Misc/NEWS | 2 +- Modules/posixmodule.c | 48 +++++++++++++++++++++++++++++++++++++++++++ configure | 4 ++-- configure.in | 2 +- pyconfig.h.in | 3 +++ 6 files changed, 62 insertions(+), 4 deletions(-) diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex index 8adcbd5a34d..70552c40070 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 diff --git a/Misc/NEWS b/Misc/NEWS index 74327c4dfab..e2e9683344a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 c21f7f85296..b26c89eccfc 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 */ diff --git a/configure b/configure index 260ea3fd1eb..be572652297 100755 --- a/configure +++ b/configure @@ -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 108d2399269..1c2f45996f8 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 7057895fa5d..8967cc6b74a 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