annotate os2/dirent.c @ 1350:4333b58d879d

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