This source file includes following definitions.
- closedir
- opendir
- readdir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include "lt__private.h"
32
33 #include <assert.h>
34 #include <stddef.h>
35
36 #include "lt__dirent.h"
37
38 #if defined(__WINDOWS__)
39
40 void
41 closedir (DIR *entry)
42 {
43 assert (entry != (DIR *) NULL);
44 FindClose (entry->hSearch);
45 free ((void *) entry);
46 }
47
48
49 DIR *
50 opendir (const char *path)
51 {
52 char file_spec[LT_FILENAME_MAX];
53 DIR *entry;
54
55 assert (path != (char *) 0);
56 if (lt_strlcpy (file_spec, path, sizeof file_spec) >= sizeof file_spec
57 || lt_strlcat (file_spec, "\\", sizeof file_spec) >= sizeof file_spec)
58 return (DIR *) 0;
59 entry = (DIR *) malloc (sizeof(DIR));
60 if (entry != (DIR *) 0)
61 {
62 entry->firsttime = TRUE;
63 entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
64
65 if (entry->hSearch == INVALID_HANDLE_VALUE)
66 {
67 if (lt_strlcat (file_spec, "\\*.*", sizeof file_spec) < sizeof file_spec)
68 {
69 entry->hSearch = FindFirstFile (file_spec, &entry->Win32FindData);
70 }
71
72 if (entry->hSearch == INVALID_HANDLE_VALUE)
73 {
74 entry = (free (entry), (DIR *) 0);
75 }
76 }
77 }
78
79 return entry;
80 }
81
82
83 struct dirent *
84 readdir (DIR *entry)
85 {
86 int status;
87
88 if (entry == (DIR *) 0)
89 return (struct dirent *) 0;
90
91 if (!entry->firsttime)
92 {
93 status = FindNextFile (entry->hSearch, &entry->Win32FindData);
94 if (status == 0)
95 return (struct dirent *) 0;
96 }
97
98 entry->firsttime = FALSE;
99 if (lt_strlcpy (entry->file_info.d_name, entry->Win32FindData.cFileName,
100 sizeof entry->file_info.d_name) >= sizeof entry->file_info.d_name)
101 return (struct dirent *) 0;
102 entry->file_info.d_namlen = strlen (entry->file_info.d_name);
103
104 return &entry->file_info;
105 }
106
107 #endif