[Python-checkins] r82719 - python/branches/import_unicode/Modules/getpath.c
victor.stinner
python-checkins at python.org
Fri Jul 9 01:33:33 CEST 2010
Author: victor.stinner
Date: Fri Jul 9 01:33:32 2010
New Revision: 82719
Log:
fix calculate_path() to use surrogates
Modified:
python/branches/import_unicode/Modules/getpath.c
Modified: python/branches/import_unicode/Modules/getpath.c
==============================================================================
--- python/branches/import_unicode/Modules/getpath.c (original)
+++ python/branches/import_unicode/Modules/getpath.c Fri Jul 9 01:33:32 2010
@@ -139,58 +139,58 @@
static int
_wstat(const wchar_t* path, struct stat *buf)
{
- char fname[PATH_MAX];
- size_t res = wcstombs(fname, path, sizeof(fname));
- if (res == (size_t)-1) {
- errno = EINVAL;
+ int ret;
+ char *fname;
+ fname = _Py_wchar2char(path);
+ if (fname == NULL)
return -1;
- }
- return stat(fname, buf);
+ ret = stat(fname, buf);
+ PyMem_Free(fname);
+ return ret;
}
#endif
-#ifndef MS_WINDOWS
static wchar_t*
-_wgetcwd(wchar_t *buf, size_t size)
+_Py_wgetcwd(wchar_t *buf, size_t size)
{
+#ifdef MS_WINDOWS
+ wchar_t buffer[MAXPATHLEN + 1];
+ wchar_t *ret, *result;
+ size_t len;
+ ret = _wgetcwd(buffer, MAXPATHLEN);
+ if (ret == NULL)
+ return NULL;
+ len = wcslen(buffer);
+ result = PyMem_Malloc(len + 1);
+ if (result == NULL)
+ return NULL;
+ wcscpy(result, buffer);
+ return result;
+#else
char fname[PATH_MAX];
if (getcwd(fname, PATH_MAX) == NULL)
return NULL;
- if (mbstowcs(buf, fname, size) >= size) {
- errno = ERANGE;
- return NULL;
- }
- return buf;
-}
+ return _Py_char2wchar(fname);
#endif
+}
#ifdef HAVE_READLINK
-int
-_Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
+wchar_t*
+_Py_wreadlink(const wchar_t *path)
{
char cbuf[PATH_MAX];
char cpath[PATH_MAX];
int res;
size_t r1 = wcstombs(cpath, path, PATH_MAX);
- if (r1 == (size_t)-1 || r1 >= PATH_MAX) {
- errno = EINVAL;
- return -1;
- }
+ if (r1 == (size_t)-1 || r1 >= PATH_MAX)
+ return NULL;
res = (int)readlink(cpath, cbuf, PATH_MAX);
if (res == -1)
- return -1;
- if (res == PATH_MAX) {
- errno = EINVAL;
- return -1;
- }
+ return NULL;
+ if (res == PATH_MAX)
+ return NULL;
cbuf[res] = '\0'; /* buf will be null terminated */
- r1 = mbstowcs(buf, cbuf, bufsiz);
- if (r1 == -1) {
- errno = EINVAL;
- return -1;
- }
- return (int)r1;
-
+ return _Py_char2wchar(cbuf);
}
#endif
@@ -295,11 +295,19 @@
if (p[0] == SEP)
wcscpy(path, p);
else {
- _wgetcwd(path, MAXPATHLEN);
+ wchar_t *cwd;
+ cwd = _Py_wgetcwd(path, MAXPATHLEN);
+ if (cwd == NULL)
+ return /* FIXME: return an error */;
+ if (wcslen(cwd) >= MAXPATHLEN)
+ return /* FIXME: return an error */;
+ wcscpy(path, cwd);
+ PyMem_Free(cwd);
if (p[0] == '.' && p[1] == SEP)
p += 2;
joinpath(path, p);
}
+ return /* FIXME: return ok */;
}
/* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */
@@ -563,19 +571,20 @@
#if HAVE_READLINK
{
- wchar_t tmpbuffer[MAXPATHLEN+1];
- int linklen = _Py_wreadlink(progpath, tmpbuffer, MAXPATHLEN);
- while (linklen != -1) {
- if (tmpbuffer[0] == SEP)
- /* tmpbuffer should never be longer than MAXPATHLEN,
+ wchar_t *link;
+ link = _Py_wreadlink(progpath);
+ while (link != NULL) {
+ if (link[0] == SEP)
+ /* link should never be longer than MAXPATHLEN,
but extra check does not hurt */
- wcsncpy(argv0_path, tmpbuffer, MAXPATHLEN);
+ wcsncpy(argv0_path, link, MAXPATHLEN);
else {
/* Interpret relative to progpath */
reduce(argv0_path);
- joinpath(argv0_path, tmpbuffer);
+ joinpath(argv0_path, link);
}
- linklen = _Py_wreadlink(argv0_path, tmpbuffer, MAXPATHLEN);
+ PyMem_Free(link);
+ link = _Py_wreadlink(argv0_path);
}
}
#endif /* HAVE_READLINK */
More information about the Python-checkins
mailing list