annotate os2/dirent.c @ 456:935436731b41

Hybrid fix, seems the last change illiminated some important code that dealt with varying padding sizes in the opposite direction of the box. This readds that code but optimizes it and includes the groupbox calculations that were already present in the previous code path. This fix will be added to the OS/2 tree as well pending testing of this new code path.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 25 Jun 2003 03:39:44 +0000
parents 0e6f09149eaa
children 2ff26b697877
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
24
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
6 #include "platform/dirent.h"
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
7 #include <errno.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
8
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
9 /*#ifndef __EMX__
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
10 #include <libx.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
11 #endif */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
12
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
13 #define INCL_DOSFILEMGR
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
14 #define INCL_DOSERRORS
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
15 #include <os2.h>
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
16
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 */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
62 static char
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
63 getFSType(const char *path)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
64 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
65 static char cache[1+26];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
66 char drive[3], info[512];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
67 Word unit, infolen;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
68 char r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
69
289
0e6f09149eaa Fixed some EMX warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 174
diff changeset
70 if (isalpha((int)path[0]) && path[1] == ':') {
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
71 unit = toupper(path[0]) - '@';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
72 path += 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
73 } else {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
74 ULONG driveMap;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
75 if (DosQueryCurrentDisk(&unit, &driveMap))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
76 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
77 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
78
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
79 if ((path[0] == '\\' || path[0] == '/')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
80 && (path[1] == '\\' || path[1] == '/'))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
81 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
82
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
83 if (cache [unit])
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
84 return cache [unit];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
85
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
86 drive[0] = '@' + unit;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
87 drive[1] = ':';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
88 drive[2] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
89 infolen = sizeof info;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
90 if (DosQueryFSAttach(drive, 0, FSAIL_QUERYNAME, (PVOID)info, &infolen))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
91 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
92 if (infolen >= sizeof(FSQBUFFER2)) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
93 FSQBUFFER2 *p = (FSQBUFFER2 *)info;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
94 r = p->szFSDName[p->cbName];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
95 } else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
96 r = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
97 return cache [unit] = r;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
98 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
99
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
100 char *
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
101 _abs_path(const char *name, char *buffer, int len)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
102 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
103 char buf[4];
289
0e6f09149eaa Fixed some EMX warnings.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 174
diff changeset
104 if (isalpha((int)name[0]) && name[1] == ':' && name[2] == '\0') {
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
105 buf[0] = name[0];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
106 buf[1] = name[1];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
107 buf[2] = '.';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
108 buf[3] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
109 name = buf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
110 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
111 if (DosQueryPathInfo((PSZ)name, FIL_QUERYFULLNAME, buffer, len))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
112 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
113 return buffer;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
114 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
115
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
116 DIR *
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
117 _openxdir(const char *path, unsigned att_mask)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
118 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
119 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
120 char name[MAXPATHLEN+3];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
121 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
122
24
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
123 if(!path)
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
124 return NULL;
d9e87e8bcf1d Updated dynamic windows to build with EMX.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 3
diff changeset
125
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
126 dir = malloc(sizeof(DIR));
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
127 if (dir == NULL) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
128 errno = ENOMEM;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
129 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
130 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
131
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
132 strncpy(name, path, MAXPATHLEN);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
133 name[MAXPATHLEN] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
134 switch (name[strlen(name)-1]) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
135 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
136 strcat(name, "\\");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
137 case '\\':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
138 case '/':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
139 case ':':
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
140 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
141 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
142 strcat(name, ".");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
143 if (!abs_path(name, dir->name, MAXPATHLEN+1))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
144 strcpy(dir->name, name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
145 if (dir->name[strlen(dir->name)-1] == '\\')
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
146 strcat(dir->name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
147 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
148 strcat(dir->name, "\\*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
149
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
150 dir->fstype = getFSType(dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
151 dir->attrmask = att_mask | A_DIR;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
152
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
153 dir->handle = HDIR_CREATE;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
154 dir->count = 100;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
155 rc = DosFindFirst(dir->name, &dir->handle, dir->attrmask,
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
156 dir->ffbuf, sizeof dir->ffbuf, &dir->count, FIL_STANDARD);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
157 switch (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
158 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
159 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
160 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
161 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
162 case NO_ERROR:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
163 case ERROR_NO_MORE_FILES:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
164 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
165 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
166
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
167 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
168 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
169 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
170
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
171 return (DIR *)dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
172 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
173
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
174 DIR *
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
175 _opendir(const char *pathname)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
176 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
177 return openxdir(pathname, 0);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
178 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
179
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
180 struct dirent *
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
181 _readdir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
182 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
183 static int dummy_ino = 2;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
184
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
185 if (dir->index == dir->count) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
186 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
187 dir->count = 100;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
188 rc = DosFindNext(dir->handle, dir->ffbuf,
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
189 sizeof dir->ffbuf, &dir->count);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
190 if (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
191 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
192 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
193 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
194
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
195 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
196 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
197 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
198
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
199 if (dir->index == dir->count)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
200 return NULL;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
201
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
202 memcpy(dir->entry.d_name, dir->next->achName, dir->next->cchName);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
203 dir->entry.d_name[dir->next->cchName] = '\0';
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
204 dir->entry.d_ino = dummy_ino++;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
205 dir->entry.d_reclen = dir->next->cchName;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
206 dir->entry.d_namlen = dir->next->cchName;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
207 dir->entry.d_size = dir->next->cbFile;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
208 dir->entry.d_attribute = dir->next->attrFile;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
209 dir->entry.d_time = *(USHORT *)&dir->next->ftimeLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
210 dir->entry.d_date = *(USHORT *)&dir->next->fdateLastWrite;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
211
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
212 switch (dir->fstype) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
213 case 'F': /* FAT */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
214 case 'C': /* CDFS */
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
215 if (dir->next->attrFile & FILE_DIRECTORY)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
216 strupr(dir->entry.d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
217 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
218 strlwr(dir->entry.d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
219 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
220
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
221 dir->next = (FFBUF *)((BYTE *)dir->next + dir->next->oNextEntryOffset);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
222 ++dir->number;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
223 ++dir->index;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
224
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
225 return &dir->entry;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
226 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
227
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
228 long
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
229 _telldir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
230 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
231 return dir->number;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
232 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
233
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
234 void
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
235 _seekdir(DIR *dir, long off)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
236 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
237 if (dir->number > off) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
238 char name[MAXPATHLEN+2];
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
239 Word rc;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
240
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
241 DosFindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
242
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
243 strcpy(name, dir->name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
244 strcat(name, "*");
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
245
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
246 dir->handle = HDIR_CREATE;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
247 dir->count = 32767;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
248 rc = DosFindFirst(name, &dir->handle, dir->attrmask,
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
249 dir->ffbuf, sizeof dir->ffbuf, &dir->count, FIL_STANDARD);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
250 switch (rc) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
251 default:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
252 error(rc);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
253 return;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
254 case NO_ERROR:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
255 case ERROR_NO_MORE_FILES:
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
256 ;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
257 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
258
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
259 dir->number = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
260 dir->index = 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
261 dir->next = (FFBUF *)dir->ffbuf;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
262 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
263
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
264 while (dir->number < off && readdir(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 void
174
75bf3051235f Fixes so you can mix compilers.
bsmith@81767d24-ef19-dc11-ae90-00e081727c95
parents: 24
diff changeset
269 _closedir(DIR *dir)
3
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
270 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
271 DosFindClose(dir->handle);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
272 free(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
273 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
274
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
275 /*****************************************************************************/
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
276
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
277 #ifdef TEST
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
278
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
279 main(int argc, char **argv)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
280 {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
281 int i;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
282 DIR *dir;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
283 struct dirent *ep;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
284
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
285 for (i = 1; i < argc; ++i) {
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
286 dir = opendir(argv[i]);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
287 if (!dir)
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
288 continue;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
289 while (ep = readdir(dir))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
290 if (strchr("\\/:", argv[i] [strlen(argv[i]) - 1]))
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
291 printf("%s%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
292 else
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
293 printf("%s/%s\n", argv[i], ep->d_name);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
294 closedir(dir);
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
295 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
296
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
297 return 0;
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
298 }
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
299
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
300 #endif
ktk@81767d24-ef19-dc11-ae90-00e081727c95
parents:
diff changeset
301