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.weechat-hashes
parent
1a2a1e59dd
commit
e89e6dda99
37
xdg.c
37
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;
|
||||
|
|
Loading…
Reference in New Issue