Index: Modules/posixmodule.c |
=================================================================== |
--- Modules/posixmodule.c (revision 66736) |
+++ Modules/posixmodule.c (working copy) |
@@ -1968,63 +1968,18 @@ |
#ifdef HAVE_GETCWD |
-PyDoc_STRVAR(posix_getcwd__doc__, |
-"getcwd() -> path\n\n\ |
-Return a string representing the current working directory."); |
- |
static PyObject * |
-posix_getcwd(PyObject *self, PyObject *noargs) |
-{ |
- int bufsize_incr = 1024; |
- int bufsize = 0; |
- char *tmpbuf = NULL; |
- char *res = NULL; |
- PyObject *dynamic_return; |
- |
- Py_BEGIN_ALLOW_THREADS |
- do { |
- bufsize = bufsize + bufsize_incr; |
- tmpbuf = malloc(bufsize); |
- if (tmpbuf == NULL) { |
- break; |
- } |
-#if defined(PYOS_OS2) && defined(PYCC_GCC) |
- res = _getcwd2(tmpbuf, bufsize); |
-#else |
- res = getcwd(tmpbuf, bufsize); |
-#endif |
- |
- if (res == NULL) { |
- free(tmpbuf); |
- } |
- } while ((res == NULL) && (errno == ERANGE)); |
- Py_END_ALLOW_THREADS |
- |
- if (res == NULL) |
- return posix_error(); |
- |
- dynamic_return = PyUnicode_FromString(tmpbuf); |
- free(tmpbuf); |
- |
- return dynamic_return; |
-} |
- |
-PyDoc_STRVAR(posix_getcwdu__doc__, |
-"getcwdu() -> path\n\n\ |
-Return a unicode string representing the current working directory."); |
- |
-static PyObject * |
-posix_getcwdu(PyObject *self, PyObject *noargs) |
+posix_getcwd(int use_bytes) |
{ |
char buf[1026]; |
char *res; |
#ifdef Py_WIN_WIDE_FILENAMES |
- DWORD len; |
- if (unicode_file_names()) { |
+ if (!use_bytes && unicode_file_names()) { |
wchar_t wbuf[1026]; |
wchar_t *wbuf2 = wbuf; |
PyObject *resobj; |
+ DWORD len; |
Py_BEGIN_ALLOW_THREADS |
len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf); |
/* If the buffer is large enough, len does not include the |
@@ -2059,8 +2014,30 @@ |
Py_END_ALLOW_THREADS |
if (res == NULL) |
return posix_error(); |
+ if (use_bytes) |
+ return PyBytes_FromStringAndSize(buf, strlen(buf)); |
return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"strict"); |
} |
+ |
+PyDoc_STRVAR(posix_getcwd__doc__, |
+"getcwd() -> path\n\n\ |
+Return a unicode string representing the current working directory."); |
+ |
+static PyObject * |
+posix_getcwd_unicode(PyObject *self) |
+{ |
+ return posix_getcwd(0); |
+} |
+ |
+PyDoc_STRVAR(posix_getcwdb__doc__, |
+"getcwdb() -> path\n\n\ |
+Return a bytes string representing the current working directory."); |
+ |
+static PyObject * |
+posix_getcwd_bytes(PyObject *self) |
+{ |
+ return posix_getcwd(1); |
+} |
#endif |
@@ -2378,9 +2355,12 @@ |
v = w; |
} |
else { |
- /* fall back to the original byte string, as |
- discussed in patch #683592 */ |
+ /* Ignore undecodable filenames, as discussed |
+ * in issue 3187. To include these, |
+ * use getcwdb(). */ |
PyErr_Clear(); |
+ Py_DECREF(v); |
+ continue; |
} |
} |
if (PyList_Append(d, v) != 0) { |
@@ -4477,9 +4457,7 @@ |
v = w; |
} |
else { |
- /* fall back to the original byte string, as |
- discussed in patch #683592 */ |
- PyErr_Clear(); |
+ v = NULL; |
} |
} |
return v; |
@@ -6810,8 +6788,10 @@ |
{"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__}, |
#endif |
#ifdef HAVE_GETCWD |
- {"getcwd", posix_getcwd, METH_NOARGS, posix_getcwd__doc__}, |
- {"getcwdu", posix_getcwdu, METH_NOARGS, posix_getcwdu__doc__}, |
+ {"getcwd", (PyCFunction)posix_getcwd_unicode, |
+ METH_NOARGS, posix_getcwd__doc__}, |
+ {"getcwdb", (PyCFunction)posix_getcwd_bytes, |
+ METH_NOARGS, posix_getcwdb__doc__}, |
#endif |
#ifdef HAVE_LINK |
{"link", posix_link, METH_VARARGS, posix_link__doc__}, |