[systemd-commits] 4 commits - src/systemctl

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Wed Feb 4 17:26:34 PST 2015


 src/systemctl/systemctl.c |  137 ++++++++++++++++++++++++++++------------------
 1 file changed, 85 insertions(+), 52 deletions(-)

New commits:
commit dab2bce81ed3e97d059d56e66f560aa25d9c2d63
Author: Ivan Shapovalov <intelfx100 at gmail.com>
Date:   Thu Feb 5 01:57:00 2015 +0300

    systemctl: unit_find_paths(): unify error handling in two code pathes

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 384ae02..2d70ff1 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -2293,6 +2293,9 @@ static int unit_find_paths(sd_bus *bus,
                            LookupPaths *lp,
                            char **fragment_path,
                            char ***dropin_paths) {
+
+        _cleanup_free_ char *path = NULL;
+        _cleanup_strv_free_ char **dropins = NULL;
         int r;
 
         /**
@@ -2311,8 +2314,6 @@ static int unit_find_paths(sd_bus *bus,
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
                 _cleanup_bus_message_unref_ sd_bus_message *unit_load_error = NULL;
                 _cleanup_free_ char *unit = NULL;
-                _cleanup_free_ char *path = NULL;
-                _cleanup_strv_free_ char **dropins = NULL;
                 _cleanup_strv_free_ char **load_error = NULL;
                 char *unit_load_error_name, *unit_load_error_message;
 
@@ -2359,28 +2360,17 @@ static int unit_find_paths(sd_bus *bus,
                 if (r < 0)
                         return log_error_errno(r, "Failed to get FragmentPath: %s", bus_error_message(&error, r));
 
-                r = sd_bus_get_property_strv(
-                                bus,
-                                "org.freedesktop.systemd1",
-                                unit,
-                                "org.freedesktop.systemd1.Unit",
-                                "DropInPaths",
-                                &error,
-                                &dropins);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to get DropInPaths: %s", bus_error_message(&error, r));
-
-                r = 0;
-                if (!isempty(path)) {
-                        *fragment_path = path;
-                        path = NULL;
-                        r = 1;
-                }
-
-                if (dropin_paths && !strv_isempty(dropins)) {
-                        *dropin_paths = dropins;
-                        dropins = NULL;
-                        r = 1;
+                if (dropin_paths) {
+                        r = sd_bus_get_property_strv(
+                                        bus,
+                                        "org.freedesktop.systemd1",
+                                        unit,
+                                        "org.freedesktop.systemd1.Unit",
+                                        "DropInPaths",
+                                        &error,
+                                        &dropins);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to get DropInPaths: %s", bus_error_message(&error, r));
                 }
         } else {
                 _cleanup_set_free_ Set *names;
@@ -2393,7 +2383,7 @@ static int unit_find_paths(sd_bus *bus,
                 if (r < 0)
                         return r;
 
-                r = unit_file_find_path(lp, unit_name, fragment_path);
+                r = unit_file_find_path(lp, unit_name, &path);
                 if (r < 0)
                         return r;
 
@@ -2405,14 +2395,31 @@ static int unit_find_paths(sd_bus *bus,
                                 return log_oom();
 
                         if (!streq(template, unit_name)) {
-                                r = unit_file_find_path(lp, template, fragment_path);
+                                r = unit_file_find_path(lp, template, &path);
                                 if (r < 0)
                                         return r;
                         }
                 }
 
-                if (dropin_paths)
-                        r = unit_file_find_dropin_paths(lp->unit_path, NULL, names, dropin_paths);
+                if (dropin_paths) {
+                        r = unit_file_find_dropin_paths(lp->unit_path, NULL, names, &dropins);
+                        if (r < 0)
+                                return r;
+                }
+        }
+
+        r = 0;
+
+        if (!isempty(path)) {
+                *fragment_path = path;
+                path = NULL;
+                r = 1;
+        }
+
+        if (dropin_paths && !strv_isempty(dropins)) {
+                *dropin_paths = dropins;
+                dropins = NULL;
+                r = 1;
         }
 
         if (r == 0)

commit 029009d4970b2871dafab5fcc9397abb335263c8
Author: Ivan Shapovalov <intelfx100 at gmail.com>
Date:   Thu Feb 5 01:56:59 2015 +0300

    systemctl: cat, edit: further polish error messages

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 567b467..384ae02 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -4578,7 +4578,7 @@ static int init_home_and_lookup_paths(char **user_home, char **user_runtime, Loo
 
         r = lookup_paths_init_from_scope(lp, arg_scope, arg_root);
         if (r < 0)
-                return log_error_errno(r, "Failed to lookup unit lookup paths: %m");
+                return log_error_errno(r, "Failed to query unit lookup paths: %m");
 
         return 0;
 }
@@ -5725,11 +5725,11 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
 
         r = tempfn_random(new_path, &t);
         if (r < 0)
-                return log_error_errno(r, "Failed to determine temporary filename for %s: %m", new_path);
+                return log_error_errno(r, "Failed to determine temporary filename for \"%s\": %m", new_path);
 
         r = mkdir_parents(new_path, 0755);
         if (r < 0) {
-                log_error_errno(r, "Failed to create directories for %s: %m", new_path);
+                log_error_errno(r, "Failed to create directories for \"%s\": %m", new_path);
                 free(t);
                 return r;
         }
@@ -5738,12 +5738,12 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
         if (r == -ENOENT) {
                 r = touch(t);
                 if (r < 0) {
-                        log_error_errno(r, "Failed to create temporary file %s: %m", t);
+                        log_error_errno(r, "Failed to create temporary file \"%s\": %m", t);
                         free(t);
                         return r;
                 }
         } else if (r < 0) {
-                log_error_errno(r, "Failed to copy %s to %s: %m", original_path, t);
+                log_error_errno(r, "Failed to copy \"%s\" to \"%s\": %m", original_path, t);
                 free(t);
                 return r;
         }
@@ -5851,7 +5851,7 @@ static int unit_file_create_copy(const char *unit_name,
         if (!path_equal(fragment_path, tmp_new_path) && access(tmp_new_path, F_OK) == 0) {
                 char response;
 
-                r = ask_char(&response, "yn", "%s already exists, are you sure to overwrite it with %s? [(y)es, (n)o] ", tmp_new_path, fragment_path);
+                r = ask_char(&response, "yn", "\"%s\" already exists. Overwrite with \"%s\"? [(y)es, (n)o] ", tmp_new_path, fragment_path);
                 if (r < 0) {
                         free(tmp_new_path);
                         return r;
@@ -5865,7 +5865,7 @@ static int unit_file_create_copy(const char *unit_name,
 
         r = create_edit_temp_file(tmp_new_path, fragment_path, &tmp_tmp_path);
         if (r < 0) {
-                log_error_errno(r, "Failed to create temporary file for %s: %m", tmp_new_path);
+                log_error_errno(r, "Failed to create temporary file for \"%s\": %m", tmp_new_path);
                 free(tmp_new_path);
                 return r;
         }
@@ -6001,7 +6001,7 @@ static int edit(sd_bus *bus, char **args) {
         assert(args);
 
         if (!on_tty()) {
-                log_error("Cannot edit units if we are not on a tty");
+                log_error("Cannot edit units if not on a tty");
                 return -EINVAL;
         }
 
@@ -6030,12 +6030,12 @@ static int edit(sd_bus *bus, char **args) {
                  * It's useful if the user wants to cancel its modification
                  */
                 if (null_or_empty_path(*tmp)) {
-                        log_warning("Edition of %s canceled: temporary file empty", *original);
+                        log_warning("Editing \"%s\" canceled: temporary file is empty", *original);
                         continue;
                 }
                 r = rename(*tmp, *original);
                 if (r < 0) {
-                        r = log_error_errno(errno, "Failed to rename %s to %s: %m", *tmp, *original);
+                        r = log_error_errno(errno, "Failed to rename \"%s\" to \"%s\": %m", *tmp, *original);
                         goto end;
                 }
         }

commit 3e7eed8497098d1b09fd4ae1260c5242e16a8127
Author: Ivan Shapovalov <intelfx100 at gmail.com>
Date:   Thu Feb 5 01:56:58 2015 +0300

    systemctl: cat: fix error handling
    
    - correctly check for local vs. remote transport
    - return after receiving error from expand_names()

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 083b618..567b467 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -4594,8 +4594,8 @@ static int cat(sd_bus *bus, char **args) {
 
         assert(args);
 
-        if (arg_host) {
-                log_error("Option --host cannot be used with 'cat'");
+        if (arg_transport != BUS_TRANSPORT_LOCAL) {
+                log_error("Cannot remotely cat units");
                 return -EINVAL;
         }
 
@@ -4605,7 +4605,7 @@ static int cat(sd_bus *bus, char **args) {
 
         r = expand_names(bus, args + 1, NULL, &names);
         if (r < 0)
-                log_error_errno(r, "Failed to expand names: %m");
+                return log_error_errno(r, "Failed to expand names: %m");
 
         avoid_bus_cache = !bus || avoid_bus();
 

commit b5e6a600327d4e92c9fe62b9d51648a9d459871e
Author: Ivan Shapovalov <intelfx100 at gmail.com>
Date:   Thu Feb 5 01:56:57 2015 +0300

    systemctl: cat, edit: improve unit load error reporting
    
    - report actual load error for units which could not be loaded
    - make unit_find_paths() report all kinds of errors it encounters
      (for consistency)
    - consistently handle not-found errors in cat() and edit()

diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 462f7fd..083b618 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -2309,9 +2309,12 @@ static int unit_find_paths(sd_bus *bus,
 
         if (!avoid_bus_cache && !unit_name_is_template(unit_name)) {
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+                _cleanup_bus_message_unref_ sd_bus_message *unit_load_error = NULL;
                 _cleanup_free_ char *unit = NULL;
                 _cleanup_free_ char *path = NULL;
                 _cleanup_strv_free_ char **dropins = NULL;
+                _cleanup_strv_free_ char **load_error = NULL;
+                char *unit_load_error_name, *unit_load_error_message;
 
                 unit = unit_dbus_path_from_name(unit_name);
                 if (!unit)
@@ -2320,6 +2323,31 @@ static int unit_find_paths(sd_bus *bus,
                 if (need_daemon_reload(bus, unit_name) > 0)
                         warn_unit_file_changed(unit_name);
 
+                r = sd_bus_get_property(
+                                bus,
+                                "org.freedesktop.systemd1",
+                                unit,
+                                "org.freedesktop.systemd1.Unit",
+                                "LoadError",
+                                &error,
+                                &unit_load_error,
+                                "(ss)");
+                if (r < 0)
+                        return log_error_errno(r, "Failed to get LoadError: %s", bus_error_message(&error, r));
+
+                r = sd_bus_message_read(
+                                unit_load_error,
+                                "(ss)",
+                                &unit_load_error_name,
+                                &unit_load_error_message);
+                if (r < 0)
+                        return bus_log_parse_error(r);
+
+                if (!isempty(unit_load_error_name)) {
+                        log_error("Unit %s is not loaded: %s", unit_name, unit_load_error_message);
+                        return 0;
+                }
+
                 r = sd_bus_get_property_string(
                                 bus,
                                 "org.freedesktop.systemd1",
@@ -2387,6 +2415,9 @@ static int unit_find_paths(sd_bus *bus,
                         r = unit_file_find_dropin_paths(lp->unit_path, NULL, names, dropin_paths);
         }
 
+        if (r == 0)
+                log_error("No files found for %s.", unit_name);
+
         return r;
 }
 
@@ -4588,10 +4619,8 @@ static int cat(sd_bus *bus, char **args) {
                 r = unit_find_paths(bus, *name, avoid_bus_cache, &lp, &fragment_path, &dropin_paths);
                 if (r < 0)
                         return r;
-                else if (r == 0) {
-                        log_warning("Unit %s does not have any files on disk", *name);
-                        continue;
-                }
+                else if (r == 0)
+                        return -ENOENT;
 
                 if (first)
                         first = false;
@@ -5940,9 +5969,13 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
                 r = unit_find_paths(bus, *name, avoid_bus_cache, &lp, &path, NULL);
                 if (r < 0)
                         return r;
-                else if (r == 0 || !path)
+                else if (r == 0)
+                        return -ENOENT;
+                else if (!path) {
                         // FIXME: support units with path==NULL (no FragmentPath)
-                        return log_error_errno(ENOENT, "Unit %s not found, cannot edit.", *name);
+                        log_error("No fragment exists for %s.", *name);
+                        return -ENOENT;
+                }
 
                 if (arg_full)
                         r = unit_file_create_copy(*name, path, user_home, user_runtime, &new_path, &tmp_path);
@@ -5981,19 +6014,12 @@ static int edit(sd_bus *bus, char **args) {
         if (r < 0)
                 return log_error_errno(r, "Failed to expand names: %m");
 
-        if (!names) {
-                log_error("No unit name found by expanding names");
-                return -ENOENT;
-        }
-
         r = find_paths_to_edit(bus, names, &paths);
         if (r < 0)
                 return r;
 
-        if (strv_isempty(paths)) {
-                log_error("Cannot find any units to edit");
+        if (strv_isempty(paths))
                 return -ENOENT;
-        }
 
         r = run_editor(paths);
         if (r < 0)



More information about the systemd-commits mailing list