2 /* UNIX password file access module */
10 static PyStructSequence_Field struct_pwd_type_fields
[] = {
11 {"pw_name", "user name"},
12 {"pw_passwd", "password"},
13 {"pw_uid", "user id"},
14 {"pw_gid", "group id"},
15 {"pw_gecos", "real name"},
16 {"pw_dir", "home directory"},
17 {"pw_shell", "shell program"},
21 PyDoc_STRVAR(struct_passwd__doc__
,
22 "pwd.struct_passwd: Results from getpw*() routines.\n\n\
23 This object may be accessed either as a tuple of\n\
24 (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
25 or via the object attributes as named in the above tuple.");
27 static PyStructSequence_Desc struct_pwd_type_desc
= {
30 struct_pwd_type_fields
,
34 PyDoc_STRVAR(pwd__doc__
,
35 "This module provides access to the Unix password database.\n\
36 It is available on all Unix versions.\n\
38 Password database entries are reported as 7-tuples containing the following\n\
39 items from the password database (see `<pwd.h>'), in order:\n\
40 pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell.\n\
41 The uid and gid items are integers, all others are strings. An\n\
42 exception is raised if the entry asked for cannot be found.");
45 static int initialized
;
46 static PyTypeObject StructPwdType
;
49 sets(PyObject
*v
, int i
, char* val
)
52 PyStructSequence_SET_ITEM(v
, i
, PyString_FromString(val
));
54 PyStructSequence_SET_ITEM(v
, i
, Py_None
);
60 mkpwent(struct passwd
*p
)
63 PyObject
*v
= PyStructSequence_New(&StructPwdType
);
67 #define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
68 #define SETS(i,val) sets(v, i, val)
70 SETS(setIndex
++, p
->pw_name
);
74 SETS(setIndex
++, p
->pw_passwd
);
76 SETI(setIndex
++, p
->pw_uid
);
77 SETI(setIndex
++, p
->pw_gid
);
81 SETS(setIndex
++, p
->pw_gecos
);
83 SETS(setIndex
++, p
->pw_dir
);
84 SETS(setIndex
++, p
->pw_shell
);
89 if (PyErr_Occurred()) {
97 PyDoc_STRVAR(pwd_getpwuid__doc__
,
98 "getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\n\
99 pw_gid,pw_gecos,pw_dir,pw_shell)\n\
100 Return the password database entry for the given numeric user ID.\n\
101 See pwd.__doc__ for more on password database entries.");
104 pwd_getpwuid(PyObject
*self
, PyObject
*args
)
108 if (!PyArg_ParseTuple(args
, "I:getpwuid", &uid
))
110 if ((p
= getpwuid(uid
)) == NULL
) {
111 PyErr_Format(PyExc_KeyError
,
112 "getpwuid(): uid not found: %d", uid
);
118 PyDoc_STRVAR(pwd_getpwnam__doc__
,
119 "getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\n\
120 pw_gid,pw_gecos,pw_dir,pw_shell)\n\
121 Return the password database entry for the given user name.\n\
122 See pwd.__doc__ for more on password database entries.");
125 pwd_getpwnam(PyObject
*self
, PyObject
*args
)
129 if (!PyArg_ParseTuple(args
, "s:getpwnam", &name
))
131 if ((p
= getpwnam(name
)) == NULL
) {
132 PyErr_Format(PyExc_KeyError
,
133 "getpwnam(): name not found: %s", name
);
140 PyDoc_STRVAR(pwd_getpwall__doc__
,
141 "getpwall() -> list_of_entries\n\
142 Return a list of all available password database entries, \
143 in arbitrary order.\n\
144 See pwd.__doc__ for more on password database entries.");
147 pwd_getpwall(PyObject
*self
)
151 if ((d
= PyList_New(0)) == NULL
)
153 #if defined(PYOS_OS2) && defined(PYCC_GCC)
154 if ((p
= getpwuid(0)) != NULL
) {
157 while ((p
= getpwent()) != NULL
) {
159 PyObject
*v
= mkpwent(p
);
160 if (v
== NULL
|| PyList_Append(d
, v
) != 0) {
172 static PyMethodDef pwd_methods
[] = {
173 {"getpwuid", pwd_getpwuid
, METH_VARARGS
, pwd_getpwuid__doc__
},
174 {"getpwnam", pwd_getpwnam
, METH_VARARGS
, pwd_getpwnam__doc__
},
176 {"getpwall", (PyCFunction
)pwd_getpwall
,
177 METH_NOARGS
, pwd_getpwall__doc__
},
179 {NULL
, NULL
} /* sentinel */
186 m
= Py_InitModule3("pwd", pwd_methods
, pwd__doc__
);
191 PyStructSequence_InitType(&StructPwdType
,
192 &struct_pwd_type_desc
);
193 Py_INCREF((PyObject
*) &StructPwdType
);
194 PyModule_AddObject(m
, "struct_passwd", (PyObject
*) &StructPwdType
);
195 /* And for b/w compatibility (this was defined by mistake): */
196 PyModule_AddObject(m
, "struct_pwent", (PyObject
*) &StructPwdType
);