grp.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """ This module provides ctypes version of cpython's grp module
  2. """
  3. import os
  4. from _pwdgrp_cffi import ffi, lib
  5. import _structseq
  6. try: from __pypy__ import builtinify
  7. except ImportError: builtinify = lambda f: f
  8. class struct_group(metaclass=_structseq.structseqtype):
  9. name = "grp.struct_group"
  10. gr_name = _structseq.structseqfield(0)
  11. gr_passwd = _structseq.structseqfield(1)
  12. gr_gid = _structseq.structseqfield(2)
  13. gr_mem = _structseq.structseqfield(3)
  14. def _group_from_gstruct(res):
  15. i = 0
  16. members = []
  17. while res.gr_mem[i]:
  18. members.append(os.fsdecode(ffi.string(res.gr_mem[i])))
  19. i += 1
  20. return struct_group([
  21. os.fsdecode(ffi.string(res.gr_name)),
  22. os.fsdecode(ffi.string(res.gr_passwd)),
  23. res.gr_gid,
  24. members])
  25. @builtinify
  26. def getgrgid(gid):
  27. res = lib.getgrgid(gid)
  28. if not res:
  29. # XXX maybe check error eventually
  30. raise KeyError(gid)
  31. return _group_from_gstruct(res)
  32. @builtinify
  33. def getgrnam(name):
  34. if not isinstance(name, str):
  35. raise TypeError("expected string")
  36. res = lib.getgrnam(os.fsencode(name))
  37. if not res:
  38. raise KeyError("'getgrnam(): name not found: %s'" % name)
  39. return _group_from_gstruct(res)
  40. @builtinify
  41. def getgrall():
  42. lib.setgrent()
  43. lst = []
  44. while 1:
  45. p = lib.getgrent()
  46. if not p:
  47. break
  48. lst.append(_group_from_gstruct(p))
  49. lib.endgrent()
  50. return lst
  51. __all__ = ('struct_group', 'getgrgid', 'getgrnam', 'getgrall')
  52. if __name__ == "__main__":
  53. from os import getgid
  54. gid = getgid()
  55. pw = getgrgid(gid)
  56. print("gid %s: %s" % (pw.gr_gid, pw))
  57. name = pw.gr_name
  58. print("name %r: %s" % (name, getgrnam(name)))
  59. print("All:")
  60. for pw in getgrall():
  61. print(pw)