bootctl: use RET_GATHER() all over the place

This commit is contained in:
Lennart Poettering
2025-09-20 00:47:46 +09:00
committed by Yu Watanabe
parent 5c396a0110
commit f757022294
+21 -68
View File
@@ -1161,7 +1161,7 @@ static int rmdir_one(const char *prefix, const char *suffix) {
}
static int remove_subdirs(const char *root, const char *const *subdirs) {
int r, q;
int r;
/* We use recursion here to destroy the directories in reverse order. Which should be safe given how
* short the array is. */
@@ -1170,9 +1170,7 @@ static int remove_subdirs(const char *root, const char *const *subdirs) {
return 0;
r = remove_subdirs(root, subdirs + 1);
q = rmdir_one(root, subdirs[0]);
return r < 0 ? r : q;
return RET_GATHER(r, rmdir_one(root, subdirs[0]));
}
static int remove_entry_directory(const char *root) {
@@ -1186,19 +1184,14 @@ static int remove_entry_directory(const char *root) {
}
static int remove_binaries(const char *esp_path) {
int r, q;
int r;
_cleanup_free_ char *p = path_join(esp_path, "/EFI/systemd");
if (!p)
return log_oom();
r = rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
q = remove_boot_efi(esp_path);
if (q < 0 && r == 0)
r = q;
return r;
return RET_GATHER(r, remove_boot_efi(esp_path));
}
static int remove_file(const char *root, const char *file) {
@@ -1258,11 +1251,9 @@ static int remove_loader_variables(void) {
q = efi_set_variable(var, NULL, 0);
if (q == -ENOENT)
continue;
if (q < 0) {
log_warning_errno(q, "Failed to remove EFI variable %s: %m", var);
if (r >= 0)
r = q;
} else
if (q < 0)
RET_GATHER(r, log_warning_errno(q, "Failed to remove EFI variable %s: %m", var));
else
log_info("Removed EFI variable %s.", var);
}
@@ -1271,7 +1262,7 @@ static int remove_loader_variables(void) {
int verb_remove(int argc, char *argv[], void *userdata) {
sd_id128_t uuid = SD_ID128_NULL;
int r, q;
int r;
r = acquire_esp(/* unprivileged_mode= */ false, /* graceful= */ false, NULL, NULL, NULL, &uuid, NULL);
if (r < 0)
@@ -1286,59 +1277,28 @@ int verb_remove(int argc, char *argv[], void *userdata) {
return r;
r = remove_binaries(arg_esp_path);
q = remove_file(arg_esp_path, "/loader/loader.conf");
if (q < 0 && r >= 0)
r = q;
q = remove_file(arg_esp_path, "/loader/random-seed");
if (q < 0 && r >= 0)
r = q;
q = remove_file(arg_esp_path, "/loader/entries.srel");
if (q < 0 && r >= 0)
r = q;
RET_GATHER(r, remove_file(arg_esp_path, "/loader/loader.conf"));
RET_GATHER(r, remove_file(arg_esp_path, "/loader/random-seed"));
RET_GATHER(r, remove_file(arg_esp_path, "/loader/entries.srel"));
FOREACH_STRING(db, "PK.auth", "KEK.auth", "db.auth") {
_cleanup_free_ char *p = path_join("/loader/keys/auto", db);
if (!p)
return log_oom();
q = remove_file(arg_esp_path, p);
if (q < 0 && r >= 0)
r = q;
RET_GATHER(r, remove_file(arg_esp_path, p));
}
q = rmdir_one(arg_esp_path, "/loader/keys/auto");
if (q < 0 && r >= 0)
r = q;
q = remove_subdirs(arg_esp_path, esp_subdirs);
if (q < 0 && r >= 0)
r = q;
q = remove_subdirs(arg_esp_path, dollar_boot_subdirs);
if (q < 0 && r >= 0)
r = q;
q = remove_entry_directory(arg_esp_path);
if (q < 0 && r >= 0)
r = q;
RET_GATHER(r, rmdir_one(arg_esp_path, "/loader/keys/auto"));
RET_GATHER(r, remove_subdirs(arg_esp_path, esp_subdirs));
RET_GATHER(r, remove_subdirs(arg_esp_path, dollar_boot_subdirs));
RET_GATHER(r, remove_entry_directory(arg_esp_path));
if (arg_xbootldr_path) {
/* Remove a subset of these also from the XBOOTLDR partition if it exists */
q = remove_file(arg_xbootldr_path, "/loader/entries.srel");
if (q < 0 && r >= 0)
r = q;
q = remove_subdirs(arg_xbootldr_path, dollar_boot_subdirs);
if (q < 0 && r >= 0)
r = q;
q = remove_entry_directory(arg_xbootldr_path);
if (q < 0 && r >= 0)
r = q;
RET_GATHER(r, remove_file(arg_xbootldr_path, "/loader/entries.srel"));
RET_GATHER(r, remove_subdirs(arg_xbootldr_path, dollar_boot_subdirs));
RET_GATHER(r, remove_entry_directory(arg_xbootldr_path));
}
(void) sync_everything();
@@ -1352,15 +1312,8 @@ int verb_remove(int argc, char *argv[], void *userdata) {
}
char *path = strjoina("/EFI/systemd/systemd-boot", get_efi_arch(), ".efi");
q = remove_variables(uuid, path, true);
if (q < 0 && r >= 0)
r = q;
q = remove_loader_variables();
if (q < 0 && r >= 0)
r = q;
return r;
RET_GATHER(r, remove_variables(uuid, path, /* in_order= */ true));
return RET_GATHER(r, remove_loader_variables());
}
int verb_is_installed(int argc, char *argv[], void *userdata) {