Commit 51b6bc55 authored by Fred Drake's avatar Fred Drake

ANSI-fication of the sources, convert to 4-space indents.

Use PyArg_ParseTuple() to get better error messages.
Add docstrings all around.
parent 4cbc9f76
...@@ -15,97 +15,124 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. ...@@ -15,97 +15,124 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#include <sys/types.h> #include <sys/types.h>
#include <grp.h> #include <grp.h>
static PyObject *mkgrent(p)
struct group *p; static PyObject *
mkgrent(struct group *p)
{ {
PyObject *v, *w; PyObject *v, *w;
char **member; char **member;
if ((w = PyList_New(0)) == NULL) { if ((w = PyList_New(0)) == NULL) {
return NULL; return NULL;
} }
for (member = p->gr_mem; *member != NULL; member++) { for (member = p->gr_mem; *member != NULL; member++) {
PyObject *x = PyString_FromString(*member); PyObject *x = PyString_FromString(*member);
if (x == NULL || PyList_Append(w, x) != 0) { if (x == NULL || PyList_Append(w, x) != 0) {
Py_XDECREF(x); Py_XDECREF(x);
Py_DECREF(w); Py_DECREF(w);
return NULL; return NULL;
} }
Py_DECREF(x); Py_DECREF(x);
} }
v = Py_BuildValue("(sslO)", v = Py_BuildValue("(sslO)",
p->gr_name, p->gr_name,
p->gr_passwd, p->gr_passwd,
#if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__) #if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__)
/* Correct a bug present on Intel machines in NextStep 3.2 and 3.3; /* Correct a bug present on Intel machines in NextStep 3.2 and 3.3;
for later versions you may have to remove this */ for later versions you may have to remove this */
(long)p->gr_short_pad, /* ugh-NeXT broke the padding */ (long)p->gr_short_pad, /* ugh-NeXT broke the padding */
#else #else
(long)p->gr_gid, (long)p->gr_gid,
#endif #endif
w); w);
Py_DECREF(w); Py_DECREF(w);
return v; return v;
} }
static PyObject *grp_getgrgid(self, args) static PyObject *
PyObject *self, *args; grp_getgrgid(PyObject *self, PyObject *args)
{ {
int gid; int gid;
struct group *p; struct group *p;
if (!PyArg_Parse((args),"i",(&gid))) if (!PyArg_ParseTuple(args, "i:getgrgid", &gid))
return NULL; return NULL;
if ((p = getgrgid(gid)) == NULL) { if ((p = getgrgid(gid)) == NULL) {
PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found"); PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
return NULL; return NULL;
} }
return mkgrent(p); return mkgrent(p);
} }
static PyObject *grp_getgrnam(self, args) static PyObject *
PyObject *self, *args; grp_getgrnam(PyObject *self, PyObject *args)
{ {
char *name; char *name;
struct group *p; struct group *p;
if (!PyArg_Parse((args),"s",(&name))) if (!PyArg_ParseTuple(args, "s:getgrnam", &name))
return NULL; return NULL;
if ((p = getgrnam(name)) == NULL) { if ((p = getgrnam(name)) == NULL) {
PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found"); PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
return NULL; return NULL;
} }
return mkgrent(p); return mkgrent(p);
} }
static PyObject *grp_getgrall(self, args) static PyObject *
PyObject *self, *args; grp_getgrall(PyObject *self, PyObject *args)
{ {
PyObject *d; PyObject *d;
struct group *p; struct group *p;
if (!PyArg_NoArgs(args))
return NULL; if (!PyArg_ParseTuple(args, ":getgrall"))
if ((d = PyList_New(0)) == NULL) return NULL;
return NULL; if ((d = PyList_New(0)) == NULL)
setgrent(); return NULL;
while ((p = getgrent()) != NULL) { setgrent();
PyObject *v = mkgrent(p); while ((p = getgrent()) != NULL) {
if (v == NULL || PyList_Append(d, v) != 0) { PyObject *v = mkgrent(p);
Py_XDECREF(v); if (v == NULL || PyList_Append(d, v) != 0) {
Py_DECREF(d); Py_XDECREF(v);
return NULL; Py_DECREF(d);
} return NULL;
Py_DECREF(v); }
} Py_DECREF(v);
return d; }
return d;
} }
static PyMethodDef grp_methods[] = { static PyMethodDef grp_methods[] = {
{"getgrgid", grp_getgrgid}, {"getgrgid", grp_getgrgid, METH_VARARGS,
{"getgrnam", grp_getgrnam}, "getgrgid(id) -> tuple\n\
{"getgrall", grp_getgrall}, Return the group database entry for the given numeric group ID. If\n\
{NULL, NULL} /* sentinel */ id is not valid, raise KeyError."},
{"getgrnam", grp_getgrnam, METH_VARARGS,
"getgrnam(name) -> tuple\n\
Return the group database entry for the given group name. If\n\
name is not valid, raise KeyError."},
{"getgrall", grp_getgrall, METH_VARARGS,
"getgrall() -> list of tuples\n\
Return a list of all available group entries, in arbitrary order."},
{NULL, NULL} /* sentinel */
}; };
static char grp__doc__[] =
"Access to the Unix group database.\n\
\n\
Group entries are reported as 4-tuples containing the following fields\n\
from the group database, in order:\n\
\n\
name - name of the group\n\
passwd - group password (encrypted); often empty\n\
gid - numeric ID of the group\n\
mem - list of members\n\
\n\
The gid is an integer, name and password are strings. (Note that most\n\
users are not explicitly listed as members of the groups they are in\n\
according to the password database. Check both databases to get\n\
complete membership information.)";
DL_EXPORT(void) DL_EXPORT(void)
initgrp() initgrp()
{ {
Py_InitModule("grp", grp_methods); Py_InitModule3("grp", grp_methods, grp__doc__);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment