_WCRTLINK unsigned _dos_findfirst( const char *path, unsigned attr, struct find_t *buf ) { HANDLE h; int error; WIN32_FIND_DATA ffb; h = FindFirstFile( (LPTSTR)path, &ffb ); if( h == (HANDLE)-1 ) { HANDLE_OF( buf ) = BAD_HANDLE; return( __set_errno_nt_reterr() ); } // if( attr == _A_NORMAL ) { // attr = ~(_A_SUBDIR|_A_VOLID); // } if( !__NTFindNextFileWithAttr( h, attr, &ffb ) ) { error = GetLastError(); HANDLE_OF( buf ) = BAD_HANDLE; FindClose( h ); return( __set_errno_dos_reterr( error ) ); } HANDLE_OF( buf ) = h; ATTR_OF( buf ) = attr; __GetNTDirInfo( (struct dirent *) buf, &ffb ); return( 0 ); }
_WCRTLINK unsigned _dos_findnext( struct find_t *buf ) { WIN32_FIND_DATA ffd; if( !FindNextFile( HANDLE_OF( buf ), &ffd ) ) { return( __set_errno_nt_reterr() ); } if( !__NTFindNextFileWithAttr( HANDLE_OF( buf ), ATTR_OF( buf ), &ffd ) ) { return( __set_errno_nt_reterr() ); } __GetNTDirInfo( (struct dirent *) buf, &ffd ); return( 0 ); }
_WCRTLINK long _findfirst( const char *filespec, struct _finddata_t *fileinfo ) #endif #endif /******************************************************************************/ { #if defined( __NT__ ) WIN32_FIND_DATA ffb; HANDLE h; /*** Initialize the find ***/ h = __lib_FindFirstFile( filespec, &ffb ); if( h == INVALID_HANDLE_VALUE ) { return( __set_errno_nt() ); } /*** Look for the first file ***/ if( !__NTFindNextFileWithAttr( h, FIND_ATTR, &ffb ) ) { FindClose( h ); 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 return( (long)h ); #elif defined( __OS2__ ) APIRET rc; HDIR h = HDIR_CREATE; FF_BUFFER ffb; OS_UINT searchcount = 1; #ifdef __WIDECHAR__ char mbFilespec[MB_CUR_MAX * _MAX_PATH]; if( wcstombs( mbFilespec, filespec, sizeof( mbFilespec ) ) == -1 ) { mbFilespec[0] = '\0'; } #endif rc = DosFindFirst( (char*)__F_NAME(filespec,mbFilespec), &h, FIND_ATTR, &ffb, sizeof( ffb ), &searchcount, FF_LEVEL ); if( rc != 0 ) { return( -1L ); } /*** 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 return( (long)h ); #elif defined( __RDOS__ ) RDOSFINDTYPE * findbuf; findbuf = (RDOSFINDTYPE*) lib_malloc( sizeof( RDOSFINDTYPE ) ); if( findbuf == NULL ) return( -1L ); findbuf->handle = RdosOpenDir( filespec ); findbuf->entry = 0; if( __rdos_finddata_get( findbuf, fileinfo ) ) return( (long) findbuf ); else { lib_free( findbuf ); return( -1 ); } #else /* DOS */ DOSFINDTYPE *findbuf; unsigned rc; /*** Start a new find using _dos_findfirst ***/ findbuf = (DOSFINDTYPE*) lib_malloc( sizeof( DOSFINDTYPE ) ); if( findbuf == NULL ) return( -1L ); rc = __F_NAME(_dos_findfirst,_wdos_findfirst)( filespec, FIND_ATTR, findbuf ); if( rc != 0 ) { lib_free( findbuf ); return( -1L ); } /*** Got one! ***/ #ifdef __INT64__ __F_NAME(__dos_finddatai64_cvt,__dos_wfinddatai64_cvt)( findbuf, fileinfo ); #else __F_NAME(__dos_finddata_cvt,__dos_wfinddata_cvt)( findbuf, fileinfo ); #endif return( (long)findbuf ); #endif }
_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 ); }