blob: a4b8ca3ef4786c64151402087feddd6e38531011 [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"
Guido van Rossum20882d51994-06-23 11:15:44 +00005
6#include <sys/types.h>
7#include <grp.h>
8
Fred Drake51b6bc52000-07-08 16:56:26 +00009
10static PyObject *
11mkgrent(struct group *p)
Guido van Rossum20882d51994-06-23 11:15:44 +000012{
Fred Drake51b6bc52000-07-08 16:56:26 +000013 PyObject *v, *w;
14 char **member;
15 if ((w = PyList_New(0)) == NULL) {
16 return NULL;
17 }
18 for (member = p->gr_mem; *member != NULL; member++) {
19 PyObject *x = PyString_FromString(*member);
20 if (x == NULL || PyList_Append(w, x) != 0) {
21 Py_XDECREF(x);
22 Py_DECREF(w);
23 return NULL;
24 }
25 Py_DECREF(x);
26 }
27 v = Py_BuildValue("(sslO)",
28 p->gr_name,
29 p->gr_passwd,
Fred Drake51b6bc52000-07-08 16:56:26 +000030 (long)p->gr_gid,
Fred Drake51b6bc52000-07-08 16:56:26 +000031 w);
32 Py_DECREF(w);
33 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000034}
35
Fred Drake51b6bc52000-07-08 16:56:26 +000036static PyObject *
37grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000038{
Fred Drake51b6bc52000-07-08 16:56:26 +000039 int gid;
40 struct group *p;
41 if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
42 return NULL;
43 if ((p = getgrgid(gid)) == NULL) {
44 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
45 return NULL;
46 }
47 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000048}
49
Fred Drake51b6bc52000-07-08 16:56:26 +000050static PyObject *
51grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000052{
Fred Drake51b6bc52000-07-08 16:56:26 +000053 char *name;
54 struct group *p;
55 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
56 return NULL;
57 if ((p = getgrnam(name)) == NULL) {
58 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
59 return NULL;
60 }
61 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000062}
63
Fred Drake51b6bc52000-07-08 16:56:26 +000064static PyObject *
65grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000066{
Fred Drake51b6bc52000-07-08 16:56:26 +000067 PyObject *d;
68 struct group *p;
69
70 if (!PyArg_ParseTuple(args, ":getgrall"))
71 return NULL;
72 if ((d = PyList_New(0)) == NULL)
73 return NULL;
74 setgrent();
75 while ((p = getgrent()) != NULL) {
76 PyObject *v = mkgrent(p);
77 if (v == NULL || PyList_Append(d, v) != 0) {
78 Py_XDECREF(v);
79 Py_DECREF(d);
80 return NULL;
81 }
82 Py_DECREF(v);
83 }
Fred Drake8e68eb62001-03-11 03:03:07 +000084 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +000085 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +000086}
87
Roger E. Masseb2b44e51996-12-18 19:37:32 +000088static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +000089 {"getgrgid", grp_getgrgid, METH_VARARGS,
90 "getgrgid(id) -> tuple\n\
91Return the group database entry for the given numeric group ID. If\n\
92id is not valid, raise KeyError."},
93 {"getgrnam", grp_getgrnam, METH_VARARGS,
94 "getgrnam(name) -> tuple\n\
95Return the group database entry for the given group name. If\n\
96name is not valid, raise KeyError."},
97 {"getgrall", grp_getgrall, METH_VARARGS,
98 "getgrall() -> list of tuples\n\
99Return a list of all available group entries, in arbitrary order."},
100 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000101};
102
Fred Drake51b6bc52000-07-08 16:56:26 +0000103static char grp__doc__[] =
104"Access to the Unix group database.\n\
105\n\
106Group entries are reported as 4-tuples containing the following fields\n\
107from the group database, in order:\n\
108\n\
109 name - name of the group\n\
110 passwd - group password (encrypted); often empty\n\
111 gid - numeric ID of the group\n\
112 mem - list of members\n\
113\n\
114The gid is an integer, name and password are strings. (Note that most\n\
115users are not explicitly listed as members of the groups they are in\n\
116according to the password database. Check both databases to get\n\
117complete membership information.)";
118
119
Guido van Rossum3886bb61998-12-04 18:50:17 +0000120DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000121initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000122{
Fred Drake51b6bc52000-07-08 16:56:26 +0000123 Py_InitModule3("grp", grp_methods, grp__doc__);
Guido van Rossum20882d51994-06-23 11:15:44 +0000124}