diff --git a/src/common/io.c b/src/common/io.c index 1c2fb918b..02edf5143 100644 --- a/src/common/io.c +++ b/src/common/io.c @@ -7,6 +7,7 @@ #ifdef _WIN32 #include #else + #include #include #include #endif @@ -231,12 +232,47 @@ void ffSuppressIO(bool suppress) dup2(suppress ? nullFile : origErr, STDERR_FILENO); } -bool ffFileExists(const char* fileName, mode_t mode) +#ifndef _WIN32 +bool ffPathExists(const char* path, FFPathType type) { struct stat fileStat; - return stat(fileName, &fileStat) == 0 && ((fileStat.st_mode & S_IFMT) == mode); + if(stat(path, &fileStat) != 0) + return false; + + int mode = fileStat.st_mode & S_IFMT; + + if(type & FF_PATHTYPE_REGULAR && mode == S_IFREG) + return true; + + if(type & FF_PATHTYPE_DIRECTORY && mode == S_IFDIR) + return true; + + if(type & FF_PATHTYPE_LINK && mode == S_IFLNK) + return true; + + return false; } +#else +bool ffPathExists(const char* path, FFPathType type) +{ + DWORD attr = GetFileAttributesA(path); + if(attr == INVALID_FILE_ATTRIBUTES) + return false; + + if(type & FF_PATHTYPE_REGULAR && !(attr & FILE_ATTRIBUTE_DIRECTORY)) + return true; + + if(type & FF_PATHTYPE_DIRECTORY && (attr & FILE_ATTRIBUTE_DIRECTORY)) + return true; + + if(type & FF_PATHTYPE_LINK && (attr & FILE_ATTRIBUTE_REPARSE_POINT)) + return true; + + return false; +} +#endif + void ffGetTerminalResponse(const char* request, const char* format, ...) { #ifndef WIN32 diff --git a/src/common/io.h b/src/common/io.h index b5446f455..c30765d9c 100644 --- a/src/common/io.h +++ b/src/common/io.h @@ -5,8 +5,6 @@ #include "fastfetch.h" -#include //mode_t, fstat, stat - bool ffWriteFDBuffer(int fd, const FFstrbuf* content); bool ffWriteFileData(const char* fileName, size_t dataSize, const void* data); bool ffWriteFileBuffer(const char* fileName, const FFstrbuf* buffer); @@ -20,7 +18,18 @@ bool ffReadFileBuffer(const char* fileName, FFstrbuf* buffer); bool ffAppendHandleBuffer(HANDLE handle, FFstrbuf* buffer); #endif -bool ffFileExists(const char* fileName, mode_t mode); +//Bit flags, combine with | +typedef enum FFPathType +{ + FF_PATHTYPE_REGULAR = 1, + FF_PATHTYPE_LINK = 2, + FF_PATHTYPE_DIRECTORY = 4 +} FFPathType; + +#define FF_PATHTYPE_FILE (FF_PATHTYPE_REGULAR | FF_PATHTYPE_LINK) +#define FF_PATHTYPE_ANY (FF_PATHTYPE_FILE | FF_PATHTYPE_DIRECTORY) + +bool ffPathExists(const char* path, FFPathType pathType); // Not thread safe! void ffSuppressIO(bool suppress); diff --git a/src/common/settings.c b/src/common/settings.c index 38cbd4b36..6c2725692 100644 --- a/src/common/settings.c +++ b/src/common/settings.c @@ -309,7 +309,7 @@ static const SQLiteData* getSQLiteData(const FFinstance* instance) int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, const char* query) { - if(!ffFileExists(dbPath, S_IFREG)) + if(!ffPathExists(dbPath, FF_PATHTYPE_FILE)) return 0; const SQLiteData* data = getSQLiteData(instance); diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 73ce6eaca..b06569b9d 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -131,7 +131,7 @@ void ffDetectCPUImpl(const FFinstance* instance, FFCPUResult* cpu) cpu->coresOnline = (uint16_t) get_nprocs(); #define BP "/sys/devices/system/cpu/cpufreq/policy0/" - if(ffFileExists(BP, S_IFDIR)) + if(ffPathExists(BP, FF_PATHTYPE_DIRECTORY)) { cpu->frequencyMin = getFrequency(BP"cpuinfo_min_freq", BP"scaling_min_freq"); cpu->frequencyMax = getFrequency(BP"cpuinfo_max_freq", BP"scaling_max_freq"); diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index 4d9d79b6a..b45c06cf9 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -48,7 +48,7 @@ static const char* parseEnv() if( getenv("WAYLAND_DISPLAY") != NULL && - ffFileExists("/mnt/wslg/", S_IFDIR) + ffPathExists("/mnt/wslg/", FF_PATHTYPE_DIRECTORY) ) return "WSLg"; return NULL; diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index ace7d637e..9b8243f3f 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -88,7 +88,7 @@ static uint32_t countFilesRecursiveImpl(FFstrbuf* baseDirPath, const char* filen ffStrbufAppendC(baseDirPath, '/'); ffStrbufAppendS(baseDirPath, filename); - bool exists = ffFileExists(baseDirPath->chars, S_IFREG); + bool exists = ffPathExists(baseDirPath->chars, FF_PATHTYPE_FILE); ffStrbufSubstrBefore(baseDirPath, baseDirPathLength); if(exists) return 1; @@ -129,7 +129,7 @@ static uint32_t countFilesRecursive(FFstrbuf* baseDir, const char* dirname, cons static uint32_t getNixPackagesImpl(char* path) { //Nix detection is kinda slow, so we only do it if the dir exists - if(!ffFileExists(path, S_IFDIR)) + if(!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) return 0; FFstrbuf output; diff --git a/src/detection/terminalfont/terminalfont_android.c b/src/detection/terminalfont/terminalfont_android.c index 6c6a224a0..55e74ea6b 100644 --- a/src/detection/terminalfont/terminalfont_android.c +++ b/src/detection/terminalfont/terminalfont_android.c @@ -62,7 +62,7 @@ void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalSh return; } - if(!ffFileExists(FF_TERMUX_FONT_PATH, S_IFREG)) + if(!ffPathExists(FF_TERMUX_FONT_PATH, FF_PATHTYPE_FILE)) { ffFontInitCopy(&terminalFont->font, "monospace"); return; diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index a8f70620d..2db259ecb 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -219,7 +219,7 @@ static const char* detectWifiWithIoctls(FF_MAYBE_UNUSED const FFinstance* instan for(struct if_nameindex* i = infs; !(i->if_index == 0 && i->if_name == NULL); ++i) { ffStrbufSetF(&path, "/sys/class/net/%s/phy80211", i->if_name); - if(!ffFileExists(path.chars, S_IFDIR)) + if(!ffPathExists(path.chars, FF_PATHTYPE_DIRECTORY)) continue; FFWifiResult* item = (FFWifiResult*)ffListAdd(result); diff --git a/src/fastfetch.c b/src/fastfetch.c index 979f37b62..cd48b0540 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -556,7 +556,7 @@ static void listConfigPaths(FFinstance* instance) FF_LIST_FOR_EACH(FFstrbuf, folder, instance->state.platform.configDirs) { ffStrbufAppendS(folder, "fastfetch/config.conf"); - printf("%s%s\n", folder->chars, ffFileExists(folder->chars, S_IFREG) ? " (*)" : ""); + printf("%s%s\n", folder->chars, ffPathExists(folder->chars, FF_PATHTYPE_FILE) ? " (*)" : ""); } } @@ -640,7 +640,7 @@ static void generateConfigFile(FFinstance* instance, bool force) // Paths generated in `init.c/initConfigDirs` end with `/` ffStrbufAppendS(filename, "fastfetch/config.conf"); - if (!force && ffFileExists(filename->chars, S_IFREG)) + if (!force && ffPathExists(filename->chars, FF_PATHTYPE_FILE)) { fprintf(stderr, "Config file exists in `%s`, use `--gen-config-force` to overwrite\n", filename->chars); exit(1); diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 8eda37811..5f81782cc 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -750,7 +750,7 @@ static bool printImageIfExistsSlowPath(FFinstance* instance, FFLogoType type, bo bool ffLogoPrintImageIfExists(FFinstance* instance, FFLogoType type, bool printError) { - if(!ffFileExists(instance->config.logo.source.chars, S_IFREG & S_IFLNK)) + if(!ffPathExists(instance->config.logo.source.chars, FF_PATHTYPE_FILE)) { if(printError) fprintf(stderr, "Logo: Image source \"%s\" does not exist\n", instance->config.logo.source.chars); diff --git a/src/logo/logo.c b/src/logo/logo.c index 5531a9942..f64f7187f 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -291,7 +291,7 @@ static bool logoPrintData(FFinstance* instance, bool doColorReplacement) { static void updateLogoPath(FFinstance* instance) { - if(ffFileExists(instance->config.logo.source.chars, S_IFREG & S_IFLNK)) + if(ffPathExists(instance->config.logo.source.chars, FF_PATHTYPE_FILE)) return; FFstrbuf fullPath; @@ -304,7 +304,7 @@ static void updateLogoPath(FFinstance* instance) ffStrbufAppendS(&fullPath, "fastfetch/logos/"); ffStrbufAppend(&fullPath, &instance->config.logo.source); - if(ffFileExists(fullPath.chars, S_IFREG & S_IFLNK)) + if(ffPathExists(fullPath.chars, FF_PATHTYPE_FILE)) { ffStrbufSet(&instance->config.logo.source, &fullPath); break;