[Python-checkins] r76637 - in python/branches/py3k: Doc/library/os.rst Lib/test/test_posix.py Misc/NEWS Modules/posixmodule.c configure configure.in pyconfig.h.in

antoine.pitrou python-checkins at python.org
Wed Dec 2 21:46:49 CET 2009


Author: antoine.pitrou
Date: Wed Dec  2 21:46:48 2009
New Revision: 76637

Log:
Merged revisions 76636 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76636 | antoine.pitrou | 2009-12-02 21:37:54 +0100 (mer., 02 déc. 2009) | 5 lines
  
  Issue #7333: The `posix` module gains an `initgroups()` function providing
  access to the initgroups(3) C library call on Unix systems which implement
  it.  Patch by Jean-Paul Calderone.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Doc/library/os.rst
   python/branches/py3k/Lib/test/test_posix.py
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Modules/posixmodule.c
   python/branches/py3k/configure
   python/branches/py3k/configure.in
   python/branches/py3k/pyconfig.h.in

Modified: python/branches/py3k/Doc/library/os.rst
==============================================================================
--- python/branches/py3k/Doc/library/os.rst	(original)
+++ python/branches/py3k/Doc/library/os.rst	Wed Dec  2 21:46:48 2009
@@ -161,6 +161,15 @@
    Availability: Unix.
 
 
+.. function:: initgroups(username, gid)
+
+   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. Availability: Unix.
+
+   .. versionadded:: 3.2
+
+
 .. function:: getlogin()
 
    Return the name of the user logged in on the controlling terminal of the

Modified: python/branches/py3k/Lib/test/test_posix.py
==============================================================================
--- python/branches/py3k/Lib/test/test_posix.py	(original)
+++ python/branches/py3k/Lib/test/test_posix.py	Wed Dec  2 21:46:48 2009
@@ -5,6 +5,7 @@
 # Skip these tests if there is no posix module.
 posix = support.import_module('posix')
 
+import errno
 import time
 import os
 import pwd
@@ -82,6 +83,27 @@
                 new_group_ids = (current_group_ids[0]+1, -1, -1)
                 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
 
+    @unittest.skipUnless(hasattr(posix, 'initgroups'),
+                         "test needs os.initgroups()")
+    def test_initgroups(self):
+        # It takes a string and an integer; check that it raises a TypeError
+        # for other argument lists.
+        self.assertRaises(TypeError, posix.initgroups)
+        self.assertRaises(TypeError, posix.initgroups, None)
+        self.assertRaises(TypeError, posix.initgroups, 3, "foo")
+        self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
+
+        # If a non-privileged user invokes it, it should fail with OSError
+        # EPERM.
+        if os.getuid() != 0:
+            name = pwd.getpwuid(posix.getuid()).pw_name
+            try:
+                posix.initgroups(name, 13)
+            except OSError as e:
+                self.assertEquals(e.errno, errno.EPERM)
+            else:
+                self.fail("Expected OSError to be raised by initgroups")
+
     def test_statvfs(self):
         if hasattr(posix, 'statvfs'):
             self.assertTrue(posix.statvfs(os.curdir))

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Wed Dec  2 21:46:48 2009
@@ -146,6 +146,10 @@
 Library
 -------
 
+- Issue #7333: The `posix` module gains an `initgroups()` function providing
+  access to the initgroups(3) C library call on Unix systems which implement
+  it.  Patch by Jean-Paul Calderone.
+
 - Issue #7408: Fixed distutils.tests.sdist so it doesn't check for group
   ownership when the group is not forced, because the group may be different
   from the user's group and inherit from its container when the test is run.

Modified: python/branches/py3k/Modules/posixmodule.c
==============================================================================
--- python/branches/py3k/Modules/posixmodule.c	(original)
+++ python/branches/py3k/Modules/posixmodule.c	Wed Dec  2 21:46:48 2009
@@ -3979,6 +3979,30 @@
 }
 #endif
 
+#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.");
+
+static PyObject *
+posix_initgroups(PyObject *self, PyObject *args)
+{
+	char *username;
+	long gid;
+
+	if (!PyArg_ParseTuple(args, "sl:initgroups", &username, &gid))
+		return NULL;
+
+	if (initgroups(username, (gid_t) gid) == -1)
+		return PyErr_SetFromErrno(PyExc_OSError);
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+#endif
+
 #ifdef HAVE_GETPGID
 PyDoc_STRVAR(posix_getpgid__doc__,
 "getpgid(pid) -> pgid\n\n\
@@ -7184,6 +7208,9 @@
 #ifdef HAVE_SETGROUPS
 	{"setgroups",	posix_setgroups, METH_O, posix_setgroups__doc__},
 #endif /* HAVE_SETGROUPS */
+#ifdef HAVE_INITGROUPS
+	{"initgroups",	posix_initgroups, METH_VARARGS, posix_initgroups__doc__},
+#endif /* HAVE_INITGROUPS */
 #ifdef HAVE_GETPGID
 	{"getpgid",	posix_getpgid, METH_VARARGS, posix_getpgid__doc__},
 #endif /* HAVE_GETPGID */

Modified: python/branches/py3k/configure
==============================================================================
--- python/branches/py3k/configure	(original)
+++ python/branches/py3k/configure	Wed Dec  2 21:46:48 2009
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 76552 .
+# From configure.in Revision: 76566 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.61 for python 3.2.
 #
@@ -17379,11 +17379,12 @@
 
 
 
+
 for ac_func in alarm setitimer getitimer bind_textdomain_codeset chown \
  clock confstr ctermid execv fchmod fchown fork fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
  getpriority getresuid getresgid getpwent getspnam getspent getsid getwd \
- kill killpg lchmod lchown lstat mbrtowc mkfifo mknod mktime \
+ initgroups kill killpg lchmod lchown lstat mbrtowc mkfifo mknod mktime \
  mremap nice pathconf pause plock poll pthread_init \
  putenv readlink realpath \
  select sem_open sem_timedwait sem_getvalue sem_unlink setegid seteuid \

Modified: python/branches/py3k/configure.in
==============================================================================
--- python/branches/py3k/configure.in	(original)
+++ python/branches/py3k/configure.in	Wed Dec  2 21:46:48 2009
@@ -2418,7 +2418,7 @@
  clock confstr ctermid execv fchmod fchown fork fpathconf ftime ftruncate \
  gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
  getpriority getresuid getresgid getpwent getspnam getspent getsid getwd \
- kill killpg lchmod lchown lstat mbrtowc mkfifo mknod mktime \
+ initgroups kill killpg lchmod lchown lstat mbrtowc mkfifo mknod mktime \
  mremap nice pathconf pause plock poll pthread_init \
  putenv readlink realpath \
  select sem_open sem_timedwait sem_getvalue sem_unlink setegid seteuid \

Modified: python/branches/py3k/pyconfig.h.in
==============================================================================
--- python/branches/py3k/pyconfig.h.in	(original)
+++ python/branches/py3k/pyconfig.h.in	Wed Dec  2 21:46:48 2009
@@ -299,6 +299,9 @@
 /* Define to 1 if you have the `getpeername' function. */
 #undef HAVE_GETPEERNAME
 
+/* Define to 1 if you have the `initgroups' function. */
+#undef HAVE_INITGROUPS
+
 /* Define to 1 if you have the `getpgid' function. */
 #undef HAVE_GETPGID
 


More information about the Python-checkins mailing list