From 3e29bd988057fc61137d018de359125c53750dd3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 27 May 2026 18:11:28 +0200 Subject: [PATCH] repart: split ListCandidateDevices handler into its own file repart.c is already 11 kLOC. The candidate-device enumeration path is about to grow a subscription mode that brings its own helpers and per-link state, which doesn't belong in the partitioning core. Move vl_method_list_candidate_devices() (and only that function -- the header exports just that symbol) into a new src/repart/repart-list-candidate-devices.{c,h}. No behavior change. --- src/repart/meson.build | 3 +- src/repart/repart-list-candidate-devices.c | 71 ++++++++++++++++++++++ src/repart/repart-list-candidate-devices.h | 10 +++ src/repart/repart.c | 64 +------------------ 4 files changed, 84 insertions(+), 64 deletions(-) create mode 100644 src/repart/repart-list-candidate-devices.c create mode 100644 src/repart/repart-list-candidate-devices.h diff --git a/src/repart/meson.build b/src/repart/meson.build index bb5b63be05..6d3278c3ca 100644 --- a/src/repart/meson.build +++ b/src/repart/meson.build @@ -9,8 +9,9 @@ executables += [ 'name' : 'systemd-repart', 'public' : true, 'extract' : files( - 'repart.c', 'iso9660.c', + 'repart.c', + 'repart-list-candidate-devices.c', ), 'dependencies' : [ libblkid_cflags, diff --git a/src/repart/repart-list-candidate-devices.c b/src/repart/repart-list-candidate-devices.c new file mode 100644 index 0000000000..53d6b024cb --- /dev/null +++ b/src/repart/repart-list-candidate-devices.c @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "sd-json.h" +#include "sd-varlink.h" + +#include "blockdev-list.h" +#include "json-util.h" +#include "repart-list-candidate-devices.h" + +int vl_method_list_candidate_devices( + sd_varlink *link, + sd_json_variant *parameters, + sd_varlink_method_flags_t flags, + void *userdata) { + + struct { + bool ignore_root; + bool ignore_empty; + } p = {}; + + static const sd_json_dispatch_field dispatch_table[] = { + { "ignoreRoot", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, voffsetof(p, ignore_root), 0 }, + { "ignoreEmpty", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, voffsetof(p, ignore_empty), 0 }, + {} + }; + + int r; + + assert(link); + assert(FLAGS_SET(flags, SD_VARLINK_METHOD_MORE)); + + r = sd_varlink_dispatch(link, parameters, dispatch_table, &p); + if (r != 0) + return r; + + BlockDevice *l = NULL; + size_t n = 0; + CLEANUP_ARRAY(l, n, block_device_array_free); + + r = blockdev_list( + BLOCKDEV_LIST_SHOW_SYMLINKS| + BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING| + BLOCKDEV_LIST_IGNORE_ZRAM| + BLOCKDEV_LIST_METADATA| + BLOCKDEV_LIST_IGNORE_READ_ONLY| + (p.ignore_empty ? BLOCKDEV_LIST_IGNORE_EMPTY : 0)| + (p.ignore_root ? BLOCKDEV_LIST_IGNORE_ROOT : 0), + &l, + &n); + if (r < 0) + return r; + + r = sd_varlink_set_sentinel(link, "io.systemd.Repart.NoCandidateDevices"); + if (r < 0) + return r; + + FOREACH_ARRAY(d, l, n) { + r = sd_varlink_replybo(link, + SD_JSON_BUILD_PAIR_STRING("node", d->node), + JSON_BUILD_PAIR_STRV_NON_EMPTY("symlinks", d->symlinks), + JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("diskseq", d->diskseq, UINT64_MAX), + JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("sizeBytes", d->size, UINT64_MAX), + JSON_BUILD_PAIR_STRING_NON_EMPTY("model", d->model), + JSON_BUILD_PAIR_STRING_NON_EMPTY("vendor", d->vendor), + JSON_BUILD_PAIR_STRING_NON_EMPTY("subsystem", d->subsystem)); + if (r < 0) + return r; + } + + return 0; +} diff --git a/src/repart/repart-list-candidate-devices.h b/src/repart/repart-list-candidate-devices.h new file mode 100644 index 0000000000..21277c8a5f --- /dev/null +++ b/src/repart/repart-list-candidate-devices.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "sd-forward.h" + +int vl_method_list_candidate_devices( + sd_varlink *link, + sd_json_variant *parameters, + sd_varlink_method_flags_t flags, + void *userdata); diff --git a/src/repart/repart.c b/src/repart/repart.c index a9d6d8efec..371036fa7d 100644 --- a/src/repart/repart.c +++ b/src/repart/repart.c @@ -70,6 +70,7 @@ #include "process-util.h" #include "random-util.h" #include "ratelimit.h" +#include "repart-list-candidate-devices.h" #include "reread-partition-table.h" #include "resize-fs.h" #include "rm-rf.h" @@ -11254,69 +11255,6 @@ static int context_ponder(Context *context) { return 0; } -static int vl_method_list_candidate_devices( - sd_varlink *link, - sd_json_variant *parameters, - sd_varlink_method_flags_t flags, - void *userdata) { - - struct { - bool ignore_root; - bool ignore_empty; - } p = {}; - - static const sd_json_dispatch_field dispatch_table[] = { - { "ignoreRoot", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, voffsetof(p, ignore_root), 0 }, - { "ignoreEmpty", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, voffsetof(p, ignore_empty), 0 }, - {} - }; - - int r; - - assert(link); - assert(FLAGS_SET(flags, SD_VARLINK_METHOD_MORE)); - - r = sd_varlink_dispatch(link, parameters, dispatch_table, &p); - if (r != 0) - return r; - - BlockDevice *l = NULL; - size_t n = 0; - CLEANUP_ARRAY(l, n, block_device_array_free); - - r = blockdev_list( - BLOCKDEV_LIST_SHOW_SYMLINKS| - BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING| - BLOCKDEV_LIST_IGNORE_ZRAM| - BLOCKDEV_LIST_METADATA| - BLOCKDEV_LIST_IGNORE_READ_ONLY| - (p.ignore_empty ? BLOCKDEV_LIST_IGNORE_EMPTY : 0)| - (p.ignore_root ? BLOCKDEV_LIST_IGNORE_ROOT : 0), - &l, - &n); - if (r < 0) - return r; - - r = sd_varlink_set_sentinel(link, "io.systemd.Repart.NoCandidateDevices"); - if (r < 0) - return r; - - FOREACH_ARRAY(d, l, n) { - r = sd_varlink_replybo(link, - SD_JSON_BUILD_PAIR_STRING("node", d->node), - JSON_BUILD_PAIR_STRV_NON_EMPTY("symlinks", d->symlinks), - JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("diskseq", d->diskseq, UINT64_MAX), - JSON_BUILD_PAIR_UNSIGNED_NOT_EQUAL("sizeBytes", d->size, UINT64_MAX), - JSON_BUILD_PAIR_STRING_NON_EMPTY("model", d->model), - JSON_BUILD_PAIR_STRING_NON_EMPTY("vendor", d->vendor), - JSON_BUILD_PAIR_STRING_NON_EMPTY("subsystem", d->subsystem)); - if (r < 0) - return r; - } - - return 0; -} - static JSON_DISPATCH_ENUM_DEFINE(json_dispatch_empty_mode, EmptyMode, empty_mode_from_string); typedef struct RunParameters {