]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysupdate: Factor out core of `features` verb
authorPhilip Withnall <pwithnall@gnome.org>
Tue, 2 Jun 2026 14:49:18 +0000 (15:49 +0100)
committerPhilip Withnall <pwithnall@gnome.org>
Tue, 14 Jul 2026 13:57:00 +0000 (14:57 +0100)
This will be used in the following commit to add a varlink interface for
it.

This introduces no functional changes.

src/sysupdate/sysupdate.c

index 48e1445de25c3c6402647cb6bb1bc1b9f6a2d490..19fd136931aac9f2ca420ea5c8fe37a3b0de4fbe 100644 (file)
@@ -1703,6 +1703,37 @@ static int context_install(
         return 1;
 }
 
+static int context_get_transfers_for_feature(Context *context, const char *feature_id, char ***ret_transfers) {
+        int r;
+
+        assert(context);
+        assert(feature_id);
+
+        FOREACH_ARRAY(tr, context->transfers, context->n_transfers) {
+                Transfer *t = *tr;
+
+                if (!strv_contains(t->features, feature_id) && !strv_contains(t->requisite_features, feature_id))
+                        continue;
+
+                r = strv_extend(ret_transfers, t->id);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        FOREACH_ARRAY(tr, context->disabled_transfers, context->n_disabled_transfers) {
+                Transfer *t = *tr;
+
+                if (!strv_contains(t->features, feature_id) && !strv_contains(t->requisite_features, feature_id))
+                        continue;
+
+                r = strv_extend(ret_transfers, t->id);
+                if (r < 0)
+                        return log_oom();
+        }
+
+        return 0;
+}
+
 static JSON_DISPATCH_ENUM_DEFINE(dispatch_target_class, TargetClass, target_class_from_string);
 
 static int dispatch_target_identifier(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
@@ -1869,27 +1900,9 @@ static int verb_features(int argc, char *argv[], uintptr_t _data, void *userdata
                 if (!table)
                         return log_oom();
 
-                FOREACH_ARRAY(tr, context.transfers, context.n_transfers) {
-                        Transfer *t = *tr;
-
-                        if (!strv_contains(t->features, f->id) && !strv_contains(t->requisite_features, f->id))
-                                continue;
-
-                        r = strv_extend(&transfers, t->id);
-                        if (r < 0)
-                                return log_oom();
-                }
-
-                FOREACH_ARRAY(tr, context.disabled_transfers, context.n_disabled_transfers) {
-                        Transfer *t = *tr;
-
-                        if (!strv_contains(t->features, f->id) && !strv_contains(t->requisite_features, f->id))
-                                continue;
-
-                        r = strv_extend(&transfers, t->id);
-                        if (r < 0)
-                                return log_oom();
-                }
+                r = context_get_transfers_for_feature(&context, f->id, &transfers);
+                if (r < 0)
+                        return r;
 
                 r = table_add_many(table,
                                    TABLE_FIELD, "Name",