[Python-checkins] r73015 - in python/branches/py3k: Misc/ACKS Misc/NEWS Modules/grpmodule.c Modules/pwdmodule.c Modules/spwdmodule.c
martin.v.loewis
python-checkins at python.org
Fri May 29 17:23:18 CEST 2009
Author: martin.v.loewis
Date: Fri May 29 17:23:17 2009
New Revision: 73015
Log:
Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
Modified:
python/branches/py3k/Misc/ACKS
python/branches/py3k/Misc/NEWS
python/branches/py3k/Modules/grpmodule.c
python/branches/py3k/Modules/pwdmodule.c
python/branches/py3k/Modules/spwdmodule.c
Modified: python/branches/py3k/Misc/ACKS
==============================================================================
--- python/branches/py3k/Misc/ACKS (original)
+++ python/branches/py3k/Misc/ACKS Fri May 29 17:23:17 2009
@@ -766,6 +766,7 @@
Barry Warsaw
Steve Waterbury
Bob Watson
+David Watson
Aaron Watters
Henrik Weber
Corran Webster
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Fri May 29 17:23:17 2009
@@ -40,6 +40,8 @@
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
Modified: python/branches/py3k/Modules/grpmodule.c
==============================================================================
--- python/branches/py3k/Modules/grpmodule.c (original)
+++ python/branches/py3k/Modules/grpmodule.c Fri May 29 17:23:17 2009
@@ -46,8 +46,11 @@
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 @@
}
#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 @@
}
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 @@
"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."},
Modified: python/branches/py3k/Modules/pwdmodule.c
==============================================================================
--- python/branches/py3k/Modules/pwdmodule.c (original)
+++ python/branches/py3k/Modules/pwdmodule.c Fri May 29 17:23:17 2009
@@ -49,8 +49,9 @@
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 @@
{
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
Modified: python/branches/py3k/Modules/spwdmodule.c
==============================================================================
--- python/branches/py3k/Modules/spwdmodule.c (original)
+++ python/branches/py3k/Modules/spwdmodule.c Fri May 29 17:23:17 2009
@@ -59,9 +59,12 @@
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 @@
{
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 */
More information about the Python-checkins
mailing list