Author: Matti Picus <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit