@@ -492,113 +492,140 @@ ST_CTIME\n\
492492" );
493493
494494
495+ static int
496+ stat_exec (PyObject * module )
497+ {
498+ #define ADD_INT_MACRO (module , macro ) \
499+ do { \
500+ if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \
501+ return -1; \
502+ } \
503+ } while (0)
504+
505+ ADD_INT_MACRO (module , S_IFDIR );
506+ ADD_INT_MACRO (module , S_IFCHR );
507+ ADD_INT_MACRO (module , S_IFBLK );
508+ ADD_INT_MACRO (module , S_IFREG );
509+ ADD_INT_MACRO (module , S_IFIFO );
510+ ADD_INT_MACRO (module , S_IFLNK );
511+ ADD_INT_MACRO (module , S_IFSOCK );
512+ ADD_INT_MACRO (module , S_IFDOOR );
513+ ADD_INT_MACRO (module , S_IFPORT );
514+ ADD_INT_MACRO (module , S_IFWHT );
515+
516+ ADD_INT_MACRO (module , S_ISUID );
517+ ADD_INT_MACRO (module , S_ISGID );
518+ ADD_INT_MACRO (module , S_ISVTX );
519+ ADD_INT_MACRO (module , S_ENFMT );
520+
521+ ADD_INT_MACRO (module , S_IREAD );
522+ ADD_INT_MACRO (module , S_IWRITE );
523+ ADD_INT_MACRO (module , S_IEXEC );
524+
525+ ADD_INT_MACRO (module , S_IRWXU );
526+ ADD_INT_MACRO (module , S_IRUSR );
527+ ADD_INT_MACRO (module , S_IWUSR );
528+ ADD_INT_MACRO (module , S_IXUSR );
529+
530+ ADD_INT_MACRO (module , S_IRWXG );
531+ ADD_INT_MACRO (module , S_IRGRP );
532+ ADD_INT_MACRO (module , S_IWGRP );
533+ ADD_INT_MACRO (module , S_IXGRP );
534+
535+ ADD_INT_MACRO (module , S_IRWXO );
536+ ADD_INT_MACRO (module , S_IROTH );
537+ ADD_INT_MACRO (module , S_IWOTH );
538+ ADD_INT_MACRO (module , S_IXOTH );
539+
540+ ADD_INT_MACRO (module , UF_NODUMP );
541+ ADD_INT_MACRO (module , UF_IMMUTABLE );
542+ ADD_INT_MACRO (module , UF_APPEND );
543+ ADD_INT_MACRO (module , UF_OPAQUE );
544+ ADD_INT_MACRO (module , UF_NOUNLINK );
545+ ADD_INT_MACRO (module , UF_COMPRESSED );
546+ ADD_INT_MACRO (module , UF_HIDDEN );
547+ ADD_INT_MACRO (module , SF_ARCHIVED );
548+ ADD_INT_MACRO (module , SF_IMMUTABLE );
549+ ADD_INT_MACRO (module , SF_APPEND );
550+ ADD_INT_MACRO (module , SF_NOUNLINK );
551+ ADD_INT_MACRO (module , SF_SNAPSHOT );
552+
553+ const char * st_constants [] = {
554+ "ST_MODE" ,
555+ "ST_INO" ,
556+ "ST_DEV" ,
557+ "ST_NLINK" ,
558+ "ST_UID" ,
559+ "ST_GID" ,
560+ "ST_SIZE" ,
561+ "ST_ATIME" ,
562+ "ST_MTIME" ,
563+ "ST_CTIME"
564+ };
565+
566+ for (int i = 0 ; i < Py_ARRAY_LENGTH (st_constants ); i ++ ) {
567+ if (PyModule_AddIntConstant (module , st_constants [i ], i ) < 0 ) {
568+ return -1 ;
569+ }
570+ }
571+
572+ #ifdef MS_WINDOWS
573+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_ARCHIVE );
574+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_COMPRESSED );
575+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_DEVICE );
576+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_DIRECTORY );
577+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_ENCRYPTED );
578+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_HIDDEN );
579+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_INTEGRITY_STREAM );
580+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_NORMAL );
581+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_NOT_CONTENT_INDEXED );
582+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_NO_SCRUB_DATA );
583+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_OFFLINE );
584+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_READONLY );
585+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_REPARSE_POINT );
586+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_SPARSE_FILE );
587+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_SYSTEM );
588+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_TEMPORARY );
589+ ADD_INT_MACRO (module , FILE_ATTRIBUTE_VIRTUAL );
590+
591+ if (PyModule_AddObject (module , "IO_REPARSE_TAG_SYMLINK" ,
592+ PyLong_FromUnsignedLong (IO_REPARSE_TAG_SYMLINK )) < 0 ) {
593+ return -1 ;
594+ }
595+ if (PyModule_AddObject (module , "IO_REPARSE_TAG_MOUNT_POINT" ,
596+ PyLong_FromUnsignedLong (IO_REPARSE_TAG_MOUNT_POINT )) < 0 ) {
597+ return -1 ;
598+ }
599+ if (PyModule_AddObject (module , "IO_REPARSE_TAG_APPEXECLINK" ,
600+ PyLong_FromUnsignedLong (IO_REPARSE_TAG_APPEXECLINK )) < 0 ) {
601+ return -1 ;
602+ }
603+ #endif
604+
605+ return 0 ;
606+ }
607+
608+
609+ static PyModuleDef_Slot stat_slots [] = {
610+ {Py_mod_exec , stat_exec },
611+ {0 , NULL }
612+ };
613+
614+
495615static struct PyModuleDef statmodule = {
496616 PyModuleDef_HEAD_INIT ,
497- "_stat" ,
498- module_doc ,
499- -1 ,
500- stat_methods ,
501- NULL ,
502- NULL ,
503- NULL ,
504- NULL
617+ .m_name = "_stat" ,
618+ .m_doc = module_doc ,
619+ .m_size = 0 ,
620+ .m_methods = stat_methods ,
621+ .m_slots = stat_slots ,
505622};
506623
624+
507625PyMODINIT_FUNC
508626PyInit__stat (void )
509627{
510- PyObject * m ;
511- m = PyModule_Create (& statmodule );
512- if (m == NULL )
513- return NULL ;
514-
515- if (PyModule_AddIntMacro (m , S_IFDIR )) return NULL ;
516- if (PyModule_AddIntMacro (m , S_IFCHR )) return NULL ;
517- if (PyModule_AddIntMacro (m , S_IFBLK )) return NULL ;
518- if (PyModule_AddIntMacro (m , S_IFREG )) return NULL ;
519- if (PyModule_AddIntMacro (m , S_IFIFO )) return NULL ;
520- if (PyModule_AddIntMacro (m , S_IFLNK )) return NULL ;
521- if (PyModule_AddIntMacro (m , S_IFSOCK )) return NULL ;
522- if (PyModule_AddIntMacro (m , S_IFDOOR )) return NULL ;
523- if (PyModule_AddIntMacro (m , S_IFPORT )) return NULL ;
524- if (PyModule_AddIntMacro (m , S_IFWHT )) return NULL ;
525-
526- if (PyModule_AddIntMacro (m , S_ISUID )) return NULL ;
527- if (PyModule_AddIntMacro (m , S_ISGID )) return NULL ;
528- if (PyModule_AddIntMacro (m , S_ISVTX )) return NULL ;
529- if (PyModule_AddIntMacro (m , S_ENFMT )) return NULL ;
530-
531- if (PyModule_AddIntMacro (m , S_IREAD )) return NULL ;
532- if (PyModule_AddIntMacro (m , S_IWRITE )) return NULL ;
533- if (PyModule_AddIntMacro (m , S_IEXEC )) return NULL ;
534-
535- if (PyModule_AddIntMacro (m , S_IRWXU )) return NULL ;
536- if (PyModule_AddIntMacro (m , S_IRUSR )) return NULL ;
537- if (PyModule_AddIntMacro (m , S_IWUSR )) return NULL ;
538- if (PyModule_AddIntMacro (m , S_IXUSR )) return NULL ;
539-
540- if (PyModule_AddIntMacro (m , S_IRWXG )) return NULL ;
541- if (PyModule_AddIntMacro (m , S_IRGRP )) return NULL ;
542- if (PyModule_AddIntMacro (m , S_IWGRP )) return NULL ;
543- if (PyModule_AddIntMacro (m , S_IXGRP )) return NULL ;
544-
545- if (PyModule_AddIntMacro (m , S_IRWXO )) return NULL ;
546- if (PyModule_AddIntMacro (m , S_IROTH )) return NULL ;
547- if (PyModule_AddIntMacro (m , S_IWOTH )) return NULL ;
548- if (PyModule_AddIntMacro (m , S_IXOTH )) return NULL ;
549-
550- if (PyModule_AddIntMacro (m , UF_NODUMP )) return NULL ;
551- if (PyModule_AddIntMacro (m , UF_IMMUTABLE )) return NULL ;
552- if (PyModule_AddIntMacro (m , UF_APPEND )) return NULL ;
553- if (PyModule_AddIntMacro (m , UF_OPAQUE )) return NULL ;
554- if (PyModule_AddIntMacro (m , UF_NOUNLINK )) return NULL ;
555- if (PyModule_AddIntMacro (m , UF_COMPRESSED )) return NULL ;
556- if (PyModule_AddIntMacro (m , UF_HIDDEN )) return NULL ;
557- if (PyModule_AddIntMacro (m , SF_ARCHIVED )) return NULL ;
558- if (PyModule_AddIntMacro (m , SF_IMMUTABLE )) return NULL ;
559- if (PyModule_AddIntMacro (m , SF_APPEND )) return NULL ;
560- if (PyModule_AddIntMacro (m , SF_NOUNLINK )) return NULL ;
561- if (PyModule_AddIntMacro (m , SF_SNAPSHOT )) return NULL ;
562-
563- if (PyModule_AddIntConstant (m , "ST_MODE" , 0 )) return NULL ;
564- if (PyModule_AddIntConstant (m , "ST_INO" , 1 )) return NULL ;
565- if (PyModule_AddIntConstant (m , "ST_DEV" , 2 )) return NULL ;
566- if (PyModule_AddIntConstant (m , "ST_NLINK" , 3 )) return NULL ;
567- if (PyModule_AddIntConstant (m , "ST_UID" , 4 )) return NULL ;
568- if (PyModule_AddIntConstant (m , "ST_GID" , 5 )) return NULL ;
569- if (PyModule_AddIntConstant (m , "ST_SIZE" , 6 )) return NULL ;
570- if (PyModule_AddIntConstant (m , "ST_ATIME" , 7 )) return NULL ;
571- if (PyModule_AddIntConstant (m , "ST_MTIME" , 8 )) return NULL ;
572- 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- return m ;
628+ return PyModuleDef_Init (& statmodule );
602629}
603630
604631#ifdef __cplusplus
0 commit comments