From 6586ea650597ae0563c4234a7658499ce1e0117b Mon Sep 17 00:00:00 2001
From: David Härdeman <david@hardeman.nu>
Date: Sun, 12 Jul 2020 14:04:40 +0200
Subject: Teach minecproxy to use same dirs as minecctl, step 1

---
 minecctl/misc-commands.c |  9 ++++---
 minecctl/misc.c          | 69 ------------------------------------------------
 minecctl/misc.h          | 14 ----------
 minecctl/server.c        | 46 +++++---------------------------
 4 files changed, 11 insertions(+), 127 deletions(-)

(limited to 'minecctl')

diff --git a/minecctl/misc-commands.c b/minecctl/misc-commands.c
index db9b937..3ad9792 100644
--- a/minecctl/misc-commands.c
+++ b/minecctl/misc-commands.c
@@ -69,6 +69,7 @@ static bool write_cfg_file(int dfd, const char *name,
 static bool find_user_service(int xfd, const char *service)
 {
 	_cleanup_close_ int dfd = -1;
+	_cleanup_free_ char *dpath = NULL;
 	/* FIXME: Make this a macro, make paths #defines */
 	char sub_path[STRLEN("systemd/user/") + strlen(service) + 1];
 	char etc_path[STRLEN("/etc/systemd/user/") + strlen(service) + 1];
@@ -98,11 +99,11 @@ static bool find_user_service(int xfd, const char *service)
 		return true;
 	}
 
-	dfd = open_xdg_data_dir(false);
+	dfd = open_xdg_data_dir(false, &dpath);
 	if (dfd >= 0) {
 		if (faccessat(dfd, sub_path, R_OK, 0) == 0) {
 			info("User service %s already installed in "
-			     "$XDG_DATA_HOME/systemd/user/", service);
+			     "%s/systemd/user/", service, dpath);
 			return true;
 		}
 	}
@@ -187,7 +188,7 @@ bool do_init(_unused_ struct cfg *cfg)
 	_cleanup_close_ int xdfd = -1;
 	_cleanup_close_ int mdfd = -1;
 
-	xcfd = open_xdg_cfg_dir(true);
+	xcfd = open_xdg_cfg_dir(true, NULL);
 	if (xcfd < 0)
 		return false;
 
@@ -215,7 +216,7 @@ bool do_init(_unused_ struct cfg *cfg)
 				 ___examples_minecproxy_service_len))
 		return false;
 
-	xdfd = open_xdg_data_dir(true);
+	xdfd = open_xdg_data_dir(true, NULL);
 	if (xdfd < 0)
 		return false;
 
diff --git a/minecctl/misc.c b/minecctl/misc.c
index 90189dc..72c711a 100644
--- a/minecctl/misc.c
+++ b/minecctl/misc.c
@@ -8,81 +8,12 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <pwd.h>
 #include <errno.h>
 
 #include "shared/utils.h"
 #include "misc.h"
 #include "minecctl.h"
 
-static const char *get_homedir()
-{
-	const char *e;
-        struct passwd *passwd;
-        uid_t uid;
-
-	e = getenv("HOME");
-	if (e && e[0] == '/')
-		return e;
-
-	uid = getuid();
-	if (uid == 0)
-		return "/root";
-
-        passwd = getpwuid(uid);
-	if (passwd && passwd->pw_dir[0] == '/')
-		return passwd->pw_dir;
-
-	return NULL;
-}
-
-int open_subdir(int dfd, const char *subdir, bool nofail)
-{
-	int sfd;
-
-	if (nofail && mkdirat(dfd, subdir, 0777) < 0 && errno != EEXIST) {
-		error("Unable to create subdirectory %s: %m", subdir);
-		return -1;
-	}
-
-	sfd = openat(dfd, subdir, O_PATH | O_CLOEXEC | O_DIRECTORY);
-	if (sfd < 0 && nofail)
-		error("Unable to open subdirectory %s: %m", subdir);
-
-	return sfd;
-}
-
-int open_xdg_dir(const char *envname, const char *altpath, bool nofail)
-{
-        const char *e;
-	const char *h;
-	int dfd, hfd;
-
-	e = getenv(envname);
-	if (e && e[0] == '/') {
-		dfd = open(e, O_PATH | O_CLOEXEC | O_DIRECTORY);
-		if (dfd < 0)
-			error("Unable to open $%s(%s): %m", envname, e);
-		return dfd;
-	}
-
-	h = get_homedir();
-	if (!h) {
-		error("Unable to determine home directory");
-		return -1;
-	}
-
-	hfd = open(h, O_PATH | O_CLOEXEC | O_DIRECTORY);
-	if (hfd < 0) {
-		error("Unable to open $HOME(%s): %m", h);
-		return -1;
-	}
-
-	dfd = open_subdir(hfd, altpath, nofail);
-	close(hfd);
-	return dfd;
-}
-
 /* FIXME: Can be shared */
 void set_use_colors()
 {
diff --git a/minecctl/misc.h b/minecctl/misc.h
index 02c01ea..3182ef8 100644
--- a/minecctl/misc.h
+++ b/minecctl/misc.h
@@ -2,20 +2,6 @@
 #ifndef foomischfoo
 #define foomischfoo
 
-int open_subdir(int dfd, const char *subdir, bool nofail);
-
-int open_xdg_dir(const char *envname, const char *altpath, bool nofail);
-
-static inline int open_xdg_data_dir(bool nofail)
-{
-	return open_xdg_dir("XDG_DATA_HOME", ".local/share", nofail);
-}
-
-static inline int open_xdg_cfg_dir(bool nofail)
-{
-	return open_xdg_dir("XDG_CONFIG_HOME", ".config", nofail);
-}
-
 void set_use_colors();
 
 char **strv_copy(char *const *strv);
diff --git a/minecctl/server.c b/minecctl/server.c
index 3acc537..e50e10c 100644
--- a/minecctl/server.c
+++ b/minecctl/server.c
@@ -9,63 +9,29 @@
 #include "minecctl.h"
 #include "server.h"
 #include "misc.h"
-#include "config.h"
 
 #define INVALID(msg) do { *error = (msg); return false; } while(0)
 
-static DIR *__open_dir(int (*base_dir)(bool nofail), const char *fallback)
-{
-	_cleanup_close_ int xfd = -1;
-	_cleanup_close_ int mfd = -1;
-	DIR *dir;
-
-	/* First, attempt per-user config dir... */
-	xfd = base_dir(false);
-	if (xfd < 0)
-		goto fallback;
-
-	mfd = openat(xfd, "minecproxy", O_CLOEXEC | O_DIRECTORY | O_RDONLY);
-	if (mfd < 0)
-		goto fallback;
-
-	dir = fdopendir(mfd);
-	if (dir)
-		mfd = -1;
-	return dir;
-
-	/* ...and fallback on the system dir */
-fallback:
-	return opendir(fallback);
-}
-
-static inline DIR *open_cfg_dir()
-{
-	return __open_dir(open_xdg_cfg_dir, DEFAULT_CFG_DIR);
-}
-
-static inline DIR *open_data_dir()
-{
-	return __open_dir(open_xdg_data_dir, DEFAULT_DATA_DIR);
-}
-
 void server_load_all_known(struct cfg *cfg)
 {
 	struct dirent *dent;
+	_cleanup_free_ char *cpath = NULL;
+	_cleanup_free_ char *dpath = NULL;
 
 	if (cfg->server_list_loaded)
 		return;
 
 	cfg->server_list_loaded = true;
 
-	cfg->cfg_dir = open_cfg_dir();
+	cfg->cfg_dir = open_cfg_dir(NULL, &cpath);
 	if (!cfg->cfg_dir) {
-		error("Failed to open config directory");
+		error("Failed to open config directory %s", cpath);
 		return;
 	}
 
-	cfg->data_dir = open_data_dir();
+	cfg->data_dir = open_data_dir(NULL, &dpath);
 	if (!cfg->data_dir) {
-		error("Failed to open server directory");
+		error("Failed to open server directory %s", dpath);
 		return;
 	}
 
-- 
cgit v1.2.3