mirror of https://github.com/python/cpython
Issue #9425: Create private _Py_stat() function
Use stat() or _wstat() depending on the OS.
This commit is contained in:
parent
4c9aa45175
commit
4f4402c4bb
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue