chiark / gitweb /
systemctl: cat: fix error handling
[elogind.git] / src / systemctl / systemctl.c
index 11b0be001f69053a621fa8c3f1b1bf208f03ac56..567b467bae9d15e1b179552ca957a984b9fe8790 100644 (file)
@@ -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;
 }
 
@@ -4563,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;
         }
 
@@ -4574,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();
 
@@ -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;
@@ -4978,8 +5007,8 @@ static int switch_root(sd_bus *bus, char **args) {
         if (init) {
                 const char *root_systemd_path = NULL, *root_init_path = NULL;
 
-                root_systemd_path = strappenda(root, "/" SYSTEMD_BINARY_PATH);
-                root_init_path = strappenda(root, "/", init);
+                root_systemd_path = strjoina(root, "/" SYSTEMD_BINARY_PATH);
+                root_init_path = strjoina(root, "/", init);
 
                 /* If the passed init is actually the same as the
                  * systemd binary, then let's suppress it. */
@@ -5783,7 +5812,7 @@ static int unit_file_create_dropin(const char *unit_name, const char *user_home,
         assert(ret_new_path);
         assert(ret_tmp_path);
 
-        ending = strappenda(unit_name, ".d/override.conf");
+        ending = strjoina(unit_name, ".d/override.conf");
         r = get_file_to_edit(ending, user_home, user_runtime, &tmp_new_path);
         if (r < 0)
                 return r;
@@ -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)