107 if (S_ISFIFO(mode)) return S_IFIFO; |
107 if (S_ISFIFO(mode)) return S_IFIFO; |
108 if (S_ISSOCK(mode)) return S_IFSOCK; |
108 if (S_ISSOCK(mode)) return S_IFSOCK; |
109 return mode; |
109 return mode; |
110 } |
110 } |
111 |
111 |
|
112 static PyObject *listfiles(PyObject *list, DIR *dir, int stat, int *all) |
|
113 { |
|
114 struct dirent *ent; |
|
115 PyObject *name, *py_kind, *val; |
|
116 |
|
117 for (ent = readdir(dir); ent; ent = readdir(dir)) { |
|
118 int kind = -1; |
|
119 |
|
120 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) |
|
121 continue; |
|
122 |
|
123 #ifdef DT_REG |
|
124 if (!stat) |
|
125 switch (ent->d_type) { |
|
126 case DT_REG: kind = S_IFREG; break; |
|
127 case DT_DIR: kind = S_IFDIR; break; |
|
128 case DT_LNK: kind = S_IFLNK; break; |
|
129 case DT_BLK: kind = S_IFBLK; break; |
|
130 case DT_CHR: kind = S_IFCHR; break; |
|
131 case DT_FIFO: kind = S_IFIFO; break; |
|
132 case DT_SOCK: kind = S_IFSOCK; break; |
|
133 default: |
|
134 *all = 0; |
|
135 break; |
|
136 } |
|
137 #else |
|
138 *all = 0; |
|
139 #endif |
|
140 |
|
141 if (kind != -1) |
|
142 py_kind = PyInt_FromLong(kind); |
|
143 else { |
|
144 py_kind = Py_None; |
|
145 Py_INCREF(Py_None); |
|
146 } |
|
147 |
|
148 val = PyTuple_New(stat ? 3 : 2); |
|
149 name = PyString_FromString(ent->d_name); |
|
150 |
|
151 if (!name || !py_kind || !val) { |
|
152 Py_XDECREF(name); |
|
153 Py_XDECREF(py_kind); |
|
154 Py_XDECREF(val); |
|
155 return PyErr_NoMemory(); |
|
156 } |
|
157 |
|
158 PyTuple_SET_ITEM(val, 0, name); |
|
159 PyTuple_SET_ITEM(val, 1, py_kind); |
|
160 if (stat) { |
|
161 PyTuple_SET_ITEM(val, 2, Py_None); |
|
162 Py_INCREF(Py_None); |
|
163 } |
|
164 |
|
165 PyList_Append(list, val); |
|
166 Py_DECREF(val); |
|
167 } |
|
168 |
|
169 return 0; |
|
170 } |
|
171 |
112 static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep, |
172 static PyObject *statfiles(PyObject *list, PyObject *ctor_args, int keep, |
113 char *path, int len, DIR *dir) |
173 char *path, int len, DIR *dir) |
114 { |
174 { |
115 struct stat buf; |
175 struct stat buf; |
116 struct stat *stp = &buf; |
176 struct stat *stp = &buf; |
171 static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs) |
231 static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs) |
172 { |
232 { |
173 static char *kwlist[] = { "path", "stat", NULL }; |
233 static char *kwlist[] = { "path", "stat", NULL }; |
174 PyObject *statobj = NULL; |
234 PyObject *statobj = NULL; |
175 DIR *dir = NULL; |
235 DIR *dir = NULL; |
176 struct dirent *ent; |
|
177 PyObject *list = NULL; |
236 PyObject *list = NULL; |
178 PyObject *err = NULL; |
237 PyObject *err = NULL; |
179 PyObject *ctor_args = NULL; |
238 PyObject *ctor_args = NULL; |
180 int all_kinds = 1; |
239 int all_kinds = 1; |
181 char full_path[PATH_MAX + 10]; |
240 char full_path[PATH_MAX + 10]; |
200 goto bail; |
259 goto bail; |
201 |
260 |
202 strncpy(full_path, path, PATH_MAX); |
261 strncpy(full_path, path, PATH_MAX); |
203 full_path[path_len] = '/'; |
262 full_path[path_len] = '/'; |
204 |
263 |
205 for (ent = readdir(dir); ent; ent = readdir(dir)) { |
264 err = listfiles(list, dir, do_stat, &all_kinds); |
206 PyObject *name = NULL; |
265 if (err) |
207 PyObject *py_kind = NULL; |
266 goto bail; |
208 PyObject *val = NULL; |
|
209 int kind = -1; |
|
210 |
|
211 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) |
|
212 continue; |
|
213 |
|
214 #ifdef DT_REG |
|
215 if (!do_stat) |
|
216 switch (ent->d_type) { |
|
217 case DT_REG: kind = S_IFREG; break; |
|
218 case DT_DIR: kind = S_IFDIR; break; |
|
219 case DT_LNK: kind = S_IFLNK; break; |
|
220 case DT_BLK: kind = S_IFBLK; break; |
|
221 case DT_CHR: kind = S_IFCHR; break; |
|
222 case DT_FIFO: kind = S_IFIFO; break; |
|
223 case DT_SOCK: kind = S_IFSOCK; break; |
|
224 default: |
|
225 all_kinds = 0; |
|
226 break; |
|
227 } |
|
228 #else |
|
229 all_kinds = 0; |
|
230 #endif |
|
231 |
|
232 name = PyString_FromString(ent->d_name); |
|
233 if (kind != -1) |
|
234 py_kind = PyInt_FromLong(kind); |
|
235 else { |
|
236 py_kind = Py_None; |
|
237 Py_INCREF(Py_None); |
|
238 } |
|
239 |
|
240 val = PyTuple_New(do_stat ? 3 : 2); |
|
241 |
|
242 if (!name || !py_kind || !val) { |
|
243 Py_XDECREF(name); |
|
244 Py_XDECREF(py_kind); |
|
245 Py_XDECREF(val); |
|
246 goto bail; |
|
247 } |
|
248 |
|
249 PyTuple_SET_ITEM(val, 0, name); |
|
250 PyTuple_SET_ITEM(val, 1, py_kind); |
|
251 if (do_stat) { |
|
252 PyTuple_SET_ITEM(val, 2, Py_None); |
|
253 Py_INCREF(Py_None); |
|
254 } |
|
255 |
|
256 PyList_Append(list, val); |
|
257 Py_DECREF(val); |
|
258 } |
|
259 |
267 |
260 PyList_Sort(list); |
268 PyList_Sort(list); |
261 |
269 |
262 if (do_stat) { |
270 if (do_stat) { |
263 ctor_args = PyTuple_New(0); |
271 ctor_args = PyTuple_New(0); |