25ff5f778451c2f4034cbf1176ebc6aba25b5b80
[reactos.git] / lib / crtdll / io / find.c
1 #include <windows.h>
2 #include <crtdll/io.h>
3 #include <crtdll/string.h>
4 #include <crtdll/internal/file.h>
5
6
7
8 int _findfirst(const char *_name, struct _finddata_t *result)
9 {
10
11         WIN32_FIND_DATA FindFileData;
12         char dir[MAX_PATH];
13         long hFindFile;
14         int len = 0;
15         
16         if ( _name == NULL || _name[0] == 0 ) {
17                 len = GetCurrentDirectory(MAX_PATH-4,dir);
18                 if (dir[len-1] != '\\') {
19                         dir[len] = '\\';
20                         dir[len+1] = 0;
21                 }
22                 strcat(dir,"*.*");
23         }
24         else 
25                 strcpy(dir,_name);
26         hFindFile = (long)FindFirstFileA( dir, &FindFileData ); 
27         if ( hFindFile == -1 ) {
28                 memset(result,0,sizeof(struct _finddata_t));
29                 return -1;
30         }
31         result->attrib = FindFileData.dwFileAttributes; 
32
33
34         result->time_create = FileTimeToUnixTime( &FindFileData.ftCreationTime,NULL);
35         result->time_access = FileTimeToUnixTime( &FindFileData.ftLastAccessTime,NULL);
36         result->time_write = FileTimeToUnixTime( &FindFileData.ftLastWriteTime,NULL);
37         result->size = FindFileData.nFileSizeLow;
38         strncpy(result->name,FindFileData.cFileName,260);
39         
40         // if no wildcard the find file handle can be closed right away
41         // a return value of 0 can flag this.
42         
43         if(!strchr(dir,'*') && !strchr(dir,'?')) {
44                 _findclose(hFindFile);
45                 return 0;
46         }
47         
48         
49         return hFindFile;
50
51 }
52
53 int  _findnext(int handle, struct _finddata_t  *result)
54 {
55         WIN32_FIND_DATA FindFileData;
56         
57         // check no wildcards or invalid handle
58         if ( handle == 0 || handle == -1)
59                 return 0;
60                 
61           
62
63         if ( !FindNextFile((void *)handle, &FindFileData ) )
64                 return -1;
65         
66         result->attrib = FindFileData.dwFileAttributes; 
67         result->time_create = FileTimeToUnixTime( &FindFileData.ftCreationTime,NULL);
68         result->time_access = FileTimeToUnixTime( &FindFileData.ftLastAccessTime,NULL);
69         result->time_write = FileTimeToUnixTime( &FindFileData.ftLastWriteTime,NULL);
70         result->size = FindFileData.nFileSizeLow;
71         strncpy(result->name,FindFileData.cFileName,260);
72         return 0;
73 }
74
75 int  _findclose(int handle)
76 {
77         // check no wildcards or invalid handle
78         if ( handle == 0 || handle == -1)
79                 return 0;
80         return FindClose((void *)handle);
81 }