Issue #9425: Create private _Py_stat() function

Use stat() or _wstat() depending on the OS.
This commit is contained in:
Victor Stinner 2010-08-14 14:50:26 +00:00
parent 4c9aa45175
commit 4f4402c4bb
2 changed files with 38 additions and 0 deletions

View File

@ -135,6 +135,11 @@ PyAPI_FUNC(wchar_t *) _Py_char2wchar(char *);
PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text); PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text);
PyAPI_FUNC(FILE *) _Py_wfopen(const wchar_t *path, const wchar_t *mode); PyAPI_FUNC(FILE *) _Py_wfopen(const wchar_t *path, const wchar_t *mode);
/* _Py_stat lives in import.c */
#ifdef HAVE_STAT
int _Py_stat(PyObject *unicode, struct stat *statbuf);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -1962,6 +1962,39 @@ case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name)
#ifdef HAVE_STAT #ifdef HAVE_STAT
/* Call _wstat() on Windows, or stat() otherwise. Only fill st_mode
attribute on Windows. Return 0 on success, -1 on stat error or (if
PyErr_Occurred()) unicode error. */
int
_Py_stat(PyObject *unicode, struct stat *statbuf)
{
#ifdef MS_WINDOWS
wchar_t path[MAXPATHLEN+1];
Py_ssize_t len;
int err;
struct _stat wstatbuf;
len = PyUnicode_AsWideChar((PyUnicodeObject*)unicode, path,
sizeof(path) / sizeof(path[0]));
if (len == -1)
return -1;
err = _wstat(path, &wstatbuf);
if (!err)
statbuf->st_mode = wstatbuf.st_mode;
return err;
#else
int ret;
PyObject *bytes = PyUnicode_EncodeFSDefault(unicode);
if (bytes == NULL)
return -1;
ret = stat(PyBytes_AS_STRING(bytes), statbuf);
Py_DECREF(bytes);
return ret;
#endif
}
/* Helper to look for __init__.py or __init__.py[co] in potential package */ /* Helper to look for __init__.py or __init__.py[co] in potential package */
static int static int
find_init_module(char *buf) find_init_module(char *buf)