From a89a0f918925a662503c1bcb28bdb06ab9b7ef25 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Tue, 30 Jun 2020 08:10:04 +0200 Subject: Share config parsing fully between server and cmdline tool --- minecproxy/systemd.c | 76 +++++++++------------------------------------------- 1 file changed, 12 insertions(+), 64 deletions(-) (limited to 'minecproxy/systemd.c') diff --git a/minecproxy/systemd.c b/minecproxy/systemd.c index a973a55..96ff50f 100644 --- a/minecproxy/systemd.c +++ b/minecproxy/systemd.c @@ -5,59 +5,7 @@ #include "main.h" #include "server.h" #include "systemd.h" - -#define SYSTEMD_DBUS_SERVICE "org.freedesktop.systemd1" -#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.systemd1.Unit" -#define SYSTEMD_DBUS_PATH_PREFIX "/org/freedesktop/systemd1/unit/" - -static inline char tohex(uint8_t val) -{ - static const char hex[] = "0123456789abcdef"; - - return hex[val & 0x0f]; -} - -/* - * Creates an escaped D-Bus object path for a given systemd service - * - * Escaping rules are documented here: - * https://dbus.freedesktop.org/doc/dbus-specification.html - * - * Essentially, everyting but a-z, A-Z, 0-9 is replaced by _xx where xx is - * the hexadecimal value of the character. - * - * Example: minecraft@world1.service -> minecraft_40world1_2eservice - */ -char *systemd_object_path(const char *service) -{ - char *r; - char *d; - const char *s; - - assert_return(service && !empty_str(service), NULL); - - r = zmalloc(STRLEN(SYSTEMD_DBUS_PATH_PREFIX) + strlen(service) * 3 + 1); - if (!r) - return NULL; - - memcpy(r, SYSTEMD_DBUS_PATH_PREFIX, STRLEN(SYSTEMD_DBUS_PATH_PREFIX)); - d = r + STRLEN(SYSTEMD_DBUS_PATH_PREFIX); - - for (s = service; *s; s++) { - if ((*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || - (*s >= '0' && *s <= '9')) { - *(d++) = *s; - continue; - } - - *(d++) = '_'; - *(d++) = tohex(*s >> 4); - *(d++) = tohex(*s); - } - - *d = '\0'; - return r; -} +#include "config.h" void systemd_delete() { @@ -106,17 +54,17 @@ bool systemd_service_running(struct server *server) bool running = false; int r; - assert_return(server && bus && server->systemd_service && - server->systemd_obj, + assert_return(server && bus && server->scfg.systemd_service && + server->scfg.systemd_obj, false); r = sd_bus_get_property_string(bus, SYSTEMD_DBUS_SERVICE, - server->systemd_obj, + server->scfg.systemd_obj, SYSTEMD_DBUS_INTERFACE, "ActiveState", &error, &status); if (r < 0) { error("failed to get status for service %s (%s): %s", - server->systemd_service, server->systemd_obj, + server->scfg.systemd_service, server->scfg.systemd_obj, error.message); goto out; } @@ -124,10 +72,10 @@ bool systemd_service_running(struct server *server) if (streq(status, "active")) { running = true; debug(DBG_SYSD, "systemd service %s (%s) is active", - server->systemd_service, server->systemd_obj); + server->scfg.systemd_service, server->scfg.systemd_obj); } else debug(DBG_SYSD, "systemd service %s (%s) is not active", - server->systemd_service, server->systemd_obj); + server->scfg.systemd_service, server->scfg.systemd_obj); out: free(status); @@ -144,16 +92,16 @@ static bool systemd_service_action(struct server *server, const char *action) bool performed = false; int r; - assert_return(server && bus && server->systemd_service && - server->systemd_obj && action, + assert_return(server && bus && server->scfg.systemd_service && + server->scfg.systemd_obj && action, false); - r = sd_bus_call_method(bus, SYSTEMD_DBUS_SERVICE, server->systemd_obj, + r = sd_bus_call_method(bus, SYSTEMD_DBUS_SERVICE, server->scfg.systemd_obj, SYSTEMD_DBUS_INTERFACE, action, &error, &m, "s", "fail"); if (r < 0) { error("failed to perform action %s on systemd service %s: %s", - action, server->systemd_service, error.message); + action, server->scfg.systemd_service, error.message); goto out; } @@ -164,7 +112,7 @@ static bool systemd_service_action(struct server *server, const char *action) } verbose("action %s queued for service %s", action, - server->systemd_service); + server->scfg.systemd_service); performed = true; out: -- cgit v1.2.3