Show More
@@ -7,9 +7,7 b'' | |||||
7 | the GNU General Public License, incorporated herein by reference. |
|
7 | the GNU General Public License, incorporated herein by reference. | |
8 | */ |
|
8 | */ | |
9 |
|
9 | |||
10 | #define _ATFILE_SOURCE |
|
|||
11 | #include <Python.h> |
|
10 | #include <Python.h> | |
12 | #include <alloca.h> |
|
|||
13 | #include <dirent.h> |
|
11 | #include <dirent.h> | |
14 | #include <fcntl.h> |
|
12 | #include <fcntl.h> | |
15 | #include <string.h> |
|
13 | #include <string.h> | |
@@ -101,18 +99,6 b' static PyTypeObject listdir_stat_type = ' | |||||
101 | listdir_stat_new, /* tp_new */ |
|
99 | listdir_stat_new, /* tp_new */ | |
102 | }; |
|
100 | }; | |
103 |
|
101 | |||
104 | static inline int mode_to_kind(int mode) |
|
|||
105 | { |
|
|||
106 | if (S_ISREG(mode)) return S_IFREG; |
|
|||
107 | if (S_ISDIR(mode)) return S_IFDIR; |
|
|||
108 | if (S_ISLNK(mode)) return S_IFLNK; |
|
|||
109 | if (S_ISBLK(mode)) return S_IFBLK; |
|
|||
110 | if (S_ISCHR(mode)) return S_IFCHR; |
|
|||
111 | if (S_ISFIFO(mode)) return S_IFIFO; |
|
|||
112 | if (S_ISSOCK(mode)) return S_IFSOCK; |
|
|||
113 | return mode; |
|
|||
114 | } |
|
|||
115 |
|
||||
116 | static PyObject *listfiles(PyObject *list, DIR *dir, |
|
102 | static PyObject *listfiles(PyObject *list, DIR *dir, | |
117 | int keep_stat, int *need_stat) |
|
103 | int keep_stat, int *need_stat) | |
118 | { |
|
104 | { | |
@@ -187,9 +173,6 b' static PyObject *statfiles(PyObject *lis' | |||||
187 | int ret; |
|
173 | int ret; | |
188 | ssize_t i; |
|
174 | ssize_t i; | |
189 | ssize_t size = PyList_Size(list); |
|
175 | ssize_t size = PyList_Size(list); | |
190 | #ifdef AT_SYMLINK_NOFOLLOW |
|
|||
191 | int dfd = dirfd(dir); |
|
|||
192 | #endif |
|
|||
193 |
|
176 | |||
194 | for (i = 0; i < size; i++) { |
|
177 | for (i = 0; i < size; i++) { | |
195 | PyObject *elt = PyList_GetItem(list, i); |
|
178 | PyObject *elt = PyList_GetItem(list, i); | |
@@ -213,17 +196,29 b' static PyObject *statfiles(PyObject *lis' | |||||
213 | PyTuple_SET_ITEM(elt, 2, py_st); |
|
196 | PyTuple_SET_ITEM(elt, 2, py_st); | |
214 | } |
|
197 | } | |
215 |
|
198 | |||
216 | #ifdef AT_SYMLINK_NOFOLLOW |
|
|||
217 | ret = fstatat(dfd, name, stp, AT_SYMLINK_NOFOLLOW); |
|
|||
218 | #else |
|
|||
219 | ret = lstat(path, stp); |
|
199 | ret = lstat(path, stp); | |
220 | #endif |
|
|||
221 | if (ret == -1) |
|
200 | if (ret == -1) | |
222 | return PyErr_SetFromErrnoWithFilename(PyExc_OSError, |
|
201 | return PyErr_SetFromErrnoWithFilename(PyExc_OSError, | |
223 | path); |
|
202 | path); | |
224 |
|
203 | |||
225 | if (kind == -1) |
|
204 | if (kind == -1) { | |
226 |
|
|
205 | if (S_ISREG(stp->st_mode)) | |
|
206 | kind = S_IFREG; | |||
|
207 | else if (S_ISDIR(stp->st_mode)) | |||
|
208 | kind = S_IFDIR; | |||
|
209 | else if (S_ISLNK(stp->st_mode)) | |||
|
210 | kind = S_IFLNK; | |||
|
211 | else if (S_ISBLK(stp->st_mode)) | |||
|
212 | kind = S_IFBLK; | |||
|
213 | else if (S_ISCHR(stp->st_mode)) | |||
|
214 | kind = S_IFCHR; | |||
|
215 | else if (S_ISFIFO(stp->st_mode)) | |||
|
216 | kind = S_IFIFO; | |||
|
217 | else if (S_ISSOCK(stp->st_mode)) | |||
|
218 | kind = S_IFSOCK; | |||
|
219 | else | |||
|
220 | kind = stp->st_mode; | |||
|
221 | } | |||
227 |
|
222 | |||
228 | if (py_kind == Py_None && kind != -1) { |
|
223 | if (py_kind == Py_None && kind != -1) { | |
229 | py_kind = PyInt_FromLong(kind); |
|
224 | py_kind = PyInt_FromLong(kind); |
General Comments 0
You need to be logged in to leave comments.
Login now