X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fsystemctl.c;h=45e900c5fe0b9f67db7959a4a866e96bd270e28f;hp=d90471773ecb2b6c9fdc0ed0058a703c1e501df0;hb=b708e7cea941538bfd5e20ce0a723c19b7da7d1d;hpb=b574246b4f8e4eb86c29c38c7df47b541b68188a diff --git a/src/systemctl.c b/src/systemctl.c index d90471773..45e900c5f 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -49,7 +49,7 @@ static const char *arg_type = NULL; static const char *arg_property = NULL; static bool arg_all = false; -static bool arg_replace = false; +static bool arg_fail = false; static bool arg_session = false; static bool arg_no_block = false; static bool arg_immediate = false; @@ -742,8 +742,8 @@ static int start_unit(DBusConnection *bus, char **args, unsigned n) { (streq(args[0], "isolate") || streq(args[0], "rescue") || streq(args[0], "emergency")) ? "isolate" : - arg_replace ? "replace" : - "fail"; + arg_fail ? "fail" : + "replace"; one_name = table[verb_to_action(args[0])]; @@ -794,12 +794,17 @@ finish: } static int start_special(DBusConnection *bus, char **args, unsigned n) { + int r; + assert(bus); assert(args); - warn_wall(verb_to_action(args[0])); + r = start_unit(bus, args, n); + + if (r >= 0) + warn_wall(verb_to_action(args[0])); - return start_unit(bus, args, n); + return r; } static int check_unit(DBusConnection *bus, char **args, unsigned n) { @@ -928,6 +933,8 @@ typedef struct ExecStatusInfo { char *path; char **argv; + bool ignore; + usec_t start_timestamp; usec_t exit_timestamp; pid_t pid; @@ -952,6 +959,7 @@ static int exec_status_info_deserialize(DBusMessageIter *sub, ExecStatusInfo *i) unsigned n; uint32_t pid; int32_t code, status; + dbus_bool_t ignore; assert(i); assert(i); @@ -997,6 +1005,7 @@ static int exec_status_info_deserialize(DBusMessageIter *sub, ExecStatusInfo *i) } if (!dbus_message_iter_next(&sub2) || + bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_BOOLEAN, &ignore, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_UINT64, &start_timestamp, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_UINT64, &exit_timestamp, true) < 0 || bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_UINT32, &pid, true) < 0 || @@ -1004,6 +1013,7 @@ static int exec_status_info_deserialize(DBusMessageIter *sub, ExecStatusInfo *i) bus_iter_get_basic_and_next(&sub2, DBUS_TYPE_INT32, &status, false) < 0) return -EIO; + i->ignore = ignore; i->start_timestamp = (usec_t) start_timestamp; i->exit_timestamp = (usec_t) exit_timestamp; i->pid = (pid_t) pid; @@ -1100,9 +1110,6 @@ static void print_status_info(UnitStatusInfo *i) { else if (i->what) printf("\t What: %s\n", i->what); - if (i->status_text) - printf("\t Status: \"%s\"\n", i->status_text); - if (i->accept) printf("\tAccepted: %u; Connected: %u\n", i->n_accepted, i->n_connections); @@ -1175,6 +1182,9 @@ static void print_status_info(UnitStatusInfo *i) { printf("\n"); } + if (i->status_text) + printf("\t Status: \"%s\"\n", i->status_text); + if (i->default_control_group) { unsigned c; @@ -1530,10 +1540,11 @@ static int print_property(const char *name, DBusMessageIter *iter) { t = strv_join(info.argv, " "); - printf("%s={ path=%s ; argv[]=%s; start_time=[%s] ; stop_time=[%s] ; pid=%u ; code=%s ; status=%i%s%s }\n", + printf("%s={ path=%s ; argv[]=%s ; ignore=%s ; start_time=[%s] ; stop_time=[%s] ; pid=%u ; code=%s ; status=%i%s%s }\n", name, strna(info.path), strna(t), + yes_no(info.ignore), strna(format_timestamp(timestamp1, sizeof(timestamp1), info.start_timestamp)), strna(format_timestamp(timestamp2, sizeof(timestamp2), info.exit_timestamp)), (unsigned) info. pid, @@ -2490,7 +2501,7 @@ static int systemctl_help(void) { " -t --type=TYPE List only units of a particular type\n" " -p --property=NAME Show only properties by this name\n" " -a --all Show all units/properties, including dead/empty ones\n" - " --replace When installing a new job, replace existing conflicting ones\n" + " --fail When installing a new job, fail if conflicting jobs are pending\n" " --system Connect to system bus\n" " --session Connect to session bus\n" " -q --quiet Suppress output\n" @@ -2599,7 +2610,7 @@ static int runlevel_help(void) { static int systemctl_parse_argv(int argc, char *argv[]) { enum { - ARG_REPLACE = 0x100, + ARG_FAIL = 0x100, ARG_SESSION, ARG_SYSTEM, ARG_NO_BLOCK, @@ -2611,7 +2622,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { { "type", required_argument, NULL, 't' }, { "property", required_argument, NULL, 'p' }, { "all", no_argument, NULL, 'a' }, - { "replace", no_argument, NULL, ARG_REPLACE }, + { "fail", no_argument, NULL, ARG_FAIL }, { "session", no_argument, NULL, ARG_SESSION }, { "system", no_argument, NULL, ARG_SYSTEM }, { "no-block", no_argument, NULL, ARG_NO_BLOCK }, @@ -2650,8 +2661,8 @@ static int systemctl_parse_argv(int argc, char *argv[]) { arg_all = true; break; - case ARG_REPLACE: - arg_replace = true; + case ARG_FAIL: + arg_fail = true; break; case ARG_SESSION: @@ -3292,26 +3303,29 @@ static int reload_with_fallback(DBusConnection *bus) { static int start_with_fallback(DBusConnection *bus) { int r; - warn_wall(arg_action); if (bus) { /* First, try systemd via D-Bus. */ if ((r = start_unit(bus, NULL, 0)) > 0) - return 0; + goto done; /* Hmm, talking to systemd via D-Bus didn't work. Then * let's try to talk to Upstart via D-Bus. */ if ((r = talk_upstart()) > 0) - return 0; + goto done; } /* Nothing else worked, so let's try * /dev/initctl */ if ((r = talk_initctl()) != 0) - return 0; + goto done; log_error("Failed to talk to init daemon."); return -EIO; + +done: + warn_wall(arg_action); + return 0; } static int halt_main(DBusConnection *bus) {