Kaydet (Commit) dbd55b37 authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Patch #523268, #522027: return enhanced tuples.

üst 99866336
...@@ -9,10 +9,11 @@ ...@@ -9,10 +9,11 @@
This module provides access to the \UNIX{} group database. This module provides access to the \UNIX{} group database.
It is available on all \UNIX{} versions. It is available on all \UNIX{} versions.
Group database entries are reported as 4-tuples containing the Group database entries are reported as a tuple-like object, whose
following items from the group database (see \code{<grp.h>}), in order: attributes correspond to the members of the \code{group} structure
(Attribute field below, see \code{<pwd.h>}):
\begin{tableiii}{r|l|l}{textrm}{Index}{Field}{Meaning} \begin{tableiii}{r|l|l}{textrm}{Index}{Attribute}{Meaning}
\lineiii{0}{gr_name}{the name of the group} \lineiii{0}{gr_name}{the name of the group}
\lineiii{1}{gr_passwd}{the (encrypted) group password; often empty} \lineiii{1}{gr_passwd}{the (encrypted) group password; often empty}
\lineiii{2}{gr_gid}{the numerical group ID} \lineiii{2}{gr_gid}{the numerical group ID}
......
...@@ -2,17 +2,47 @@ ...@@ -2,17 +2,47 @@
/* UNIX group file access module */ /* UNIX group file access module */
#include "Python.h" #include "Python.h"
#include "structseq.h"
#include <sys/types.h> #include <sys/types.h>
#include <grp.h> #include <grp.h>
static PyStructSequence_Field struct_group_type_fields[] = {
{"gr_name", "group name"},
{"gr_passwd", "password"},
{"gr_gid", "group id"},
{"gr_mem", "group memebers"},
{0}
};
static char struct_group__doc__[] =
"grp.struct_group: Results from getgr*() routines.\n\n\
This object may be accessed either as a tuple of\n\
(gr_name,gr_passwd,gr_gid,gr_mem)\n\
or via the object attributes as named in the above tuple.\n";
static PyStructSequence_Desc struct_group_type_desc = {
"grp.struct_group",
struct_group__doc__,
struct_group_type_fields,
4,
};
static PyTypeObject StructGrpType;
static PyObject * static PyObject *
mkgrent(struct group *p) mkgrent(struct group *p)
{ {
PyObject *v, *w; int setIndex = 0;
PyObject *v = PyStructSequence_New(&StructGrpType), *w;
char **member; char **member;
if (v == NULL)
return NULL;
if ((w = PyList_New(0)) == NULL) { if ((w = PyList_New(0)) == NULL) {
Py_DECREF(v);
return NULL; return NULL;
} }
for (member = p->gr_mem; *member != NULL; member++) { for (member = p->gr_mem; *member != NULL; member++) {
...@@ -20,16 +50,25 @@ mkgrent(struct group *p) ...@@ -20,16 +50,25 @@ mkgrent(struct group *p)
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);
Py_DECREF(v);
return NULL; return NULL;
} }
Py_DECREF(x); Py_DECREF(x);
} }
v = Py_BuildValue("(sslO)",
p->gr_name, #define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
p->gr_passwd, SET(setIndex++, PyString_FromString(p->gr_name));
(long)p->gr_gid, SET(setIndex++, PyString_FromString(p->gr_passwd));
w); SET(setIndex++, PyInt_FromLong((long) p->gr_gid));
Py_DECREF(w); SET(setIndex++, w);
#undef SET
if (PyErr_Occurred()) {
Py_DECREF(v);
Py_DECREF(w);
return NULL;
}
return v; return v;
} }
...@@ -120,5 +159,9 @@ complete membership information.)"; ...@@ -120,5 +159,9 @@ complete membership information.)";
DL_EXPORT(void) DL_EXPORT(void)
initgrp(void) initgrp(void)
{ {
Py_InitModule3("grp", grp_methods, grp__doc__); PyObject *m, *d;
m = Py_InitModule3("grp", grp_methods, grp__doc__);
d = PyModule_GetDict(m);
PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
} }
...@@ -2,10 +2,35 @@ ...@@ -2,10 +2,35 @@
/* UNIX password file access module */ /* UNIX password file access module */
#include "Python.h" #include "Python.h"
#include "structseq.h"
#include <sys/types.h> #include <sys/types.h>
#include <pwd.h> #include <pwd.h>
static PyStructSequence_Field struct_pwd_type_fields[] = {
{"pw_name", "user name"},
{"pw_passwd", "password"},
{"pw_uid", "user id"},
{"pw_gid", "group id"},
{"pw_gecos", "real name"},
{"pw_dir", "home directory"},
{"pw_shell", "shell program"},
{0}
};
static char struct_passwd__doc__[] =
"pwd.struct_passwd: Results from getpw*() routines.\n\n\
This object may be accessed either as a tuple of\n\
(pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
or via the object attributes as named in the above tuple.\n";
static PyStructSequence_Desc struct_pwd_type_desc = {
"pwd.struct_passwd",
struct_passwd__doc__,
struct_pwd_type_fields,
7,
};
static char pwd__doc__ [] = "\ static char pwd__doc__ [] = "\
This module provides access to the Unix password database.\n\ This module provides access to the Unix password database.\n\
It is available on all Unix versions.\n\ It is available on all Unix versions.\n\
...@@ -17,22 +42,40 @@ The uid and gid items are integers, all others are strings. An\n\ ...@@ -17,22 +42,40 @@ The uid and gid items are integers, all others are strings. An\n\
exception is raised if the entry asked for cannot be found."; exception is raised if the entry asked for cannot be found.";
static PyTypeObject StructPwdType;
static PyObject * static PyObject *
mkpwent(struct passwd *p) mkpwent(struct passwd *p)
{ {
return Py_BuildValue( int setIndex = 0;
"(ssllsss)", PyObject *v = PyStructSequence_New(&StructPwdType);
p->pw_name, if (v == NULL)
p->pw_passwd, return NULL;
(long)p->pw_uid,
(long)p->pw_gid, #define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))
p->pw_gecos, #define SETS(i,val) PyStructSequence_SET_ITEM(v, i, PyString_FromString(val))
p->pw_dir,
p->pw_shell); SETS(setIndex++, p->pw_name);
SETS(setIndex++, p->pw_passwd);
SETI(setIndex++, p->pw_uid);
SETI(setIndex++, p->pw_gid);
SETS(setIndex++, p->pw_gecos);
SETS(setIndex++, p->pw_dir);
SETS(setIndex++, p->pw_shell);
#undef SETS
#undef SETI
if (PyErr_Occurred()) {
Py_XDECREF(v);
return NULL;
}
return v;
} }
static char pwd_getpwuid__doc__[] = "\ static char pwd_getpwuid__doc__[] = "\
getpwuid(uid) -> entry\n\ getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
Return the password database entry for the given numeric user ID.\n\ Return the password database entry for the given numeric user ID.\n\
See pwd.__doc__ for more on password database entries."; See pwd.__doc__ for more on password database entries.";
...@@ -51,7 +94,7 @@ pwd_getpwuid(PyObject *self, PyObject *args) ...@@ -51,7 +94,7 @@ pwd_getpwuid(PyObject *self, PyObject *args)
} }
static char pwd_getpwnam__doc__[] = "\ static char pwd_getpwnam__doc__[] = "\
getpwnam(name) -> entry\n\ getpwnam(name) -> (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
Return the password database entry for the given user name.\n\ Return the password database entry for the given user name.\n\
See pwd.__doc__ for more on password database entries."; See pwd.__doc__ for more on password database entries.";
...@@ -112,6 +155,10 @@ static PyMethodDef pwd_methods[] = { ...@@ -112,6 +155,10 @@ static PyMethodDef pwd_methods[] = {
DL_EXPORT(void) DL_EXPORT(void)
initpwd(void) initpwd(void)
{ {
Py_InitModule4("pwd", pwd_methods, pwd__doc__, PyObject *m, *d;
m = Py_InitModule4("pwd", pwd_methods, pwd__doc__,
(PyObject *)NULL, PYTHON_API_VERSION); (PyObject *)NULL, PYTHON_API_VERSION);
d = PyModule_GetDict(m);
PyStructSequence_InitType(&StructPwdType, &struct_pwd_type_desc);
PyDict_SetItemString(d, "struct_pwent", (PyObject *) &StructPwdType);
} }
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