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.
Diffstat (limited to '')
-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; |