blob: ebc38cca119c95264abdbed24c3fe86c2a642600 [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"},
Serhiy Storchaka083c0aa2013-02-12 09:20:19 +020013 {"gr_gid", "group id"},
14 {"gr_mem", "group memebers"},
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000015 {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
Martin v. Löwis19ab6c92006-04-16 18:55:50 +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++) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +000050 PyObject *x = PyString_FromString(*member);
Fred Drake51b6bc52000-07-08 16:56:26 +000051 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)
Gregory P. Smithdd96db62008-06-09 04:58:54 +000061 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)
Gregory P. Smithdd96db62008-06-09 04:58:54 +000067 SET(setIndex++, PyString_FromString(p->gr_passwd));
Martin v. Löwisceb7c182002-09-17 07:05:25 +000068 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);
Martin v. Löwisdbd55b32002-03-01 10:38:44 +000079 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 *
Brett Cannon4c803f12006-05-25 22:00:14 +000086grp_getgrgid(PyObject *self, PyObject *pyo_id)
Guido van Rossum20882d51994-06-23 11:15:44 +000087{
Brett Cannon4c803f12006-05-25 22:00:14 +000088 PyObject *py_int_id;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000089 unsigned int gid;
Fred Drake51b6bc52000-07-08 16:56:26 +000090 struct group *p;
Brett Cannon4c803f12006-05-25 22:00:14 +000091
92 py_int_id = PyNumber_Int(pyo_id);
93 if (!py_int_id)
94 return NULL;
95 gid = PyInt_AS_LONG(py_int_id);
96 Py_DECREF(py_int_id);
97
Fred Drake51b6bc52000-07-08 16:56:26 +000098 if ((p = getgrgid(gid)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +000099 PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid);
Fred Drake51b6bc52000-07-08 16:56:26 +0000100 return NULL;
101 }
102 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000103}
104
Fred Drake51b6bc52000-07-08 16:56:26 +0000105static PyObject *
Brett Cannon4c803f12006-05-25 22:00:14 +0000106grp_getgrnam(PyObject *self, PyObject *pyo_name)
Guido van Rossum20882d51994-06-23 11:15:44 +0000107{
Brett Cannon4c803f12006-05-25 22:00:14 +0000108 PyObject *py_str_name;
Fred Drake51b6bc52000-07-08 16:56:26 +0000109 char *name;
110 struct group *p;
Brett Cannon4c803f12006-05-25 22:00:14 +0000111
112 py_str_name = PyObject_Str(pyo_name);
113 if (!py_str_name)
114 return NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000115 name = PyString_AS_STRING(py_str_name);
Serhiy Storchaka083c0aa2013-02-12 09:20:19 +0200116
Fred Drake51b6bc52000-07-08 16:56:26 +0000117 if ((p = getgrnam(name)) == NULL) {
Barry Warsawc7a77092004-01-20 21:06:00 +0000118 PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name);
Brett Cannon4c803f12006-05-25 22:00:14 +0000119 Py_DECREF(py_str_name);
Fred Drake51b6bc52000-07-08 16:56:26 +0000120 return NULL;
121 }
Brett Cannon4c803f12006-05-25 22:00:14 +0000122
123 Py_DECREF(py_str_name);
Fred Drake51b6bc52000-07-08 16:56:26 +0000124 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +0000125}
126
Fred Drake51b6bc52000-07-08 16:56:26 +0000127static PyObject *
Brett Cannon4c803f12006-05-25 22:00:14 +0000128grp_getgrall(PyObject *self, PyObject *ignore)
Guido van Rossum20882d51994-06-23 11:15:44 +0000129{
Fred Drake51b6bc52000-07-08 16:56:26 +0000130 PyObject *d;
131 struct group *p;
132
Fred Drake51b6bc52000-07-08 16:56:26 +0000133 if ((d = PyList_New(0)) == NULL)
134 return NULL;
135 setgrent();
136 while ((p = getgrent()) != NULL) {
137 PyObject *v = mkgrent(p);
138 if (v == NULL || PyList_Append(d, v) != 0) {
139 Py_XDECREF(v);
140 Py_DECREF(d);
Martin v. Löwis4f16d3b2009-05-29 15:58:08 +0000141 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000142 return NULL;
143 }
144 Py_DECREF(v);
145 }
Fred Drake8e68eb62001-03-11 03:03:07 +0000146 endgrent();
Fred Drake51b6bc52000-07-08 16:56:26 +0000147 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000148}
149
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000150static PyMethodDef grp_methods[] = {
Brett Cannon4c803f12006-05-25 22:00:14 +0000151 {"getgrgid", grp_getgrgid, METH_O,
Fred Drake51b6bc52000-07-08 16:56:26 +0000152 "getgrgid(id) -> tuple\n\
153Return the group database entry for the given numeric group ID. If\n\
154id is not valid, raise KeyError."},
Brett Cannon4c803f12006-05-25 22:00:14 +0000155 {"getgrnam", grp_getgrnam, METH_O,
Fred Drake51b6bc52000-07-08 16:56:26 +0000156 "getgrnam(name) -> tuple\n\
157Return the group database entry for the given group name. If\n\
158name is not valid, raise KeyError."},
Brett Cannon4c803f12006-05-25 22:00:14 +0000159 {"getgrall", grp_getgrall, METH_NOARGS,
Fred Drake51b6bc52000-07-08 16:56:26 +0000160 "getgrall() -> list of tuples\n\
R. David Murrayf8a63912010-12-14 16:26:30 +0000161Return a list of all available group entries, in arbitrary order.\n\
162An entry whose name starts with '+' or '-' represents an instruction\n\
163to use YP/NIS and may not be accessible via getgrnam or getgrgid."},
Fred Drake51b6bc52000-07-08 16:56:26 +0000164 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000165};
166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000167PyDoc_STRVAR(grp__doc__,
Fred Drake51b6bc52000-07-08 16:56:26 +0000168"Access to the Unix group database.\n\
169\n\
170Group entries are reported as 4-tuples containing the following fields\n\
171from the group database, in order:\n\
172\n\
173 name - name of the group\n\
174 passwd - group password (encrypted); often empty\n\
175 gid - numeric ID of the group\n\
176 mem - list of members\n\
177\n\
178The gid is an integer, name and password are strings. (Note that most\n\
179users are not explicitly listed as members of the groups they are in\n\
180according to the password database. Check both databases to get\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000181complete membership information.)");
Fred Drake51b6bc52000-07-08 16:56:26 +0000182
183
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000184PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000185initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000186{
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000187 PyObject *m, *d;
188 m = Py_InitModule3("grp", grp_methods, grp__doc__);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000189 if (m == NULL)
190 return;
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000191 d = PyModule_GetDict(m);
Martin v. Löwis19ab6c92006-04-16 18:55:50 +0000192 if (!initialized)
193 PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
Martin v. Löwisdbd55b32002-03-01 10:38:44 +0000194 PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
Martin v. Löwis19ab6c92006-04-16 18:55:50 +0000195 initialized = 1;
Guido van Rossum20882d51994-06-23 11:15:44 +0000196}