blob: f13472f29b6f11136a610d5597e023563c1357d2 [file] [log] [blame]
Guido van Rossum20882d51994-06-23 11:15:44 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum20882d51994-06-23 11:15:44 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum20882d51994-06-23 11:15:44 +00009******************************************************************/
10
11/* UNIX group file access module */
12
Roger E. Masseb2b44e51996-12-18 19:37:32 +000013#include "Python.h"
Guido van Rossum20882d51994-06-23 11:15:44 +000014
15#include <sys/types.h>
16#include <grp.h>
17
Fred Drake51b6bc52000-07-08 16:56:26 +000018
19static PyObject *
20mkgrent(struct group *p)
Guido van Rossum20882d51994-06-23 11:15:44 +000021{
Fred Drake51b6bc52000-07-08 16:56:26 +000022 PyObject *v, *w;
23 char **member;
24 if ((w = PyList_New(0)) == NULL) {
25 return NULL;
26 }
27 for (member = p->gr_mem; *member != NULL; member++) {
28 PyObject *x = PyString_FromString(*member);
29 if (x == NULL || PyList_Append(w, x) != 0) {
30 Py_XDECREF(x);
31 Py_DECREF(w);
32 return NULL;
33 }
34 Py_DECREF(x);
35 }
36 v = Py_BuildValue("(sslO)",
37 p->gr_name,
38 p->gr_passwd,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000039#if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__)
40/* Correct a bug present on Intel machines in NextStep 3.2 and 3.3;
41 for later versions you may have to remove this */
Fred Drake51b6bc52000-07-08 16:56:26 +000042 (long)p->gr_short_pad, /* ugh-NeXT broke the padding */
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000043#else
Fred Drake51b6bc52000-07-08 16:56:26 +000044 (long)p->gr_gid,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000045#endif
Fred Drake51b6bc52000-07-08 16:56:26 +000046 w);
47 Py_DECREF(w);
48 return v;
Guido van Rossum20882d51994-06-23 11:15:44 +000049}
50
Fred Drake51b6bc52000-07-08 16:56:26 +000051static PyObject *
52grp_getgrgid(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000053{
Fred Drake51b6bc52000-07-08 16:56:26 +000054 int gid;
55 struct group *p;
56 if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
57 return NULL;
58 if ((p = getgrgid(gid)) == NULL) {
59 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
60 return NULL;
61 }
62 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000063}
64
Fred Drake51b6bc52000-07-08 16:56:26 +000065static PyObject *
66grp_getgrnam(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000067{
Fred Drake51b6bc52000-07-08 16:56:26 +000068 char *name;
69 struct group *p;
70 if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
71 return NULL;
72 if ((p = getgrnam(name)) == NULL) {
73 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
74 return NULL;
75 }
76 return mkgrent(p);
Guido van Rossum20882d51994-06-23 11:15:44 +000077}
78
Fred Drake51b6bc52000-07-08 16:56:26 +000079static PyObject *
80grp_getgrall(PyObject *self, PyObject *args)
Guido van Rossum20882d51994-06-23 11:15:44 +000081{
Fred Drake51b6bc52000-07-08 16:56:26 +000082 PyObject *d;
83 struct group *p;
84
85 if (!PyArg_ParseTuple(args, ":getgrall"))
86 return NULL;
87 if ((d = PyList_New(0)) == NULL)
88 return NULL;
89 setgrent();
90 while ((p = getgrent()) != NULL) {
91 PyObject *v = mkgrent(p);
92 if (v == NULL || PyList_Append(d, v) != 0) {
93 Py_XDECREF(v);
94 Py_DECREF(d);
95 return NULL;
96 }
97 Py_DECREF(v);
98 }
99 return d;
Guido van Rossum20882d51994-06-23 11:15:44 +0000100}
101
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000102static PyMethodDef grp_methods[] = {
Fred Drake51b6bc52000-07-08 16:56:26 +0000103 {"getgrgid", grp_getgrgid, METH_VARARGS,
104 "getgrgid(id) -> tuple\n\
105Return the group database entry for the given numeric group ID. If\n\
106id is not valid, raise KeyError."},
107 {"getgrnam", grp_getgrnam, METH_VARARGS,
108 "getgrnam(name) -> tuple\n\
109Return the group database entry for the given group name. If\n\
110name is not valid, raise KeyError."},
111 {"getgrall", grp_getgrall, METH_VARARGS,
112 "getgrall() -> list of tuples\n\
113Return a list of all available group entries, in arbitrary order."},
114 {NULL, NULL} /* sentinel */
Guido van Rossum20882d51994-06-23 11:15:44 +0000115};
116
Fred Drake51b6bc52000-07-08 16:56:26 +0000117static char grp__doc__[] =
118"Access to the Unix group database.\n\
119\n\
120Group entries are reported as 4-tuples containing the following fields\n\
121from the group database, in order:\n\
122\n\
123 name - name of the group\n\
124 passwd - group password (encrypted); often empty\n\
125 gid - numeric ID of the group\n\
126 mem - list of members\n\
127\n\
128The gid is an integer, name and password are strings. (Note that most\n\
129users are not explicitly listed as members of the groups they are in\n\
130according to the password database. Check both databases to get\n\
131complete membership information.)";
132
133
Guido van Rossum3886bb61998-12-04 18:50:17 +0000134DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000135initgrp(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000136{
Fred Drake51b6bc52000-07-08 16:56:26 +0000137 Py_InitModule3("grp", grp_methods, grp__doc__);
Guido van Rossum20882d51994-06-23 11:15:44 +0000138}