Added cs to the list of languages
[midnight-commander.git] / pc / dirent_nt.c
blobc0b7900e8744f95230d0a5e5ae945a31864dd79b
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <windows.h>
6 #include <errno.h>
7 #include "dirent.h"
9 DIR *opendir (const char * a_dir)
11 int err;
12 WIN32_FIND_DATA wfd;
13 DIR* dd_dir = (DIR*) malloc (sizeof(DIR));
15 char *c_dir = malloc (strlen(a_dir) + 4);
16 strcpy (c_dir, a_dir);
17 strcat (c_dir, "\\*");
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;
35 free(dd_dir);
36 return NULL;
38 dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
39 ? 0 : wfd.dwFileAttributes;
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;
46 free (c_dir);
47 return dd_dir;
50 DIR *readdir( DIR * dd_dir)
52 int err;
53 WIN32_FIND_DATA wfd;
55 if (dd_dir->d_first) {
56 dd_dir->d_first = 0;
57 return dd_dir;
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;
75 return NULL;
77 dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
78 ? 0 : wfd.dwFileAttributes;
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;
86 int closedir (DIR *dd_dir)
88 FindClose(dd_dir->d_handle);
89 free (dd_dir);
90 return 1;