tree-wide: extend verbs functions with extra per-verb data parameter

We often have a pattern where the same verb function is used for
multiple actions. This leads to an antipattern where we figure out what
action needs to be taken from argv[0] multiple times: often once in
parse_argv() to figure out what options are allowed, then once again
implicitly in dispatch_verb(), and then again in the action verb itself.
Let's allow passing a parameter into the verb to simplify this.

This matches a pattern we have in conf-parser.h, where we have both
void *userdata (more global) and void *data (per-config item). Here,
I opted for uintptr_t userdata. It seems that most of the time we'll
want to just pass an enum value. This works OK with no casts. I also
tried a void* and union. In both cases, much more boilerplate is needed:
either a cast or a macro to help avoid compiler warnings. uintptr_t
seems generic enough to cover foreseeable usecases with no fuss.

This is a noop refactoring. See next commit for an example.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-03-18 10:28:47 +00:00
committed by Luca Boccassi
parent 9e8babc8ab
commit 31ddd87da0
216 changed files with 745 additions and 573 deletions
+1 -1
View File
@@ -87,7 +87,7 @@ static int cleanup_orphaned_files(
return r;
}
int verb_cleanup(int argc, char *argv[], void *userdata) {
int verb_cleanup(int argc, char *argv[], uintptr_t _data, void *userdata) {
dev_t esp_devid = 0, xbootldr_devid = 0;
int r;
+1 -1
View File
@@ -3,4 +3,4 @@
#include "shared-forward.h"
int verb_cleanup(int argc, char *argv[], void *userdata);
int verb_cleanup(int argc, char *argv[], uintptr_t _data, void *userdata);
+3 -3
View File
@@ -1661,7 +1661,7 @@ static int run_install(InstallContext *c) {
return install_variables(c, path);
}
int verb_install(int argc, char *argv[], void *userdata) {
int verb_install(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
/* Invoked for both "update" and "install" */
@@ -1882,7 +1882,7 @@ static int remove_loader_variables(void) {
return r;
}
int verb_remove(int argc, char *argv[], void *userdata) {
int verb_remove(int argc, char *argv[], uintptr_t _data, void *userdata) {
sd_id128_t uuid = SD_ID128_NULL;
int r;
@@ -1956,7 +1956,7 @@ int verb_remove(int argc, char *argv[], void *userdata) {
return RET_GATHER(r, remove_loader_variables());
}
int verb_is_installed(int argc, char *argv[], void *userdata) {
int verb_is_installed(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
_cleanup_(install_context_done) InstallContext c = INSTALL_CONTEXT_NULL;
+3 -3
View File
@@ -3,8 +3,8 @@
#include "shared-forward.h"
int verb_install(int argc, char *argv[], void *userdata);
int verb_remove(int argc, char *argv[], void *userdata);
int verb_is_installed(int argc, char *argv[], void *userdata);
int verb_install(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_remove(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_is_installed(int argc, char *argv[], uintptr_t _data, void *userdata);
int vl_method_install(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
+1 -1
View File
@@ -201,7 +201,7 @@ int install_random_seed(const char *esp) {
return set_system_token();
}
int verb_random_seed(int argc, char *argv[], void *userdata) {
int verb_random_seed(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = find_esp_and_warn(arg_root, arg_esp_path, /* unprivileged_mode= */ false, &arg_esp_path);
+3 -1
View File
@@ -1,6 +1,8 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include "shared-forward.h"
int install_random_seed(const char *esp);
int verb_random_seed(int argc, char *argv[], void *userdata);
int verb_random_seed(int argc, char *argv[], uintptr_t _data, void *userdata);
+1 -1
View File
@@ -12,7 +12,7 @@
#include "log.h"
#include "parse-util.h"
int verb_reboot_to_firmware(int argc, char *argv[], void *userdata) {
int verb_reboot_to_firmware(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = verify_touch_variables_allowed(argv[0]);
+1 -1
View File
@@ -3,7 +3,7 @@
#include "shared-forward.h"
int verb_reboot_to_firmware(int argc, char *argv[], void *userdata);
int verb_reboot_to_firmware(int argc, char *argv[], uintptr_t _data, void *userdata);
int vl_method_set_reboot_to_firmware(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_get_reboot_to_firmware(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
+1 -1
View File
@@ -129,7 +129,7 @@ static int parse_loader_entry_target_arg(const char *arg1, char16_t **ret_target
return 0;
}
int verb_set_efivar(int argc, char *argv[], void *userdata) {
int verb_set_efivar(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = verify_touch_variables_allowed(argv[0]);
+3 -1
View File
@@ -1,4 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
int verb_set_efivar(int argc, char *argv[], void *userdata);
#include "shared-forward.h"
int verb_set_efivar(int argc, char *argv[], uintptr_t _data, void *userdata);
+2 -2
View File
@@ -326,7 +326,7 @@ static void print_yes_no_line(bool first, bool good, const char *name) {
name);
}
int verb_status(int argc, char *argv[], void *userdata) {
int verb_status(int argc, char *argv[], uintptr_t _data, void *userdata) {
sd_id128_t esp_uuid = SD_ID128_NULL, xbootldr_uuid = SD_ID128_NULL;
dev_t esp_devid = 0, xbootldr_devid = 0;
int r, k;
@@ -621,7 +621,7 @@ int verb_status(int argc, char *argv[], void *userdata) {
return r;
}
int verb_list(int argc, char *argv[], void *userdata) {
int verb_list(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(boot_config_free) BootConfig config = BOOT_CONFIG_NULL;
dev_t esp_devid = 0, xbootldr_devid = 0;
int r;
+2 -2
View File
@@ -3,7 +3,7 @@
#include "shared-forward.h"
int verb_status(int argc, char *argv[], void *userdata);
int verb_list(int argc, char *argv[], void *userdata);
int verb_status(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_list(int argc, char *argv[], uintptr_t _data, void *userdata);
int vl_method_list_boot_entries(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
+2 -2
View File
@@ -6,7 +6,7 @@
#include "bootctl-uki.h"
#include "kernel-image.h"
int verb_kernel_identify(int argc, char *argv[], void *userdata) {
int verb_kernel_identify(int argc, char *argv[], uintptr_t _data, void *userdata) {
KernelImageType t;
int r;
@@ -18,7 +18,7 @@ int verb_kernel_identify(int argc, char *argv[], void *userdata) {
return 0;
}
int verb_kernel_inspect(int argc, char *argv[], void *userdata) {
int verb_kernel_inspect(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_free_ char *cmdline = NULL, *uname = NULL, *pname = NULL;
KernelImageType t;
int r;
+2 -2
View File
@@ -3,5 +3,5 @@
#include "shared-forward.h"
int verb_kernel_identify(int argc, char *argv[], void *userdata);
int verb_kernel_inspect(int argc, char *argv[], void *userdata);
int verb_kernel_identify(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_kernel_inspect(int argc, char *argv[], uintptr_t _data, void *userdata);
+1 -1
View File
@@ -199,7 +199,7 @@ static int unlink_entry(const BootConfig *config, const char *root, const char *
return 0;
}
int verb_unlink(int argc, char *argv[], void *userdata) {
int verb_unlink(int argc, char *argv[], uintptr_t _data, void *userdata) {
dev_t esp_devid = 0, xbootldr_devid = 0;
int r;
+1 -1
View File
@@ -3,6 +3,6 @@
#include "shared-forward.h"
int verb_unlink(int argc, char *argv[], void *userdata);
int verb_unlink(int argc, char *argv[], uintptr_t _data, void *userdata);
int boot_config_count_known_files(const BootConfig *config, const char* root, Hashmap **ret_known_files);
+7 -4
View File
@@ -244,7 +244,7 @@ GracefulMode arg_graceful(void) {
return _arg_graceful;
}
static int help(int argc, char *argv[], void *userdata) {
static int help(void) {
_cleanup_free_ char *link = NULL;
int r;
@@ -355,6 +355,10 @@ static int help(int argc, char *argv[], void *userdata) {
return 0;
}
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
static int parse_argv(int argc, char *argv[]) {
enum {
ARG_ESP_PATH = 0x100,
@@ -432,8 +436,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
case 'h':
help(0, NULL, NULL);
return 0;
return help();
case ARG_VERSION:
return version();
@@ -672,7 +675,7 @@ static int parse_argv(int argc, char *argv[]) {
static int bootctl_main(int argc, char *argv[]) {
static const Verb verbs[] = {
{ "help", VERB_ANY, VERB_ANY, 0, help },
{ "help", VERB_ANY, VERB_ANY, 0, verb_help },
{ "status", VERB_ANY, 1, VERB_DEFAULT, verb_status },
{ "install", VERB_ANY, 1, 0, verb_install },
{ "update", VERB_ANY, 1, 0, verb_install },