blob: c8340099404701728951b62126d2a781cae981bb [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));
61 SET(setIndex++, PyString_FromString(p->gr_passwd));
62 SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
63 SET(setIndex++, w);
64#undef SET
65
66 if (PyErr_Occurred()) {
67 Py_DECREF(v);
68 Py_DECREF(w);
69 return NULL;
70 }
71
Fred Drake51b6bc52000-07-08 16:56:26 +000072 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000073}
74
Fred Drake51b6bc52000-07-08 16:56:26 +000075static PyObject *
76grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000077{
Fred Drake51b6bc52000-07-08 16:56:26 +000078 int gid;
79 struct group *p;
80 if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
81 return NULL;
82 if ((p = getgrgid(gid)) == NULL) {
83 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
84 return NULL;
85 }
86 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000087}
88
Fred Drake51b6bc52000-07-08 16:56:26 +000089static PyObject *
90grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000091{
Fred Drake51b6bc52000-07-08 16:56:26 +000092 char *name;
93 struct group *p;
94 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
95 return NULL;
96 if ((p = getgrnam(name)) == NULL) {
97 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
98 return NULL;
99 }
100 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000101}
102
Fred Drake51b6bc52000-07-08 16:56:26 +0000103static PyObject *
104grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +0000105{
Fred Drake51b6bc52000-07-08 16:56:26 +0000106 PyObject *d;
107 struct group *p;
108
109 if (!PyArg_ParseTuple(args, ":getgrall"))
110 return NULL;
111 if ((d = PyList_New(0)) == NULL)
112 return NULL;
113 setgrent();
114 while ((p = getgrent()) != NULL) {
115 PyObject *v = mkgrent(p);
116 if (v == NULL || PyList_Append(d, v) != 0) {
117 Py_XDECREF(v);
118 Py_DECREF(d);
119 return NULL;
120 }
121 Py_DECREF(v);
122 }
Fred Drake8e68eb62001-03-11 03:03:07 +0000123 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000124 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000125}
126
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000127static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +0000128 {"getgrgid", grp_getgrgid, METH_VARARGS,
129 "getgrgid(id) -> tuple\n\
130Return the group database entry for the given numeric group ID. If\n\
131id is not valid, raise KeyError."},
132 {"getgrnam", grp_getgrnam, METH_VARARGS,
133 "getgrnam(name) -> tuple\n\
134Return the group database entry for the given group name. If\n\
135name is not valid, raise KeyError."},
136 {"getgrall", grp_getgrall, METH_VARARGS,
137 "getgrall() -> list of tuples\n\
138Return a list of all available group entries, in arbitrary order."},
139 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000140};
141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000142PyDoc_STRVAR(grp__doc__,
Fred Drake51b6bc52000-07-08 16:56:26 +0000143"Access to the Unix group database.\n\
144\n\
145Group entries are reported as 4-tuples containing the following fields\n\
146from the group database, in order:\n\
147\n\
148 name - name of the group\n\
149 passwd - group password (encrypted); often empty\n\
150 gid - numeric ID of the group\n\
151 mem - list of members\n\
152\n\
153The gid is an integer, name and password are strings. (Note that most\n\
154users are not explicitly listed as members of the groups they are in\n\
155according to the password database. Check both databases to get\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000156complete membership information.)");
Fred Drake51b6bc52000-07-08 16:56:26 +0000157
158
Guido van Rossum3886bb61998-12-04 18:50:17 +0000159DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000160initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000161{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000162 PyObject *m, *d;
163 m = Py_InitModule3("grp", grp_methods, grp__doc__);
164 d = PyModule_GetDict(m);
165 PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
166 PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
Guido van Rossum20882d51994-06-23 11:15:44 +0000167}