/src/Python-3.8.3/Modules/_stat.c
Line  | Count  | Source  | 
1  |  | /* stat.h interface  | 
2  |  |  *  | 
3  |  |  * The module defines all S_IF*, S_I*, UF_*, SF_* and ST_* constants to  | 
4  |  |  * sensible default values as well as defines S_IS*() macros in order to keep  | 
5  |  |  * backward compatibility with the old stat.py module.  | 
6  |  |  *  | 
7  |  |  * New constants and macros such as S_IFDOOR / S_ISDOOR() are always defined  | 
8  |  |  * as int 0.  | 
9  |  |  *  | 
10  |  |  * NOTE: POSIX only defines the values of the S_I* permission bits.  | 
11  |  |  *  | 
12  |  |  */  | 
13  |  |  | 
14  |  | #define PY_SSIZE_T_CLEAN  | 
15  |  | #include "Python.h"  | 
16  |  |  | 
17  |  | #ifdef __cplusplus  | 
18  |  | extern "C" { | 
19  |  | #endif  | 
20  |  |  | 
21  |  | #ifdef HAVE_SYS_TYPES_H  | 
22  |  | #include <sys/types.h>  | 
23  |  | #endif /* HAVE_SYS_TYPES_H */  | 
24  |  |  | 
25  |  | #ifdef HAVE_SYS_STAT_H  | 
26  |  | #include <sys/stat.h>  | 
27  |  | #endif /* HAVE_SYS_STAT_H */  | 
28  |  |  | 
29  |  | #ifdef MS_WINDOWS  | 
30  |  | #include <windows.h>  | 
31  |  | typedef unsigned short mode_t;  | 
32  |  |  | 
33  |  | /* FILE_ATTRIBUTE_INTEGRITY_STREAM and FILE_ATTRIBUTE_NO_SCRUB_DATA  | 
34  |  |    are not present in VC2010, so define them manually */  | 
35  |  | #ifndef FILE_ATTRIBUTE_INTEGRITY_STREAM  | 
36  |  | #  define FILE_ATTRIBUTE_INTEGRITY_STREAM 0x8000  | 
37  |  | #endif  | 
38  |  |  | 
39  |  | #ifndef FILE_ATTRIBUTE_NO_SCRUB_DATA  | 
40  |  | #  define FILE_ATTRIBUTE_NO_SCRUB_DATA 0x20000  | 
41  |  | #endif  | 
42  |  |  | 
43  |  | #endif /* MS_WINDOWS */  | 
44  |  |  | 
45  |  | /* From Python's stat.py */  | 
46  |  | #ifndef S_IMODE  | 
47  | 0  | #  define S_IMODE 07777  | 
48  |  | #endif  | 
49  |  |  | 
50  |  | /* S_IFXXX constants (file types)  | 
51  |  |  *  | 
52  |  |  * Only the names are defined by POSIX but not their value. All common file  | 
53  |  |  * types seems to have the same numeric value on all platforms, though.  | 
54  |  |  *  | 
55  |  |  * pyport.h guarantees S_IFMT, S_IFDIR, S_IFCHR, S_IFREG and S_IFLNK  | 
56  |  |  */  | 
57  |  |  | 
58  |  | #ifndef S_IFBLK  | 
59  |  | #  define S_IFBLK 0060000  | 
60  |  | #endif  | 
61  |  |  | 
62  |  | #ifndef S_IFIFO  | 
63  |  | #  define S_IFIFO 0010000  | 
64  |  | #endif  | 
65  |  |  | 
66  |  | #ifndef S_IFSOCK  | 
67  |  | #  define S_IFSOCK 0140000  | 
68  |  | #endif  | 
69  |  |  | 
70  |  | #ifndef S_IFDOOR  | 
71  |  | #  define S_IFDOOR 0  | 
72  |  | #endif  | 
73  |  |  | 
74  |  | #ifndef S_IFPORT  | 
75  |  | #  define S_IFPORT 0  | 
76  |  | #endif  | 
77  |  |  | 
78  |  | #ifndef S_IFWHT  | 
79  |  | #  define S_IFWHT 0  | 
80  |  | #endif  | 
81  |  |  | 
82  |  |  | 
83  |  | /* S_ISXXX()  | 
84  |  |  * pyport.h defines S_ISDIR(), S_ISREG() and S_ISCHR()  | 
85  |  |  */  | 
86  |  |  | 
87  |  | #ifndef S_ISBLK  | 
88  |  | #  define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)  | 
89  |  | #endif  | 
90  |  |  | 
91  |  | #ifndef S_ISFIFO  | 
92  |  | #  define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)  | 
93  |  | #endif  | 
94  |  |  | 
95  |  | #ifndef S_ISLNK  | 
96  |  | #  define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)  | 
97  |  | #endif  | 
98  |  |  | 
99  |  | #ifndef S_ISSOCK  | 
100  |  | #  define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)  | 
101  |  | #endif  | 
102  |  |  | 
103  |  | #ifndef S_ISDOOR  | 
104  | 0  | #  define S_ISDOOR(mode) 0  | 
105  |  | #endif  | 
106  |  |  | 
107  |  | #ifndef S_ISPORT  | 
108  | 0  | #  define S_ISPORT(mode) 0  | 
109  |  | #endif  | 
110  |  |  | 
111  |  | #ifndef S_ISWHT  | 
112  | 0  | #  define S_ISWHT(mode) 0  | 
113  |  | #endif  | 
114  |  |  | 
115  |  |  | 
116  |  | /* S_I* file permission  | 
117  |  |  *  | 
118  |  |  * The permission bit value are defined by POSIX standards.  | 
119  |  |  */  | 
120  |  | #ifndef S_ISUID  | 
121  |  | #  define S_ISUID 04000  | 
122  |  | #endif  | 
123  |  |  | 
124  |  | #ifndef S_ISGID  | 
125  |  | #  define S_ISGID 02000  | 
126  |  | #endif  | 
127  |  |  | 
128  |  | /* what is S_ENFMT? */  | 
129  |  | #ifndef S_ENFMT  | 
130  |  | #  define S_ENFMT S_ISGID  | 
131  |  | #endif  | 
132  |  |  | 
133  |  | #ifndef S_ISVTX  | 
134  |  | #  define S_ISVTX 01000  | 
135  |  | #endif  | 
136  |  |  | 
137  |  | #ifndef S_IREAD  | 
138  |  | #  define S_IREAD 00400  | 
139  |  | #endif  | 
140  |  |  | 
141  |  | #ifndef S_IWRITE  | 
142  |  | #  define S_IWRITE 00200  | 
143  |  | #endif  | 
144  |  |  | 
145  |  | #ifndef S_IEXEC  | 
146  |  | #  define S_IEXEC 00100  | 
147  |  | #endif  | 
148  |  |  | 
149  |  | #ifndef S_IRWXU  | 
150  |  | #  define S_IRWXU 00700  | 
151  |  | #endif  | 
152  |  |  | 
153  |  | #ifndef S_IRUSR  | 
154  |  | #  define S_IRUSR 00400  | 
155  |  | #endif  | 
156  |  |  | 
157  |  | #ifndef S_IWUSR  | 
158  |  | #  define S_IWUSR 00200  | 
159  |  | #endif  | 
160  |  |  | 
161  |  | #ifndef S_IXUSR  | 
162  |  | #  define S_IXUSR 00100  | 
163  |  | #endif  | 
164  |  |  | 
165  |  | #ifndef S_IRWXG  | 
166  |  | #  define S_IRWXG 00070  | 
167  |  | #endif  | 
168  |  |  | 
169  |  | #ifndef S_IRGRP  | 
170  |  | #  define S_IRGRP 00040  | 
171  |  | #endif  | 
172  |  |  | 
173  |  | #ifndef S_IWGRP  | 
174  |  | #  define S_IWGRP 00020  | 
175  |  | #endif  | 
176  |  |  | 
177  |  | #ifndef S_IXGRP  | 
178  |  | #  define S_IXGRP 00010  | 
179  |  | #endif  | 
180  |  |  | 
181  |  | #ifndef S_IRWXO  | 
182  |  | #  define S_IRWXO 00007  | 
183  |  | #endif  | 
184  |  |  | 
185  |  | #ifndef S_IROTH  | 
186  |  | #  define S_IROTH 00004  | 
187  |  | #endif  | 
188  |  |  | 
189  |  | #ifndef S_IWOTH  | 
190  |  | #  define S_IWOTH 00002  | 
191  |  | #endif  | 
192  |  |  | 
193  |  | #ifndef S_IXOTH  | 
194  |  | #  define S_IXOTH 00001  | 
195  |  | #endif  | 
196  |  |  | 
197  |  |  | 
198  |  | /* Names for file flags */  | 
199  |  | #ifndef UF_NODUMP  | 
200  |  | #  define UF_NODUMP 0x00000001  | 
201  |  | #endif  | 
202  |  |  | 
203  |  | #ifndef UF_IMMUTABLE  | 
204  |  | #  define UF_IMMUTABLE 0x00000002  | 
205  |  | #endif  | 
206  |  |  | 
207  |  | #ifndef UF_APPEND  | 
208  |  | #  define UF_APPEND 0x00000004  | 
209  |  | #endif  | 
210  |  |  | 
211  |  | #ifndef UF_OPAQUE  | 
212  |  | #  define UF_OPAQUE 0x00000008  | 
213  |  | #endif  | 
214  |  |  | 
215  |  | #ifndef UF_NOUNLINK  | 
216  |  | #  define UF_NOUNLINK 0x00000010  | 
217  |  | #endif  | 
218  |  |  | 
219  |  | #ifndef UF_COMPRESSED  | 
220  |  | #  define UF_COMPRESSED 0x00000020  | 
221  |  | #endif  | 
222  |  |  | 
223  |  | #ifndef UF_HIDDEN  | 
224  |  | #  define UF_HIDDEN 0x00008000  | 
225  |  | #endif  | 
226  |  |  | 
227  |  | #ifndef SF_ARCHIVED  | 
228  |  | #  define SF_ARCHIVED 0x00010000  | 
229  |  | #endif  | 
230  |  |  | 
231  |  | #ifndef SF_IMMUTABLE  | 
232  |  | #  define SF_IMMUTABLE 0x00020000  | 
233  |  | #endif  | 
234  |  |  | 
235  |  | #ifndef SF_APPEND  | 
236  |  | #  define SF_APPEND 0x00040000  | 
237  |  | #endif  | 
238  |  |  | 
239  |  | #ifndef SF_NOUNLINK  | 
240  |  | #  define SF_NOUNLINK 0x00100000  | 
241  |  | #endif  | 
242  |  |  | 
243  |  | #ifndef SF_SNAPSHOT  | 
244  |  | #  define SF_SNAPSHOT 0x00200000  | 
245  |  | #endif  | 
246  |  |  | 
247  |  | static mode_t  | 
248  |  | _PyLong_AsMode_t(PyObject *op)  | 
249  | 0  | { | 
250  | 0  |     unsigned long value;  | 
251  | 0  |     mode_t mode;  | 
252  |  | 
  | 
253  | 0  |     value = PyLong_AsUnsignedLong(op);  | 
254  | 0  |     if ((value == (unsigned long)-1) && PyErr_Occurred())  | 
255  | 0  |         return (mode_t)-1;  | 
256  |  |  | 
257  | 0  |     mode = (mode_t)value;  | 
258  | 0  |     if ((unsigned long)mode != value) { | 
259  | 0  |         PyErr_SetString(PyExc_OverflowError, "mode out of range");  | 
260  | 0  |         return (mode_t)-1;  | 
261  | 0  |     }  | 
262  | 0  |     return mode;  | 
263  | 0  | }  | 
264  |  |  | 
265  |  |  | 
266  |  | #define stat_S_ISFUNC(isfunc, doc)                             \  | 
267  |  |     static PyObject *                                          \  | 
268  |  |     stat_ ##isfunc (PyObject *self, PyObject *omode)           \  | 
269  | 0  |     {                                                          \ | 
270  | 0  |        mode_t mode = _PyLong_AsMode_t(omode);                   \  | 
271  | 0  |        if ((mode == (mode_t)-1) && PyErr_Occurred())           \  | 
272  | 0  |            return NULL;                                        \  | 
273  | 0  |        return PyBool_FromLong(isfunc(mode));                   \  | 
274  | 0  |     }                                                          \  | 
275  |  |     PyDoc_STRVAR(stat_ ## isfunc ## _doc, doc)  | 
276  |  |  | 
277  | 0  | stat_S_ISFUNC(S_ISDIR,  | 
278  |  |     "S_ISDIR(mode) -> bool\n\n"  | 
279  |  |     "Return True if mode is from a directory.");  | 
280  |  |  | 
281  | 0  | stat_S_ISFUNC(S_ISCHR,  | 
282  |  |     "S_ISCHR(mode) -> bool\n\n"  | 
283  |  |     "Return True if mode is from a character special device file.");  | 
284  |  |  | 
285  | 0  | stat_S_ISFUNC(S_ISBLK,  | 
286  |  |     "S_ISBLK(mode) -> bool\n\n"  | 
287  |  |     "Return True if mode is from a block special device file.");  | 
288  |  |  | 
289  | 0  | stat_S_ISFUNC(S_ISREG,  | 
290  |  |     "S_ISREG(mode) -> bool\n\n"  | 
291  |  |     "Return True if mode is from a regular file.");  | 
292  |  |  | 
293  | 0  | stat_S_ISFUNC(S_ISFIFO,  | 
294  |  |     "S_ISFIFO(mode) -> bool\n\n"  | 
295  |  |     "Return True if mode is from a FIFO (named pipe).");  | 
296  |  |  | 
297  | 0  | stat_S_ISFUNC(S_ISLNK,  | 
298  |  |     "S_ISLNK(mode) -> bool\n\n"  | 
299  |  |     "Return True if mode is from a symbolic link.");  | 
300  |  |  | 
301  | 0  | stat_S_ISFUNC(S_ISSOCK,  | 
302  |  |     "S_ISSOCK(mode) -> bool\n\n"  | 
303  |  |     "Return True if mode is from a socket.");  | 
304  |  |  | 
305  | 0  | stat_S_ISFUNC(S_ISDOOR,  | 
306  |  |     "S_ISDOOR(mode) -> bool\n\n"  | 
307  |  |     "Return True if mode is from a door.");  | 
308  |  |  | 
309  | 0  | stat_S_ISFUNC(S_ISPORT,  | 
310  |  |     "S_ISPORT(mode) -> bool\n\n"  | 
311  |  |     "Return True if mode is from an event port.");  | 
312  |  |  | 
313  | 0  | stat_S_ISFUNC(S_ISWHT,  | 
314  |  |     "S_ISWHT(mode) -> bool\n\n"  | 
315  |  |     "Return True if mode is from a whiteout.");  | 
316  |  |  | 
317  |  |  | 
318  |  | PyDoc_STRVAR(stat_S_IMODE_doc,  | 
319  |  | "Return the portion of the file's mode that can be set by os.chmod().");  | 
320  |  |  | 
321  |  | static PyObject *  | 
322  |  | stat_S_IMODE(PyObject *self, PyObject *omode)  | 
323  | 0  | { | 
324  | 0  |     mode_t mode = _PyLong_AsMode_t(omode);  | 
325  | 0  |     if ((mode == (mode_t)-1) && PyErr_Occurred())  | 
326  | 0  |         return NULL;  | 
327  | 0  |     return PyLong_FromUnsignedLong(mode & S_IMODE);  | 
328  | 0  | }  | 
329  |  |  | 
330  |  |  | 
331  |  | PyDoc_STRVAR(stat_S_IFMT_doc,  | 
332  |  | "Return the portion of the file's mode that describes the file type.");  | 
333  |  |  | 
334  |  | static PyObject *  | 
335  |  | stat_S_IFMT(PyObject *self, PyObject *omode)  | 
336  | 0  | { | 
337  | 0  |     mode_t mode = _PyLong_AsMode_t(omode);  | 
338  | 0  |     if ((mode == (mode_t)-1) && PyErr_Occurred())  | 
339  | 0  |         return NULL;  | 
340  | 0  |     return PyLong_FromUnsignedLong(mode & S_IFMT);  | 
341  | 0  | }  | 
342  |  |  | 
343  |  | /* file type chars according to  | 
344  |  |    http://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/sys/stat.h */  | 
345  |  |  | 
346  |  | static char  | 
347  |  | filetype(mode_t mode)  | 
348  | 0  | { | 
349  |  |     /* common cases first */  | 
350  | 0  |     if (S_ISREG(mode))  return '-';  | 
351  | 0  |     if (S_ISDIR(mode))  return 'd';  | 
352  | 0  |     if (S_ISLNK(mode))  return 'l';  | 
353  |  |     /* special files */  | 
354  | 0  |     if (S_ISBLK(mode))  return 'b';  | 
355  | 0  |     if (S_ISCHR(mode))  return 'c';  | 
356  | 0  |     if (S_ISFIFO(mode)) return 'p';  | 
357  | 0  |     if (S_ISSOCK(mode)) return 's';  | 
358  |  |     /* non-standard types */  | 
359  | 0  |     if (S_ISDOOR(mode)) return 'D';  | 
360  | 0  |     if (S_ISPORT(mode)) return 'P';  | 
361  | 0  |     if (S_ISWHT(mode))  return 'w';  | 
362  |  |     /* unknown */  | 
363  | 0  |     return '?';  | 
364  | 0  | }  | 
365  |  |  | 
366  |  | static void  | 
367  |  | fileperm(mode_t mode, char *buf)  | 
368  | 0  | { | 
369  | 0  |     buf[0] = mode & S_IRUSR ? 'r' : '-';  | 
370  | 0  |     buf[1] = mode & S_IWUSR ? 'w' : '-';  | 
371  | 0  |     if (mode & S_ISUID) { | 
372  | 0  |         buf[2] = mode & S_IXUSR ? 's' : 'S';  | 
373  | 0  |     } else { | 
374  | 0  |         buf[2] = mode & S_IXUSR ? 'x' : '-';  | 
375  | 0  |     }  | 
376  | 0  |     buf[3] = mode & S_IRGRP ? 'r' : '-';  | 
377  | 0  |     buf[4] = mode & S_IWGRP ? 'w' : '-';  | 
378  | 0  |     if (mode & S_ISGID) { | 
379  | 0  |         buf[5] = mode & S_IXGRP ? 's' : 'S';  | 
380  | 0  |     } else { | 
381  | 0  |         buf[5] = mode & S_IXGRP ? 'x' : '-';  | 
382  | 0  |     }  | 
383  | 0  |     buf[6] = mode & S_IROTH ? 'r' : '-';  | 
384  | 0  |     buf[7] = mode & S_IWOTH ? 'w' : '-';  | 
385  | 0  |     if (mode & S_ISVTX) { | 
386  | 0  |         buf[8] = mode & S_IXOTH ? 't' : 'T';  | 
387  | 0  |     } else { | 
388  | 0  |         buf[8] = mode & S_IXOTH ? 'x' : '-';  | 
389  | 0  |     }  | 
390  | 0  | }  | 
391  |  |  | 
392  |  | PyDoc_STRVAR(stat_filemode_doc,  | 
393  |  | "Convert a file's mode to a string of the form '-rwxrwxrwx'");  | 
394  |  |  | 
395  |  | static PyObject *  | 
396  |  | stat_filemode(PyObject *self, PyObject *omode)  | 
397  | 0  | { | 
398  | 0  |     char buf[10];  | 
399  | 0  |     mode_t mode;  | 
400  |  | 
  | 
401  | 0  |     mode = _PyLong_AsMode_t(omode);  | 
402  | 0  |     if ((mode == (mode_t)-1) && PyErr_Occurred())  | 
403  | 0  |         return NULL;  | 
404  |  |  | 
405  | 0  |     buf[0] = filetype(mode);  | 
406  | 0  |     fileperm(mode, &buf[1]);  | 
407  | 0  |     return PyUnicode_FromStringAndSize(buf, 10);  | 
408  | 0  | }  | 
409  |  |  | 
410  |  |  | 
411  |  | static PyMethodDef stat_methods[] = { | 
412  |  |     {"S_ISDIR",         stat_S_ISDIR,  METH_O, stat_S_ISDIR_doc}, | 
413  |  |     {"S_ISCHR",         stat_S_ISCHR,  METH_O, stat_S_ISCHR_doc}, | 
414  |  |     {"S_ISBLK",         stat_S_ISBLK,  METH_O, stat_S_ISBLK_doc}, | 
415  |  |     {"S_ISREG",         stat_S_ISREG,  METH_O, stat_S_ISREG_doc}, | 
416  |  |     {"S_ISFIFO",        stat_S_ISFIFO, METH_O, stat_S_ISFIFO_doc}, | 
417  |  |     {"S_ISLNK",         stat_S_ISLNK,  METH_O, stat_S_ISLNK_doc}, | 
418  |  |     {"S_ISSOCK",        stat_S_ISSOCK, METH_O, stat_S_ISSOCK_doc}, | 
419  |  |     {"S_ISDOOR",        stat_S_ISDOOR, METH_O, stat_S_ISDOOR_doc}, | 
420  |  |     {"S_ISPORT",        stat_S_ISPORT, METH_O, stat_S_ISPORT_doc}, | 
421  |  |     {"S_ISWHT",         stat_S_ISWHT,  METH_O, stat_S_ISWHT_doc}, | 
422  |  |     {"S_IMODE",         stat_S_IMODE,  METH_O, stat_S_IMODE_doc}, | 
423  |  |     {"S_IFMT",          stat_S_IFMT,   METH_O, stat_S_IFMT_doc}, | 
424  |  |     {"filemode",        stat_filemode, METH_O, stat_filemode_doc}, | 
425  |  |     {NULL,              NULL}           /* sentinel */ | 
426  |  | };  | 
427  |  |  | 
428  |  |  | 
429  |  | PyDoc_STRVAR(module_doc,  | 
430  |  | "S_IFMT_: file type bits\n\  | 
431  |  | S_IFDIR: directory\n\  | 
432  |  | S_IFCHR: character device\n\  | 
433  |  | S_IFBLK: block device\n\  | 
434  |  | S_IFREG: regular file\n\  | 
435  |  | S_IFIFO: fifo (named pipe)\n\  | 
436  |  | S_IFLNK: symbolic link\n\  | 
437  |  | S_IFSOCK: socket file\n\  | 
438  |  | S_IFDOOR: door\n\  | 
439  |  | S_IFPORT: event port\n\  | 
440  |  | S_IFWHT: whiteout\n\  | 
441  |  | \n"  | 
442  |  |  | 
443  |  | "S_ISUID: set UID bit\n\  | 
444  |  | S_ISGID: set GID bit\n\  | 
445  |  | S_ENFMT: file locking enforcement\n\  | 
446  |  | S_ISVTX: sticky bit\n\  | 
447  |  | S_IREAD: Unix V7 synonym for S_IRUSR\n\  | 
448  |  | S_IWRITE: Unix V7 synonym for S_IWUSR\n\  | 
449  |  | S_IEXEC: Unix V7 synonym for S_IXUSR\n\  | 
450  |  | S_IRWXU: mask for owner permissions\n\  | 
451  |  | S_IRUSR: read by owner\n\  | 
452  |  | S_IWUSR: write by owner\n\  | 
453  |  | S_IXUSR: execute by owner\n\  | 
454  |  | S_IRWXG: mask for group permissions\n\  | 
455  |  | S_IRGRP: read by group\n\  | 
456  |  | S_IWGRP: write by group\n\  | 
457  |  | S_IXGRP: execute by group\n\  | 
458  |  | S_IRWXO: mask for others (not in group) permissions\n\  | 
459  |  | S_IROTH: read by others\n\  | 
460  |  | S_IWOTH: write by others\n\  | 
461  |  | S_IXOTH: execute by others\n\  | 
462  |  | \n"  | 
463  |  |  | 
464  |  | "UF_NODUMP: do not dump file\n\  | 
465  |  | UF_IMMUTABLE: file may not be changed\n\  | 
466  |  | UF_APPEND: file may only be appended to\n\  | 
467  |  | UF_OPAQUE: directory is opaque when viewed through a union stack\n\  | 
468  |  | UF_NOUNLINK: file may not be renamed or deleted\n\  | 
469  |  | UF_COMPRESSED: OS X: file is hfs-compressed\n\  | 
470  |  | UF_HIDDEN: OS X: file should not be displayed\n\  | 
471  |  | SF_ARCHIVED: file may be archived\n\  | 
472  |  | SF_IMMUTABLE: file may not be changed\n\  | 
473  |  | SF_APPEND: file may only be appended to\n\  | 
474  |  | SF_NOUNLINK: file may not be renamed or deleted\n\  | 
475  |  | SF_SNAPSHOT: file is a snapshot file\n\  | 
476  |  | \n"  | 
477  |  |  | 
478  |  | "ST_MODE\n\  | 
479  |  | ST_INO\n\  | 
480  |  | ST_DEV\n\  | 
481  |  | ST_NLINK\n\  | 
482  |  | ST_UID\n\  | 
483  |  | ST_GID\n\  | 
484  |  | ST_SIZE\n\  | 
485  |  | ST_ATIME\n\  | 
486  |  | ST_MTIME\n\  | 
487  |  | ST_CTIME\n\  | 
488  |  | \n"  | 
489  |  |  | 
490  |  | "FILE_ATTRIBUTE_*: Windows file attribute constants\n\  | 
491  |  |                    (only present on Windows)\n\  | 
492  |  | ");  | 
493  |  |  | 
494  |  |  | 
495  |  | static struct PyModuleDef statmodule = { | 
496  |  |     PyModuleDef_HEAD_INIT,  | 
497  |  |     "_stat",  | 
498  |  |     module_doc,  | 
499  |  |     -1,  | 
500  |  |     stat_methods,  | 
501  |  |     NULL,  | 
502  |  |     NULL,  | 
503  |  |     NULL,  | 
504  |  |     NULL  | 
505  |  | };  | 
506  |  |  | 
507  |  | PyMODINIT_FUNC  | 
508  |  | PyInit__stat(void)  | 
509  | 14  | { | 
510  | 14  |     PyObject *m;  | 
511  | 14  |     m = PyModule_Create(&statmodule);  | 
512  | 14  |     if (m == NULL)  | 
513  | 0  |         return NULL;  | 
514  |  |  | 
515  | 14  |     if (PyModule_AddIntMacro(m, S_IFDIR)) return NULL;  | 
516  | 14  |     if (PyModule_AddIntMacro(m, S_IFCHR)) return NULL;  | 
517  | 14  |     if (PyModule_AddIntMacro(m, S_IFBLK)) return NULL;  | 
518  | 14  |     if (PyModule_AddIntMacro(m, S_IFREG)) return NULL;  | 
519  | 14  |     if (PyModule_AddIntMacro(m, S_IFIFO)) return NULL;  | 
520  | 14  |     if (PyModule_AddIntMacro(m, S_IFLNK)) return NULL;  | 
521  | 14  |     if (PyModule_AddIntMacro(m, S_IFSOCK)) return NULL;  | 
522  | 14  |     if (PyModule_AddIntMacro(m, S_IFDOOR)) return NULL;  | 
523  | 14  |     if (PyModule_AddIntMacro(m, S_IFPORT)) return NULL;  | 
524  | 14  |     if (PyModule_AddIntMacro(m, S_IFWHT)) return NULL;  | 
525  |  |  | 
526  | 14  |     if (PyModule_AddIntMacro(m, S_ISUID)) return NULL;  | 
527  | 14  |     if (PyModule_AddIntMacro(m, S_ISGID)) return NULL;  | 
528  | 14  |     if (PyModule_AddIntMacro(m, S_ISVTX)) return NULL;  | 
529  | 14  |     if (PyModule_AddIntMacro(m, S_ENFMT)) return NULL;  | 
530  |  |  | 
531  | 14  |     if (PyModule_AddIntMacro(m, S_IREAD)) return NULL;  | 
532  | 14  |     if (PyModule_AddIntMacro(m, S_IWRITE)) return NULL;  | 
533  | 14  |     if (PyModule_AddIntMacro(m, S_IEXEC)) return NULL;  | 
534  |  |  | 
535  | 14  |     if (PyModule_AddIntMacro(m, S_IRWXU)) return NULL;  | 
536  | 14  |     if (PyModule_AddIntMacro(m, S_IRUSR)) return NULL;  | 
537  | 14  |     if (PyModule_AddIntMacro(m, S_IWUSR)) return NULL;  | 
538  | 14  |     if (PyModule_AddIntMacro(m, S_IXUSR)) return NULL;  | 
539  |  |  | 
540  | 14  |     if (PyModule_AddIntMacro(m, S_IRWXG)) return NULL;  | 
541  | 14  |     if (PyModule_AddIntMacro(m, S_IRGRP)) return NULL;  | 
542  | 14  |     if (PyModule_AddIntMacro(m, S_IWGRP)) return NULL;  | 
543  | 14  |     if (PyModule_AddIntMacro(m, S_IXGRP)) return NULL;  | 
544  |  |  | 
545  | 14  |     if (PyModule_AddIntMacro(m, S_IRWXO)) return NULL;  | 
546  | 14  |     if (PyModule_AddIntMacro(m, S_IROTH)) return NULL;  | 
547  | 14  |     if (PyModule_AddIntMacro(m, S_IWOTH)) return NULL;  | 
548  | 14  |     if (PyModule_AddIntMacro(m, S_IXOTH)) return NULL;  | 
549  |  |  | 
550  | 14  |     if (PyModule_AddIntMacro(m, UF_NODUMP)) return NULL;  | 
551  | 14  |     if (PyModule_AddIntMacro(m, UF_IMMUTABLE)) return NULL;  | 
552  | 14  |     if (PyModule_AddIntMacro(m, UF_APPEND)) return NULL;  | 
553  | 14  |     if (PyModule_AddIntMacro(m, UF_OPAQUE)) return NULL;  | 
554  | 14  |     if (PyModule_AddIntMacro(m, UF_NOUNLINK)) return NULL;  | 
555  | 14  |     if (PyModule_AddIntMacro(m, UF_COMPRESSED)) return NULL;  | 
556  | 14  |     if (PyModule_AddIntMacro(m, UF_HIDDEN)) return NULL;  | 
557  | 14  |     if (PyModule_AddIntMacro(m, SF_ARCHIVED)) return NULL;  | 
558  | 14  |     if (PyModule_AddIntMacro(m, SF_IMMUTABLE)) return NULL;  | 
559  | 14  |     if (PyModule_AddIntMacro(m, SF_APPEND)) return NULL;  | 
560  | 14  |     if (PyModule_AddIntMacro(m, SF_NOUNLINK)) return NULL;  | 
561  | 14  |     if (PyModule_AddIntMacro(m, SF_SNAPSHOT)) return NULL;  | 
562  |  |  | 
563  | 14  |     if (PyModule_AddIntConstant(m, "ST_MODE", 0)) return NULL;  | 
564  | 14  |     if (PyModule_AddIntConstant(m, "ST_INO", 1)) return NULL;  | 
565  | 14  |     if (PyModule_AddIntConstant(m, "ST_DEV", 2)) return NULL;  | 
566  | 14  |     if (PyModule_AddIntConstant(m, "ST_NLINK", 3)) return NULL;  | 
567  | 14  |     if (PyModule_AddIntConstant(m, "ST_UID", 4)) return NULL;  | 
568  | 14  |     if (PyModule_AddIntConstant(m, "ST_GID", 5)) return NULL;  | 
569  | 14  |     if (PyModule_AddIntConstant(m, "ST_SIZE", 6)) return NULL;  | 
570  | 14  |     if (PyModule_AddIntConstant(m, "ST_ATIME", 7)) return NULL;  | 
571  | 14  |     if (PyModule_AddIntConstant(m, "ST_MTIME", 8)) return NULL;  | 
572  | 14  |     if (PyModule_AddIntConstant(m, "ST_CTIME", 9)) return NULL;  | 
573  |  |  | 
574  |  | #ifdef MS_WINDOWS  | 
575  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ARCHIVE)) return NULL;  | 
576  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_COMPRESSED)) return NULL;  | 
577  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DEVICE)) return NULL;  | 
578  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DIRECTORY)) return NULL;  | 
579  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ENCRYPTED)) return NULL;  | 
580  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_HIDDEN)) return NULL;  | 
581  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_INTEGRITY_STREAM)) return NULL;  | 
582  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NORMAL)) return NULL;  | 
583  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) return NULL;  | 
584  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NO_SCRUB_DATA)) return NULL;  | 
585  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_OFFLINE)) return NULL;  | 
586  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_READONLY)) return NULL;  | 
587  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_REPARSE_POINT)) return NULL;  | 
588  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SPARSE_FILE)) return NULL;  | 
589  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SYSTEM)) return NULL;  | 
590  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_TEMPORARY)) return NULL;  | 
591  |  |     if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_VIRTUAL)) return NULL;  | 
592  |  |  | 
593  |  |     if (PyModule_AddObject(m, "IO_REPARSE_TAG_SYMLINK",  | 
594  |  |         PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK))) return NULL;  | 
595  |  |     if (PyModule_AddObject(m, "IO_REPARSE_TAG_MOUNT_POINT",  | 
596  |  |         PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT))) return NULL;  | 
597  |  |     if (PyModule_AddObject(m, "IO_REPARSE_TAG_APPEXECLINK",  | 
598  |  |         PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK))) return NULL;  | 
599  |  | #endif  | 
600  |  |  | 
601  | 14  |     return m;  | 
602  | 14  | }  | 
603  |  |  | 
604  |  | #ifdef __cplusplus  | 
605  |  | }  | 
606  |  | #endif  |