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

Use PyArg_ParseTuple() to get better error messages.
Add docstrings all around.
This commit is contained in:
Fred Drake 2000-07-08 16:56:26 +00:00
parent 4cbc9f7650
commit 51b6bc55e3
1 changed files with 97 additions and 70 deletions

View File

@ -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__);
} }