Merge pull request #3527 from poettering/systemctl-fixes

Systemctl fixes
This commit is contained in:
Daniel Mack
2016-06-14 14:25:43 +02:00
committed by GitHub
2 changed files with 69 additions and 59 deletions
-1
View File
@@ -195,7 +195,6 @@ typedef enum SwapState {
_SWAP_STATE_INVALID = -1
} SwapState;
typedef enum TargetState {
TARGET_DEAD,
TARGET_ACTIVE,
+69 -58
View File
@@ -3847,14 +3847,13 @@ static void print_status_info(
printf(" CPU: %s\n", format_timespan(buf, sizeof(buf), i->cpu_usage_nsec / NSEC_PER_USEC, USEC_PER_MSEC));
}
if (i->control_group)
printf(" CGroup: %s\n", i->control_group);
{
if (i->control_group) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
static const char prefix[] = " ";
unsigned c;
printf(" CGroup: %s\n", i->control_group);
c = columns();
if (c > sizeof(prefix) - 1)
c -= sizeof(prefix) - 1;
@@ -4559,12 +4558,20 @@ static int show_one(
const char *verb,
sd_bus *bus,
const char *path,
const char *unit,
bool show_properties,
bool *new_line,
bool *ellipsized) {
static const struct bus_properties_map property_map[] = {
{ "LoadState", "s", NULL, offsetof(UnitStatusInfo, load_state) },
{ "ActiveState", "s", NULL, offsetof(UnitStatusInfo, active_state) },
{}
};
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_set_free_ Set *found_properties = NULL;
UnitStatusInfo info = {
.memory_current = (uint64_t) -1,
.memory_high = CGROUP_LIMIT_MAX,
@@ -4574,14 +4581,6 @@ static int show_one(
.tasks_current = (uint64_t) -1,
.tasks_max = (uint64_t) -1,
};
struct property_info {
const char *load_state, *active_state;
} property_info = {};
static const struct bus_properties_map property_map[] = {
{ "LoadState", "s", NULL, offsetof(struct property_info, load_state) },
{ "ActiveState", "s", NULL, offsetof(struct property_info, active_state) },
{}
};
ExecStatusInfo *p;
int r;
@@ -4602,16 +4601,24 @@ static int show_one(
if (r < 0)
return log_error_errno(r, "Failed to get properties: %s", bus_error_message(&error, r));
r = bus_message_map_all_properties(reply, property_map, &property_info);
if (r < 0)
return log_error_errno(r, "Failed to map properties: %s", bus_error_message(&error, r));
if (unit) {
r = bus_message_map_all_properties(reply, property_map, &info);
if (r < 0)
return log_error_errno(r, "Failed to map properties: %s", bus_error_message(&error, r));
if (streq_ptr(property_info.load_state, "not-found") && streq_ptr(property_info.active_state, "inactive"))
return EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN;
if (streq_ptr(info.load_state, "not-found") && streq_ptr(info.active_state, "inactive")) {
log_error("Unit %s could not be found.", unit);
r = sd_bus_message_rewind(reply, true);
if (r < 0)
return log_error_errno(r, "Failed to rewind: %s", bus_error_message(&error, r));
if (streq(verb, "status"))
return EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN;
return -ENOENT;
}
r = sd_bus_message_rewind(reply, true);
if (r < 0)
return log_error_errno(r, "Failed to rewind: %s", bus_error_message(&error, r));
}
r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "{sv}");
if (r < 0)
@@ -4637,9 +4644,17 @@ static int show_one(
if (r < 0)
return bus_log_parse_error(r);
if (show_properties)
if (show_properties) {
r = set_ensure_allocated(&found_properties, &string_hash_ops);
if (r < 0)
return log_oom();
r = set_put(found_properties, name);
if (r < 0 && r != EEXIST)
return log_oom();
r = print_property(name, reply, contents);
else
} else
r = status_property(name, reply, &info, contents);
if (r < 0)
return r;
@@ -4661,35 +4676,30 @@ static int show_one(
r = 0;
if (!show_properties) {
if (streq(verb, "help"))
show_unit_help(&info);
if (show_properties) {
char **pp;
STRV_FOREACH(pp, arg_properties) {
if (!set_contains(found_properties, *pp)) {
log_warning("Property %s does not exist.", *pp);
r = -ENXIO;
}
}
} else if (streq(verb, "help"))
show_unit_help(&info);
else if (streq(verb, "status")) {
print_status_info(bus, &info, ellipsized);
if (info.active_state && STR_IN_SET(info.active_state, "inactive", "failed"))
r = EXIT_PROGRAM_NOT_RUNNING;
else
print_status_info(bus, &info, ellipsized);
r = EXIT_PROGRAM_RUNNING_OR_SERVICE_OK;
}
strv_free(info.documentation);
strv_free(info.dropin_paths);
strv_free(info.listen);
if (!streq_ptr(info.active_state, "active") &&
!streq_ptr(info.active_state, "reloading") &&
streq(verb, "status")) {
/* According to LSB: "program not running" */
/* 0: program is running or service is OK
* 1: program is dead and /run PID file exists
* 2: program is dead and /run/lock lock file exists
* 3: program is not running
* 4: program or service status is unknown
*/
if (info.pid_file && access(info.pid_file, F_OK) == 0)
r = EXIT_PROGRAM_DEAD_AND_PID_EXISTS;
else if (streq_ptr(info.load_state, "not-found") && streq_ptr(info.active_state, "inactive"))
r = EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN;
else
r = EXIT_PROGRAM_NOT_RUNNING;
}
while ((p = info.exec)) {
LIST_REMOVE(exec, info.exec, p);
exec_status_info_free(p);
@@ -4762,7 +4772,7 @@ static int show_all(
if (!p)
return log_oom();
r = show_one(verb, bus, p, show_properties, new_line, ellipsized);
r = show_one(verb, bus, p, u->id, show_properties, new_line, ellipsized);
if (r < 0)
return r;
else if (r > 0 && ret == 0)
@@ -4858,7 +4868,7 @@ static int show(int argc, char *argv[], void *userdata) {
/* If no argument is specified inspect the manager itself */
if (show_properties && argc <= 1)
return show_one(argv[0], bus, "/org/freedesktop/systemd1", show_properties, &new_line, &ellipsized);
return show_one(argv[0], bus, "/org/freedesktop/systemd1", NULL, show_properties, &new_line, &ellipsized);
if (show_status && argc <= 1) {
@@ -4873,7 +4883,7 @@ static int show(int argc, char *argv[], void *userdata) {
char **name;
STRV_FOREACH(name, strv_skip(argv, 1)) {
_cleanup_free_ char *unit = NULL;
_cleanup_free_ char *path = NULL, *unit = NULL;
uint32_t id;
if (safe_atou32(*name, &id) < 0) {
@@ -4883,19 +4893,23 @@ static int show(int argc, char *argv[], void *userdata) {
continue;
} else if (show_properties) {
/* Interpret as job id */
if (asprintf(&unit, "/org/freedesktop/systemd1/job/%u", id) < 0)
if (asprintf(&path, "/org/freedesktop/systemd1/job/%u", id) < 0)
return log_oom();
} else {
/* Interpret as PID */
r = get_unit_dbus_path_by_pid(bus, id, &unit);
r = get_unit_dbus_path_by_pid(bus, id, &path);
if (r < 0) {
ret = r;
continue;
}
r = unit_name_from_dbus_path(path, &unit);
if (r < 0)
return log_oom();
}
r = show_one(argv[0], bus, unit, show_properties, &new_line, &ellipsized);
r = show_one(argv[0], bus, path, unit, show_properties, &new_line, &ellipsized);
if (r < 0)
return r;
else if (r > 0 && ret == 0)
@@ -4910,20 +4924,17 @@ static int show(int argc, char *argv[], void *userdata) {
return log_error_errno(r, "Failed to expand names: %m");
STRV_FOREACH(name, names) {
_cleanup_free_ char *unit;
_cleanup_free_ char *path;
unit = unit_dbus_path_from_name(*name);
if (!unit)
path = unit_dbus_path_from_name(*name);
if (!path)
return log_oom();
r = show_one(argv[0], bus, unit, show_properties, &new_line, &ellipsized);
r = show_one(argv[0], bus, path, *name, show_properties, &new_line, &ellipsized);
if (r < 0)
return r;
else if (r > 0 && ret == 0)
if (r > 0 && ret == 0)
ret = r;
if (r == EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN)
log_error("Can't display property %s. Unit %s does not exist.", *patterns, *name);
}
}
}