21
21
* it under the terms of the GNU General Public License as published by
22
22
* the Free Software Foundation; either version 2 of the License, or
23
23
* (at your option) any later version.
25
25
* This program is distributed in the hope that it will be useful,
26
26
* but WITHOUT ANY WARRANTY; without even the implied warranty of
27
27
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28
28
* GNU General Public License for more details.
30
30
* You should have received a copy of the GNU General Public License
31
31
* along with this program; if not, write to the Free Software
32
32
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
38
38
* This file is a part of the mingw-runtime package.
39
39
* No warranty is given; refer to the file DISCLAIMER within the package.
41
* Derived from DIRLIB.C by Matt J. Weinstein
41
* Derived from DIRLIB.C by Matt J. Weinstein
42
42
* This note appears in the DIRLIB.H
43
43
* DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89
45
45
* Updated by Jeremy Bettis <jeremy@hksys.com>
46
46
* Significantly revised and rewinddir, seekdir and telldir added by Colin
47
47
* Peters <colin@fu.is.saga-u.ac.jp>
87
87
if (szPath[0] == '\0') {
91
91
/* Attempt to determine if the given path really is a directory. */
92
92
rc = GetFileAttributes(szPath);
93
93
if (rc == (unsigned int) -1) {
94
/* call GetLastError for more error info */
94
/* call GetLastError for more error info */
98
98
if (!(rc & FILE_ATTRIBUTE_DIRECTORY)) {
99
/* Error, entry exists but not a directory. */
99
/* Error, entry exists but not a directory. */
103
103
/* Make an absolute pathname. */
104
104
_fullpath(szFullPath, szPath, MAX_PATH);
106
106
/* Allocate enough space to store DIR structure and the complete
107
107
* directory path given. */
108
108
nd = (DIR *) malloc(sizeof(DIR) + (strlen(szFullPath)
110
+ strlen(SUFFIX) + 1)
110
+ strlen(SUFFIX) + 1)
114
/* Error, out of memory. */
114
/* Error, out of memory. */
118
118
/* Create the search expression. */
119
119
strcpy(nd->dd_name, szFullPath);
121
121
/* Add on a slash if the path does not end with one. */
122
122
if (nd->dd_name[0] != '\0'
123
&& strchr(nd->dd_name, '/') != nd->dd_name
124
+ strlen(nd->dd_name) - 1
125
&& strchr(nd->dd_name, '\\') != nd->dd_name
126
+ strlen(nd->dd_name) - 1) {
127
strcat(nd->dd_name, SLASH);
123
&& strchr(nd->dd_name, '/') != nd->dd_name
124
+ strlen(nd->dd_name) - 1
125
&& strchr(nd->dd_name, '\\') != nd->dd_name
126
+ strlen(nd->dd_name) - 1) {
127
strcat(nd->dd_name, SLASH);
129
129
/* Add on the search pattern */
130
130
strcat(nd->dd_name, SUFFIX);
155
155
* next entry in the directory.
158
readdir(DIR * dirp) {
162
161
/* Check for valid DIR struct. */
165
return (struct dirent *) 0;
164
return (struct dirent *) 0;
167
166
if (dirp->dd_stat < 0) {
168
/* We have already returned all files in the directory
169
* (or the structure has an invalid dd_stat). */
170
return (struct dirent *) 0;
167
/* We have already returned all files in the directory
168
* (or the structure has an invalid dd_stat). */
169
return (struct dirent *) 0;
171
170
} else if (dirp->dd_stat == 0) {
172
/* We haven't started the search yet. */
173
/* Start the search */
174
dirp->dd_handle = _findfirst(dirp->dd_name, &(dirp->dd_dta));
171
/* We haven't started the search yet. */
172
/* Start the search */
173
dirp->dd_handle = _findfirst(dirp->dd_name, &(dirp->dd_dta));
176
if (dirp->dd_handle == -1) {
177
/* Whoops! Seems there are no files in that
175
if (dirp->dd_handle == -1) {
176
/* Whoops! Seems there are no files in that
184
/* Get the next search entry. */
185
if (_findnext(dirp->dd_handle, &(dirp->dd_dta))) {
186
/* We are off the end or otherwise error.
187
* _findnext sets errno to ENOENT if no more file
189
DWORD winerr = GetLastError();
190
if (winerr == ERROR_NO_MORE_FILES)
192
_findclose(dirp->dd_handle);
193
dirp->dd_handle = -1;
196
/* Update the status to indicate the correct
183
/* Get the next search entry. */
184
if (_findnext(dirp->dd_handle, &(dirp->dd_dta))) {
185
/* We are off the end or otherwise error.
186
* _findnext sets errno to ENOENT if no more file
188
DWORD winerr = GetLastError();
189
if (winerr == ERROR_NO_MORE_FILES)
191
_findclose(dirp->dd_handle);
192
dirp->dd_handle = -1;
195
/* Update the status to indicate the correct
202
201
if (dirp->dd_stat > 0) {
203
/* Successfully got an entry. Everything about the file is
204
* already appropriately filled in except the length of the
206
dirp->dd_dir.d_namlen = strlen(dirp->dd_dta.name);
207
strcpy(dirp->dd_dir.d_name, dirp->dd_dta.name);
208
return &dirp->dd_dir;
202
/* Successfully got an entry. Everything about the file is
203
* already appropriately filled in except the length of the
205
dirp->dd_dir.d_namlen = strlen(dirp->dd_dta.name);
206
strcpy(dirp->dd_dir.d_name, dirp->dd_dta.name);
207
return &dirp->dd_dir;
210
209
return (struct dirent *) 0;
299
/* Seeking to an invalid position. */
298
/* Seeking to an invalid position. */
302
301
} else if (lPos == -1) {
304
if (dirp->dd_handle != -1) {
305
_findclose(dirp->dd_handle);
307
dirp->dd_handle = -1;
303
if (dirp->dd_handle != -1) {
304
_findclose(dirp->dd_handle);
306
dirp->dd_handle = -1;
310
/* Rewind and read forward to the appropriate index. */
309
/* Rewind and read forward to the appropriate index. */
313
while ((dirp->dd_stat < lPos) && readdir(dirp));
312
while ((dirp->dd_stat < lPos) && readdir(dirp));
316
315
#endif /* _SQUID_MSWIN_ */