#include "wimlib/file_io.h"
#include "wimlib/glob.h"
#include "wimlib/error.h"
+#include "wimlib/wildcard.h"
#include "wimlib/util.h"
/* Replacement for POSIX fsync() */
return -1;
}
-/* Replacement for POSIX fnmatch() (partial functionality only) */
-int
-fnmatch(const wchar_t *pattern, const wchar_t *string, int flags)
-{
- if (PathMatchSpecW(string, pattern))
- return 0;
- else
- return FNM_NOMATCH;
-}
-
/* truncate() replacement */
int
win32_truncate_replacement(const wchar_t *path, off_t size)
return do_pread_or_pwrite(fd, (void*)buf, count, offset, true);
}
-#if 0
-/* Dumb Windows implementation of writev(). It writes the vectors one at a
- * time. */
-ssize_t writev(int fd, const struct iovec *iov, int iovcnt)
-{
- ssize_t total_bytes_written = 0;
-
- if (iovcnt <= 0) {
- errno = EINVAL;
- return -1;
- }
- for (int i = 0; i < iovcnt; i++) {
- ssize_t bytes_written;
-
- bytes_written = write(fd, iov[i].iov_base, iov[i].iov_len);
- if (bytes_written >= 0)
- total_bytes_written += bytes_written;
- if (bytes_written != iov[i].iov_len) {
- if (total_bytes_written == 0)
- total_bytes_written = -1;
- break;
- }
- }
- return total_bytes_written;
-}
-#endif
-
int
win32_get_file_and_vol_ids(const wchar_t *path, u64 *ino_ret, u64 *dev_ret)
{
HANDLE hFind;
int ret;
size_t nspaces;
+ int errno_save;
const wchar_t *backslash, *end_slash;
size_t prefix_len;
errno = 0;
return GLOB_NOMATCH;
} else {
- /* The other possible error codes for FindFirstFile()
- * are undocumented. */
- errno = EIO;
+ set_errno_from_win32_error(err);
return GLOB_ABORTED;
}
}
} while (FindNextFileW(hFind, &dat));
err = GetLastError();
CloseHandle(hFind);
- if (err == ERROR_NO_MORE_FILES) {
- errno = 0;
- return 0;
- } else {
- /* Other possible error codes for FindNextFile() are
- * undocumented */
- errno = EIO;
+ if (err != ERROR_NO_MORE_FILES) {
+ set_errno_from_win32_error(err);
ret = GLOB_ABORTED;
goto fail_globfree;
}
+ return 0;
+
oom:
CloseHandle(hFind);
errno = ENOMEM;
ret = GLOB_NOSPACE;
fail_globfree:
+ errno_save = errno;
globfree(pglob);
+ errno = errno_save;
return ret;
}