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:
committed by
Luca Boccassi
parent
9e8babc8ab
commit
31ddd87da0
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 },
|
||||
|
||||
Reference in New Issue
Block a user