diff --git a/qse/Makefile.in b/qse/Makefile.in index fd1fe0a1..ac445d01 100644 --- a/qse/Makefile.in +++ b/qse/Makefile.in @@ -34,7 +34,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/README.in \ $(top_srcdir)/configure ac/config.guess ac/config.sub \ ac/depcomp ac/install-sh ac/ltmain.sh ac/missing diff --git a/qse/include/qse/fs/dir.h b/qse/include/qse/fs/dir.h index 790039cc..c4a2b84e 100644 --- a/qse/include/qse/fs/dir.h +++ b/qse/include/qse/fs/dir.h @@ -30,7 +30,11 @@ enum qse_dir_errnum_t QSE_DIR_EINTERN, QSE_DIR_ENOMEM, - QSE_DIR_EINVAL + QSE_DIR_EINVAL, + QSE_DIR_EACCES, + QSE_DIR_ENOENT, + QSE_DIR_ENOTDIR, + QSE_DIR_ESYSTEM }; typedef enum qse_dir_errnum_t qse_dir_errnum_t; diff --git a/qse/lib/fs/dir.c b/qse/lib/fs/dir.c index 6960f079..48f690c7 100644 --- a/qse/lib/fs/dir.c +++ b/qse/lib/fs/dir.c @@ -33,6 +33,7 @@ # include # include # include +# include #endif typedef struct info_t info_t; @@ -157,7 +158,7 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) if (name[0] == QSE_T('\0')) { - /* dir->errnum = QSE_DIR_EINVAL; */ + dir->errnum = QSE_DIR_EINVAL; return -1; } @@ -165,7 +166,11 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) if (info == QSE_NULL) { info = QSE_MMGR_ALLOC (dir->mmgr, QSE_SIZEOF(*info)); - if (info == QSE_NULL) return -1; + if (info == QSE_NULL) + { + dir->errnum = QSE_DIR_ENOMEM; + return -1; + } QSE_MEMSET (info, 0, QSE_SIZEOF(*info)); #if defined(_WIN32) @@ -185,7 +190,7 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) dirname = qse_stradup (tmp_name, dir->mmgr); if (dirname == QSE_NULL) { - /* dir->errnum = QSE_DIR_ENOMEM; */ + dir->errnum = QSE_DIR_ENOMEM; return -1; } @@ -197,7 +202,12 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) handle = FindFirstFile (dirname, &wfd); if (handle == INVALID_HANDLE_VALUE) { - /* dir->errnum = QSE_DIR_ESYSTEM; */ + DWORD e = GetLastError(); + dir->errnum = (e == ERROR_ACCESS_DENIED)? QSE_DIR_EACCES: + (e == ERROR_FILE_NOT_FOUND)? QSE_DIR_ENOENT: + (e == ERROR_INVALID_NAME)? QSE_DIR_EINVAL: + (e == ERROR_DIRECTORY)? QSE_DIR_EINVAL: + QSE_DIR_ESYSTEM; QSE_MMGR_FREE (dir->mmgr, dirname); return -1; } @@ -222,7 +232,7 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) dirname = qse_strdup (name, dir->mmgr); if (dirname == QSE_NULL) { - /* dir->errnum = QSE_DIR_ENOMEM; */ + dir->errnum = QSE_DIR_ENOMEM; return -1; } @@ -234,7 +244,7 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) mbsdirname = qse_wcstombsdup (name, dir->mmgr); if (mbsdirname == QSE_NULL) { - /* dir->errnum = QSE_DIR_ENOMEM */ + dir->errnum = QSE_DIR_ENOMEM; QSE_MMGR_FREE (dir->mmgr, dirname); return -1; } @@ -250,7 +260,12 @@ int qse_dir_change (qse_dir_t* dir, const qse_char_t* name) if (handle == QSE_NULL) { - /* dir->errnum = QSE_DIR... */ + dir->errnum = (errno == EACCES)? QSE_DIR_EACCES: + (errno == ENOENT)? QSE_DIR_ENOENT: + (errno == ENOTDIR)? QSE_DIR_ENOTDIR: + (errno == ENOMEM)? QSE_DIR_ENOMEM: + QSE_DIR_ESYSTEM; + QSE_MMGR_FREE (dir->mmgr, dirname); return -1; } @@ -305,7 +320,7 @@ static int set_entry_name (qse_dir_t* dir, const qse_mchar_t* name) ); if (tmp == QSE_NULL) { - /* dir->errnum = QSE_DIR_ENOMEM; */ + dir->errnum = QSE_DIR_ENOMEM; return -1; } @@ -341,9 +356,7 @@ qse_dir_ent_t* qse_dir_read (qse_dir_t* dir) if (info->no_more_files) { - /* - dir->errnum = QSE_DIR_ENOENT; - */ + dir->errnum = QSE_DIR_ENOERR; return QSE_NULL; } @@ -368,7 +381,20 @@ qse_dir_ent_t* qse_dir_read (qse_dir_t* dir) if (FindNextFile (info->handle, &info->wfd) == FALSE) { /*if (GetLastError() == ERROR_NO_MORE_FILES) */ - info->no_more_files = 1; + DWORD e = GetLastError(); + if (e == ERROR_NO_MORE_FILES) + { + info->no_more_files = 1; + } + else + { + dir->errnum = (e == ERROR_ACCESS_DENIED)? QSE_DIR_EACCES: + (e == ERROR_FILE_NOT_FOUND)? QSE_DIR_ENOENT: + (e == ERROR_INVALID_NAME)? QSE_DIR_EINVAL: + (e == ERROR_DIRECTORY)? QSE_DIR_EINVAL: + QSE_DIR_ESYSTEM; + return QSE_NULL; + } } #elif defined(__OS2__) # error NOT IMPLEMENTED @@ -380,7 +406,7 @@ qse_dir_ent_t* qse_dir_read (qse_dir_t* dir) ent = readdir (info->handle); if (ent == QSE_NULL) { - /* TODO: dir->errnum = ... */ + /*dir->errnum = QSE_DIR_ENOENT;*/ /* TODO: to be more specific */ return QSE_NULL; } @@ -447,6 +473,10 @@ const qse_char_t* qse_dir_geterrmsg (qse_dir_t* dir) QSE_T("insufficient memory"), QSE_T("invalid parameter or data"), + QSE_T("permission denined"), + QSE_T("no such entry"), + QSE_T("not a directory"), + QSE_T("system error") }; return (dir->errnum >= 0 && dir->errnum < QSE_COUNTOF(errstr))?