#include "list.h"
static const char *arg_type = NULL;
-static const char *arg_property = NULL;
+static char **arg_property = NULL;
static bool arg_all = false;
static bool arg_fail = false;
static bool arg_session = false;
static bool private_bus = false;
+static const char *ansi_highlight(bool b) {
+ static int t = -1;
+
+ if (_unlikely_(t < 0))
+ t = isatty(STDOUT_FILENO) > 0;
+
+ if (!t)
+ return "";
+
+ return b ? ANSI_HIGHLIGHT_ON : ANSI_HIGHLIGHT_OFF;
+}
+
static bool error_is_no_service(DBusError *error) {
assert(error);
int a = 0, b = 0;
if (streq(active_state, "maintenance"))
- fputs(ANSI_HIGHLIGHT_ON, stdout);
+ fputs(ansi_highlight(true), stdout);
e = arg_full ? NULL : ellipsize(id, 45, 33);
printf("%-45s %-6s %-12s %-12s%n", e ? e : id, load_state, active_state, sub_state, &a);
}
if (streq(active_state, "maintenance"))
- fputs(ANSI_HIGHLIGHT_OFF, stdout);
+ fputs(ansi_highlight(false), stdout);
fputs("\n", stdout);
k++;
streq(args[0], "restart") ? "RestartUnit" :
streq(args[0], "try-restart") ? "TryRestartUnit" :
streq(args[0], "reload-or-restart") ? "ReloadOrRestartUnit" :
- streq(args[0], "reload-or-try-restart") ? "ReloadOrTryRestartUnit" :
+ streq(args[0], "reload-or-try-restart") ||
+ streq(args[0], "force-reload") ||
+ streq(args[0], "condrestart") ? "ReloadOrTryRestartUnit" :
"StartUnit";
mode =
if (i->fragment_path)
printf("\t Loaded: %s (%s)\n", strna(i->load_state), i->fragment_path);
else if (streq_ptr(i->load_state, "failed"))
- printf("\t Loaded: " ANSI_HIGHLIGHT_ON "%s" ANSI_HIGHLIGHT_OFF "\n", strna(i->load_state));
+ printf("\t Loaded: %s%s%s\n",
+ ansi_highlight(true),
+ strna(i->load_state),
+ ansi_highlight(false));
else
printf("\t Loaded: %s\n", strna(i->load_state));
if (streq_ptr(i->active_state, "maintenance")) {
if (streq_ptr(i->active_state, i->sub_state))
- printf("\t Active: " ANSI_HIGHLIGHT_ON "%s" ANSI_HIGHLIGHT_OFF "\n",
- strna(i->active_state));
+ printf("\t Active: %s%s%s\n",
+ ansi_highlight(true),
+ strna(i->active_state),
+ ansi_highlight(false));
else
- printf("\t Active: " ANSI_HIGHLIGHT_ON "%s (%s)" ANSI_HIGHLIGHT_OFF "\n",
+ printf("\t Active: %s%s (%s)%s\n",
+ ansi_highlight(true),
strna(i->active_state),
- strna(i->sub_state));
+ strna(i->sub_state),
+ ansi_highlight(false));
} else {
if (streq_ptr(i->active_state, i->sub_state))
printf("\t Active: %s\n",
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)
}
if (i->need_daemon_reload)
- printf("\n" ANSI_HIGHLIGHT_ON "Warning:" ANSI_HIGHLIGHT_OFF " Unit file changed on disk, 'systemctl %s daemon-reload' recommended.\n",
+ printf("\n%sWarning:%s Unit file changed on disk, 'systemctl %s daemon-reload' recommended.\n",
+ ansi_highlight(true),
+ ansi_highlight(false),
arg_session ? "--session" : "--system");
}
/* This is a low-level property printer, see
* print_status_info() for the nicer output */
- if (arg_property && !streq(name, arg_property))
+ if (arg_property && !strv_find(arg_property, name))
return 0;
switch (dbus_message_iter_get_arg_type(iter)) {
arg_type = optarg;
break;
- case 'p':
- arg_property = optarg;
+ case 'p': {
+ char **l;
+
+ if (!(l = strv_append(arg_property, optarg)))
+ return -ENOMEM;
+
+ strv_free(arg_property);
+ arg_property = l;
/* If the user asked for a particular
* property, show it to him, even if it is
* empty. */
arg_all = true;
break;
+ }
case 'a':
arg_all = true;
{ "try-restart", MORE, 2, start_unit },
{ "reload-or-restart", MORE, 2, start_unit },
{ "reload-or-try-restart", MORE, 2, start_unit },
+ { "force-reload", MORE, 2, start_unit }, /* For compatibility with SysV */
+ { "condrestart", MORE, 2, start_unit }, /* For compatibility with RH */
{ "isolate", EQUAL, 2, start_unit },
{ "check", MORE, 2, check_unit },
{ "show", MORE, 1, show },
dbus_shutdown();
+ strv_free(arg_property);
+
return retval;
}