summaryrefslogtreecommitdiffstats
path: root/Modules/spwdmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/spwdmodule.c')
-rw-r--r--Modules/spwdmodule.c47
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;
}