about summary refs log tree commit diff
path: root/xdg.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-01-26 15:39:13 -0500
committerJune McEnroe <june@causal.agency>2021-01-28 16:27:10 -0500
commit584e9d2ae22b757393d6784332b5cf8b3b4a1e53 (patch)
treece51c329fb77ad54f8b64018658813ddb183ce54 /xdg.c
parentRefactor hasTag to be usable in more places (diff)
downloadpounce-584e9d2ae22b757393d6784332b5cf8b3b4a1e53.tar.gz
pounce-584e9d2ae22b757393d6784332b5cf8b3b4a1e53.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 'xdg.c')
-rw-r--r--xdg.c38
1 files changed, 13 insertions, 25 deletions
diff --git a/xdg.c b/xdg.c
index 7400d80..67f4ab0 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 "bounce.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;
 }
 
 static 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;