]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
install: make UnitFileChangeType enum anonymous
authorLennart Poettering <lennart@poettering.net>
Wed, 17 Feb 2021 09:38:12 +0000 (10:38 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 17 Feb 2021 18:29:24 +0000 (19:29 +0100)
We almost never use the named enum type, in almost all cases we use
"int" instead, since we overload it with negative errnos. To simplify
things, let's use "int" really everywhere.

Moreover, let's rename the fields for this enum to "type_or_errno", to
make the overloading clear. And let's ad some assertions that things are
in the right range.

src/core/dbus-manager.c
src/shared/bus-unit-util.c
src/shared/install.c
src/shared/install.h
src/systemctl/systemctl-is-enabled.c
src/test/test-install-root.c
src/test/test-install.c

index 86d0b3744d07c13d26e22b305b31824b366e273f..f54e73684e8d1c8bb73174acd0213ab38e95c601 100644 (file)
@@ -2062,9 +2062,9 @@ static int install_error(
 
         for (size_t i = 0; i < n_changes; i++)
 
-                switch(changes[i].type) {
+                switch(changes[i].type_or_errno) {
 
-                case 0 ... INT_MAX:
+                case 0 ... _UNIT_FILE_CHANGE_TYPE_MAX: /* not errors */
                         continue;
 
                 case -EEXIST:
@@ -2106,7 +2106,8 @@ static int install_error(
                         goto found;
 
                 default:
-                        r = sd_bus_error_set_errnof(error, changes[i].type, "File %s: %m", changes[i].path);
+                        assert(changes[i].type_or_errno < 0); /* other errors */
+                        r = sd_bus_error_set_errnof(error, changes[i].type_or_errno, "File %s: %m", changes[i].path);
                         goto found;
                 }
 
@@ -2151,14 +2152,14 @@ static int reply_unit_file_changes_and_free(
 
         for (size_t i = 0; i < n_changes; i++) {
 
-                if (changes[i].type < 0) {
+                if (changes[i].type_or_errno < 0) {
                         bad = true;
                         continue;
                 }
 
                 r = sd_bus_message_append(
                                 reply, "(sss)",
-                                unit_file_change_type_to_string(changes[i].type),
+                                unit_file_change_type_to_string(changes[i].type_or_errno),
                                 changes[i].path,
                                 changes[i].source);
                 if (r < 0)
@@ -2542,7 +2543,7 @@ static int method_get_unit_file_links(sd_bus_message *message, void *userdata, s
                 return log_error_errno(r, "Failed to get file links for %s: %m", name);
 
         for (i = 0; i < n_changes; i++)
-                if (changes[i].type == UNIT_FILE_UNLINK) {
+                if (changes[i].type_or_errno == UNIT_FILE_UNLINK) {
                         r = sd_bus_message_append(reply, "s", changes[i].path);
                         if (r < 0)
                                 return r;
index 61d264b9537aac7946d23879e6bc145b3b0743d7..548dc57e3ceba129131d230d9ca6a9c2dc5b6da1 100644 (file)
@@ -2388,7 +2388,7 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet, Un
         while ((r = sd_bus_message_read(m, "(sss)", &type, &path, &source)) > 0) {
                 /* We expect only "success" changes to be sent over the bus.
                    Hence, reject anything negative. */
-                UnitFileChangeType ch = unit_file_change_type_from_string(type);
+                int ch = unit_file_change_type_from_string(type);
                 if (ch < 0) {
                         log_notice_errno(ch, "Manager reported unknown change type \"%s\" for path \"%s\", ignoring.",
                                          type, path);
index 77208582b7d8af91935ffa122eaa92ffc7f00868..183da5865e0247914fae5a2be8e6e1d08605bb6c 100644 (file)
@@ -14,6 +14,7 @@
 #include "conf-parser.h"
 #include "def.h"
 #include "dirent-util.h"
+#include "errno-list.h"
 #include "extract-word.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -261,7 +262,7 @@ static const char* config_path_from_flags(const LookupPaths *paths, UnitFileFlag
 int unit_file_changes_add(
                 UnitFileChange **changes,
                 size_t *n_changes,
-                int type,
+                int type_or_errno, /* UNIT_FILE_SYMLINK, _UNLINK, _IS_MASKED, _IS_DANGLING if positive or errno if negative */
                 const char *path,
                 const char *source) {
 
@@ -271,6 +272,11 @@ int unit_file_changes_add(
         assert(path);
         assert(!changes == !n_changes);
 
+        if (type_or_errno >= 0)
+                assert(type_or_errno < _UNIT_FILE_CHANGE_TYPE_MAX);
+        else
+                assert(type_or_errno >= -ERRNO_MAX);
+
         if (!changes)
                 return 0;
 
@@ -280,19 +286,25 @@ int unit_file_changes_add(
         *changes = c;
 
         p = strdup(path);
-        if (source)
-                s = strdup(source);
-
-        if (!p || (source && !s))
+        if (!p)
                 return -ENOMEM;
 
         path_simplify(p, false);
-        if (s)
+
+        if (source) {
+                s = strdup(source);
+                if (!s)
+                        return -ENOMEM;
+
                 path_simplify(s, false);
+        }
+
+        c[(*n_changes)++] = (UnitFileChange) {
+                .type_or_errno = type_or_errno,
+                .path = TAKE_PTR(p),
+                .source = TAKE_PTR(s),
+        };
 
-        c[*n_changes] = (UnitFileChange) { type, p, s };
-        p = s = NULL;
-        (*n_changes) ++;
         return 0;
 }
 
@@ -315,9 +327,9 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
         assert(verb || r >= 0);
 
         for (size_t i = 0; i < n_changes; i++) {
-                assert(verb || changes[i].type >= 0);
+                assert(verb || changes[i].type_or_errno >= 0);
 
-                switch(changes[i].type) {
+                switch(changes[i].type_or_errno) {
                 case UNIT_FILE_SYMLINK:
                         if (!quiet)
                                 log_info("Created symlink %s %s %s.",
@@ -340,45 +352,45 @@ void unit_file_dump_changes(int r, const char *verb, const UnitFileChange *chang
                         break;
                 case -EEXIST:
                         if (changes[i].source)
-                                log_error_errno(changes[i].type,
+                                log_error_errno(changes[i].type_or_errno,
                                                 "Failed to %s unit, file %s already exists and is a symlink to %s.",
                                                 verb, changes[i].path, changes[i].source);
                         else
-                                log_error_errno(changes[i].type,
+                                log_error_errno(changes[i].type_or_errno,
                                                 "Failed to %s unit, file %s already exists.",
                                                 verb, changes[i].path);
                         logged = true;
                         break;
                 case -ERFKILL:
-                        log_error_errno(changes[i].type, "Failed to %s unit, unit %s is masked.",
+                        log_error_errno(changes[i].type_or_errno, "Failed to %s unit, unit %s is masked.",
                                         verb, changes[i].path);
                         logged = true;
                         break;
                 case -EADDRNOTAVAIL:
-                        log_error_errno(changes[i].type, "Failed to %s unit, unit %s is transient or generated.",
+                        log_error_errno(changes[i].type_or_errno, "Failed to %s unit, unit %s is transient or generated.",
                                         verb, changes[i].path);
                         logged = true;
                         break;
                 case -EUCLEAN:
-                        log_error_errno(changes[i].type,
+                        log_error_errno(changes[i].type_or_errno,
                                         "Failed to %s unit, \"%s\" is not a valid unit name.",
                                         verb, changes[i].path);
                         logged = true;
                         break;
                 case -ELOOP:
-                        log_error_errno(changes[i].type, "Failed to %s unit, refusing to operate on linked unit file %s",
+                        log_error_errno(changes[i].type_or_errno, "Failed to %s unit, refusing to operate on linked unit file %s",
                                         verb, changes[i].path);
                         logged = true;
                         break;
 
                 case -ENOENT:
-                        log_error_errno(changes[i].type, "Failed to %s unit, unit %s does not exist.", verb, changes[i].path);
+                        log_error_errno(changes[i].type_or_errno, "Failed to %s unit, unit %s does not exist.", verb, changes[i].path);
                         logged = true;
                         break;
 
                 default:
-                        assert(changes[i].type < 0);
-                        log_error_errno(changes[i].type, "Failed to %s unit, file %s: %m.",
+                        assert(changes[i].type_or_errno < 0);
+                        log_error_errno(changes[i].type_or_errno, "Failed to %s unit, file %s: %m.",
                                         verb, changes[i].path);
                         logged = true;
                 }
@@ -3464,7 +3476,7 @@ static const char* const unit_file_change_type_table[_UNIT_FILE_CHANGE_TYPE_MAX]
         [UNIT_FILE_IS_DANGLING] = "dangling",
 };
 
-DEFINE_STRING_TABLE_LOOKUP(unit_file_change_type, UnitFileChangeType);
+DEFINE_STRING_TABLE_LOOKUP(unit_file_change_type, int);
 
 static const char* const unit_file_preset_mode_table[_UNIT_FILE_PRESET_MAX] = {
         [UNIT_FILE_PRESET_FULL]         = "full",
index 232184de33b29e7e7dc48fb659de8b4b70bea7ca..305e4f74b8fcd89aa009228dcb1c0204a74201c3 100644 (file)
@@ -25,7 +25,9 @@ enum UnitFilePresetMode {
         _UNIT_FILE_PRESET_INVALID = -EINVAL,
 };
 
-enum UnitFileChangeType {
+/* This enum type is anonymous, since we usually store it in an 'int', as we overload it with negative errno
+ * values. */
+enum {
         UNIT_FILE_SYMLINK,
         UNIT_FILE_UNLINK,
         UNIT_FILE_IS_MASKED,
@@ -42,20 +44,18 @@ enum UnitFileFlags {
         _UNIT_FILE_FLAGS_MASK_PUBLIC = UNIT_FILE_RUNTIME|UNIT_FILE_PORTABLE|UNIT_FILE_FORCE,
 };
 
-/* type can either one of the UnitFileChangeTypes listed above, or a negative error.
- * If source is specified, it should be the contents of the path symlink.
- * In case of an error, source should be the existing symlink contents or NULL
- */
+/* type can either one of the UNIT_FILE_SYMLINK, UNIT_FILE_UNLINK, … listed above, or a negative errno value.
+ * If source is specified, it should be the contents of the path symlink. In case of an error, source should
+ * be the existing symlink contents or NULL. */
 struct UnitFileChange {
-        int type; /* UnitFileChangeType or bust */
+        int type_or_errno; /* UNIT_FILE_SYMLINK, … if positive, errno if negative */
         char *path;
         char *source;
 };
 
 static inline bool unit_file_changes_have_modification(const UnitFileChange* changes, size_t n_changes) {
-        size_t i;
-        for (i = 0; i < n_changes; i++)
-                if (IN_SET(changes[i].type, UNIT_FILE_SYMLINK, UNIT_FILE_UNLINK))
+        for (size_t i = 0; i < n_changes; i++)
+                if (IN_SET(changes[i].type_or_errno, UNIT_FILE_SYMLINK, UNIT_FILE_UNLINK))
                         return true;
         return false;
 }
@@ -206,8 +206,8 @@ const char *unit_file_state_to_string(UnitFileState s) _const_;
 UnitFileState unit_file_state_from_string(const char *s) _pure_;
 /* from_string conversion is unreliable because of the overlap between -EPERM and -1 for error. */
 
-const char *unit_file_change_type_to_string(UnitFileChangeType s) _const_;
-UnitFileChangeType unit_file_change_type_from_string(const char *s) _pure_;
+const char *unit_file_change_type_to_string(int s) _const_;
+int unit_file_change_type_from_string(const char *s) _pure_;
 
 const char *unit_file_preset_mode_to_string(UnitFilePresetMode m) _const_;
 UnitFilePresetMode unit_file_preset_mode_from_string(const char *s) _pure_;
index de1d016bb3b3ebbadcc4e1990cebdf231bfe35af..e33dffaf29925d5ac549dbd3fd611a6bf14bf6c7 100644 (file)
@@ -23,7 +23,7 @@ static int show_installation_targets_client_side(const char *name) {
                 return log_error_errno(r, "Failed to get file links for %s: %m", name);
 
         for (size_t i = 0; i < n_changes; i++)
-                if (changes[i].type == UNIT_FILE_UNLINK)
+                if (changes[i].type_or_errno == UNIT_FILE_UNLINK)
                         printf("  %s\n", changes[i].path);
 
         return 0;
index aedec54a7f898ab83ee37c47f4be4d897daa1c33..04125f1db1f82830720718d8501bd5378eb35850 100644 (file)
@@ -55,7 +55,7 @@ static void test_basic_mask_and_enable(const char *root) {
 
         assert_se(unit_file_mask(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/dev/null"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/a.service");
         assert_se(streq(changes[0].path, p));
@@ -75,7 +75,7 @@ static void test_basic_mask_and_enable(const char *root) {
 
         assert_se(unit_file_unmask(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/a.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -83,7 +83,7 @@ static void test_basic_mask_and_enable(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/a.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/a.service");
         assert_se(streq(changes[0].path, p));
@@ -103,7 +103,7 @@ static void test_basic_mask_and_enable(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("a.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/a.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -123,7 +123,7 @@ static void test_basic_mask_and_enable(const char *root) {
         /* Let's enable this indirectly via a symlink */
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("d.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/a.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/a.service");
         assert_se(streq(changes[0].path, p));
@@ -139,10 +139,10 @@ static void test_basic_mask_and_enable(const char *root) {
 
         assert_se(unit_file_reenable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("b.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/a.service");
         assert_se(streq(changes[0].path, p));
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/a.service"));
         assert_se(streq(changes[1].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -224,7 +224,7 @@ static void test_linked_units(const char *root) {
         /* First, let's link the unit into the search path */
         assert_se(unit_file_link(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("/opt/linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/opt/linked.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/linked.service");
         assert_se(streq(changes[0].path, p));
@@ -236,7 +236,7 @@ static void test_linked_units(const char *root) {
         /* Let's unlink it from the search path again */
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/linked.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -250,7 +250,7 @@ static void test_linked_units(const char *root) {
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/linked.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/linked.service");
         for (i = 0 ; i < n_changes; i++) {
-                assert_se(changes[i].type == UNIT_FILE_SYMLINK);
+                assert_se(changes[i].type_or_errno == UNIT_FILE_SYMLINK);
                 assert_se(streq(changes[i].source, "/opt/linked.service"));
 
                 if (p && streq(changes[i].path, p))
@@ -272,7 +272,7 @@ static void test_linked_units(const char *root) {
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/linked.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/linked.service");
         for (i = 0; i < n_changes; i++) {
-                assert_se(changes[i].type == UNIT_FILE_UNLINK);
+                assert_se(changes[i].type_or_errno == UNIT_FILE_UNLINK);
 
                 if (p && streq(changes[i].path, p))
                         p = NULL;
@@ -292,7 +292,7 @@ static void test_linked_units(const char *root) {
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/linked2.service");
         q = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/linked2.service");
         for (i = 0 ; i < n_changes; i++) {
-                assert_se(changes[i].type == UNIT_FILE_SYMLINK);
+                assert_se(changes[i].type_or_errno == UNIT_FILE_SYMLINK);
                 assert_se(streq(changes[i].source, "/opt/linked2.service"));
 
                 if (p && streq(changes[i].path, p))
@@ -308,7 +308,7 @@ static void test_linked_units(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("linked3.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(startswith(changes[0].path, root));
         assert_se(endswith(changes[0].path, "linked3.service"));
         assert_se(streq(changes[0].source, "/opt/linked3.service"));
@@ -332,7 +332,7 @@ static void test_default(const char *root) {
 
         assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, 0, root, "idontexist.target", &changes, &n_changes) == -ENOENT);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == -ENOENT);
+        assert_se(changes[0].type_or_errno == -ENOENT);
         assert_se(streq_ptr(changes[0].path, "idontexist.target"));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -341,7 +341,7 @@ static void test_default(const char *root) {
 
         assert_se(unit_file_set_default(UNIT_FILE_SYSTEM, 0, root, "test-default.target", &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/test-default-real.target"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR "/" SPECIAL_DEFAULT_TARGET);
         assert_se(streq(changes[0].path, p));
@@ -371,7 +371,7 @@ static void test_add_dependency(const char *root) {
 
         assert_se(unit_file_add_dependency(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("add-dependency-test-service.service"), "add-dependency-test-target.target", UNIT_WANTS, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/real-add-dependency-test-service.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/real-add-dependency-test-target.target.wants/real-add-dependency-test-service.service");
         assert_se(streq(changes[0].path, p));
@@ -412,7 +412,7 @@ static void test_template_enable(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/template@def.service");
         assert_se(streq(changes[0].path, p));
@@ -428,7 +428,7 @@ static void test_template_enable(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -443,7 +443,7 @@ static void test_template_enable(const char *root) {
         log_info("== %s with template@foo.service enabled ==", __func__);
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@foo.service"), &changes, &n_changes) >= 0);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/template@foo.service");
         assert_se(streq(changes[0].path, p));
@@ -459,7 +459,7 @@ static void test_template_enable(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template@foo.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -476,7 +476,7 @@ static void test_template_enable(const char *root) {
         log_info("== %s with template-symlink@quux.service enabled ==", __func__);
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("template-symlink@quux.service"), &changes, &n_changes) >= 0);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/template@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/template@quux.service");
         assert_se(streq(changes[0].path, p));
@@ -522,7 +522,7 @@ static void test_indirect(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("indirectc.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/indirectb.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/indirectb.service");
         assert_se(streq(changes[0].path, p));
@@ -535,7 +535,7 @@ static void test_indirect(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("indirectc.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/indirectb.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -574,7 +574,7 @@ static void test_preset_and_list(const char *root) {
 
         assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("preset-yes.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/preset-yes.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/preset-yes.service");
         assert_se(streq(changes[0].path, p));
@@ -586,7 +586,7 @@ static void test_preset_and_list(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("preset-yes.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/preset-yes.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -611,11 +611,11 @@ static void test_preset_and_list(const char *root) {
 
         for (i = 0; i < n_changes; i++) {
 
-                if (changes[i].type == UNIT_FILE_SYMLINK) {
+                if (changes[i].type_or_errno == UNIT_FILE_SYMLINK) {
                         assert_se(streq(changes[i].source, "/usr/lib/systemd/system/preset-yes.service"));
                         assert_se(streq(changes[i].path, p));
                 } else
-                        assert_se(changes[i].type == UNIT_FILE_UNLINK);
+                        assert_se(changes[i].type_or_errno == UNIT_FILE_UNLINK);
         }
 
         unit_file_changes_free(changes, n_changes);
@@ -678,7 +678,7 @@ static void test_revert(const char *root) {
         /* Revert the override file */
         assert_se(unit_file_revert(UNIT_FILE_SYSTEM, root, STRV_MAKE("xx.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -690,11 +690,11 @@ static void test_revert(const char *root) {
         /* Revert the dropin file */
         assert_se(unit_file_revert(UNIT_FILE_SYSTEM, root, STRV_MAKE("xx.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         assert_se(streq(changes[0].path, p));
 
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/xx.service.d");
-        assert_se(changes[1].type == UNIT_FILE_UNLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_UNLINK);
         assert_se(streq(changes[1].path, p));
         unit_file_changes_free(changes, n_changes);
         changes = NULL; n_changes = 0;
@@ -730,7 +730,7 @@ static void test_preset_order(const char *root) {
 
         assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("prefix-1.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/prefix-1.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/prefix-1.service");
         assert_se(streq(changes[0].path, p));
@@ -842,8 +842,8 @@ static void test_with_dropin(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-1.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-1.service"));
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/with-dropin-1.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-1.service");
@@ -856,8 +856,8 @@ static void test_with_dropin(const char *root) {
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-2.service"), &changes, &n_changes) == 1);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "with-dropin-2.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, SYSTEM_CONFIG_UNIT_DIR"/with-dropin-2.service"));
         assert_se(streq(changes[1].source, SYSTEM_CONFIG_UNIT_DIR"/with-dropin-2.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-2.service");
@@ -870,8 +870,8 @@ static void test_with_dropin(const char *root) {
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-3.service"), &changes, &n_changes) == 1);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "with-dropin-3.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-3.service"));
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/with-dropin-3.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-3.service");
@@ -884,8 +884,8 @@ static void test_with_dropin(const char *root) {
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-4a.service"), &changes, &n_changes) == 2);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "with-dropin-3.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-4a.service"));
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/with-dropin-4b.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-4a.service");
@@ -954,8 +954,8 @@ static void test_with_dropin_template(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-1@instance-1.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-1@.service"));
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/with-dropin-1@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-1@instance-1.service");
@@ -967,8 +967,8 @@ static void test_with_dropin_template(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-2@instance-1.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 2);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
-        assert_se(changes[1].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
+        assert_se(changes[1].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-2@.service"));
         assert_se(streq(changes[1].source, "/usr/lib/systemd/system/with-dropin-2@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-2@instance-1.service");
@@ -980,7 +980,7 @@ static void test_with_dropin_template(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-2@instance-2.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-2@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-2@instance-2.service");
         assert_se(streq(changes[0].path, p));
@@ -989,7 +989,7 @@ static void test_with_dropin_template(const char *root) {
 
         assert_se(unit_file_enable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("with-dropin-3@.service"), &changes, &n_changes) == 1);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         assert_se(streq(changes[0].source, "/usr/lib/systemd/system/with-dropin-3@.service"));
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/with-dropin-3@instance-2.service");
         assert_se(streq(changes[0].path, p));
@@ -1030,7 +1030,7 @@ static void test_preset_multiple_instances(const char *root) {
         assert_se(unit_file_preset(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("foo@bar0.service"), UNIT_FILE_PRESET_FULL, &changes, &n_changes) >= 0);
         assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "foo@bar0.service", &state) >= 0 && state == UNIT_FILE_ENABLED);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_SYMLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_SYMLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/foo@bar0.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
@@ -1038,7 +1038,7 @@ static void test_preset_multiple_instances(const char *root) {
 
         assert_se(unit_file_disable(UNIT_FILE_SYSTEM, 0, root, STRV_MAKE("foo@bar0.service"), &changes, &n_changes) >= 0);
         assert_se(n_changes == 1);
-        assert_se(changes[0].type == UNIT_FILE_UNLINK);
+        assert_se(changes[0].type_or_errno == UNIT_FILE_UNLINK);
         p = strjoina(root, SYSTEM_CONFIG_UNIT_DIR"/multi-user.target.wants/foo@bar0.service");
         assert_se(streq(changes[0].path, p));
         unit_file_changes_free(changes, n_changes);
index 7cd91efcb7f75993693e0ceea001e6b3a9fe6a42..7a0beb2d248252538a6d5c3920eb4c4f53d2664a 100644 (file)
@@ -12,9 +12,9 @@ static void dump_changes(UnitFileChange *c, unsigned n) {
         assert_se(n == 0 || c);
 
         for (i = 0; i < n; i++) {
-                if (c[i].type == UNIT_FILE_UNLINK)
+                if (c[i].type_or_errno == UNIT_FILE_UNLINK)
                         printf("rm '%s'\n", c[i].path);
-                else if (c[i].type == UNIT_FILE_SYMLINK)
+                else if (c[i].type_or_errno == UNIT_FILE_SYMLINK)
                         printf("ln -s '%s' '%s'\n", c[i].source, c[i].path);
         }
 }