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