Mainly standardisation of makefiles, now support make install rules and use ros heade...
[reactos.git] / rosapps / mc / pc / dirent_os2.c
1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4
5 #define INCL_DOSFILEMGR
6 #define INCL_DOSERRORS
7 #include <os2.h>
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <errno.h>
13 #include "dirent.h"
14
15 DIR *opendir (const char * a_dir)
16 {
17 APIRET rc;
18 FILEFINDBUF3 FindBuffer = {0};
19 ULONG FileCount = 1;
20 DIR *dd_dir = (DIR*) malloc (sizeof(DIR));
21 char *c_dir = (char*) malloc (strlen(a_dir) + 5);
22
23 strcpy (c_dir, a_dir);
24 strcat (c_dir, "\\*.*");
25 dd_dir->d_handle = (unsigned long*) HDIR_CREATE;
26
27 rc = DosFindFirst(c_dir,
28 (PHDIR) &dd_dir->d_handle,
29 FILE_SYSTEM | FILE_HIDDEN | FILE_DIRECTORY,
30 (PVOID) &FindBuffer,
31 sizeof(FILEFINDBUF3),
32 &FileCount,
33 FIL_STANDARD);
34
35 if (rc) {
36 switch (rc) {
37 case ERROR_NO_MORE_FILES:
38 case ERROR_FILE_NOT_FOUND:
39 case ERROR_PATH_NOT_FOUND:
40 errno = ENOENT;
41 break;
42 case ERROR_BUFFER_OVERFLOW:
43 errno = ENOMEM;
44 break;
45 default:
46 errno = EINVAL;
47 break;
48 }
49 free(dd_dir);
50 return NULL;
51 }
52 dd_dir->d_attr = FindBuffer.attrFile;
53 dd_dir->d_time = dd_dir->d_date = 10;
54 dd_dir->d_size = FindBuffer.cbFile;
55 strcpy (dd_dir->d_name, FindBuffer.achName);
56 dd_dir->d_first = 1;
57
58 free (c_dir);
59 return dd_dir;
60 }
61
62 DIR *readdir( DIR * dd_dir)
63 {
64 APIRET rc;
65 FILEFINDBUF3 FindBuffer = {0};
66 ULONG FileCount = 1;
67 DIR *ret_dir = (DIR*) malloc (sizeof(DIR));
68
69 if (dd_dir->d_first) {
70 dd_dir->d_first = 0;
71 return dd_dir;
72 }
73
74 rc = DosFindNext((HDIR) dd_dir->d_handle,
75 (PVOID) &FindBuffer,
76 sizeof(FILEFINDBUF3),
77 &FileCount);
78
79 if (rc) {
80 switch (rc) {
81 case ERROR_NO_MORE_FILES:
82 case ERROR_FILE_NOT_FOUND:
83 case ERROR_PATH_NOT_FOUND:
84 errno = ENOENT;
85 break;
86 case ERROR_BUFFER_OVERFLOW:
87 errno = ENOMEM;
88 break;
89 default:
90 errno = EINVAL;
91 break;
92 }
93 return NULL;
94 }
95
96 ret_dir->d_attr = FindBuffer.attrFile;
97 ret_dir->d_time = ret_dir->d_date = 10;
98 ret_dir->d_size = FindBuffer.cbFile;
99 strcpy (ret_dir->d_name, FindBuffer.achName);
100 return ret_dir;
101 }
102
103 int closedir (DIR *dd_dir)
104 {
105 if (dd_dir->d_handle != (unsigned long*) HDIR_CREATE) {
106 DosFindClose((HDIR) dd_dir->d_handle);
107 }
108 free (dd_dir);
109 return 1;
110 }