| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| |
| #include "alloc-util.h" |
| #include "bootctl-systemd-efi-options.h" |
| #include "efi-loader.h" |
| |
| int verb_systemd_efi_options(int argc, char *argv[], void *userdata) { |
| int r; |
| |
| if (argc == 1) { |
| _cleanup_free_ char *line = NULL, *new = NULL; |
| |
| r = systemd_efi_options_variable(&line); |
| if (r == -ENODATA) |
| log_debug("No SystemdOptions EFI variable present in cache."); |
| else if (r < 0) |
| return log_error_errno(r, "Failed to read SystemdOptions EFI variable from cache: %m"); |
| else |
| puts(line); |
| |
| r = systemd_efi_options_efivarfs_if_newer(&new); |
| if (r == -ENODATA) { |
| if (line) |
| log_notice("Note: SystemdOptions EFI variable has been removed since boot."); |
| } else if (r < 0) |
| log_warning_errno(r, "Failed to check SystemdOptions EFI variable in efivarfs, ignoring: %m"); |
| else if (new && !streq_ptr(line, new)) |
| log_notice("Note: SystemdOptions EFI variable has been modified since boot. New value: %s", |
| new); |
| } else { |
| r = efi_set_variable_string(EFI_SYSTEMD_VARIABLE(SystemdOptions), argv[1]); |
| if (r < 0) |
| return log_error_errno(r, "Failed to set SystemdOptions EFI variable: %m"); |
| } |
| |
| return 0; |
| } |