[Python-checkins] r84012 - in python/branches/py3k: Include/Python.h Python/import.c
victor.stinner
python-checkins at python.org
Sat Aug 14 16:50:26 CEST 2010
Author: victor.stinner
Date: Sat Aug 14 16:50:26 2010
New Revision: 84012
Log:
Issue #9425: Create private _Py_stat() function
Use stat() or _wstat() depending on the OS.
Modified:
python/branches/py3k/Include/Python.h
python/branches/py3k/Python/import.c
Modified: python/branches/py3k/Include/Python.h
==============================================================================
--- python/branches/py3k/Include/Python.h (original)
+++ python/branches/py3k/Include/Python.h Sat Aug 14 16:50:26 2010
@@ -135,6 +135,11 @@
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
Modified: python/branches/py3k/Python/import.c
==============================================================================
--- python/branches/py3k/Python/import.c (original)
+++ python/branches/py3k/Python/import.c Sat Aug 14 16:50:26 2010
@@ -1962,6 +1962,39 @@
#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)
More information about the Python-checkins
mailing list