chiark / gitweb /
systemctl: let's make use of FOREACH_STRING() where we can
[elogind.git] / src / systemctl / systemctl.c
index 083b6180e394d8a755a0b1688900ee3095ce4cd2..773b4ccd87f19e139023adf2a00bbfe2086c7bf8 100644 (file)
@@ -37,7 +37,6 @@
 #include <sys/stat.h>
 #include <stddef.h>
 #include <sys/prctl.h>
-#include <fnmatch.h>
 
 #include "sd-daemon.h"
 #include "sd-shutdown.h"
@@ -311,16 +310,9 @@ static int compare_unit_info(const void *a, const void *b) {
 }
 
 static bool output_show_unit(const UnitInfo *u, char **patterns) {
-        if (!strv_isempty(patterns)) {
-                char **pattern;
-
-                STRV_FOREACH(pattern, patterns)
-                        if (fnmatch(*pattern, u->id, FNM_NOESCAPE) == 0)
-                                goto next;
+        if (!strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE))
                 return false;
-        }
 
-next:
         if (arg_types) {
                 const char *dot;
 
@@ -1255,16 +1247,9 @@ static int compare_unit_file_list(const void *a, const void *b) {
 }
 
 static bool output_show_unit_file(const UnitFileList *u, char **patterns) {
-        if (!strv_isempty(patterns)) {
-                char **pattern;
-
-                STRV_FOREACH(pattern, patterns)
-                        if (fnmatch(*pattern, basename(u->path), FNM_NOESCAPE) == 0)
-                                goto next;
+        if (!strv_fnmatch_or_empty(patterns, basename(u->path), FNM_NOESCAPE))
                 return false;
-        }
 
-next:
         if (!strv_isempty(arg_types)) {
                 const char *dot;
 
@@ -1276,10 +1261,9 @@ next:
                         return false;
         }
 
-        if (!strv_isempty(arg_states)) {
-                if (!strv_find(arg_states, unit_file_state_to_string(u->state)))
-                        return false;
-        }
+        if (!strv_isempty(arg_states) &&
+            !strv_find(arg_states, unit_file_state_to_string(u->state)))
+                return false;
 
         return true;
 }
@@ -1736,18 +1720,7 @@ static int get_machine_properties(sd_bus *bus, struct machine_info *mi) {
 }
 
 static bool output_show_machine(const char *name, char **patterns) {
-        char **i;
-
-        assert(name);
-
-        if (strv_isempty(patterns))
-                return true;
-
-        STRV_FOREACH(i, patterns)
-                if (fnmatch(*i, name, FNM_NOESCAPE) == 0)
-                        return true;
-
-        return false;
+        return strv_fnmatch_or_empty(patterns, name, FNM_NOESCAPE);
 }
 
 static int get_machine_list(
@@ -2100,17 +2073,7 @@ static void output_jobs_list(const struct job_info* jobs, unsigned n, bool skipp
 }
 
 static bool output_show_job(struct job_info *job, char **patterns) {
-        char **pattern;
-
-        assert(job);
-
-        if (strv_isempty(patterns))
-                return true;
-
-        STRV_FOREACH(pattern, patterns)
-                if (fnmatch(*pattern, job->name, FNM_NOESCAPE) == 0)
-                        return true;
-        return false;
+        return strv_fnmatch_or_empty(patterns, job->name, FNM_NOESCAPE);
 }
 
 static int list_jobs(sd_bus *bus, char **args) {
@@ -2293,6 +2256,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,9 +2277,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;
 
                 unit = unit_dbus_path_from_name(unit_name);
@@ -2359,28 +2322,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 +2345,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 +2357,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)
@@ -2986,7 +2955,7 @@ static int start_special(sd_bus *bus, char **args) {
                 return -EPERM;
         }
 
-        if (a == ACTION_REBOOT) {
+        if (a == ACTION_REBOOT && args[1]) {
                 r = update_reboot_param_file(args[1]);
                 if (r < 0)
                         return r;
@@ -4578,7 +4547,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;
 }
@@ -4594,8 +4563,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 +4574,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();
 
@@ -5725,11 +5694,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 +5707,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;
         }
@@ -5802,7 +5771,6 @@ static int get_file_to_edit(const char *name, const char *user_home, const char
         return 0;
 }
 
-
 static int unit_file_create_dropin(const char *unit_name, const char *user_home, const char *user_runtime, char **ret_new_path, char **ret_tmp_path) {
         char *tmp_new_path, *ending;
         char *tmp_tmp_path;
@@ -5829,12 +5797,14 @@ static int unit_file_create_dropin(const char *unit_name, const char *user_home,
         return 0;
 }
 
-static int unit_file_create_copy(const char *unit_name,
-                                 const char *fragment_path,
-                                 const char *user_home,
-                                 const char *user_runtime,
-                                 char **ret_new_path,
-                                 char **ret_tmp_path) {
+static int unit_file_create_copy(
+                const char *unit_name,
+                const char *fragment_path,
+                const char *user_home,
+                const char *user_runtime,
+                char **ret_new_path,
+                char **ret_tmp_path) {
+
         char *tmp_new_path;
         char *tmp_tmp_path;
         int r;
@@ -5851,7 +5821,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 +5835,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;
         }
@@ -5890,9 +5860,8 @@ static int run_editor(char **paths) {
 
         if (pid == 0) {
                 const char **args;
-                char **backup_editors = STRV_MAKE("nano", "vim", "vi");
                 char *editor;
-                char **tmp_path, **original_path, **p;
+                char **tmp_path, **original_path, *p;
                 unsigned i = 1;
                 size_t argc;
 
@@ -5921,9 +5890,9 @@ static int run_editor(char **paths) {
                         execvp(editor, (char* const*) args);
                 }
 
-                STRV_FOREACH(p, backup_editors) {
-                        args[0] = *p;
-                        execvp(*p, (char* const*) args);
+                FOREACH_STRING(p, "nano", "vim", "vi") {
+                        args[0] = p;
+                        execvp(p, (char* const*) args);
                         /* We do not fail if the editor doesn't exist
                          * because we want to try each one of them before
                          * failing.
@@ -5934,7 +5903,7 @@ static int run_editor(char **paths) {
                         }
                 }
 
-                log_error("Cannot edit unit(s), no editor available. Please set either $SYSTEMD_EDITOR or $EDITOR or $VISUAL.");
+                log_error("Cannot edit unit(s), no editor available. Please set either $SYSTEMD_EDITOR, $EDITOR or $VISUAL.");
                 _exit(EXIT_FAILURE);
         }
 
@@ -6001,7 +5970,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 +5999,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;
                 }
         }