blob: de849c98bd5a2506f52876c1fc237be438cb11b7 [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öwisc16f3bd2003-05-03 09:14:54 +000061#ifdef __VMS
62 SET(setIndex++, Py_None);
63 Py_INCREF(Py_None);
64#else
Martin v. Löwisceb7c182002-09-17 07:05:25 +000065 if (p->gr_passwd)
66 SET(setIndex++, PyString_FromString(p->gr_passwd));
67 else {
68 SET(setIndex++, Py_None);
69 Py_INCREF(Py_None);
70 }
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +000071#endif
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000072 SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
73 SET(setIndex++, w);
74#undef SET
75
76 if (PyErr_Occurred()) {
77 Py_DECREF(v);
78 Py_DECREF(w);
79 return NULL;
80 }
81
Fred Drake51b6bc52000-07-08 16:56:26 +000082 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000083}
84
Fred Drake51b6bc52000-07-08 16:56:26 +000085static PyObject *
86grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000087{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000088 unsigned int gid;
Fred Drake51b6bc52000-07-08 16:56:26 +000089 struct group *p;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000090 if (!PyArg_ParseTuple(args, "I:getgrgid", &gid))
Fred Drake51b6bc52000-07-08 16:56:26 +000091 return NULL;
92 if ((p = getgrgid(gid)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +000093 PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
Fred Drake51b6bc52000-07-08 16:56:26 +000094 return NULL;
95 }
96 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000097}
98
Fred Drake51b6bc52000-07-08 16:56:26 +000099static PyObject *
100grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000101{
Fred Drake51b6bc52000-07-08 16:56:26 +0000102 char *name;
103 struct group *p;
104 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
105 return NULL;
106 if ((p = getgrnam(name)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +0000107 PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name);
Fred Drake51b6bc52000-07-08 16:56:26 +0000108 return NULL;
109 }
110 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000111}
112
Fred Drake51b6bc52000-07-08 16:56:26 +0000113static PyObject *
114grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000115{
Fred Drake51b6bc52000-07-08 16:56:26 +0000116 PyObject *d;
117 struct group *p;
118
119 if (!PyArg_ParseTuple(args, ":getgrall"))
120 return NULL;
121 if ((d = PyList_New(0)) == NULL)
122 return NULL;
123 setgrent();
124 while ((p = getgrent()) != NULL) {
125 PyObject *v = mkgrent(p);
126 if (v == NULL || PyList_Append(d, v) != 0) {
127 Py_XDECREF(v);
128 Py_DECREF(d);
129 return NULL;
130 }
131 Py_DECREF(v);
132 }
Fred Drake8e68eb62001-03-11 03:03:07 +0000133 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000134 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000135}
136
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000137static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +0000138 {"getgrgid", grp_getgrgid, METH_VARARGS,
139 "getgrgid(id) -> tuple\n\
140Return the group database entry for the given numeric group ID. If\n\
141id is not valid, raise KeyError."},
142 {"getgrnam", grp_getgrnam, METH_VARARGS,
143 "getgrnam(name) -> tuple\n\
144Return the group database entry for the given group name. If\n\
145name is not valid, raise KeyError."},
146 {"getgrall", grp_getgrall, METH_VARARGS,
147 "getgrall() -> list of tuples\n\
148Return a list of all available group entries, in arbitrary order."},
149 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000150};
151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000152PyDoc_STRVAR(grp__doc__,
Fred Drake51b6bc52000-07-08 16:56:26 +0000153"Access to the Unix group database.\n\
154\n\
155Group entries are reported as 4-tuples containing the following fields\n\
156from the group database, in order:\n\
157\n\
158 name - name of the group\n\
159 passwd - group password (encrypted); often empty\n\
160 gid - numeric ID of the group\n\
161 mem - list of members\n\
162\n\
163The gid is an integer, name and password are strings. (Note that most\n\
164users are not explicitly listed as members of the groups they are in\n\
165according to the password database. Check both databases to get\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000166complete membership information.)");
Fred Drake51b6bc52000-07-08 16:56:26 +0000167
168
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000169PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000170initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000171{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000172 PyObject *m, *d;
173 m = Py_InitModule3("grp", grp_methods, grp__doc__);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000174 if (m == NULL)
175 return;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000176 d = PyModule_GetDict(m);
177 PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
178 PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
Guido van Rossum20882d51994-06-23 11:15:44 +0000179}