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
+3 -3
View File
@@ -58,7 +58,7 @@ static void on_tar_finished(TarExport *export, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_export_tar(int argc, char *argv[], void *userdata) {
static int verb_export_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(tar_export_unrefp) TarExport *export = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
_cleanup_(image_unrefp) Image *image = NULL;
@@ -139,7 +139,7 @@ static void on_raw_finished(RawExport *export, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_export_raw(int argc, char *argv[], void *userdata) {
static int verb_export_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(raw_export_unrefp) RawExport *export = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
_cleanup_(image_unrefp) Image *image = NULL;
@@ -225,7 +225,7 @@ static int help(void) {
return 0;
}
static int verb_help(int argc, char *argv[], void *userdata) {
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
+2 -2
View File
@@ -107,7 +107,7 @@ static int progress_bytes(uint64_t nbytes, uint64_t bps, void *userdata) {
return 0;
}
static int verb_import_fs(int argc, char *argv[], void *userdata) {
static int verb_import_fs(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(rm_rf_subvolume_and_freep) char *temp_path = NULL;
_cleanup_(progress_info_free) ProgressInfo progress = { .bps = UINT64_MAX };
_cleanup_free_ char *l = NULL, *final_path = NULL;
@@ -295,7 +295,7 @@ static int help(void) {
return 0;
}
static int verb_help(int argc, char *argv[], void *userdata) {
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
+3 -3
View File
@@ -138,7 +138,7 @@ static void on_tar_finished(TarImport *import, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_import_tar(int argc, char *argv[], void *userdata) {
static int verb_import_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(tar_import_unrefp) TarImport *import = NULL;
_cleanup_free_ char *ll = NULL, *normalized = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
@@ -207,7 +207,7 @@ static void on_raw_finished(RawImport *import, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_import_raw(int argc, char *argv[], void *userdata) {
static int verb_import_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(raw_import_unrefp) RawImport *import = NULL;
_cleanup_free_ char *ll = NULL, *normalized = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
@@ -303,7 +303,7 @@ static int help(void) {
return 0;
}
static int verb_help(int argc, char *argv[], void *userdata) {
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
+12 -12
View File
@@ -261,7 +261,7 @@ static int transfer_image_common(sd_bus *bus, sd_bus_message *m) {
return -r;
}
static int verb_import_tar(int argc, char *argv[], void *userdata) {
static int verb_import_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *ll = NULL, *fn = NULL;
const char *local = NULL, *path = NULL;
@@ -340,7 +340,7 @@ static int verb_import_tar(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_import_raw(int argc, char *argv[], void *userdata) {
static int verb_import_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *ll = NULL, *fn = NULL;
const char *local = NULL, *path = NULL;
@@ -419,7 +419,7 @@ static int verb_import_raw(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_import_fs(int argc, char *argv[], void *userdata) {
static int verb_import_fs(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
const char *local = NULL, *path = NULL;
_cleanup_free_ char *fn = NULL;
@@ -506,7 +506,7 @@ static void determine_compression_from_filename(const char *p) {
arg_format = "zstd";
}
static int verb_export_tar(int argc, char *argv[], void *userdata) {
static int verb_export_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_close_ int fd = -EBADF;
const char *local = NULL, *path = NULL;
@@ -565,7 +565,7 @@ static int verb_export_tar(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_export_raw(int argc, char *argv[], void *userdata) {
static int verb_export_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_close_ int fd = -EBADF;
const char *local = NULL, *path = NULL;
@@ -624,7 +624,7 @@ static int verb_export_raw(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_pull_tar(int argc, char *argv[], void *userdata) {
static int verb_pull_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *l = NULL, *ll = NULL;
const char *local, *remote;
@@ -697,7 +697,7 @@ static int verb_pull_tar(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_pull_raw(int argc, char *argv[], void *userdata) {
static int verb_pull_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *l = NULL, *ll = NULL;
const char *local, *remote;
@@ -770,7 +770,7 @@ static int verb_pull_raw(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_pull_oci(int argc, char *argv[], void *userdata) {
static int verb_pull_oci(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
_cleanup_free_ char *l = NULL;
const char *local, *remote;
@@ -825,7 +825,7 @@ static int verb_pull_oci(int argc, char *argv[], void *userdata) {
return transfer_image_common(bus, m);
}
static int verb_list_transfers(int argc, char *argv[], void *userdata) {
static int verb_list_transfers(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(table_unrefp) Table *t = NULL;
@@ -929,7 +929,7 @@ static int verb_list_transfers(int argc, char *argv[], void *userdata) {
return 0;
}
static int verb_cancel_transfer(int argc, char *argv[], void *userdata) {
static int verb_cancel_transfer(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
sd_bus *bus = ASSERT_PTR(userdata);
int r;
@@ -951,7 +951,7 @@ static int verb_cancel_transfer(int argc, char *argv[], void *userdata) {
return 0;
}
static int verb_list_images(int argc, char *argv[], void *userdata) {
static int verb_list_images(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(table_unrefp) Table *t = NULL;
@@ -1112,7 +1112,7 @@ static int help(void) {
return 0;
}
static int verb_help(int argc, char *argv[], void *userdata) {
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}
+4 -4
View File
@@ -117,7 +117,7 @@ static void on_tar_finished(TarPull *pull, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_pull_tar(int argc, char *argv[], void *userdata) {
static int verb_pull_tar(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_free_ char *ll = NULL, *normalized = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
_cleanup_(tar_pull_unrefp) TarPull *pull = NULL;
@@ -187,7 +187,7 @@ static void on_raw_finished(RawPull *pull, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_pull_raw(int argc, char *argv[], void *userdata) {
static int verb_pull_raw(int argc, char *argv[], uintptr_t _data, void *userdata) {
_cleanup_free_ char *ll = NULL, *normalized = NULL;
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
_cleanup_(raw_pull_unrefp) RawPull *pull = NULL;
@@ -256,7 +256,7 @@ static void on_oci_finished(OciPull *pull, int error, void *userdata) {
sd_event_exit(event, ABS(error));
}
static int verb_pull_oci(int argc, char *argv[], void *userdata) {
static int verb_pull_oci(int argc, char *argv[], uintptr_t _data, void *userdata) {
int r;
const char *ref = argv[1];
@@ -356,7 +356,7 @@ static int help(void) {
return 0;
}
static int verb_help(int argc, char *argv[], void *userdata) {
static int verb_help(int argc, char *argv[], uintptr_t _data, void *userdata) {
return help();
}