X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsystemctl.c;h=27e5e3708e82f8ff3077a3ea54a376a2d73123b9;hb=2cf3143ac3650feff2e3069d6d02bb8e46ab1929;hp=d6b1fcd58102a399f33248e7c66bc086700cda1f;hpb=ec7f7f20069028ee7acc189255637e42acbd8e32;p=elogind.git diff --git a/src/systemctl.c b/src/systemctl.c index d6b1fcd58..27e5e3708 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -489,7 +489,7 @@ static int dot(DBusConnection *bus, char **args, unsigned n) { dbus_message_iter_recurse(&iter, &sub); while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { - const char *id, *description, *load_state, *active_state, *sub_state, *unit_path; + const char *id, *description, *load_state, *active_state, *sub_state, *following, *unit_path; if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRUCT) { log_error("Failed to parse reply."); @@ -504,6 +504,7 @@ static int dot(DBusConnection *bus, char **args, unsigned n) { bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &load_state, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &active_state, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &sub_state, true) < 0 || + bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_STRING, &following, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_OBJECT_PATH, &unit_path, true) < 0) { log_error("Failed to parse reply."); r = -EIO; @@ -1528,14 +1529,15 @@ static void print_status_info(UnitStatusInfo *i) { printf(" (%s)", t); free(t); } - } else { + } else if (i->exit_code > 0) { printf(" (code=%s, ", sigchld_code_to_string(i->exit_code)); if (i->exit_code == CLD_EXITED) printf("status=%i", i->exit_status); else printf("signal=%s", signal_to_string(i->exit_status)); - printf(")"); } + printf(")"); + } } if (i->main_pid > 0 && i->control_pid > 0) @@ -3933,7 +3935,8 @@ static int halt_parse_argv(int argc, char *argv[]) { break; case 'p': - arg_action = ACTION_POWEROFF; + if (arg_action != ACTION_REBOOT) + arg_action = ACTION_POWEROFF; break; case ARG_REBOOT: @@ -4209,8 +4212,22 @@ static int parse_argv(int argc, char *argv[]) { arg_action = ACTION_POWEROFF; return shutdown_parse_argv(argc, argv); } else if (strstr(program_invocation_short_name, "init")) { - arg_action = ACTION_INVALID; - return telinit_parse_argv(argc, argv); + + if (sd_booted() > 0) { + arg_action = ACTION_INVALID; + return telinit_parse_argv(argc, argv); + } else { + /* Hmm, so some other init system is + * running, we need to forward this + * request to it. For now we simply + * guess that it is Upstart. */ + + execv("/lib/upstart/telinit", argv); + + log_error("Couldn't find an alternative telinit implementation to spawn."); + return -EIO; + } + } else if (strstr(program_invocation_short_name, "runlevel")) { arg_action = ACTION_RUNLEVEL; return runlevel_parse_argv(argc, argv);