summaryrefslogtreecommitdiff
path: root/minecproxy/systemd.c
diff options
context:
space:
mode:
Diffstat (limited to 'minecproxy/systemd.c')
-rw-r--r--minecproxy/systemd.c76
1 files changed, 12 insertions, 64 deletions
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: