Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a example of Tesh variables
[simgrid.git] / tools / tesh2 / w32 / src / dirent.c
1 \r
2 #include <sys/stat.h>\r
3 #include <stdio.h>\r
4 #include <dirent.h>\r
5 #include <errno.h>\r
6 \r
7 \r
8 DIR*\r
9 opendir(const char* directory_name)\r
10 {\r
11         struct stat sb;\r
12         DIR* dir;\r
13 \r
14         if(NULL == directory_name) \r
15         {\r
16                 errno = EINVAL;\r
17                 return NULL;\r
18         }\r
19         \r
20         if(0 != stat(directory_name, &sb)) \r
21         {\r
22                 /* directory not found */\r
23                 errno = ENOENT;\r
24                 return NULL;\r
25         }\r
26         \r
27         if(0 == S_ISDIR(sb.st_mode)) \r
28         {\r
29                 /* it's not a directory */\r
30                 errno = ENOTDIR;\r
31                 return NULL;\r
32         }\r
33 \r
34         \r
35         dir = (DIR *)calloc(1,sizeof(DIR));\r
36 \r
37         if (NULL == dir)\r
38         {\r
39                 errno = ENOMEM;\r
40                 return NULL;\r
41         }\r
42 \r
43         if('\\' != dir->directory_name[strlen(directory_name) - 1])\r
44                 sprintf(dir->directory_name,"%s\\*",directory_name);\r
45         else\r
46                 sprintf(dir->directory_name,"%s*",directory_name);\r
47 \r
48         dir->file_handle = INVALID_HANDLE_VALUE;\r
49 \r
50         return dir;\r
51 }\r
52 \r
53 int\r
54 closedir(DIR* dir)\r
55 {\r
56         if(NULL == dir) \r
57                 return EINVAL;\r
58         \r
59         if(INVALID_HANDLE_VALUE != dir->file_handle)\r
60                 FindClose(dir->file_handle);\r
61         else\r
62                 return EBADF;\r
63         \r
64         free(dir);\r
65 \r
66         return 0;\r
67 \r
68 }\r
69 \r
70 struct dirent*\r
71 readdir(DIR* dir)\r
72 {\r
73         WIN32_FIND_DATA wfd = {0};\r
74 \r
75         if(!dir) \r
76         {\r
77                 errno = EINVAL;\r
78                 return NULL;\r
79         }\r
80 \r
81         if(!dir->pos) \r
82                 dir->file_handle = FindFirstFile(dir->directory_name, &wfd);\r
83         \r
84         if(!FindNextFile(dir->file_handle, &wfd))\r
85                 return NULL;\r
86                         \r
87         dir->pos++;\r
88 \r
89         strcpy(dir->entry.d_name, wfd.cFileName);\r
90 \r
91         return &(dir->entry);\r
92 }\r
93 \r
94 void\r
95 rewinddir(DIR* dir)\r
96 {\r
97         if(NULL == dir) \r
98         {\r
99                 errno = EINVAL;\r
100                 return;\r
101         }\r
102 \r
103         if(INVALID_HANDLE_VALUE != dir->file_handle)\r
104         {\r
105                 FindClose(dir->file_handle);\r
106                 dir->file_handle = INVALID_HANDLE_VALUE;\r
107                 dir->pos = 0;\r
108         }\r
109 }\r
110 \r
111 off_t\r
112 telldir(DIR* dir)\r
113 {\r
114         if(NULL == dir) \r
115         {\r
116                 errno = EINVAL;\r
117                 return -1;\r
118         }\r
119         \r
120         return dir->pos;\r
121 }\r
122 \r
123 void\r
124 seekdir(DIR* dir, off_t offset)\r
125 {\r
126         WIN32_FIND_DATA wfd = {0};\r
127         \r
128         if(NULL == dir)\r
129         {\r
130                 errno = EINVAL;\r
131                 return;\r
132         }\r
133 \r
134         if(INVALID_HANDLE_VALUE != dir->file_handle)\r
135         {\r
136                 FindClose(dir->file_handle);\r
137                 dir->file_handle = INVALID_HANDLE_VALUE;\r
138                 dir->pos = 0;\r
139         }\r
140         \r
141         dir->file_handle = FindFirstFile(dir->directory_name, &wfd);\r
142         \r
143         dir->pos += offset;\r
144         \r
145         while(--offset)\r
146         {\r
147                 if(!FindNextFile(dir->file_handle, &wfd))\r
148                         errno = EINVAL;\r
149         }\r
150 }\r