diff options
author | C. McEnroe | 2021-01-26 15:39:13 -0500 |
---|---|---|
committer | C. McEnroe | 2021-01-26 15:51:40 -0500 |
commit | e89e6dda99fbc3d0d952da5692014326f8cf7a74 (patch) | |
tree | 276955f47f690eccda6956fd6bd928300c4e4698 | |
parent | 1a2a1e59ddc0fbe74cfa3a74833bc2950f73db02 (diff) |
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 | 37 |
1 files changed, 12 insertions, 25 deletions
diff --git a/xdg.c b/xdg.c index c706e87..b206427 100644 --- a/xdg.c +++ b/xdg.c @@ -71,7 +71,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 +89,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 +98,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 +109,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 +128,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; |