summaryrefslogtreecommitdiff
path: root/minecctl
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-07-12 14:04:40 +0200
committerDavid Härdeman <david@hardeman.nu>2020-07-12 14:04:40 +0200
commit6586ea650597ae0563c4234a7658499ce1e0117b (patch)
treebe99b63c29a21b2492a35d0bc9cd2ade93388405 /minecctl
parent714c267f5e4af98fd986c3563fc0e8e82a3dae1f (diff)
Teach minecproxy to use same dirs as minecctl, step 1
Diffstat (limited to 'minecctl')
-rw-r--r--minecctl/misc-commands.c9
-rw-r--r--minecctl/misc.c69
-rw-r--r--minecctl/misc.h14
-rw-r--r--minecctl/server.c46
4 files changed, 11 insertions, 127 deletions
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;
}