annotate os2/dirent.c @ 1853:4790589f52a9

Initial commit for new dw_signal_connect_data() function... Same as dw_signal_connect() but it has an additional callback parameter that gets called when the callback is being removed. This allows me to free memory allocated for the data parameter and prevent memory leaks in godwindows... Tested GTK and Mac.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 27 Feb 2013 19:14:22 +0000
parents 6baf177f335c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
1 #include <stdio.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
2 #include <stdlib.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
3 #include <string.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
4 #include <ctype.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
5
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
6 #define INCL_DOSFILEMGR
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
7 #define INCL_DOSERRORS
1594
6baf177f335c Rename compat.c/h dwcompat.c/h and configure option to --with-dwcompat.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1404
diff changeset
8 #include "dwcompat.h"
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
9 #include <errno.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
10
1404
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
11 #ifdef __WATCOMC__
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
12 #include "platform\dirent.h"
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
13 typedef struct _dirdescr DIRW;
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
14 #define DIR DIRW
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
15 #endif
56f311dc23f6 Changes to get the library building with Watcom on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 1341
diff changeset
16
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
17 # define FFBUF FILEFINDBUF3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
18 # define Word ULONG
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
19 /*
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
20 * LS20 recommends a request count of 100, but according to the
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
21 * APAR text it does not lead to missing files, just to funny
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
22 * numbers of returned entries.
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
23 *
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
24 * LS30 HPFS386 requires a count greater than 2, or some files
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
25 * are missing (those starting with a character less that '.').
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
26 *
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
27 * Novell looses entries which overflow the buffer. In previous
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
28 * versions of dirent2, this could have lead to missing files
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
29 * when the average length of 100 directory entries was 40 bytes
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
30 * or more (quite unlikely for files on a Novell server).
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
31 *
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
32 * Conclusion: Make sure that the entries all fit into the buffer
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
33 * and that the buffer is large enough for more than 2 entries
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
34 * (each entry is at most 300 bytes long). And ignore the LS20
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
35 * effect.
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
36 */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
37 # define Count 25
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
38 # define BufSz (25 * (sizeof(FILEFINDBUF3)+1))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
39
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
40 #if defined(__IBMC__) || defined(__IBMCPP__)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
41 #define error(rc) _doserrno = rc, errno = EOS2ERR
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
42 #else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
43 #define error(rc) errno = 255
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
44 #endif
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
45
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
46 struct _dirdescr {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
47 HDIR handle; /* DosFindFirst handle */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
48 char fstype; /* filesystem type */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
49 Word count; /* valid entries in <ffbuf> */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
50 long number; /* absolute number of next entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
51 int index; /* relative number of next entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
52 FFBUF * next; /* pointer to next entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
53 char name[MAXPATHLEN+3]; /* directory name */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
54 unsigned attrmask; /* attribute mask for seekdir */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
55 struct dirent entry; /* buffer for directory entry */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
56 BYTE ffbuf[BufSz];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
57 };
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
58
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
59 /*
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
60 * Return first char of filesystem type, or 0 if unknown.
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
61 */
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
62 static char API getFSType(const char *path)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
63 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
64 static char cache[1+26];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
65 char drive[3], info[512];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
66 Word unit, infolen;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
67 char r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
68
289
0e6f09149eaa Fixed some EMX warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 174
diff changeset
69 if (isalpha((int)path[0]) && path[1] == ':') {
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
70 unit = toupper(path[0]) - '@';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
71 path += 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
72 } else {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
73 ULONG driveMap;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
74 if (DosQueryCurrentDisk(&unit, &driveMap))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
75 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
76 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
77
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
78 if ((path[0] == '\\' || path[0] == '/')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
79 && (path[1] == '\\' || path[1] == '/'))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
80 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
81
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
82 if (cache [unit])
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
83 return cache [unit];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
84
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
85 drive[0] = '@' + unit;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
86 drive[1] = ':';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
87 drive[2] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
88 infolen = sizeof info;
1341
184b3aedc2ff Added PMPrintf support to dw_debug() on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 528
diff changeset
89 if (DosQueryFSAttach((PSZ)drive, 0, FSAIL_QUERYNAME, (PVOID)info, &infolen))
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
90 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
91 if (infolen >= sizeof(FSQBUFFER2)) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
92 FSQBUFFER2 *p = (FSQBUFFER2 *)info;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
93 r = p->szFSDName[p->cbName];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
94 } else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
95 r = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
96 return cache [unit] = r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
97 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
98
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
99 char * API _abs_path(const char *name, char *buffer, int len)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
100 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
101 char buf[4];
289
0e6f09149eaa Fixed some EMX warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 174
diff changeset
102 if (isalpha((int)name[0]) && name[1] == ':' && name[2] == '\0') {
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
103 buf[0] = name[0];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
104 buf[1] = name[1];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
105 buf[2] = '.';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
106 buf[3] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
107 name = buf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
108 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
109 if (DosQueryPathInfo((PSZ)name, FIL_QUERYFULLNAME, buffer, len))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
110 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
111 return buffer;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
112 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
113
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
114 DIR * API _openxdir(const char *path, unsigned att_mask)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
115 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
116 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
117 char name[MAXPATHLEN+3];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
118 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
119
24
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
120 if(!path)
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
121 return NULL;
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
122
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
123 dir = malloc(sizeof(DIR));
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
124 if (dir == NULL) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
125 errno = ENOMEM;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
126 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
127 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
128
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
129 strncpy(name, path, MAXPATHLEN);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
130 name[MAXPATHLEN] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
131 switch (name[strlen(name)-1]) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
132 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
133 strcat(name, "\\");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
134 case '\\':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
135 case '/':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
136 case ':':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
137 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
138 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
139 strcat(name, ".");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
140 if (!abs_path(name, dir->name, MAXPATHLEN+1))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
141 strcpy(dir->name, name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
142 if (dir->name[strlen(dir->name)-1] == '\\')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
143 strcat(dir->name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
144 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
145 strcat(dir->name, "\\*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
146
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
147 dir->fstype = getFSType(dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
148 dir->attrmask = att_mask | A_DIR;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
149
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
150 dir->handle = HDIR_CREATE;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
151 dir->count = 100;
1341
184b3aedc2ff Added PMPrintf support to dw_debug() on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 528
diff changeset
152 rc = DosFindFirst((PSZ)dir->name, &dir->handle, dir->attrmask,
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
153 dir->ffbuf, sizeof dir->ffbuf, &dir->count, FIL_STANDARD);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
154 switch (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
155 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
156 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
157 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
158 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
159 case NO_ERROR:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
160 case ERROR_NO_MORE_FILES:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
161 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
162 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
163
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
164 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
165 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
166 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
167
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
168 return (DIR *)dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
169 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
170
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
171 DIR * API _opendir(const char *pathname)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
172 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
173 return openxdir(pathname, 0);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
174 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
175
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
176 struct dirent * API _readdir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
177 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
178 static int dummy_ino = 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
179
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
180 if (dir->index == dir->count) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
181 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
182 dir->count = 100;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
183 rc = DosFindNext(dir->handle, dir->ffbuf,
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
184 sizeof dir->ffbuf, &dir->count);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
185 if (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
186 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
187 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
188 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
189
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
190 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
191 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
192 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
193
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
194 if (dir->index == dir->count)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
195 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
196
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
197 memcpy(dir->entry.d_name, dir->next->achName, dir->next->cchName);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
198 dir->entry.d_name[dir->next->cchName] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
199 dir->entry.d_ino = dummy_ino++;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
200 dir->entry.d_reclen = dir->next->cchName;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
201 dir->entry.d_namlen = dir->next->cchName;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
202 dir->entry.d_size = dir->next->cbFile;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
203 dir->entry.d_attribute = dir->next->attrFile;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
204 dir->entry.d_time = *(USHORT *)&dir->next->ftimeLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
205 dir->entry.d_date = *(USHORT *)&dir->next->fdateLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
206
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
207 switch (dir->fstype) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
208 case 'F': /* FAT */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
209 case 'C': /* CDFS */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
210 if (dir->next->attrFile & FILE_DIRECTORY)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
211 strupr(dir->entry.d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
212 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
213 strlwr(dir->entry.d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
214 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
215
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
216 dir->next = (FFBUF *)((BYTE *)dir->next + dir->next->oNextEntryOffset);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
217 ++dir->number;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
218 ++dir->index;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
219
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
220 return &dir->entry;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
221 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
222
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
223 long API _telldir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
224 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
225 return dir->number;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
226 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
227
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
228 void API _seekdir(DIR *dir, long off)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
229 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
230 if (dir->number > off) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
231 char name[MAXPATHLEN+2];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
232 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
233
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
234 DosFindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
235
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
236 strcpy(name, dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
237 strcat(name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
238
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
239 dir->handle = HDIR_CREATE;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
240 dir->count = 32767;
1341
184b3aedc2ff Added PMPrintf support to dw_debug() on OS/2.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 528
diff changeset
241 rc = DosFindFirst((PSZ)name, &dir->handle, dir->attrmask,
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
242 dir->ffbuf, sizeof dir->ffbuf, &dir->count, FIL_STANDARD);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
243 switch (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
244 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
245 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
246 return;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
247 case NO_ERROR:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
248 case ERROR_NO_MORE_FILES:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
249 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
250 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
251
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
252 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
253 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
254 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
255 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
256
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
257 while (dir->number < off && readdir(dir))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
258 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
259 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
260
525
2ff26b697877 Fixes for building with Innotek GCC. Will have to check for regressions
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 289
diff changeset
261 void API _closedir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
262 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
263 DosFindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
264 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
265 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
266
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
267 /*****************************************************************************/
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
268
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
269 #ifdef TEST
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
270
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
271 main(int argc, char **argv)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
272 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
273 int i;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
274 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
275 struct dirent *ep;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
276
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
277 for (i = 1; i < argc; ++i) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
278 dir = opendir(argv[i]);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
279 if (!dir)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
280 continue;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
281 while (ep = readdir(dir))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
282 if (strchr("\\/:", argv[i] [strlen(argv[i]) - 1]))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
283 printf("%s%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
284 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
285 printf("%s/%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
286 closedir(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
287 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
288
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
289 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
290 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
291
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
292 #endif
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
293