summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2009-05-29 15:23:17 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2009-05-29 15:23:17 (GMT)
commitb6a748b817205413ac75ccee5f9b4728b5ea3b2d (patch)
treeca69f2aea6235e35952a2d5cac84cde1237afb52
parentc15bdef8190241357970c9d65783c929860b933a (diff)
downloadcpython-b6a748b817205413ac75ccee5f9b4728b5ea3b2d.zip
cpython-b6a748b817205413ac75ccee5f9b4728b5ea3b2d.tar.gz
cpython-b6a748b817205413ac75ccee5f9b4728b5ea3b2d.tar.bz2
Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/grpmodule.c36
-rw-r--r--Modules/pwdmodule.c22
-rw-r--r--Modules/spwdmodule.c26
5 files changed, 61 insertions, 26 deletions
diff --git a/Misc/ACKS b/Misc/ACKS
index 4c3844d..4d58f95 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -766,6 +766,7 @@ Greg Ward
Barry Warsaw
Steve Waterbury
Bob Watson
+David Watson
Aaron Watters
Henrik Weber
Corran Webster
diff --git a/Misc/NEWS b/Misc/NEWS
index 1aafdec..8cc76a2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,8 @@ Core and Builtins
Library
-------
+- Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
+
- smtplib 'login' and 'cram-md5' login are also fixed (see Issue #5259).
- Issue #6121: pydoc now ignores leading and trailing spaces in the
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c
index a58cb06..e642731 100644
--- a/Modules/grpmodule.c
+++ b/Modules/grpmodule.c
@@ -46,8 +46,11 @@ mkgrent(struct group *p)
Py_DECREF(v);
return NULL;
}
+#define FSDECODE(val) PyUnicode_Decode(val, strlen(val),\
+ Py_FileSystemDefaultEncoding,\
+ "surrogateescape")
for (member = p->gr_mem; *member != NULL; member++) {
- PyObject *x = PyUnicode_FromString(*member);
+ PyObject *x = FSDECODE(*member);
if (x == NULL || PyList_Append(w, x) != 0) {
Py_XDECREF(x);
Py_DECREF(w);
@@ -58,13 +61,13 @@ mkgrent(struct group *p)
}
#define SET(i,val) PyStructSequence_SET_ITEM(v, i, val)
- SET(setIndex++, PyUnicode_FromString(p->gr_name));
+ SET(setIndex++, FSDECODE(p->gr_name));
#ifdef __VMS
SET(setIndex++, Py_None);
Py_INCREF(Py_None);
#else
if (p->gr_passwd)
- SET(setIndex++, PyUnicode_FromString(p->gr_passwd));
+ SET(setIndex++, FSDECODE(p->gr_passwd));
else {
SET(setIndex++, Py_None);
Py_INCREF(Py_None);
@@ -104,25 +107,28 @@ grp_getgrgid(PyObject *self, PyObject *pyo_id)
}
static PyObject *
-grp_getgrnam(PyObject *self, PyObject *pyo_name)
+grp_getgrnam(PyObject *self, PyObject *args)
{
- PyObject *py_str_name;
char *name;
struct group *p;
+ PyObject *arg, *bytes, *retval = NULL;
- py_str_name = PyObject_Str(pyo_name);
- if (!py_str_name)
- return NULL;
- name = _PyUnicode_AsString(py_str_name);
+ if (!PyArg_ParseTuple(args, "U:getgrnam", &arg))
+ return NULL;
+ if ((bytes = PyUnicode_AsEncodedString(arg, Py_FileSystemDefaultEncoding,
+ "surrogateescape")) == NULL)
+ return NULL;
+ if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
+ goto out;
if ((p = getgrnam(name)) == NULL) {
PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name);
- Py_DECREF(py_str_name);
- return NULL;
+ goto out;
}
-
- Py_DECREF(py_str_name);
- return mkgrent(p);
+ retval = mkgrent(p);
+out:
+ Py_DECREF(bytes);
+ return retval;
}
static PyObject *
@@ -152,7 +158,7 @@ static PyMethodDef grp_methods[] = {
"getgrgid(id) -> tuple\n\
Return the group database entry for the given numeric group ID. If\n\
id is not valid, raise KeyError."},
- {"getgrnam", grp_getgrnam, METH_O,
+ {"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."},
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index 061a0a5..5802818 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -49,8 +49,9 @@ static void
sets(PyObject *v, int i, const char* val)
{
if (val) {
- PyObject *o =
- PyUnicode_DecodeUnicodeEscape(val, strlen(val), "strict");
+ PyObject *o = PyUnicode_Decode(val, strlen(val),
+ Py_FileSystemDefaultEncoding,
+ "surrogateescape");
PyStructSequence_SET_ITEM(v, i, o);
}
else {
@@ -129,14 +130,25 @@ pwd_getpwnam(PyObject *self, PyObject *args)
{
char *name;
struct passwd *p;
- if (!PyArg_ParseTuple(args, "s:getpwnam", &name))
+ PyObject *arg, *bytes, *retval = NULL;
+
+ if (!PyArg_ParseTuple(args, "U:getpwnam", &arg))
+ return NULL;
+ if ((bytes = PyUnicode_AsEncodedString(arg,
+ Py_FileSystemDefaultEncoding,
+ "surrogateescape")) == NULL)
return NULL;
+ if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1)
+ goto out;
if ((p = getpwnam(name)) == NULL) {
PyErr_Format(PyExc_KeyError,
"getpwnam(): name not found: %s", name);
- return NULL;
+ goto out;
}
- return mkpwent(p);
+ retval = mkpwent(p);
+out:
+ Py_DECREF(bytes);
+ return retval;
}
#ifdef HAVE_GETPWENT
diff --git a/Modules/spwdmodule.c b/Modules/spwdmodule.c
index a6b9d93..230b57c 100644
--- a/Modules/spwdmodule.c
+++ b/Modules/spwdmodule.c
@@ -59,9 +59,12 @@ static PyTypeObject StructSpwdType;
static void
sets(PyObject *v, int i, const char* val)
{
- if (val)
- PyStructSequence_SET_ITEM(v, i, PyUnicode_FromString(val));
- else {
+ if (val) {
+ PyObject *o = PyUnicode_Decode(val, strlen(val),
+ Py_FileSystemDefaultEncoding,
+ "surrogateescape");
+ PyStructSequence_SET_ITEM(v, i, o);
+ } else {
PyStructSequence_SET_ITEM(v, i, Py_None);
Py_INCREF(Py_None);
}
@@ -113,13 +116,24 @@ 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_AsEncodedString(arg,
+ Py_FileSystemDefaultEncoding,
+ "surrogateescape")) == 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 */