IO: don't require posix specific stuff for ffPathExists

This commit is contained in:
Linus Dierheimer
2023-01-28 11:52:23 +01:00
parent 3b0e1a5833
commit 2c51d55ba2
11 changed files with 62 additions and 17 deletions
+38 -2
View File
@@ -7,6 +7,7 @@
#ifdef _WIN32
#include <fileapi.h>
#else
#include <sys/stat.h>
#include <termios.h>
#include <poll.h>
#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
+12 -3
View File
@@ -5,8 +5,6 @@
#include "fastfetch.h"
#include <sys/stat.h> //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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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");
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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;
@@ -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;
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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;