From 853830a44643f2ccd5e15e5c8cf93ffc9dc8217f Mon Sep 17 00:00:00 2001 From: flyinghead Date: Wed, 15 Dec 2021 17:55:42 +0100 Subject: [PATCH] log errno when failing to open a disk or folder. Better win32 errors Log errno when failing to open a disk or folder (game scanner) Better win32 error codes with GetLastError() for opendir, stat, access --- core/deps/dirent/dirent.h | 4 +++- core/imgread/cdi.cpp | 9 ++++++--- core/imgread/chd.cpp | 11 +++++++---- core/imgread/cue.cpp | 5 ++++- core/imgread/gdi.cpp | 3 +++ core/oslib/directory.h | 34 ++++++++++++++++++++++++++++++---- 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/core/deps/dirent/dirent.h b/core/deps/dirent/dirent.h index 9531f567f..9896b600f 100644 --- a/core/deps/dirent/dirent.h +++ b/core/deps/dirent/dirent.h @@ -617,7 +617,7 @@ dirent_first( /* Failed to re-open directory: no directory entry in memory */ dirp->cached = 0; datap = NULL; - + dirent_set_errno(GetLastError()); /* Not a valid errno but better than nothing */ } return datap; } @@ -651,6 +651,8 @@ dirent_next( FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; p = NULL; + if (GetLastError() != ERROR_NO_MORE_FILES) + dirent_set_errno(GetLastError()); } } else { diff --git a/core/imgread/cdi.cpp b/core/imgread/cdi.cpp index 23347e356..8f07ca48f 100644 --- a/core/imgread/cdi.cpp +++ b/core/imgread/cdi.cpp @@ -11,7 +11,10 @@ Disc* cdi_parse(const char* file, std::vector *digest) FILE *fsource = nowide::fopen(file, "rb"); if (fsource == nullptr) + { + WARN_LOG(COMMON, "Cannot open file '%s' errno %d", file, errno); throw FlycastException(std::string("Cannot open CDI file ") + file); + } image_s image = { 0 }; track_s track = { 0 }; @@ -78,10 +81,10 @@ Disc* cdi_parse(const char* file, std::vector *digest) #endif if (ft) { - ft=false; + ft = false; Session s; - s.StartFAD=track.pregap_length + track.start_lba; - s.FirstTrack=track.global_current_track; + s.StartFAD = track.pregap_length + track.start_lba; + s.FirstTrack = (u8)track.global_current_track; rv->sessions.push_back(s); } diff --git a/core/imgread/chd.cpp b/core/imgread/chd.cpp index 718a591e3..ac176530c 100644 --- a/core/imgread/chd.cpp +++ b/core/imgread/chd.cpp @@ -84,7 +84,10 @@ void CHDDisc::tryOpen(const char* file) { fp = nowide::fopen(file, "rb"); if (fp == nullptr) + { + WARN_LOG(COMMON, "Cannot open file '%s' errno %d", file, errno); throw FlycastException(std::string("Cannot open CHD file ") + file); + } chd_error err = chd_open_file(fp, CHD_OPEN_READ, 0, &chd); @@ -117,23 +120,23 @@ void CHDDisc::tryOpen(const char* file) char type[16], subtype[16], pgtype[16], pgsub[16]; int tkid=-1, frames=0, pregap=0, postgap=0, padframes=0; - err = chd_get_metadata(chd, CDROM_TRACK_METADATA2_TAG, tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); + err = chd_get_metadata(chd, CDROM_TRACK_METADATA2_TAG, (u32)tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); if (err == CHDERR_NONE) { //"TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d" sscanf(temp, CDROM_TRACK_METADATA2_FORMAT, &tkid, type, subtype, &frames, &pregap, pgtype, pgsub, &postgap); } - else if (CHDERR_NONE== (err = chd_get_metadata(chd, CDROM_TRACK_METADATA_TAG, tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags)) ) + else if (CHDERR_NONE== (err = chd_get_metadata(chd, CDROM_TRACK_METADATA_TAG, (u32)tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags)) ) { //CDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d" sscanf(temp, CDROM_TRACK_METADATA_FORMAT, &tkid, type, subtype, &frames); } else { - err = chd_get_metadata(chd, GDROM_OLD_METADATA_TAG, tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); + err = chd_get_metadata(chd, GDROM_OLD_METADATA_TAG, (u32)tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); if (err != CHDERR_NONE) { - err = chd_get_metadata(chd, GDROM_TRACK_METADATA_TAG, tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); + err = chd_get_metadata(chd, GDROM_TRACK_METADATA_TAG, (u32)tracks.size(), temp, sizeof(temp), &temp_len, &tag, &flags); } if (err == CHDERR_NONE) { diff --git a/core/imgread/cue.cpp b/core/imgread/cue.cpp index f7c5c5343..7cfc2ecd5 100644 --- a/core/imgread/cue.cpp +++ b/core/imgread/cue.cpp @@ -53,7 +53,10 @@ Disc* cue_parse(const char* file, std::vector *digest) FILE *fsource = nowide::fopen(file, "rb"); if (fsource == nullptr) + { + WARN_LOG(COMMON, "Cannot open file '%s' errno %d", file, errno); throw FlycastException(std::string("Cannot open CUE file ") + file); + } size_t cue_len = flycast::fsize(fsource); @@ -107,7 +110,7 @@ Disc* cue_parse(const char* file, std::vector *digest) current_fad += 11400; Session ses; - ses.FirstTrack = disc->tracks.size() + 1; + ses.FirstTrack = (u8)disc->tracks.size() + 1; ses.StartFAD = current_fad; disc->sessions.push_back(ses); DEBUG_LOG(GDROM, "session[%zd]: 1st track: %d FAD:%d", disc->sessions.size(), ses.FirstTrack, ses.StartFAD); diff --git a/core/imgread/gdi.cpp b/core/imgread/gdi.cpp index d7d9b9530..c8271ca4b 100644 --- a/core/imgread/gdi.cpp +++ b/core/imgread/gdi.cpp @@ -64,7 +64,10 @@ Disc* load_gdi(const char* file, std::vector *digest) { FILE *t = nowide::fopen(file, "rb"); if (t == nullptr) + { + WARN_LOG(COMMON, "Cannot open file '%s' errno %d", file, errno); throw FlycastException(std::string("Cannot open GDI file ") + file); + } size_t gdi_len = flycast::fsize(t); diff --git a/core/oslib/directory.h b/core/oslib/directory.h index 912529c7a..11bb915e4 100644 --- a/core/oslib/directory.h +++ b/core/oslib/directory.h @@ -80,18 +80,30 @@ inline int closedir(DIR *dirstream) return ::_wclosedir((_WDIR *)dirstream); } +inline static void _set_errno(int error) +{ +#ifdef _MSC_VER + ::_set_errno (error); +#else + errno = error; +#endif +} + inline int stat(const char *filename, struct stat *buf) { nowide::wstackstring wname; if (!wname.convert(filename)) { - errno = EINVAL; + _set_errno(EINVAL); return -1; } #ifdef TARGET_UWP WIN32_FILE_ATTRIBUTE_DATA attrs; bool rc = GetFileAttributesExFromAppW(wname.c_str(), GetFileExInfoStandard, &attrs); if (!rc) + { + _set_errno(GetLastError()); return -1; + } memset(buf, 0, sizeof(struct stat)); if (attrs.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) buf->st_mode = S_IFDIR; @@ -129,16 +141,27 @@ inline int access(const char *filename, int how) { nowide::wstackstring wname; if (!wname.convert(filename)) { - errno = EINVAL; + _set_errno(EINVAL); return -1; } #ifdef TARGET_UWP WIN32_FILE_ATTRIBUTE_DATA attrs; bool rc = GetFileAttributesExFromAppW(wname.c_str(), GetFileExInfoStandard, &attrs); if (!rc) + { + if (GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_PATH_NOT_FOUND) + _set_errno(ENOENT); + else if (GetLastError() == ERROR_ACCESS_DENIED) + _set_errno(EACCES); + else + _set_errno(GetLastError()); return -1; + } if (how != R_OK && (attrs.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + { + _set_errno(EACCES); return -1; + } else return 0; #else @@ -237,7 +260,10 @@ public: { struct stat st; if (flycast::stat(childPath.c_str(), &st) != 0) + { + WARN_LOG(COMMON, "Cannot stat file '%s' errno 0x%x", childPath.c_str(), errno); continue; + } if (S_ISDIR(st.st_mode)) isDir = true; } @@ -250,7 +276,7 @@ public: DIR *childDir = flycast::opendir(childPath.c_str()); if (childDir == nullptr) { - INFO_LOG(COMMON, "Cannot read directory '%s'", childPath.c_str()); + WARN_LOG(COMMON, "Cannot read subdirectory '%s' errno 0x%x", childPath.c_str(), errno); } else { @@ -275,7 +301,7 @@ public: { DIR *dir = flycast::opendir(root.c_str()); if (dir == nullptr) - INFO_LOG(COMMON, "Cannot read directory '%s'", root.c_str()); + WARN_LOG(COMMON, "Cannot read directory '%s' errno 0x%x", root.c_str(), errno); return {dir, root}; }