diff options
author | June McEnroe <june@causal.agency> | 2021-01-26 15:39:13 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2021-04-03 18:06:10 -0400 |
commit | 299763d948cd31522b357f011a8c148b0cf2fe83 (patch) | |
tree | aba591ce7e80afc9497bfad5b01312ff1b4d3ac2 | |
parent | Skip STATUSMSG prefixes (diff) | |
download | litterbox-299763d948cd31522b357f011a8c148b0cf2fe83.tar.gz litterbox-299763d948cd31522b357f011a8c148b0cf2fe83.zip |
Tighten up XDG base directory path handling
Don't search base directories if path starts with "/", "./" or "../", but still do if the path simply starts with ".". Bail early if HOME is needed but unset. Don't attempt to open the original path in configOpen and dataOpen.
-rw-r--r-- | xdg.c | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/xdg.c b/xdg.c index 00cd021..c22bc0a 100644 --- a/xdg.c +++ b/xdg.c @@ -32,6 +32,7 @@ #include <stdlib.h> #include <string.h> #include <sys/stat.h> +#include <sysexits.h> #include "database.h" @@ -71,7 +72,7 @@ basePath(struct Base base, const char **dirs, const char *path) { return buf; } - if (path[0] == '/' || path[0] == '.') { + if (path[strspn(path, ".")] == '/') { *dirs = ""; return path; } @@ -89,7 +90,7 @@ basePath(struct Base base, const char **dirs, const char *path) { home, base.defHome, path ); } else { - return NULL; + errx(EX_CONFIG, "HOME unset"); } return buf; } @@ -98,8 +99,7 @@ const char *configPath(const char **dirs, const char *path) { return basePath(Config, dirs, path); } -const char * -dataPath(const char **dirs, const char *path) { +const char *dataPath(const char **dirs, const char *path) { return basePath(Data, dirs, path); } @@ -110,17 +110,16 @@ FILE *configOpen(const char *path, const char *mode) { if (file) return file; if (errno != ENOENT) warn("%s", abs); } - FILE *file = fopen(path, mode); - if (!file) warn("%s", path); - return file; + dirs = NULL; + warn("%s", configPath(&dirs, path)); + return NULL; } void dataMkdir(const char *path) { const char *dirs = NULL; - const char *abs = dataPath(&dirs, path); - if (!abs) return; - int error = mkdir(abs, S_IRWXU); - if (error && errno != EEXIST) warn("%s", abs); + path = dataPath(&dirs, path); + int error = mkdir(path, S_IRWXU); + if (error && errno != EEXIST) warn("%s", path); } FILE *dataOpen(const char *path, const char *mode) { @@ -130,20 +129,9 @@ FILE *dataOpen(const char *path, const char *mode) { if (file) return file; if (errno != ENOENT) warn("%s", abs); } - - if (mode[0] != 'r') { - dataMkdir(""); - dirs = NULL; - path = dataPath(&dirs, path); - if (!path) { - warn("HOME unset"); - return NULL; - } - FILE *file = fopen(path, mode); - if (!file) warn("%s", path); - return file; - } - + if (mode[0] != 'r') dataMkdir(""); + dirs = NULL; + path = dataPath(&dirs, path); FILE *file = fopen(path, mode); if (!file) warn("%s", path); return file; |