BOOL __NTFindNextFileWithAttr( HANDLE h, unsigned attr, LPWIN32_FIND_DATA ffb ) { for(;;) { if( ffb->dwFileAttributes == 0 ) { // Win95 seems to return 0 for the attributes sometimes? // In that case, treat as a normal file ffb->dwFileAttributes = FILE_ATTRIBUTE_NORMAL; } if( (attr & _A_HIDDEN) || (ffb->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0 ) { if( (attr & _A_SYSTEM) || (ffb->dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) == 0 ) { if( (attr & _A_SUBDIR) || (ffb->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 ) { return ( TRUE ); } } } if( !__lib_FindNextFile( h, ffb ) ) { return( FALSE ); } } }
_WCRTLINK DIR_TYPE *__F_NAME(readdir,_wreaddir)( DIR_TYPE *dirp ) /***************************************************************/ { WIN32_FIND_DATA ffd; DWORD err; if( dirp == NULL || dirp->d_first == _DIR_CLOSED ) return( NULL ); if( dirp->d_first == _DIR_ISFIRST ) { dirp->d_first = _DIR_NOTFIRST; } else { if( !__lib_FindNextFile( DIR_HANDLE_OF( dirp ), &ffd ) ) { err = GetLastError(); if( err != ERROR_NO_MORE_FILES ) { __set_errno_dos( err ); } return( NULL ); } __GetNTDirInfo( dirp, &ffd ); } return( dirp ); }
_WCRTLINK int _findnext( intptr_t handle, struct _finddata_t *fileinfo ) #endif #endif { #ifdef __NT__ WIN32_FIND_DATA ffb; BOOL rc; /*** Try to find another matching file ***/ rc = __lib_FindNextFile( (HANDLE)handle, &ffb ); if( rc == FALSE ) { return( __set_errno_nt() ); } if( !__NTFindNextFileWithAttr( (HANDLE)handle, FIND_ATTR, &ffb ) ) { return( __set_errno_dos( ERROR_FILE_NOT_FOUND ) ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__nt_finddatai64_cvt,__nt_wfinddatai64_cvt)( &ffb, fileinfo ); #else __F_NAME(__nt_finddata_cvt,__nt_wfinddata_cvt)( &ffb, fileinfo ); #endif #elif defined( __OS2__ ) APIRET rc; FF_BUFFER ffb; OS_UINT searchcount = 1; rc = DosFindNext( (HDIR)handle, &ffb, sizeof( ffb ), &searchcount ); if( rc != 0 ) { return( __set_errno_dos( rc ) ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__os2_finddatai64_cvt,__os2_wfinddatai64_cvt)( &ffb, fileinfo ); #else __F_NAME(__os2_finddata_cvt,__os2_wfinddata_cvt)( &ffb, fileinfo ); #endif #elif defined( __RDOS__ ) RDOSFINDTYPE *findbuf = (RDOSFINDTYPE *)handle; findbuf->entry++; if( __rdos_finddata_get( findbuf, fileinfo ) ) { return( 0 ); } else { return( -1 ); } #else /* DOS */ if( __F_NAME(_dos_findnext,_wdos_findnext)( (DOSFINDTYPE *)handle ) ) { return( -1 ); } #ifdef __INT64__ __F_NAME(__dos_finddatai64_cvt,__dos_wfinddatai64_cvt)( (DOSFINDTYPE *)handle, fileinfo ); #else __F_NAME(__dos_finddata_cvt,__dos_wfinddata_cvt)( (DOSFINDTYPE *)handle, fileinfo ); #endif #endif return( 0 ); }