blob: 2882fabd13308f8eb01bccaf19da22ae87cca51a [file] [log] [blame]
Guido van Rossum20882d51994-06-23 11:15:44 +00001
2/* UNIX group file access module */
3
Roger E. Masseb2b44e51996-12-18 19:37:32 +00004#include "Python.h"
Martin v. Löwisdbd55b32002-03-01 10:38:44 +00005#include "structseq.h"
Guido van Rossum20882d51994-06-23 11:15:44 +00006
7#include <sys/types.h>
8#include <grp.h>
9
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000010static PyStructSequence_Field struct_group_type_fields[] = {
11 {"gr_name", "group name"},
12 {"gr_passwd", "password"},
13 {"gr_gid", "group id"},
14 {"gr_mem", "group memebers"},
15 {0}
16};
17
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000018PyDoc_STRVAR(struct_group__doc__,
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000019"grp.struct_group: Results from getgr*() routines.\n\n\
20This object may be accessed either as a tuple of\n\
21 (gr_name,gr_passwd,gr_gid,gr_mem)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000022or via the object attributes as named in the above tuple.\n");
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000023
24static PyStructSequence_Desc struct_group_type_desc = {
25 "grp.struct_group",
26 struct_group__doc__,
27 struct_group_type_fields,
28 4,
29};
30
31
32static PyTypeObject StructGrpType;
Fred Drake51b6bc52000-07-08 16:56:26 +000033
34static PyObject *
35mkgrent(struct group *p)
Guido van Rossum20882d51994-06-23 11:15:44 +000036{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000037 int setIndex = 0;
38 PyObject *v = PyStructSequence_New(&StructGrpType), *w;
Fred Drake51b6bc52000-07-08 16:56:26 +000039 char **member;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000040
41 if (v == NULL)
42 return NULL;
43
Fred Drake51b6bc52000-07-08 16:56:26 +000044 if ((w = PyList_New(0)) == NULL) {
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000045 Py_DECREF(v);
Fred Drake51b6bc52000-07-08 16:56:26 +000046 return NULL;
47 }
48 for (member = p->gr_mem; *member != NULL; member++) {
49 PyObject *x = PyString_FromString(*member);
50 if (x == NULL || PyList_Append(w, x) != 0) {
51 Py_XDECREF(x);
52 Py_DECREF(w);
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000053 Py_DECREF(v);
Fred Drake51b6bc52000-07-08 16:56:26 +000054 return NULL;
55 }
56 Py_DECREF(x);
57 }
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000058
59#define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
60 SET(setIndex++, PyString_FromString(p->gr_name));
Martin v. Löwisceb7c182002-09-17 07:05:25 +000061 if (p->gr_passwd)
62 SET(setIndex++, PyString_FromString(p->gr_passwd));
63 else {
64 SET(setIndex++, Py_None);
65 Py_INCREF(Py_None);
66 }
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000067 SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
68 SET(setIndex++, w);
69#undef SET
70
71 if (PyErr_Occurred()) {
72 Py_DECREF(v);
73 Py_DECREF(w);
74 return NULL;
75 }
76
Fred Drake51b6bc52000-07-08 16:56:26 +000077 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000078}
79
Fred Drake51b6bc52000-07-08 16:56:26 +000080static PyObject *
81grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000082{
Fred Drake51b6bc52000-07-08 16:56:26 +000083 int gid;
84 struct group *p;
85 if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
86 return NULL;
87 if ((p = getgrgid(gid)) == NULL) {
88 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
89 return NULL;
90 }
91 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000092}
93
Fred Drake51b6bc52000-07-08 16:56:26 +000094static PyObject *
95grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000096{
Fred Drake51b6bc52000-07-08 16:56:26 +000097 char *name;
98 struct group *p;
99 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
100 return NULL;
101 if ((p = getgrnam(name)) == NULL) {
102 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
103 return NULL;
104 }
105 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000106}
107
Fred Drake51b6bc52000-07-08 16:56:26 +0000108static PyObject *
109grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000110{
Fred Drake51b6bc52000-07-08 16:56:26 +0000111 PyObject *d;
112 struct group *p;
113
114 if (!PyArg_ParseTuple(args, ":getgrall"))
115 return NULL;
116 if ((d = PyList_New(0)) == NULL)
117 return NULL;
118 setgrent();
119 while ((p = getgrent()) != NULL) {
120 PyObject *v = mkgrent(p);
121 if (v == NULL || PyList_Append(d, v) != 0) {
122 Py_XDECREF(v);
123 Py_DECREF(d);
124 return NULL;
125 }
126 Py_DECREF(v);
127 }
Fred Drake8e68eb62001-03-11 03:03:07 +0000128 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000129 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000130}
131
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000132static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +0000133 {"getgrgid", grp_getgrgid, METH_VARARGS,
134 "getgrgid(id) -> tuple\n\
135Return the group database entry for the given numeric group ID. If\n\
136id is not valid, raise KeyError."},
137 {"getgrnam", grp_getgrnam, METH_VARARGS,
138 "getgrnam(name) -> tuple\n\
139Return the group database entry for the given group name. If\n\
140name is not valid, raise KeyError."},
141 {"getgrall", grp_getgrall, METH_VARARGS,
142 "getgrall() -> list of tuples\n\
143Return a list of all available group entries, in arbitrary order."},
144 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000145};
146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000147PyDoc_STRVAR(grp__doc__,
Fred Drake51b6bc52000-07-08 16:56:26 +0000148"Access to the Unix group database.\n\
149\n\
150Group entries are reported as 4-tuples containing the following fields\n\
151from the group database, in order:\n\
152\n\
153 name - name of the group\n\
154 passwd - group password (encrypted); often empty\n\
155 gid - numeric ID of the group\n\
156 mem - list of members\n\
157\n\
158The gid is an integer, name and password are strings. (Note that most\n\
159users are not explicitly listed as members of the groups they are in\n\
160according to the password database. Check both databases to get\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000161complete membership information.)");
Fred Drake51b6bc52000-07-08 16:56:26 +0000162
163
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000164PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000165initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000166{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000167 PyObject *m, *d;
168 m = Py_InitModule3("grp", grp_methods, grp__doc__);
169 d = PyModule_GetDict(m);
170 PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
171 PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
Guido van Rossum20882d51994-06-23 11:15:44 +0000172}