blob: 12d33dd2a4112ded98ba73f741555bedb2ecb950 [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000032static int initialized;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000033static PyTypeObject StructGrpType;
Fred Drake51b6bc52000-07-08 16:56:26 +000034
35static PyObject *
36mkgrent(struct group *p)
Guido van Rossum20882d51994-06-23 11:15:44 +000037{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000038 int setIndex = 0;
39 PyObject *v = PyStructSequence_New(&StructGrpType), *w;
Fred Drake51b6bc52000-07-08 16:56:26 +000040 char **member;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000041
42 if (v == NULL)
43 return NULL;
44
Fred Drake51b6bc52000-07-08 16:56:26 +000045 if ((w = PyList_New(0)) == NULL) {
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000046 Py_DECREF(v);
Fred Drake51b6bc52000-07-08 16:56:26 +000047 return NULL;
48 }
49 for (member = p->gr_mem; *member != NULL; member++) {
50 PyObject *x = PyString_FromString(*member);
51 if (x == NULL || PyList_Append(w, x) != 0) {
52 Py_XDECREF(x);
53 Py_DECREF(w);
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000054 Py_DECREF(v);
Fred Drake51b6bc52000-07-08 16:56:26 +000055 return NULL;
56 }
57 Py_DECREF(x);
58 }
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000059
60#define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
61 SET(setIndex++, PyString_FromString(p->gr_name));
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +000062#ifdef __VMS
63 SET(setIndex++, Py_None);
64 Py_INCREF(Py_None);
65#else
Martin v. Löwisceb7c182002-09-17 07:05:25 +000066 if (p->gr_passwd)
67 SET(setIndex++, PyString_FromString(p->gr_passwd));
68 else {
69 SET(setIndex++, Py_None);
70 Py_INCREF(Py_None);
71 }
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +000072#endif
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000073 SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
74 SET(setIndex++, w);
75#undef SET
76
77 if (PyErr_Occurred()) {
78 Py_DECREF(v);
79 Py_DECREF(w);
80 return NULL;
81 }
82
Fred Drake51b6bc52000-07-08 16:56:26 +000083 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000084}
85
Fred Drake51b6bc52000-07-08 16:56:26 +000086static PyObject *
87grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000088{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000089 unsigned int gid;
Fred Drake51b6bc52000-07-08 16:56:26 +000090 struct group *p;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000091 if (!PyArg_ParseTuple(args, "I:getgrgid", &gid))
Fred Drake51b6bc52000-07-08 16:56:26 +000092 return NULL;
93 if ((p = getgrgid(gid)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +000094 PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
Fred Drake51b6bc52000-07-08 16:56:26 +000095 return NULL;
96 }
97 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000098}
99
Fred Drake51b6bc52000-07-08 16:56:26 +0000100static PyObject *
101grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000102{
Fred Drake51b6bc52000-07-08 16:56:26 +0000103 char *name;
104 struct group *p;
105 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
106 return NULL;
107 if ((p = getgrnam(name)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +0000108 PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name);
Fred Drake51b6bc52000-07-08 16:56:26 +0000109 return NULL;
110 }
111 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000112}
113
Fred Drake51b6bc52000-07-08 16:56:26 +0000114static PyObject *
115grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000116{
Fred Drake51b6bc52000-07-08 16:56:26 +0000117 PyObject *d;
118 struct group *p;
119
120 if (!PyArg_ParseTuple(args, ":getgrall"))
121 return NULL;
122 if ((d = PyList_New(0)) == NULL)
123 return NULL;
124 setgrent();
125 while ((p = getgrent()) != NULL) {
126 PyObject *v = mkgrent(p);
127 if (v == NULL || PyList_Append(d, v) != 0) {
128 Py_XDECREF(v);
129 Py_DECREF(d);
130 return NULL;
131 }
132 Py_DECREF(v);
133 }
Fred Drake8e68eb62001-03-11 03:03:07 +0000134 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000135 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000136}
137
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000138static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +0000139 {"getgrgid", grp_getgrgid, METH_VARARGS,
140 "getgrgid(id) -> tuple\n\
141Return the group database entry for the given numeric group ID. If\n\
142id is not valid, raise KeyError."},
143 {"getgrnam", grp_getgrnam, METH_VARARGS,
144 "getgrnam(name) -> tuple\n\
145Return the group database entry for the given group name. If\n\
146name is not valid, raise KeyError."},
147 {"getgrall", grp_getgrall, METH_VARARGS,
148 "getgrall() -> list of tuples\n\
149Return a list of all available group entries, in arbitrary order."},
150 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000151};
152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000153PyDoc_STRVAR(grp__doc__,
Fred Drake51b6bc52000-07-08 16:56:26 +0000154"Access to the Unix group database.\n\
155\n\
156Group entries are reported as 4-tuples containing the following fields\n\
157from the group database, in order:\n\
158\n\
159 name - name of the group\n\
160 passwd - group password (encrypted); often empty\n\
161 gid - numeric ID of the group\n\
162 mem - list of members\n\
163\n\
164The gid is an integer, name and password are strings. (Note that most\n\
165users are not explicitly listed as members of the groups they are in\n\
166according to the password database. Check both databases to get\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000167complete membership information.)");
Fred Drake51b6bc52000-07-08 16:56:26 +0000168
169
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000170PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000171initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000172{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000173 PyObject *m, *d;
174 m = Py_InitModule3("grp", grp_methods, grp__doc__);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000175 if (m == NULL)
176 return;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000177 d = PyModule_GetDict(m);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000178 if (!initialized)
179 PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000180 PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000181 initialized = 1;
Guido van Rossum20882d51994-06-23 11:15:44 +0000182}