diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-14 14:50:26 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-14 14:50:26 (GMT) |
commit | 4f4402c4bb780a89c1d1c2564522e8ca901cbe17 (patch) | |
tree | 3a0c661bfcb5c4407eae886b58cbf4ba6a410812 | |
parent | 4c9aa451756ab52dd1fba381469fdbb2201ee4c4 (diff) | |
download | cpython-4f4402c4bb780a89c1d1c2564522e8ca901cbe17.zip cpython-4f4402c4bb780a89c1d1c2564522e8ca901cbe17.tar.gz cpython-4f4402c4bb780a89c1d1c2564522e8ca901cbe17.tar.bz2 |
Issue #9425: Create private _Py_stat() function
Use stat() or _wstat() depending on the OS.
-rw-r--r-- | Include/Python.h | 5 | ||||
-rw-r--r-- | Python/import.c | 33 |
2 files changed, 38 insertions, 0 deletions
diff --git a/Include/Python.h b/Include/Python.h index d5ac13e..eb5ea28 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -135,6 +135,11 @@ PyAPI_FUNC(wchar_t *) _Py_char2wchar(char *); PyAPI_FUNC(char*) _Py_wchar2char(const wchar_t *text); 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 } #endif diff --git a/Python/import.c b/Python/import.c index 4cdce74..79a378e 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1962,6 +1962,39 @@ case_ok(char *buf, Py_ssize_t len, Py_ssize_t namelen, char *name) #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 */ static int find_init_module(char *buf) |