From 71d74e87cbcf4626520e20d5e83da697d7cba00f Mon Sep 17 00:00:00 2001 From: Andrew MacIntyre Date: Thu, 10 Jul 2003 12:52:54 +0000 Subject: Extend the pwd & grp emulations to support accessing the pwd/grp record tuple by name as well as index, to match the behaviour of the pwd/grp extension modules for Unix. These emulation modules now pass test_pwd & test_grp. --- Lib/plat-os2emx/grp.py | 39 +++++++++++++++++++++++++++++++++++++-- Lib/plat-os2emx/pwd.py | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/Lib/plat-os2emx/grp.py b/Lib/plat-os2emx/grp.py index 228f4c1..d05ad27 100644 --- a/Lib/plat-os2emx/grp.py +++ b/Lib/plat-os2emx/grp.py @@ -2,7 +2,7 @@ # extension module. # written by Andrew MacIntyre, April 2001. -# released into the public domain "as is", with NO WARRANTY +# updated July 2003, adding field accessor support # note that this implementation checks whether ":" or ";" as used as # the field separator character. @@ -96,6 +96,40 @@ def __get_field_sep(record): else: raise KeyError, '>> group database fields not delimited <<' +# class to match the new record field name accessors. +# the resulting object is intended to behave like a read-only tuple, +# with each member also accessible by a field name. +class Group: + def __init__(self, name, passwd, gid, mem): + self.__dict__['gr_name'] = name + self.__dict__['gr_passwd'] = passwd + self.__dict__['gr_gid'] = gid + self.__dict__['gr_mem'] = mem + self.__dict__['_record'] = (self.gr_name, self.gr_passwd, + self.gr_gid, self.gr_mem) + + def __len__(self): + return 4 + + def __getitem__(self, key): + return self._record[key] + + def __setattr__(self, name, value): + raise AttributeError('attribute read-only: %s' % name) + + def __repr__(self): + return str(self._record) + + def __cmp__(self, other): + this = str(self._record) + if this == other: + return 0 + elif this < other: + return -1 + else: + return 1 + + # read the whole file, parsing each entry into tuple form # with dictionaries to speed recall by GID or group name def __read_group_file(): @@ -113,7 +147,8 @@ def __read_group_file(): sep = __get_field_sep(entry) fields = entry.split(sep) fields[2] = int(fields[2]) - record = tuple(fields) + fields[3] = [f.strip() for f in fields[3].split(',')] + record = Group(*fields) if not gidx.has_key(fields[2]): gidx[fields[2]] = record if not namx.has_key(fields[0]): diff --git a/Lib/plat-os2emx/pwd.py b/Lib/plat-os2emx/pwd.py index 6e2b008..1036fce 100644 --- a/Lib/plat-os2emx/pwd.py +++ b/Lib/plat-os2emx/pwd.py @@ -2,7 +2,7 @@ # extension module. # written by Andrew MacIntyre, April 2001. -# released into the public domain "as is", with NO WARRANTY +# updated July 2003, adding field accessor support # note that this implementation checks whether ":" or ";" as used as # the field separator character. Path conversions are are applied when @@ -115,6 +115,45 @@ def __get_field_sep(record): else: raise KeyError, '>> passwd database fields not delimited <<' +# class to match the new record field name accessors. +# the resulting object is intended to behave like a read-only tuple, +# with each member also accessible by a field name. +class Passwd: + def __init__(self, name, passwd, uid, gid, gecos, dir, shell): + self.__dict__['pw_name'] = name + self.__dict__['pw_passwd'] = passwd + self.__dict__['pw_uid'] = uid + self.__dict__['pw_gid'] = gid + self.__dict__['pw_gecos'] = gecos + self.__dict__['pw_dir'] = dir + self.__dict__['pw_shell'] = shell + self.__dict__['_record'] = (self.pw_name, self.pw_passwd, + self.pw_uid, self.pw_gid, + self.pw_gecos, self.pw_dir, + self.pw_shell) + + def __len__(self): + return 7 + + def __getitem__(self, key): + return self._record[key] + + def __setattr__(self, name, value): + raise AttributeError('attribute read-only: %s' % name) + + def __repr__(self): + return str(self._record) + + def __cmp__(self, other): + this = str(self._record) + if this == other: + return 0 + elif this < other: + return -1 + else: + return 1 + + # read the whole file, parsing each entry into tuple form # with dictionaries to speed recall by UID or passwd name def __read_passwd_file(): @@ -135,7 +174,7 @@ def __read_passwd_file(): fields[i] = int(fields[i]) for i in (5, 6): fields[i] = __field_sep[sep](fields[i]) - record = tuple(fields) + record = Passwd(*fields) if not uidx.has_key(fields[2]): uidx[fields[2]] = record if not namx.has_key(fields[0]): -- cgit v0.12