X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl%2Fsystemctl.c;h=408a4f0506dd080da0bbe0809cf0527f50d8ca55;hp=356854353cdd1e1121fab87ba9e247c1bcdecda5;hb=71645acac27da55d510f2e4d61cc61b4e5b93035;hpb=e31165b26212b45e135fd4cd7d618a081d50bd28 diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 356854353..408a4f050 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -760,7 +760,6 @@ static int list_dependencies_get_dependencies(DBusConnection *bus, const char *n int r = 0; char **ret = NULL; - char **c; assert(bus); assert(name); @@ -798,12 +797,7 @@ static int list_dependencies_get_dependencies(DBusConnection *bus, const char *n while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { const char *prop; - if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_DICT_ENTRY) { - log_error("Failed to parse reply."); - r = -EIO; - goto finish; - } - + assert(dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_DICT_ENTRY); dbus_message_iter_recurse(&sub, &sub2); if (bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &prop, true) < 0) { @@ -834,13 +828,13 @@ static int list_dependencies_get_dependencies(DBusConnection *bus, const char *n assert(dbus_message_iter_get_arg_type(&sub4) == DBUS_TYPE_STRING); dbus_message_iter_get_basic(&sub4, &s); - c = strv_append(ret, s); - if (c == NULL) { - r = log_oom(); + + r = strv_extend(&ret, s); + if (r < 0) { + log_oom(); goto finish; } - strv_free(ret); - ret = c; + dbus_message_iter_next(&sub4); } } @@ -848,8 +842,9 @@ static int list_dependencies_get_dependencies(DBusConnection *bus, const char *n } finish: if (r < 0) - strv_freep(&ret); - *deps = ret; + strv_free(ret); + else + *deps = ret; return r; } @@ -2182,6 +2177,7 @@ static int set_cgroup(DBusConnection *bus, char **args) { DBusMessageIter iter; int r; _cleanup_free_ char *n = NULL; + const char *runtime; assert(bus); assert(args); @@ -2213,6 +2209,10 @@ static int set_cgroup(DBusConnection *bus, char **args) { if (r < 0) return log_oom(); + runtime = arg_runtime ? "runtime" : "persistent"; + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &runtime)) + return log_oom(); + reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); if (!reply) { log_error("Failed to issue method call: %s", bus_error_message(&error)); @@ -2229,6 +2229,7 @@ static int set_cgroup_attr(DBusConnection *bus, char **args) { DBusMessageIter iter, sub, sub2; char **x, **y; _cleanup_free_ char *n = NULL; + const char *runtime; assert(bus); assert(args); @@ -2265,8 +2266,54 @@ static int set_cgroup_attr(DBusConnection *bus, char **args) { return log_oom(); } - if (!dbus_message_iter_close_container(&iter, &sub)) - return -ENOMEM; + runtime = arg_runtime ? "runtime" : "persistent"; + if (!dbus_message_iter_close_container(&iter, &sub) || + !dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &runtime)) + return log_oom(); + + reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); + if (!reply) { + log_error("Failed to issue method call: %s", bus_error_message(&error)); + dbus_error_free(&error); + return -EIO; + } + + return 0; +} + +static int get_cgroup_attr(DBusConnection *bus, char **args) { + _cleanup_dbus_message_unref_ DBusMessage *m = NULL, *reply = NULL; + DBusError error; + DBusMessageIter iter; + int r; + _cleanup_free_ char *n = NULL; + _cleanup_strv_free_ char **list = NULL; + char **a; + + assert(bus); + assert(args); + + dbus_error_init(&error); + + n = unit_name_mangle(args[1]); + if (!n) + return log_oom(); + + m = dbus_message_new_method_call( + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "GetUnitControlGroupAttributes"); + if (!m) + return log_oom(); + + dbus_message_iter_init_append(m, &iter); + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &n)) + return log_oom(); + + r = bus_append_strv_iter(&iter, args + 2); + if (r < 0) + return log_oom(); reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); if (!reply) { @@ -2275,6 +2322,20 @@ static int set_cgroup_attr(DBusConnection *bus, char **args) { return -EIO; } + dbus_message_iter_init(reply, &iter); + r = bus_parse_strv_iter(&iter, &list); + if (r < 0) { + log_error("Failed to parse value list."); + return r; + } + + STRV_FOREACH(a, list) { + if (endswith(*a, "\n")) + fputs(*a, stdout); + else + puts(*a); + } + return 0; } @@ -2681,13 +2742,23 @@ static void print_status_info(UnitStatusInfo *i) { if (i->id && arg_transport != TRANSPORT_SSH) { printf("\n"); - show_journal_by_unit(stdout, - i->id, - arg_output, - 0, - i->inactive_exit_timestamp_monotonic, - arg_lines, - flags); + if(arg_scope == UNIT_FILE_SYSTEM) + show_journal_by_unit(stdout, + i->id, + arg_output, + 0, + i->inactive_exit_timestamp_monotonic, + arg_lines, + flags); + else + show_journal_by_user_unit(stdout, + i->id, + arg_output, + 0, + i->inactive_exit_timestamp_monotonic, + arg_lines, + getuid(), + flags); } if (i->need_daemon_reload) @@ -3100,7 +3171,7 @@ static int print_property(const char *name, DBusMessageIter *iter) { bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &attr, true) >= 0 && bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &value, false) >= 0) { - printf("ControlGroupAttribute={ controller=%s ; attribute=%s ; value=\"%s\" }\n", + printf("ControlGroupAttributes={ controller=%s ; attribute=%s ; value=\"%s\" }\n", controller, attr, value); @@ -4281,12 +4352,14 @@ static int systemctl_help(void) { " help [NAME...|PID...] Show manual for one or more units\n" " reset-failed [NAME...] Reset failed state for all, one, or more\n" " units\n" - " set-cgroup [NAME] [CGROUP...] Add unit to a control group\n" - " unset-cgroup [NAME] [CGROUP...] Remove unit from a control group\n" + " get-cgroup-attr [NAME] [ATTR] ...\n" + " Get control group attrubute\n" " set-cgroup-attr [NAME] [ATTR] [VALUE] ...\n" " Set control group attribute\n" " unset-cgroup-attr [NAME] [ATTR...]\n" " Unset control group attribute\n" + " set-cgroup [NAME] [CGROUP...] Add unit to a control group\n" + " unset-cgroup [NAME] [CGROUP...] Remove unit from a control group\n" " load [NAME...] Load one or more units\n" " list-dependencies [NAME] Recursively show units which are required\n" " or wanted by this unit\n\n" @@ -5266,6 +5339,7 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError { "isolate", EQUAL, 2, start_unit }, { "set-cgroup", MORE, 2, set_cgroup }, { "unset-cgroup", MORE, 2, set_cgroup }, + { "get-cgroup-attr", MORE, 2, get_cgroup_attr }, { "set-cgroup-attr", MORE, 2, set_cgroup_attr }, { "unset-cgroup-attr", MORE, 2, set_cgroup }, { "kill", MORE, 2, kill_unit },