diff options
| -rw-r--r-- | chat.h | 8 | ||||
| -rw-r--r-- | irc.c | 12 | ||||
| -rw-r--r-- | xdg.c | 55 | 
3 files changed, 34 insertions, 41 deletions
@@ -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); @@ -27,7 +27,6 @@  #include <assert.h>  #include <err.h> -#include <limits.h>  #include <netdb.h>  #include <netinet/in.h>  #include <stdarg.h> @@ -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;  		} @@ -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;  	}  | 
