TRANSPORT_SSH,
TRANSPORT_POLKIT
} arg_transport = TRANSPORT_NORMAL;
-static const char *arg_host = NULL;
+static char *arg_host = NULL;
+static char *arg_user = NULL;
static unsigned arg_lines = 10;
static OutputMode arg_output = OUTPUT_SHORT;
static bool arg_plain = false;
pid_t main_pid;
pid_t control_pid;
const char *status_text;
+ const char *pid_file;
bool running:1;
usec_t start_timestamp;
on_tty() * OUTPUT_COLOR |
!arg_quiet * OUTPUT_WARN_CUTOFF |
arg_full * OUTPUT_FULL_WIDTH;
- int maxlen = 8; /* a value that'll suffice most of the time */
char **t, **t2;
assert(i);
- STRV_FOREACH_PAIR(t, t2, i->listen)
- maxlen = MAX(maxlen, (int)(sizeof("Listen") - 1 + strlen(*t)));
- if (i->accept)
- maxlen = MAX(maxlen, (int)sizeof("Accept") - 1);
- if (i->main_pid > 0)
- maxlen = MAX(maxlen, (int)sizeof("Main PID") - 1);
- else if (i->control_pid > 0)
- maxlen = MAX(maxlen, (int)sizeof("Control") - 1);
-
/* This shows pretty information about a unit. See
* print_property() for a low-level property printer */
printf("\n");
if (i->following)
- printf(" %*s: unit currently follows state of %s\n", maxlen, "Follow", i->following);
+ printf(" Follow: unit currently follows state of %s\n", i->following);
if (streq_ptr(i->load_state, "error")) {
on = ansi_highlight_red(true);
path = i->source_path ? i->source_path : i->fragment_path;
if (i->load_error)
- printf(" %*s: %s%s%s (Reason: %s)\n",
- maxlen, "Loaded", on, strna(i->load_state), off, i->load_error);
+ printf(" Loaded: %s%s%s (Reason: %s)\n",
+ on, strna(i->load_state), off, i->load_error);
else if (path && i->unit_file_state)
- printf(" %*s: %s%s%s (%s; %s)\n",
- maxlen, "Loaded", on, strna(i->load_state), off, path, i->unit_file_state);
+ printf(" Loaded: %s%s%s (%s; %s)\n",
+ on, strna(i->load_state), off, path, i->unit_file_state);
else if (path)
- printf(" %*s: %s%s%s (%s)\n",
- maxlen, "Loaded", on, strna(i->load_state), off, path);
+ printf(" Loaded: %s%s%s (%s)\n",
+ on, strna(i->load_state), off, path);
else
- printf(" %*s: %s%s%s\n",
- maxlen, "Loaded", on, strna(i->load_state), off);
+ printf(" Loaded: %s%s%s\n",
+ on, strna(i->load_state), off);
if (!strv_isempty(i->dropin_paths)) {
char ** dropin;
STRV_FOREACH(dropin, i->dropin_paths) {
if (! dir || last) {
- printf(" %*s ", maxlen, dir ? "" : "Drop-In:");
+ printf(dir ? " " : " Drop-In: ");
free(dir);
return;
}
- printf("%s\n %*s %s", dir, maxlen, "",
+ printf("%s\n %s", dir,
draw_special_char(DRAW_TREE_RIGHT));
}
on = off = "";
if (ss)
- printf(" %*s: %s%s (%s)%s",
- maxlen, "Active", on, strna(i->active_state), ss, off);
+ printf(" Active: %s%s (%s)%s",
+ on, strna(i->active_state), ss, off);
else
- printf(" %*s: %s%s%s",
- maxlen, "Active", on, strna(i->active_state), off);
+ printf(" Active: %s%s%s",
+ on, strna(i->active_state), off);
if (!isempty(i->result) && !streq(i->result, "success"))
printf(" (Result: %s)", i->result);
s2 = format_timestamp(since2, sizeof(since2), i->condition_timestamp);
if (s1)
- printf(" %*s start condition failed at %s; %s\n", maxlen, "", s2, s1);
+ printf(" start condition failed at %s; %s\n", s2, s1);
else if (s2)
- printf(" %*s start condition failed at %s\n", maxlen, "", s2);
+ printf(" start condition failed at %s\n", s2);
}
if (i->sysfs_path)
- printf(" %*s: %s\n", maxlen, "Device", i->sysfs_path);
+ printf(" Device: %s\n", i->sysfs_path);
if (i->where)
- printf(" %*s: %s\n", maxlen, "Where", i->where);
+ printf(" Where: %s\n", i->where);
if (i->what)
- printf(" %*s: %s\n", maxlen, "What", i->what);
+ printf(" What: %s\n", i->what);
STRV_FOREACH(t, i->documentation)
- printf(" %*s %s\n", maxlen+1, t == i->documentation ? "Docs:" : "", *t);
+ printf(" %*s %s\n", 9, t == i->documentation ? "Docs:" : "", *t);
STRV_FOREACH_PAIR(t, t2, i->listen)
- printf(" %*s %s (%s)\n", maxlen+1, t == i->listen ? "Listen:" : "", *t2, *t);
+ printf(" %*s %s (%s)\n", 9, t == i->listen ? "Listen:" : "", *t2, *t);
if (i->accept)
- printf(" %*s: %u; Connected: %u\n", maxlen, "Accepted", i->n_accepted, i->n_connections);
+ printf(" Accepted: %u; Connected: %u\n", i->n_accepted, i->n_connections);
LIST_FOREACH(exec, p, i->exec) {
_cleanup_free_ char *argv = NULL;
continue;
argv = strv_join(p->argv, " ");
- printf(" %*s: %u %s=%s ", maxlen, "Process", p->pid, p->name, strna(argv));
+ printf(" Process: %u %s=%s ", p->pid, p->name, strna(argv));
good = is_clean_exit_lsb(p->code, p->status, NULL);
if (!good) {
if (i->main_pid > 0 || i->control_pid > 0) {
if (i->main_pid > 0) {
- printf(" %*s: %u", maxlen, "Main PID", (unsigned) i->main_pid);
+ printf(" Main PID: %u", (unsigned) i->main_pid);
if (i->running) {
_cleanup_free_ char *comm = NULL;
if (i->control_pid > 0) {
_cleanup_free_ char *c = NULL;
- printf(" %*s: %u", i->main_pid ? 0 : maxlen, "Control", (unsigned) i->control_pid);
+ printf(" %8s: %u", i->main_pid ? "" : " Control", (unsigned) i->control_pid);
get_process_comm(i->control_pid, &c);
if (c)
}
if (i->status_text)
- printf(" %*s: \"%s\"\n", maxlen, "Status", i->status_text);
+ printf(" Status: \"%s\"\n", i->status_text);
if (i->default_control_group &&
(i->main_pid > 0 || i->control_pid > 0 || cg_is_empty_by_spec(i->default_control_group, false) == 0)) {
unsigned c;
- printf(" %*s: %s\n", maxlen, "CGroup", i->default_control_group);
+ printf(" CGroup: %s\n", i->default_control_group);
if (arg_transport != TRANSPORT_SSH) {
unsigned k = 0;
pid_t extra[2];
- char prefix[maxlen + 4];
- memset(prefix, ' ', sizeof(prefix) - 1);
- prefix[sizeof(prefix) - 1] = '\0';
+ char prefix[] = " ";
c = columns();
if (c > sizeof(prefix) - 1)
i->default_control_group = s;
else if (streq(name, "StatusText"))
i->status_text = s;
+ else if (streq(name, "PIDFile"))
+ i->pid_file = s;
else if (streq(name, "SysFSPath"))
i->sysfs_path = s;
else if (streq(name, "Where"))
!streq_ptr(info.active_state, "reloading") &&
streq(verb, "status"))
/* According to LSB: "program not running" */
- r = 3;
+ /* 0: program is running or service is OK
+ * 1: program is dead and /var/run pid file exists
+ * 2: program is dead and /var/lock lock file exists
+ * 3: program is not running
+ * 4: program or service status is unknown
+ */
+ if (info.pid_file)
+ r = 1;
+ else
+ r = 3;
while ((p = info.exec)) {
LIST_REMOVE(ExecStatusInfo, exec, info.exec, p);
dbus_error_init(&error);
if (strv_length(args) > 1)
- n = snapshot_name_mangle(args[1]);
+ n = unit_name_mangle_with_suffix(args[1], ".snapshot");
else
n = strdup("");
if (!n)
_cleanup_free_ char *n = NULL;
int r;
- n = snapshot_name_mangle(*name);
+ n = unit_name_mangle_with_suffix(*name, ".snapshot");
if (!n)
return log_oom();
" the 'list-unit-files' command instead.\n"
" --reverse Show reverse dependencies with 'list-dependencies'\n"
" --failed Show only failed units\n"
- " --full Don't ellipsize unit names on output\n"
+ " -l --full Don't ellipsize unit names on output\n"
" --fail When queueing a new job, fail if conflicting jobs are\n"
" pending\n"
" --irreversible Create jobs which cannot be implicitly cancelled\n"
ARG_NO_PAGER,
ARG_NO_WALL,
ARG_ROOT,
- ARG_FULL,
ARG_NO_RELOAD,
ARG_KILL_WHO,
ARG_NO_ASK_PASSWORD,
{ "before", no_argument, NULL, ARG_BEFORE },
{ "show-types", no_argument, NULL, ARG_SHOW_TYPES },
{ "failed", no_argument, NULL, ARG_FAILED },
- { "full", no_argument, NULL, ARG_FULL },
+ { "full", no_argument, NULL, 'l' },
{ "fail", no_argument, NULL, ARG_FAIL },
{ "irreversible", no_argument, NULL, ARG_IRREVERSIBLE },
{ "ignore-dependencies", no_argument, NULL, ARG_IGNORE_DEPENDENCIES },
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "ht:p:aqfs:H:Pn:o:i", options, NULL)) >= 0) {
+ while ((c = getopt_long(argc, argv, "ht:p:alqfs:H:Pn:o:i", options, NULL)) >= 0) {
switch (c) {
arg_root = optarg;
break;
- case ARG_FULL:
+ case 'l':
arg_full = true;
break;
case 'H':
arg_transport = TRANSPORT_SSH;
- arg_host = optarg;
+ parse_user_at_host(optarg, &arg_user, &arg_host);
break;
case ARG_RUNTIME:
bus_connect_system_polkit(&bus, &error);
private_bus = false;
} else if (arg_transport == TRANSPORT_SSH) {
- bus_connect_system_ssh(NULL, arg_host, &bus, &error);
+ bus_connect_system_ssh(arg_user, arg_host, &bus, &error);
private_bus = false;
} else
assert_not_reached("Uh, invalid transport...");