Coverage Report

Created: 2025-07-11 06:59

/src/Python-3.8.3/Modules/_stat.c
Line
Count
Source (jump to first uncovered line)
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
    }                                                          \
Unexecuted instantiation: _stat.c:stat_S_ISDIR
Unexecuted instantiation: _stat.c:stat_S_ISCHR
Unexecuted instantiation: _stat.c:stat_S_ISBLK
Unexecuted instantiation: _stat.c:stat_S_ISREG
Unexecuted instantiation: _stat.c:stat_S_ISFIFO
Unexecuted instantiation: _stat.c:stat_S_ISLNK
Unexecuted instantiation: _stat.c:stat_S_ISSOCK
Unexecuted instantiation: _stat.c:stat_S_ISDOOR
Unexecuted instantiation: _stat.c:stat_S_ISPORT
Unexecuted instantiation: _stat.c:stat_S_ISWHT
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