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