From 8190d76086e57a4b07e7ed39af3748a470f53b89 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 21 Aug 2020 16:47:54 -0400 Subject: Use a static buffer for base directory paths --- chat.h | 8 ++------ irc.c | 12 ++++-------- xdg.c | 55 ++++++++++++++++++++++++++++--------------------------- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/chat.h b/chat.h index 6b4de93..1ac37b9 100644 --- a/chat.h +++ b/chat.h @@ -294,12 +294,8 @@ void logFormat(uint id, const time_t *time, const char *format, ...) __attribute__((format(printf, 3, 4))); void logClose(void); -const char *configPath( - char *buf, size_t cap, const char **dirs, const char *path -); -const char *dataPath( - char *buf, size_t cap, const char **dirs, const char *path -); +const char *configPath(const char **dirs, const char *path); +const char *dataPath(const char **dirs, const char *path); FILE *configOpen(const char *path, const char *mode); FILE *dataOpen(const char *path, const char *mode); void dataMkdir(const char *path); diff --git a/irc.c b/irc.c index b87351c..5acc69f 100644 --- a/irc.c +++ b/irc.c @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -61,12 +60,9 @@ void ircConfig(bool insecure, const char *cert, const char *priv) { tls_config_insecure_noverifyname(config); } - const char *path; - const char *dirs; - char buf[PATH_MAX]; if (cert) { - dirs = NULL; - while (NULL != (path = configPath(buf, sizeof(buf), &dirs, cert))) { + const char *dirs = NULL; + for (const char *path; NULL != (path = configPath(&dirs, cert));) { if (priv) { error = tls_config_set_cert_file(config, path); } else { @@ -77,8 +73,8 @@ void ircConfig(bool insecure, const char *cert, const char *priv) { if (error) errx(EX_NOINPUT, "%s: %s", cert, tls_config_error(config)); } if (priv) { - dirs = NULL; - while (NULL != (path = configPath(buf, sizeof(buf), &dirs, priv))) { + const char *dirs = NULL; + for (const char *path; NULL != (path = configPath(&dirs, priv));) { error = tls_config_set_key_file(config, path); if (!error) break; } diff --git a/xdg.c b/xdg.c index a92bc6d..c706e87 100644 --- a/xdg.c +++ b/xdg.c @@ -58,14 +58,14 @@ static const struct Base Data = { .defDirs = "/usr/local/share:/usr/share", }; -static const char *basePath( - struct Base base, - char *buf, size_t cap, const char **dirs, const char *path -) { +static const char * +basePath(struct Base base, const char **dirs, const char *path) { + static char buf[PATH_MAX]; + if (*dirs) { if (!**dirs) return NULL; size_t len = strcspn(*dirs, ":"); - snprintf(buf, cap, "%.*s/" SUBDIR "/%s", (int)len, *dirs, path); + snprintf(buf, sizeof(buf), "%.*s/" SUBDIR "/%s", (int)len, *dirs, path); *dirs += len; if (**dirs) *dirs += 1; return buf; @@ -82,29 +82,30 @@ static const char *basePath( const char *home = getenv("HOME"); const char *baseHome = getenv(base.envHome); if (baseHome) { - snprintf(buf, cap, "%s/" SUBDIR "/%s", baseHome, path); + snprintf(buf, sizeof(buf), "%s/" SUBDIR "/%s", baseHome, path); + } else if (home) { + snprintf( + buf, sizeof(buf), "%s/%s/" SUBDIR "/%s", + home, base.defHome, path + ); } else { - if (!home) return NULL; - snprintf(buf, cap, "%s/%s/" SUBDIR "/%s", home, base.defHome, path); + return NULL; } return buf; } -const char * -configPath(char *buf, size_t cap, const char **dirs, const char *path) { - return basePath(Config, buf, cap, dirs, path); +const char *configPath(const char **dirs, const char *path) { + return basePath(Config, dirs, path); } const char * -dataPath(char *buf, size_t cap, const char **dirs, const char *path) { - return basePath(Data, buf, cap, dirs, path); +dataPath(const char **dirs, const char *path) { + return basePath(Data, dirs, path); } FILE *configOpen(const char *path, const char *mode) { - const char *abs; - char buf[PATH_MAX]; const char *dirs = NULL; - while (NULL != (abs = configPath(buf, sizeof(buf), &dirs, path))) { + for (const char *abs; NULL != (abs = configPath(&dirs, path));) { FILE *file = fopen(abs, mode); if (file) return file; if (errno != ENOENT) warn("%s", abs); @@ -115,31 +116,31 @@ FILE *configOpen(const char *path, const char *mode) { } void dataMkdir(const char *path) { - char buf[PATH_MAX]; const char *dirs = NULL; - const char *abs = dataPath(buf, sizeof(buf), &dirs, path); + const char *abs = dataPath(&dirs, path); + if (!abs) return; int error = mkdir(abs, S_IRWXU); if (error && errno != EEXIST) warn("%s", abs); } FILE *dataOpen(const char *path, const char *mode) { - const char *abs; - char buf[PATH_MAX]; const char *dirs = NULL; - while (NULL != (abs = dataPath(buf, sizeof(buf), &dirs, path))) { + for (const char *abs; NULL != (abs = dataPath(&dirs, path));) { FILE *file = fopen(abs, mode); if (file) return file; if (errno != ENOENT) warn("%s", abs); } if (mode[0] != 'r') { - dirs = NULL; - abs = dataPath(buf, sizeof(buf), &dirs, path); - if (!abs) return NULL; - dataMkdir(""); - FILE *file = fopen(abs, mode); - if (!file) warn("%s", abs); + 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; } -- cgit 1.4.1