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
+2 -2
View File
@@ -280,11 +280,11 @@ static int query_solutions_for_path(const char *path) {
return 0;
}
static int verb_query(int argc, char *argv[], void *userdata) {
static int verb_query(int argc, char *argv[], uintptr_t _data, void *userdata) {
return query_solutions_for_path(ASSERT_PTR(argv[1]));
}
static int verb_apply(int argc, char *argv[], void *userdata) {
static int verb_apply(int argc, char *argv[], uintptr_t _data, void *userdata) {
return apply_solution_for_path(
ASSERT_PTR(argv[1]),
argc > 2 ? ASSERT_PTR(argv[2]) : NULL);
+1 -1
View File
@@ -92,7 +92,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_cat_main(int argc, char *argv[], void *userdata) {
int verb_cat_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = parse_argv(argc, argv);
+1 -1
View File
@@ -331,7 +331,7 @@ static int send_control_commands(void) {
return 0;
}
int verb_control_main(int argc, char *argv[], void *userdata) {
int verb_control_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
if (running_in_chroot() > 0) {
+1 -1
View File
@@ -78,7 +78,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_hwdb_main(int argc, char *argv[], void *userdata) {
int verb_hwdb_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = parse_argv(argc, argv);
+1 -1
View File
@@ -1275,7 +1275,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_info_main(int argc, char *argv[], void *userdata) {
int verb_info_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
r = parse_argv(argc, argv);
+1 -1
View File
@@ -228,7 +228,7 @@ static int lock_device(
return TAKE_FD(fd);
}
int verb_lock_main(int argc, char *argv[], void *userdata) {
int verb_lock_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_fdset_free_ FDSet *fds = NULL;
_cleanup_free_ dev_t *devnos = NULL;
size_t n_devnos = 0;
+1 -1
View File
@@ -187,7 +187,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_monitor_main(int argc, char *argv[], void *userdata) {
int verb_monitor_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *kernel_monitor = NULL, *udev_monitor = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
int r;
+1 -1
View File
@@ -184,7 +184,7 @@ static int on_inotify(sd_event_source *s, const struct inotify_event *event, voi
return 0;
}
int verb_settle_main(int argc, char *argv[], void *userdata) {
int verb_settle_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
int r;
+1 -1
View File
@@ -63,7 +63,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_builtin_main(int argc, char *argv[], void *userdata) {
int verb_builtin_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(udev_event_unrefp) UdevEvent *event = NULL;
_cleanup_(sd_device_unrefp) sd_device *dev = NULL;
UdevBuiltinCommand cmd;
+1 -1
View File
@@ -129,7 +129,7 @@ static void maybe_insert_empty_line(void) {
fputs("\n", stderr);
}
int verb_test_main(int argc, char *argv[], void *userdata) {
int verb_test_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(udev_rules_freep) UdevRules *rules = NULL;
_cleanup_(udev_event_unrefp) UdevEvent *event = NULL;
_cleanup_(sd_device_unrefp) sd_device *dev = NULL;
+1 -1
View File
@@ -534,7 +534,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1;
}
int verb_trigger_main(int argc, char *argv[], void *userdata) {
int verb_trigger_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *m = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
+1 -1
View File
@@ -156,7 +156,7 @@ static int verify_rules(UdevRules *rules, ConfFile * const *files, size_t n_file
return ret;
}
int verb_verify_main(int argc, char *argv[], void *userdata) {
int verb_verify_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(udev_rules_freep) UdevRules *rules = NULL;
int r;
+1 -1
View File
@@ -376,7 +376,7 @@ static int parse_argv(int argc, char *argv[]) {
return 1; /* work to do */
}
int verb_wait_main(int argc, char *argv[], void *userdata) {
int verb_wait_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_device_monitor_unrefp) sd_device_monitor *udev_monitor = NULL, *kernel_monitor = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
int r;
+2 -2
View File
@@ -91,11 +91,11 @@ int print_version(void) {
return 0;
}
static int verb_version_main(int argc, char *argv[], void *userdata) {
static int verb_version_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
return print_version();
}
static int verb_help_main(int argc, char *argv[], void *userdata) {
static int verb_help_main(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
+12 -12
View File
@@ -3,17 +3,17 @@
#include "shared-forward.h"
int verb_cat_main(int argc, char *argv[], void *userdata);
int verb_info_main(int argc, char *argv[], void *userdata);
int verb_trigger_main(int argc, char *argv[], void *userdata);
int verb_settle_main(int argc, char *argv[], void *userdata);
int verb_control_main(int argc, char *argv[], void *userdata);
int verb_monitor_main(int argc, char *argv[], void *userdata);
int verb_hwdb_main(int argc, char *argv[], void *userdata);
int verb_test_main(int argc, char *argv[], void *userdata);
int verb_builtin_main(int argc, char *argv[], void *userdata);
int verb_verify_main(int argc, char *argv[], void *userdata);
int verb_wait_main(int argc, char *argv[], void *userdata);
int verb_lock_main(int argc, char *argv[], void *userdata);
int verb_cat_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_info_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_trigger_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_settle_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_control_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_monitor_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_hwdb_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_test_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_builtin_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_verify_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_wait_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int verb_lock_main(int argc, char *argv[], uintptr_t _data, void *userdata);
int print_version(void);