1 #include "../git-compat-util.h"
5 struct dirent dd_dir
; /* includes d_type */
6 HANDLE dd_handle
; /* FindFirstFile handle */
7 int dd_stat
; /* 0-based index */
8 char dd_name
[1]; /* extend struct */
11 DIR *opendir(const char *name
)
13 DWORD attrs
= GetFileAttributesA(name
);
17 /* check for valid path */
18 if (attrs
== INVALID_FILE_ATTRIBUTES
) {
23 /* check if it's a directory */
24 if (!(attrs
& FILE_ATTRIBUTE_DIRECTORY
)) {
29 /* check that the pattern won't be too long for FindFirstFileA */
31 if (is_dir_sep(name
[len
- 1]))
33 if (len
+ 2 >= MAX_PATH
) {
38 p
= malloc(sizeof(DIR) + len
+ 2);
42 memset(p
, 0, sizeof(DIR) + len
+ 2);
43 strcpy(p
->dd_name
, name
);
44 p
->dd_name
[len
] = '/';
45 p
->dd_name
[len
+1] = '*';
47 p
->dd_handle
= INVALID_HANDLE_VALUE
;
51 struct dirent
*readdir(DIR *dir
)
56 if (!dir
|| !dir
->dd_handle
) {
57 errno
= EBADF
; /* No set_errno for mingw */
61 if (dir
->dd_handle
== INVALID_HANDLE_VALUE
&& dir
->dd_stat
== 0) {
63 handle
= FindFirstFileA(dir
->dd_name
, &buf
);
64 lasterr
= GetLastError();
65 dir
->dd_handle
= handle
;
66 if (handle
== INVALID_HANDLE_VALUE
&& (lasterr
!= ERROR_NO_MORE_FILES
)) {
67 errno
= err_win_to_posix(lasterr
);
70 } else if (dir
->dd_handle
== INVALID_HANDLE_VALUE
) {
72 } else if (!FindNextFileA(dir
->dd_handle
, &buf
)) {
73 DWORD lasterr
= GetLastError();
74 FindClose(dir
->dd_handle
);
75 dir
->dd_handle
= INVALID_HANDLE_VALUE
;
76 /* POSIX says you shouldn't set errno when readdir can't
77 find any more files; so, if another error we leave it set. */
78 if (lasterr
!= ERROR_NO_MORE_FILES
)
79 errno
= err_win_to_posix(lasterr
);
83 /* We get here if `buf' contains valid data. */
84 strcpy(dir
->dd_dir
.d_name
, buf
.cFileName
);
87 /* Set file type, based on WIN32_FIND_DATA */
88 dir
->dd_dir
.d_type
= 0;
89 if (buf
.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
90 dir
->dd_dir
.d_type
|= DT_DIR
;
92 dir
->dd_dir
.d_type
|= DT_REG
;
97 int closedir(DIR *dir
)
104 if (dir
->dd_handle
!= INVALID_HANDLE_VALUE
)
105 FindClose(dir
->dd_handle
);