return 0;
}
-static int log_level(int argc, char *argv[], void *userdata) {
- sd_bus *bus;
+static int log_setting_internal(sd_bus *bus, const BusLocator* bloc, const char *verb, const char *value) {
+ assert(bus);
+ assert(STR_IN_SET(verb, "log-level", "log-target", "service-log-level", "service-log-target"));
+
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ bool level = endswith(verb, "log-level");
int r;
- r = acquire_bus(BUS_MANAGER, &bus);
- if (r < 0)
- return r;
-
- if (argc == 1) {
- _cleanup_free_ char *level = NULL;
-
- r = bus_get_property_string(bus, bus_systemd_mgr, "LogLevel", &error, &level);
+ if (value) {
+ r = bus_set_property(bus, bloc,
+ level ? "LogLevel" : "LogTarget",
+ &error, "s", value);
if (r < 0)
- return log_error_errno(r, "Failed to get log level: %s", bus_error_message(&error, r));
-
- puts(level);
-
+ return log_error_errno(r, "Failed to set log %s of %s to %s: %s",
+ level ? "level" : "target",
+ bloc->destination, value, bus_error_message(&error, r));
} else {
- assert(argc == 2);
+ _cleanup_free_ char *t = NULL;
- r = bus_set_property(bus, bus_systemd_mgr, "LogLevel", &error, "s", argv[1]);
+ r = bus_get_property_string(bus, bloc,
+ level ? "LogLevel" : "LogTarget",
+ &error, &t);
if (r < 0)
- return log_error_errno(r, "Failed to set log level: %s", bus_error_message(&error, r));
+ return log_error_errno(r, "Failed to get log %s of %s: %s",
+ level ? "level" : "target",
+ bloc->destination, bus_error_message(&error, r));
+ puts(t);
}
return 0;
}
+static int log_setting(int argc, char *argv[], void *userdata) {
+ sd_bus *bus;
+ int r;
+
+ assert(argc >= 1 && argc <= 2);
+
+ r = acquire_bus(BUS_MANAGER, &bus);
+ if (r < 0)
+ return r;
+
+ return log_setting_internal(bus, bus_systemd_mgr, argv[0], argv[1]);
+}
+
static int service_name_to_dbus(sd_bus *bus, const char *name, char **ret_dbus_name) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ char *bus_name = NULL;
static int service_log_setting(int argc, char *argv[], void *userdata) {
sd_bus *bus;
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ char *unit = NULL, *dbus_name = NULL;
int r;
- assert(STR_IN_SET(argv[0], "service-log-level", "service-log-target"));
- bool level = streq(argv[0], "service-log-level");
+ assert(argc >= 2 && argc <= 3);
r = acquire_bus(BUS_FULL, &bus);
if (r < 0)
if (r < 0)
return r;
- if (argc == 2) {
- _cleanup_free_ char *value = NULL;
-
- r = sd_bus_get_property_string(
- bus,
- dbus_name,
- "/org/freedesktop/LogControl1",
- "org.freedesktop.LogControl1",
- level ? "LogLevel" : "LogTarget",
- &error,
- &value);
- if (r < 0)
- return log_error_errno(r, "Failed to get log %s of service %s: %s",
- level ? "level" : "target",
- dbus_name, bus_error_message(&error, r));
-
- puts(value);
-
- } else {
- assert(argc == 3);
-
- r = sd_bus_set_property(
- bus,
- dbus_name,
- "/org/freedesktop/LogControl1",
- "org.freedesktop.LogControl1",
- level ? "LogLevel" : "LogTarget",
- &error,
- "s",
- argv[2]);
- if (r < 0)
- return log_error_errno(r, "Failed to set log %s of service %s to %s: %s",
- level ? "level" : "target",
- dbus_name, argv[2], bus_error_message(&error, r));
- }
-
- return 0;
-}
-
-static int log_target(int argc, char *argv[], void *userdata) {
- sd_bus *bus;
- _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- int r;
-
- r = acquire_bus(BUS_MANAGER, &bus);
- if (r < 0)
- return r;
-
- if (argc == 1) {
- _cleanup_free_ char *target = NULL;
-
- r = bus_get_property_string(bus, bus_systemd_mgr, "LogTarget", &error, &target);
- if (r < 0)
- return log_error_errno(r, "Failed to get log target: %s", bus_error_message(&error, r));
-
- puts(target);
-
- } else {
- assert(argc == 2);
-
- r = bus_set_property(bus, bus_systemd_mgr, "LogTarget", &error, "s", argv[1]);
- if (r < 0)
- return log_error_errno(r, "Failed to set log target: %s", bus_error_message(&error, r));
- }
+ const BusLocator bloc = {
+ .destination = dbus_name,
+ .path = "/org/freedesktop/LogControl1",
+ .interface = "org.freedesktop.LogControl1",
+ };
- return 0;
+ return log_setting_internal(bus, &bloc, argv[0], argv[2]);
}
static int service_watchdogs(int argc, char *argv[], void *userdata) {
{ "help", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, show },
{ "daemon-reload", VERB_ANY, 1, VERB_ONLINE_ONLY, daemon_reload },
{ "daemon-reexec", VERB_ANY, 1, VERB_ONLINE_ONLY, daemon_reload },
- { "log-level", VERB_ANY, 2, VERB_ONLINE_ONLY, log_level },
- { "log-target", VERB_ANY, 2, VERB_ONLINE_ONLY, log_target },
+ { "log-level", VERB_ANY, 2, VERB_ONLINE_ONLY, log_setting },
+ { "log-target", VERB_ANY, 2, VERB_ONLINE_ONLY, log_setting },
{ "service-log-level", 2, 3, VERB_ONLINE_ONLY, service_log_setting },
{ "service-log-target", 2, 3, VERB_ONLINE_ONLY, service_log_setting },
{ "service-watchdogs", VERB_ANY, 2, VERB_ONLINE_ONLY, service_watchdogs },