diff options
Diffstat (limited to 'Modules/spwdmodule.c')
| -rw-r--r-- | Modules/spwdmodule.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c index 957de58..194ae19 100644 --- a/Modules/spwdmodule.c +++ b/Modules/spwdmodule.c @@ -4,7 +4,6 @@ /* For info also see http://www.unixpapa.com/incnote/passwd.html */ #include "Python.h" -#include "structseq.h" #include <sys/types.h> #ifdef HAVE_SHADOW_H @@ -57,11 +56,12 @@ static PyTypeObject StructSpwdType; static void -sets(PyObject *v, int i, char* val) +sets(PyObject *v, int i, const char* val) { - if (val) - PyStructSequence_SET_ITEM(v, i, PyString_FromString(val)); - else { + if (val) { + PyObject *o = PyUnicode_DecodeFSDefault(val); + PyStructSequence_SET_ITEM(v, i, o); + } else { PyStructSequence_SET_ITEM(v, i, Py_None); Py_INCREF(Py_None); } @@ -74,7 +74,7 @@ static PyObject *mkspent(struct spwd *p) if (v == NULL) return NULL; -#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val)) +#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyLong_FromLong((long) val)) #define SETS(i,val) sets(v, i, val) SETS(setIndex++, p->sp_namp); @@ -113,13 +113,22 @@ static PyObject* spwd_getspnam(PyObject *self, PyObject *args) { char *name; struct spwd *p; - if (!PyArg_ParseTuple(args, "s:getspnam", &name)) + PyObject *arg, *bytes, *retval = NULL; + + if (!PyArg_ParseTuple(args, "U:getspnam", &arg)) + return NULL; + if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) return NULL; + if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) + goto out; if ((p = getspnam(name)) == NULL) { PyErr_SetString(PyExc_KeyError, "getspnam(): name not found"); - return NULL; + goto out; } - return mkspent(p); + retval = mkspent(p); +out: + Py_DECREF(bytes); + return retval; } #endif /* HAVE_GETSPNAM */ @@ -167,17 +176,31 @@ static PyMethodDef spwd_methods[] = { }; + +static struct PyModuleDef spwdmodule = { + PyModuleDef_HEAD_INIT, + "spwd", + spwd__doc__, + -1, + spwd_methods, + NULL, + NULL, + NULL, + NULL +}; + PyMODINIT_FUNC -initspwd(void) +PyInit_spwd(void) { PyObject *m; - m=Py_InitModule3("spwd", spwd_methods, spwd__doc__); + m=PyModule_Create(&spwdmodule); if (m == NULL) - return; + return NULL; if (!initialized) PyStructSequence_InitType(&StructSpwdType, &struct_spwd_type_desc); Py_INCREF((PyObject *) &StructSpwdType); PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType); initialized = 1; + return m; } |
