]> granicus.if.org Git - python/commitdiff
Issue #4859: Implement PEP 383 for pwd, spwd, and grp.
authorMartin v. Löwis <martin@v.loewis.de>
Fri, 29 May 2009 15:23:17 +0000 (15:23 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Fri, 29 May 2009 15:23:17 +0000 (15:23 +0000)
Misc/ACKS
Misc/NEWS
Modules/grpmodule.c
Modules/pwdmodule.c
Modules/spwdmodule.c

index 4c3844d0a7c2103553cb1a3c8fe750d78b3a10f5..4d58f95d8a2c088a797fdef42875861d8d833b56 100644 (file)
--- 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
index 1aafdec93ee4cbdec3272a3dc3137f62d9346e90..8cc76a258f03d7283bce59dd966baf1bcc0c8289 100644 (file)
--- 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
index a58cb060a6e92eeadba4f8d928bd53590dc0b81e..e642731f834027b9351892704413ace67a9d3182 100644 (file)
@@ -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."},
index 061a0a5254fb04684ab8fce14f3eeb7dcc3a6aa7..5802818149ac5589c0e40bab29b91c7934005e35 100644 (file)
@@ -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
index a6b9d93fedce82b2054e12013928aba2371eba70..230b57cf3ea81a91395ab4e27cc9bbfaab664620 100644 (file)
@@ -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 */