annotate Modules/pwdmodule.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents fc718c177ee6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1351
diff changeset
2 /* UNIX password file access module */
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
4 #include "Python.h"
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
5 #include "posixmodule.h"
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #include <pwd.h>
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
9 static PyStructSequence_Field struct_pwd_type_fields[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
10 {"pw_name", "user name"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
11 {"pw_passwd", "password"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
12 {"pw_uid", "user id"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
13 {"pw_gid", "group id"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
14 {"pw_gecos", "real name"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
15 {"pw_dir", "home directory"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
16 {"pw_shell", "shell program"},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
17 {0}
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
18 };
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
19
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
20 PyDoc_STRVAR(struct_passwd__doc__,
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
21 "pwd.struct_passwd: Results from getpw*() routines.\n\n\
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
22 This object may be accessed either as a tuple of\n\
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
23 (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
24 or via the object attributes as named in the above tuple.");
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
25
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
26 static PyStructSequence_Desc struct_pwd_type_desc = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
27 "pwd.struct_passwd",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
28 struct_passwd__doc__,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
29 struct_pwd_type_fields,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
30 7,
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
31 };
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
32
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
33 PyDoc_STRVAR(pwd__doc__,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
34 "This module provides access to the Unix password database.\n\
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
35 It is available on all Unix versions.\n\
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
36 \n\
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
37 Password database entries are reported as 7-tuples containing the following\n\
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
38 items from the password database (see `<pwd.h>'), in order:\n\
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
39 pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell.\n\
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
40 The uid and gid items are integers, all others are strings. An\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
41 exception is raised if the entry asked for cannot be found.");
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
42
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
43
37772
b90a7c6021bc Initialize structseq types only once.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
44 static int initialized;
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
45 static PyTypeObject StructPwdType;
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
46
25303
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
47 static void
42804
69b8e2976556 Use unicode for password modules
Neal Norwitz <nnorwitz@gmail.com>
parents: 37772
diff changeset
48 sets(PyObject *v, int i, const char* val)
25303
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
49 {
43698
d46a31f5c5df Get the locale and pwd tests working on the Solaris box where there
Neal Norwitz <nnorwitz@gmail.com>
parents: 42804
diff changeset
50 if (val) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61367
diff changeset
51 PyObject *o = PyUnicode_DecodeFSDefault(val);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
52 PyStructSequence_SET_ITEM(v, i, o);
43698
d46a31f5c5df Get the locale and pwd tests working on the Solaris box where there
Neal Norwitz <nnorwitz@gmail.com>
parents: 42804
diff changeset
53 }
25303
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
54 else {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
55 PyStructSequence_SET_ITEM(v, i, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
56 Py_INCREF(Py_None);
25303
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
57 }
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
58 }
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
59
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
60 static PyObject *
13505
0edeb4efe6db ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
61 mkpwent(struct passwd *p)
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
63 int setIndex = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
64 PyObject *v = PyStructSequence_New(&StructPwdType);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
65 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
66 return NULL;
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
67
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43698
diff changeset
68 #define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val))
25303
df03fcc66104 Deal with NULL fields in mkpwent.
Martin v. Löwis <martin@v.loewis.de>
parents: 24471
diff changeset
69 #define SETS(i,val) sets(v, i, val)
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
70
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
71 SETS(setIndex++, p->pw_name);
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
72 #ifdef __VMS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
73 SETS(setIndex++, "");
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
74 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
75 SETS(setIndex++, p->pw_passwd);
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
76 #endif
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
77 PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromUid(p->pw_uid));
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
78 PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromGid(p->pw_gid));
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
79 #ifdef __VMS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
80 SETS(setIndex++, "");
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
81 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
82 SETS(setIndex++, p->pw_gecos);
26550
b9c912e2c3c0 Patch #614055: Support OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 25303
diff changeset
83 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
84 SETS(setIndex++, p->pw_dir);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
85 SETS(setIndex++, p->pw_shell);
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
86
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
87 #undef SETS
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
88 #undef SETI
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
89
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
90 if (PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
91 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
92 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
93 }
22099
d0acb3cb011d Patch #523268, #522027: return enhanced tuples.
Martin v. Löwis <martin@v.loewis.de>
parents: 21859
diff changeset
94
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
95 return v;
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 }
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
98 PyDoc_STRVAR(pwd_getpwuid__doc__,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
99 "getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\n\
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
100 pw_gid,pw_gecos,pw_dir,pw_shell)\n\
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
101 Return the password database entry for the given numeric user ID.\n\
64077
4085cc560e9e Merged revisions 84106 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61467
diff changeset
102 See help(pwd) for more on password database entries.");
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
103
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
104 static PyObject *
13505
0edeb4efe6db ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
105 pwd_getpwuid(PyObject *self, PyObject *args)
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 {
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
107 uid_t uid;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
108 struct passwd *p;
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
109 if (!PyArg_ParseTuple(args, "O&:getpwuid", _Py_Uid_Converter, &uid)) {
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
110 if (PyErr_ExceptionMatches(PyExc_OverflowError))
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
111 PyErr_Format(PyExc_KeyError,
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
112 "getpwuid(): uid not found");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
113 return NULL;
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
114 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
115 if ((p = getpwuid(uid)) == NULL) {
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
116 PyObject *uid_obj = _PyLong_FromUid(uid);
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
117 if (uid_obj == NULL)
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
118 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
119 PyErr_Format(PyExc_KeyError,
82172
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
120 "getpwuid(): uid not found: %S", uid_obj);
3893ab574c55 Issue #4591: Uid and gid values larger than 2**31 are supported now.
Serhiy Storchaka <storchaka@gmail.com>
parents: 68257
diff changeset
121 Py_DECREF(uid_obj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
122 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
123 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
124 return mkpwent(p);
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 }
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
127 PyDoc_STRVAR(pwd_getpwnam__doc__,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
128 "getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\n\
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
129 pw_gid,pw_gecos,pw_dir,pw_shell)\n\
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
130 Return the password database entry for the given user name.\n\
64077
4085cc560e9e Merged revisions 84106 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61467
diff changeset
131 See help(pwd) for more on password database entries.");
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
132
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
133 static PyObject *
13505
0edeb4efe6db ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
134 pwd_getpwnam(PyObject *self, PyObject *args)
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
136 char *name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
137 struct passwd *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
138 PyObject *arg, *bytes, *retval = NULL;
54422
28d64192ab5a Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
Martin v. Löwis <martin@v.loewis.de>
parents: 53757
diff changeset
139
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
140 if (!PyArg_ParseTuple(args, "U:getpwnam", &arg))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
141 return NULL;
61597
b5ba7ea4246b Issue #8715: Create PyUnicode_EncodeFSDefault() function: Encode a Unicode
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61466
diff changeset
142 if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
143 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
144 if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
145 goto out;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
146 if ((p = getpwnam(name)) == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
147 PyErr_Format(PyExc_KeyError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
148 "getpwnam(): name not found: %s", name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
149 goto out;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
150 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
151 retval = mkpwent(p);
54422
28d64192ab5a Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
Martin v. Löwis <martin@v.loewis.de>
parents: 53757
diff changeset
152 out:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
153 Py_DECREF(bytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
154 return retval;
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 }
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156
6142
144db635b49d Added configuration tests for presence of alarm(), pause(), and getpwent()
Guido van Rossum <guido@python.org>
parents: 4917
diff changeset
157 #ifdef HAVE_GETPWENT
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
158 PyDoc_STRVAR(pwd_getpwall__doc__,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23048
diff changeset
159 "getpwall() -> list_of_entries\n\
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
160 Return a list of all available password database entries, \
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
161 in arbitrary order.\n\
64077
4085cc560e9e Merged revisions 84106 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61467
diff changeset
162 See help(pwd) for more on password database entries.");
7530
891105dac9b4 Doc strings added by Mitch Chapman.
Guido van Rossum <guido@python.org>
parents: 6142
diff changeset
163
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
164 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 22114
diff changeset
165 pwd_getpwall(PyObject *self)
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
167 PyObject *d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
168 struct passwd *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
169 if ((d = PyList_New(0)) == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
170 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
171 setpwent();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
172 while ((p = getpwent()) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
173 PyObject *v = mkpwent(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
174 if (v == NULL || PyList_Append(d, v) != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
175 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
176 Py_DECREF(d);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
177 endpwent();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
178 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
179 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
180 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
181 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
182 endpwent();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
183 return d;
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 }
6142
144db635b49d Added configuration tests for presence of alarm(), pause(), and getpwent()
Guido van Rossum <guido@python.org>
parents: 4917
diff changeset
185 #endif
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186
4684
d800841b57a8 Renamed.
Barry Warsaw <barry@python.org>
parents: 4503
diff changeset
187 static PyMethodDef pwd_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
188 {"getpwuid", pwd_getpwuid, METH_VARARGS, pwd_getpwuid__doc__},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
189 {"getpwnam", pwd_getpwnam, METH_VARARGS, pwd_getpwnam__doc__},
6142
144db635b49d Added configuration tests for presence of alarm(), pause(), and getpwent()
Guido van Rossum <guido@python.org>
parents: 4917
diff changeset
190 #ifdef HAVE_GETPWENT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
191 {"getpwall", (PyCFunction)pwd_getpwall,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
192 METH_NOARGS, pwd_getpwall__doc__},
6142
144db635b49d Added configuration tests for presence of alarm(), pause(), and getpwent()
Guido van Rossum <guido@python.org>
parents: 4917
diff changeset
193 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
194 {NULL, NULL} /* sentinel */
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 };
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44099
diff changeset
197 static struct PyModuleDef pwdmodule = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
198 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
199 "pwd",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
200 pwd__doc__,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
201 -1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
202 pwd_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
203 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
204 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
205 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
206 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44099
diff changeset
207 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44099
diff changeset
208
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44099
diff changeset
209
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 23832
diff changeset
210 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44099
diff changeset
211 PyInit_pwd(void)
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
213 PyObject *m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
214 m = PyModule_Create(&pwdmodule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
215 if (m == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
216 return NULL;
23024
4e58a38e3c06 initpwd(): Clean up initialization, avoid PyModule_GetDict().
Fred Drake <fdrake@acm.org>
parents: 22709
diff changeset
217
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
218 if (!initialized) {
84793
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 82175
diff changeset
219 if (PyStructSequence_InitType2(&StructPwdType,
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 82175
diff changeset
220 &struct_pwd_type_desc) < 0)
fc718c177ee6 Issue #18520: Add a new PyStructSequence_InitType2() function, same than
Victor Stinner <victor.stinner@gmail.com>
parents: 82175
diff changeset
221 return NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
222 initialized = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
223 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
224 Py_INCREF((PyObject *) &StructPwdType);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
225 PyModule_AddObject(m, "struct_passwd", (PyObject *) &StructPwdType);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54425
diff changeset
226 return m;
201
310f8c924073 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 }