update
[midnight-commander.git] / os2 / dirent.os2.c
blobbd311b8d7171da54bdb102a120e97ef1d558c99a
1 #define INCL_DOSFILEMGR
2 #define INCL_DOSERRORS
4 #ifdef HAVE_CONFIG_H
5 #include <config.h>
6 #endif
7 #include <os2.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "dirent.h"
12 #include <errno.h>
14 DIR *opendir (const char * a_dir)
16 APIRET rc;
17 FILEFINDBUF3 FindBuffer = {0};
18 ULONG FileCount = 1;
19 DIR *dd_dir = (DIR*) malloc (sizeof(DIR));
20 char *c_dir = (char*) malloc (strlen(a_dir) + 5);
22 strcpy (c_dir, a_dir);
23 strcat (c_dir, "\\*.*");
24 dd_dir->d_handle = 0xFFFF;
26 rc = DosFindFirst(c_dir,
27 (PHDIR) &dd_dir->d_handle,
28 /* FILE_NORMAL || FILE_DIRECTORY, */
29 FILE_DIRECTORY,
30 (PVOID) &FindBuffer,
31 sizeof(FILEFINDBUF3),
32 &FileCount,
33 FIL_STANDARD);
35 switch (rc) {
36 case ERROR_NO_MORE_FILES:
37 case ERROR_FILE_NOT_FOUND:
38 case ERROR_PATH_NOT_FOUND:
39 errno = ENOENT;
40 free(dd_dir);
41 return NULL;
42 break;
43 case ERROR_BUFFER_OVERFLOW:
44 errno = ENOMEM;
45 free(dd_dir);
46 return NULL;
47 break;
48 case NO_ERROR: /* go through */
49 break;
50 default:
51 errno = EINVAL;
52 free(dd_dir);
53 return NULL;
54 break;
56 dd_dir->d_attr = FindBuffer.attrFile;
57 /* dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
58 ? 0 : wfd.dwFileAttributes; */
60 dd_dir->d_time = dd_dir->d_date = 10;
61 dd_dir->d_size = FindBuffer.cbFile;
62 strcpy (dd_dir->d_name, FindBuffer.achName);
63 dd_dir->d_first = 1;
65 free (c_dir);
66 return dd_dir;
69 DIR *readdir( DIR * dd_dir)
71 APIRET rc;
72 FILEFINDBUF3 FindBuffer = {0};
73 ULONG FileCount = 1;
74 DIR *ret_dir = (DIR*) malloc (sizeof(DIR));
76 if (dd_dir->d_first) {
77 dd_dir->d_first = 0;
78 return dd_dir;
81 rc = DosFindNext((HDIR) dd_dir->d_handle,
82 (PVOID) &FindBuffer,
83 sizeof(FILEFINDBUF3),
84 &FileCount);
86 switch (rc) {
87 case ERROR_NO_MORE_FILES:
88 case ERROR_FILE_NOT_FOUND:
89 case ERROR_PATH_NOT_FOUND:
90 errno = ENOENT;
91 return NULL;
92 break;
93 case ERROR_BUFFER_OVERFLOW:
94 errno = ENOMEM;
95 return NULL;
96 break;
97 case NO_ERROR: /* go through */
98 break;
99 default:
100 errno = EINVAL;
101 return NULL;
102 break;
104 /* dd_dir->d_attr = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
105 ? 0 : wfd.dwFileAttributes; */
106 /* #define FILE_NORMAL 0x0000
107 #define FILE_READONLY 0x0001
108 #define FILE_HIDDEN 0x0002
109 #define FILE_SYSTEM 0x0004
110 #define FILE_DIRECTORY 0x0010
111 #define FILE_ARCHIVED 0x0020
114 ret_dir->d_attr = FindBuffer.attrFile;
116 ret_dir->d_time = ret_dir->d_date = 10;
117 ret_dir->d_size = FindBuffer.cbFile;
118 strcpy (ret_dir->d_name, FindBuffer.achName);
119 return ret_dir;
122 int closedir (DIR *dd_dir)
124 if (dd_dir->d_handle != 0xFFFF) {
125 DosFindClose(dd_dir->d_handle);
127 free (dd_dir);
128 return 1;