[pypy-svn] r54557 - pypy/dist/pypy/lib

haypo at codespeak.net haypo at codespeak.net
Thu May 8 14:25:24 CEST 2008


Author: haypo
Date: Thu May  8 14:25:24 2008
New Revision: 54557

Added:
   pypy/dist/pypy/lib/pwd.py   (contents, props changed)
Log:
Add my pwd implementation in ctypes, issue 322


Added: pypy/dist/pypy/lib/pwd.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/lib/pwd.py	Thu May  8 14:25:24 2008
@@ -0,0 +1,136 @@
+# ctypes implementation: Victor Stinner, 2008-05-08
+"""
+This module provides access to the Unix password database.
+It is available on all Unix versions.
+
+Password database entries are reported as 7-tuples containing the following
+items from the password database (see `<pwd.h>'), in order:
+pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell.
+The uid and gid items are integers, all others are strings. An
+exception is raised if the entry asked for cannot be found.
+"""
+
+from ctypes_support import standard_c_lib as libc
+from ctypes import Structure, POINTER, c_int, c_char_p
+
+uid_t = c_int
+gid_t = c_int
+
+class passwd(Structure):
+    _fields_ = (
+        ("pw_name", c_char_p),
+        ("pw_passwd", c_char_p),
+        ("pw_uid", uid_t),
+        ("pw_gid", gid_t),
+        ("pw_gecos", c_char_p),
+        ("pw_dir", c_char_p),
+        ("pw_shell", c_char_p),
+    )
+    def __iter__(self):
+        yield self.pw_name
+        yield self.pw_passwd
+        yield self.pw_uid
+        yield self.pw_gid
+        yield self.pw_gecos
+        yield self.pw_dir
+        yield self.pw_shell
+
+class struct_passwd(tuple):
+    """
+    pwd.struct_passwd: Results from getpw*() routines.
+
+    This object may be accessed either as a tuple of
+      (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)
+    or via the object attributes as named in the above tuple.
+    """
+    def __init__(self, passwd):
+        self.pw_name = passwd.pw_name
+        self.pw_passwd = passwd.pw_passwd
+        self.pw_uid = passwd.pw_uid
+        self.pw_gid = passwd.pw_gid
+        self.pw_gecos = passwd.pw_gecos
+        self.pw_dir = passwd.pw_dir
+        self.pw_shell = passwd.pw_shell
+        tuple.__init__(self, passwd)
+
+passwd_p = POINTER(passwd)
+
+_getpwuid = libc.getpwuid
+_getpwuid.argtypes = (uid_t,)
+_getpwuid.restype = passwd_p
+
+_getpwnam = libc.getpwnam
+_getpwnam.argtypes = (c_char_p,)
+_getpwnam.restype = passwd_p
+
+_setpwent = libc.setpwent
+_setpwent.argtypes = None
+_setpwent.restype = None
+
+_getpwent = libc.getpwent
+_getpwent.argtypes = None
+_getpwent.restype = passwd_p
+
+_endpwent = libc.endpwent
+_endpwent.argtypes = None
+_endpwent.restype = None
+
+def mkpwent(pw):
+    pw = pw.contents
+    return struct_passwd(pw)
+
+def getpwuid(uid):
+    """
+    getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,
+                      pw_gid,pw_gecos,pw_dir,pw_shell)
+    Return the password database entry for the given numeric user ID.
+    See pwd.__doc__ for more on password database entries.
+    """
+    pw = _getpwuid(uid)
+    if not pw:
+        raise KeyError("getpwuid(): uid not found: %s" % uid)
+    return mkpwent(pw)
+
+def getpwnam(name):
+    """
+    getpwnam(name) -> (pw_name,pw_passwd,pw_uid,
+                        pw_gid,pw_gecos,pw_dir,pw_shell)
+    Return the password database entry for the given user name.
+    See pwd.__doc__ for more on password database entries.
+    """
+    pw = _getpwnam(name)
+    if not pw:
+        raise KeyError("getpwname(): name not found: %s" % name)
+    return mkpwent(pw)
+
+def getpwall():
+    """
+    "getpwall() -> list_of_entries
+    Return a list of all available password database entries, in arbitrary order.
+    See pwd.__doc__ for more on password database entries.
+    """
+    users = []
+    _setpwent()
+    while True:
+        pw = _getpwent()
+        if not pw:
+            break
+        users.append(mkpwent(pw))
+    _endpwent()
+    return users
+
+__all__ = ('struct_passwd', 'getpwuid', 'getpwnam', 'getpwall')
+
+if __name__ == "__main__":
+# Uncomment next line to test CPython implementation
+#    from pwd import getpwuid, getpwnam, getpwall
+    from os import getuid
+    uid = getuid()
+    pw = getpwuid(uid)
+    print "uid %s: %s" % (pw.pw_uid, pw)
+    name = pw.pw_name
+    print "name %r: %s" % (name, getpwnam(name))
+    print "All:"
+    for pw in getpwall():
+        print pw
+



More information about the Pypy-commit mailing list