@@ -4430,6 +4430,25 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd,
44304430}
44314431#endif 
44324432
4433+ #ifdef  MS_WINDOWS 
4434+ 
4435+ static  int 
4436+ _is_dot_filename (WIN32_FIND_DATAW  * entry )
4437+ {
4438+     return  wcscmp (entry -> cFileName , L"." ) ==  0  ||  wcscmp (entry -> cFileName , L".." ) ==  0 ;
4439+ }
4440+ 
4441+ #else 
4442+ 
4443+ static  int 
4444+ _is_dot_filename (struct  dirent  * entry )
4445+ {
4446+     Py_ssize_t  name_len  =  NAMLEN (entry );
4447+     return  entry -> d_name [0 ] ==  '.'  && 
4448+            (name_len  ==  1  ||  (entry -> d_name [1 ] ==  '.'  &&  name_len  ==  2 ));
4449+ }
4450+ 
4451+ #endif 
44334452
44344453#if  defined(MS_WINDOWS ) &&  !defined(HAVE_OPENDIR )
44354454static  PyObject  * 
@@ -4484,8 +4503,7 @@ _listdir_windows_no_opendir(path_t *path, PyObject *list)
44844503    }
44854504    do  {
44864505        /* Skip over . and .. */ 
4487-         if  (wcscmp (wFileData .cFileName , L"." ) !=  0  && 
4488-             wcscmp (wFileData .cFileName , L".." ) !=  0 ) {
4506+         if  (!_is_dot_filename (& wFileData )) {
44894507            v  =  PyUnicode_FromWideChar (wFileData .cFileName ,
44904508                                       wcslen (wFileData .cFileName ));
44914509            if  (return_bytes  &&  v ) {
@@ -16020,7 +16038,7 @@ join_path_filenameW(const wchar_t *path_wide, const wchar_t *filename)
1602016038}
1602116039
1602216040static  PyObject  * 
16023- DirEntry_from_find_data (PyObject  * module , path_t  * path , WIN32_FIND_DATAW  * dataW )
16041+ DirEntry_from_os (PyObject  * module , path_t  * path , WIN32_FIND_DATAW  * dataW )
1602416042{
1602516043    DirEntry  * entry ;
1602616044    BY_HANDLE_FILE_INFORMATION  file_info ;
@@ -16110,15 +16128,12 @@ join_path_filename(const char *path_narrow, const char* filename, Py_ssize_t fil
1611016128}
1611116129
1611216130static  PyObject  * 
16113- DirEntry_from_posix_info (PyObject  * module , path_t  * path , const  char  * name ,
16114-                          Py_ssize_t  name_len , ino_t  d_ino 
16115- #ifdef  HAVE_DIRENT_D_TYPE 
16116-                          , unsigned char   d_type 
16117- #endif 
16118-                          )
16131+ DirEntry_from_os (PyObject  * module , path_t  * path , struct  dirent  * direntp )
1611916132{
1612016133    DirEntry  * entry ;
1612116134    char  * joined_path ;
16135+     const  char  * name  =  direntp -> d_name ;
16136+     Py_ssize_t  name_len  =  NAMLEN (direntp );
1612216137
1612316138    PyObject  * DirEntryType  =  get_posix_state (module )-> DirEntryType ;
1612416139    entry  =  PyObject_New (DirEntry , (PyTypeObject  * )DirEntryType );
@@ -16161,9 +16176,9 @@ DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name,
1616116176        goto error ;
1616216177
1616316178#ifdef  HAVE_DIRENT_D_TYPE 
16164-     entry -> d_type  =  d_type ;
16179+     entry -> d_type  =  direntp -> d_type ;
1616516180#endif 
16166-     entry -> d_ino  =  d_ino ;
16181+     entry -> d_ino  =  direntp -> d_ino ;
1616716182
1616816183    return  (PyObject  * )entry ;
1616916184
@@ -16245,33 +16260,6 @@ ScandirIterator_nextdirentry(ScandirIterator *iterator, WIN32_FIND_DATAW *file_d
1624516260    return  has_result ;
1624616261}
1624716262
16248- static  PyObject  * 
16249- ScandirIterator_iternext (PyObject  * op )
16250- {
16251-     ScandirIterator  * iterator  =  ScandirIterator_CAST (op );
16252-     WIN32_FIND_DATAW  file_data ;
16253-     PyObject  * entry ;
16254- 
16255-     while  (ScandirIterator_nextdirentry (iterator , & file_data )) {
16256-         /* Skip over . and .. */ 
16257-         if  (wcscmp (file_data .cFileName , L"." ) !=  0  && 
16258-             wcscmp (file_data .cFileName , L".." ) !=  0 )
16259-         {
16260-             PyObject  * module  =  PyType_GetModule (Py_TYPE (iterator ));
16261-             entry  =  DirEntry_from_find_data (module , & iterator -> path , & file_data );
16262-             if  (!entry )
16263-                 break ;
16264-             return  entry ;
16265-         }
16266- 
16267-         /* Loop till we get a non-dot directory or finish iterating */ 
16268-     }
16269- 
16270-     /* Already closed, error, or no more files */ 
16271-     ScandirIterator_closedir (iterator );
16272-     return  NULL ;
16273- }
16274- 
1627516263#else  /* POSIX */ 
1627616264
1627716265static  int 
@@ -16327,44 +16315,36 @@ ScandirIterator_nextdirentry(ScandirIterator *iterator, struct dirent *direntp)
1632716315    return  result  !=  NULL ;
1632816316}
1632916317
16318+ #endif 
16319+ 
1633016320static  PyObject  * 
1633116321ScandirIterator_iternext (PyObject  * op )
1633216322{
16323+ #ifdef  MS_WINDOWS 
16324+     WIN32_FIND_DATAW  dirent ;
16325+ #else 
16326+     struct  dirent  dirent ;
16327+ #endif 
1633316328    ScandirIterator  * iterator  =  ScandirIterator_CAST (op );
16334-     struct  dirent  direntp ;
16335-     Py_ssize_t  name_len ;
16336-     int  is_dot ;
16337-     PyObject  * entry ;
1633816329
16339-     while  ((ScandirIterator_nextdirentry (iterator , & direntp ))) {
16330+     while  ((ScandirIterator_nextdirentry (iterator , & dirent ))) {
16331+ 
1634016332        /* Skip over . and .. */ 
16341-         name_len  =  NAMLEN (& direntp );
16342-         is_dot  =  direntp .d_name [0 ] ==  '.'  && 
16343-                  (name_len  ==  1  ||  (direntp .d_name [1 ] ==  '.'  &&  name_len  ==  2 ));
16344-         if  (!is_dot ) {
16345-             PyObject  * module  =  PyType_GetModule (Py_TYPE (iterator ));
16346-             entry  =  DirEntry_from_posix_info (module ,
16347-                                              & iterator -> path , direntp .d_name ,
16348-                                              name_len , direntp .d_ino 
16349- #ifdef  HAVE_DIRENT_D_TYPE 
16350-                                              , direntp .d_type 
16351- #endif 
16352-                                             );
16353-             if  (!entry )
16354-                 break ;
16355-             return  entry ;
16356-         }
16333+         if  (_is_dot_filename (& dirent ))
16334+             continue ;
1635716335
16358-         /* Loop till we get a non-dot directory or finish iterating */ 
16336+         PyObject  * module  =  PyType_GetModule (Py_TYPE (iterator ));
16337+         PyObject  * entry  =  DirEntry_from_os (module , & iterator -> path , & dirent );
16338+         if  (!entry )
16339+             break ;
16340+         return  entry ;
1635916341    }
1636016342
1636116343    /* Already closed, error, or no more files */ 
1636216344    ScandirIterator_closedir (iterator );
1636316345    return  NULL ;
1636416346}
1636516347
16366- #endif 
16367- 
1636816348static  PyObject  * 
1636916349ScandirIterator_close (PyObject  * op , PyObject  * Py_UNUSED (dummy ))
1637016350{
0 commit comments