[systemd-devel] [PATCH 1/2] systemctl: refactor show()
Shawn Landden
shawn at churchofgit.com
Fri Nov 22 13:37:42 PST 2013
---
src/systemctl/systemctl.c | 66 ++++++++++++++++++++++++++++++-----------------
1 file changed, 43 insertions(+), 23 deletions(-)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 84826a3..576396f 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -3594,16 +3594,13 @@ static int show_one(
return r;
}
-static int show_one_by_pid(
- const char *verb,
+static int get_unit_dbus_path_by_pid(
sd_bus *bus,
uint32_t pid,
- bool *new_line,
- bool *ellipsized) {
+ char **unit) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
- const char *path = NULL;
int r;
r = sd_bus_call_method(
@@ -3620,11 +3617,11 @@ static int show_one_by_pid(
return r;
}
- r = sd_bus_message_read(reply, "o", &path);
+ r = sd_bus_message_read(reply, "o", unit);
if (r < 0)
return bus_log_parse_error(r);
- return show_one(verb, bus, path, false, new_line, ellipsized);
+ return 0;
}
static int show_all(
@@ -3668,6 +3665,36 @@ static int show_all(
return 0;
}
+static int get_unit_from_arg(sd_bus *bus, char *arg, char **unitp, bool interpret_as_job_id) {
+ uint32_t id;
+ int r = 0;
+
+ if (safe_atou32(arg, &id) < 0) {
+ _cleanup_free_ char *n = NULL;
+ char *unit;
+ /* Interpret as unit name */
+
+ n = unit_name_mangle(arg);
+ if (!n)
+ return log_oom();
+
+ unit = unit_dbus_path_from_name(n);
+ if (!unit)
+ return log_oom();
+
+ *unitp = unit;
+ } else if (interpret_as_job_id) {
+ /* Interpret as job id */
+ if (asprintf(unitp, "/org/freedesktop/systemd1/job/%u", id) < 0)
+ return log_oom();
+ } else {
+ /* Interpret as PID */
+ r = get_unit_by_pid(bus, id, unitp);
+ }
+
+ return r;
+}
+
static int show(sd_bus *bus, char **args) {
int r, ret = 0;
bool show_properties, show_status, new_line = false;
@@ -3692,41 +3719,34 @@ static int show(sd_bus *bus, char **args) {
ret = show_all(args[0], bus, false, &new_line, &ellipsized);
else
STRV_FOREACH(name, args+1) {
+ _cleanup_free_ char *unit = NULL;
uint32_t id;
if (safe_atou32(*name, &id) < 0) {
- _cleanup_free_ char *p = NULL, *n = NULL;
+ _cleanup_free_ char *n = NULL;
/* Interpret as unit name */
n = unit_name_mangle(*name);
if (!n)
return log_oom();
- p = unit_dbus_path_from_name(n);
- if (!p)
+ unit = unit_dbus_path_from_name(n);
+ if (!unit)
return log_oom();
- r = show_one(args[0], bus, p, show_properties, &new_line, &ellipsized);
- if (r != 0)
- ret = r;
-
} else if (show_properties) {
- _cleanup_free_ char *p = NULL;
-
/* Interpret as job id */
- if (asprintf(&p, "/org/freedesktop/systemd1/job/%u", id) < 0)
+ if (asprintf(&unit, "/org/freedesktop/systemd1/job/%u", id) < 0)
return log_oom();
- r = show_one(args[0], bus, p, show_properties, &new_line, &ellipsized);
- if (r != 0)
- ret = r;
-
} else {
/* Interpret as PID */
- r = show_one_by_pid(args[0], bus, id, &new_line, &ellipsized);
- if (r != 0)
+ r = get_unit_dbus_path_by_pid(bus, id, &unit);
+ if (r < 0)
ret = r;
}
+
+ show_one(args[0], bus, unit, show_properties, &new_line, &ellipsized);
}
if (ellipsized && !arg_quiet)
--
1.8.4.3
More information about the systemd-devel
mailing list