Author: Matti Picus <matti.pi...@gmail.com>
Branch: py3.6
Changeset: r98204:7a5929c7cc5e
Date: 2019-12-01 21:53 +0200
http://bitbucket.org/pypy/pypy/changeset/7a5929c7cc5e/

Log:    add rposix getgrouplist (part of issue 2375)

diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1931,8 +1931,7 @@
                               rffi.INT, save_err=rffi.RFFI_FULL_ERRNO_ZERO)
     c_sched_get_priority_min = external('sched_get_priority_min', [rffi.INT],
                              rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO)
-    if not _WIN32:
-        c_sched_yield = external('sched_yield', [], rffi.INT)
+    c_sched_yield = external('sched_yield', [], rffi.INT)
 
     @enforceargs(int)
     def sched_get_priority_max(policy):
@@ -1945,6 +1944,36 @@
     def sched_yield():
         return handle_posix_error('sched_yield', c_sched_yield())
 
+    c_getgroupslist = external('getgrouplist', [rffi.CCHARP, GID_T,
+                            GID_GROUPS_T, rffi.INTP], rffi.INT,
+                            save_err=rffi.RFFI_SAVE_ERRNO)
+
+    def getgrouplist(user, group):
+        groups_p = lltype.malloc(GID_GROUPS_T.TO, 64, flavor='raw')
+        ngroups_p = lltype.malloc(rffi.INTP.TO, 1, flavor='raw')
+        ngroups_p[0] = rffi.cast(rffi.INT, 64)
+        try:
+            n = handle_posix_error('getgrouplist', c_getgroupslist(user, group,
+                             groups_p, ngroups_p))
+            if n == -1:
+               if widen(ngroups_p[0]) > 64:
+                    # reallocate. Should never happen
+                    lltype.free(groups_p, flavor='raw')
+                    groups_p = lltype.nullptr(GID_GROUPS_T.TO)
+                    groups_p = lltype.malloc(GID_GROUPS_T.TO, 
widen(ngroups_p[0]),
+                                             flavor='raw')
+                     
+                    n = handle_posix_error('getgrouplist', 
c_getgroupslist(user,
+                                                     group, groups_p, 
ngroups_p))
+            ngroups = widen(ngroups_p[0])
+            groups = [0] * ngroups
+            for i in range(ngroups):
+                groups[i] = groups_p[i]
+            return groups
+        finally:
+            lltype.free(ngroups_p, flavor='raw')
+            if groups_p:
+                lltype.free(groups_p, flavor='raw')
 #___________________________________________________________________
 
 c_chroot = external('chroot', [rffi.CCHARP], rffi.INT,
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to