Sync to Wine-0_9_5:
[reactos.git] / rosapps / mc / pc / dirent_nt.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <windows.h>
6 #include <errno.h>
7 #include "dirent.h"
8
9 DIR *opendir (const char * a_dir)
10 {
11 int err;
12 WIN32_FIND_DATA wfd;
13 DIR* dd_dir = (DIR*) malloc (sizeof(DIR));
14
15 char *c_dir = malloc (strlen(a_dir) + 4);
16 strcpy (c_dir, a_dir);
17 strcat (c_dir, "\\*");
18
19 dd_dir->d_handle = FindFirstFile (c_dir, &wfd);
20 if (dd_dir->d_handle == INVALID_HANDLE_VALUE) {
21 err = GetLastError();
22 switch (err) {
23 case ERROR_NO_MORE_FILES:
24 case ERROR_FILE_NOT_FOUND:
25 case ERROR_PATH_NOT_FOUND:
26 errno = ENOENT;
27 break;
28 case ERROR_NOT_ENOUGH_MEMORY:
29 errno = ENOMEM;
30 break;
31 default:
32 errno = EINVAL;
33 break;
34 }
35 free(dd_dir);
36 return NULL;
37 }
38 dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
39 ? 0 : wfd.dwFileAttributes;
40
41 dd_dir->d_time = dd_dir->d_date = 10;
42 dd_dir->d_size = wfd.nFileSizeLow;
43 strcpy (dd_dir->d_name, wfd.cFileName);
44 dd_dir->d_first = 1;
45
46 free (c_dir);
47 return dd_dir;
48 }
49
50 DIR *readdir( DIR * dd_dir)
51 {
52 int err;
53 WIN32_FIND_DATA wfd;
54
55 if (dd_dir->d_first) {
56 dd_dir->d_first = 0;
57 return dd_dir;
58 }
59
60 if(!FindNextFile (dd_dir->d_handle, &wfd)) {
61 err = GetLastError();
62 switch (err) {
63 case ERROR_NO_MORE_FILES:
64 case ERROR_FILE_NOT_FOUND:
65 case ERROR_PATH_NOT_FOUND:
66 errno = ENOENT;
67 break;
68 case ERROR_NOT_ENOUGH_MEMORY:
69 errno = ENOMEM;
70 break;
71 default:
72 errno = EINVAL;
73 break;
74 }
75 return NULL;
76 }
77 dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
78 ? 0 : wfd.dwFileAttributes;
79
80 dd_dir->d_time = dd_dir->d_date = 10;
81 dd_dir->d_size = wfd.nFileSizeLow;
82 strcpy (dd_dir->d_name, wfd.cFileName);
83 return dd_dir;
84 }
85
86 int closedir (DIR *dd_dir)
87 {
88 FindClose(dd_dir->d_handle);
89 free (dd_dir);
90 return 1;
91 }
92