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