win32: dirent: handle errors

Previously all error conditions were ignored. Be nice, and set errno
when we should.

Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Erik Faye-Lund 2010-11-23 19:38:27 +01:00 committed by Junio C Hamano
parent 20c6788ace
commit 9585ed519c
2 changed files with 28 additions and 2 deletions

View file

@ -1582,7 +1582,7 @@ struct dirent *mingw_readdir(DIR *dir)
HANDLE handle;
struct mingw_DIR *mdir = (struct mingw_DIR*)dir;
if (!dir->dd_handle) {
if (!dir || !dir->dd_handle) {
errno = EBADF; /* No set_errno for mingw */
return NULL;
}

View file

@ -5,8 +5,29 @@
DIR *opendir(const char *name)
{
int len = strlen(name);
DWORD attrs = GetFileAttributes(name);
int len;
DIR *p;
/* check for valid path */
if (attrs == INVALID_FILE_ATTRIBUTES) {
errno = ENOENT;
return NULL;
}
/* check if it's a directory */
if (!(attrs & FILE_ATTRIBUTE_DIRECTORY)) {
errno = ENOTDIR;
return NULL;
}
/* check that the pattern won't be too long for FindFirstFileA */
len = strlen(name);
if (len + 2 >= MAX_PATH) {
errno = ENAMETOOLONG;
return NULL;
}
p = malloc(sizeof(DIR) + len + 2);
if (!p)
return NULL;
@ -21,6 +42,11 @@ DIR *opendir(const char *name)
}
int closedir(DIR *dir)
{
if (!dir) {
errno = EBADF;
return -1;
}
if (dir->dd_handle != (long)INVALID_HANDLE_VALUE)
FindClose((HANDLE)dir->dd_handle);
free(dir);