diff options
Diffstat (limited to 'src/efi-boot-generator/efi-boot-generator.c')
-rw-r--r-- | src/efi-boot-generator/efi-boot-generator.c | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c index 606d35bf79..270dc226ef 100644 --- a/src/efi-boot-generator/efi-boot-generator.c +++ b/src/efi-boot-generator/efi-boot-generator.c @@ -27,15 +27,18 @@ #include "util.h" #include "mkdir.h" #include "unit-name.h" +#include "virt.h" +#include "generator.h" +#include "special.h" static const char *arg_dest = "/tmp"; int main(int argc, char *argv[]) { + _cleanup_free_ char *what = NULL; + _cleanup_fclose_ FILE *f = NULL; int r = EXIT_SUCCESS; sd_id128_t id; - _cleanup_free_ char *what = NULL, *fsck = NULL; char *name; - _cleanup_fclose_ FILE *f = NULL, *f2 = NULL; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); @@ -51,16 +54,30 @@ int main(int argc, char *argv[]) { umask(0022); - if (!is_efi_boot()) + if (in_initrd()) { + log_debug("In initrd, exiting."); return EXIT_SUCCESS; + } + if (detect_container(NULL) > 0) { + log_debug("In a container, exiting."); + return EXIT_SUCCESS; + } - if (dir_is_empty("/boot") <= 0) + if (!is_efi_boot()) { + log_debug("Not an EFI boot, exiting."); return EXIT_SUCCESS; + } + + if (dir_is_empty("/boot") <= 0) { + log_debug("/boot already populated, exiting."); + return EXIT_SUCCESS; + } r = efi_loader_get_device_part_uuid(&id); - if (r == -ENOENT) + if (r == -ENOENT) { + log_debug("EFI loader partition unknown exiting."); return EXIT_SUCCESS; - if (r < 0) { + } else if (r < 0) { log_error("Failed to read ESP partition UUID: %s", strerror(-r)); return EXIT_FAILURE; } @@ -80,28 +97,34 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - fsck = unit_name_from_path_instance("systemd-fsck", what, ".service"); - if (!fsck) { - log_oom(); - return EXIT_FAILURE; - } - fprintf(f, "# Automatially generated by systemd-efi-boot-generator\n\n" "[Unit]\n" - "Description=EFI System Partition\n" - "Requires=%s\n" - "After=%s\n" + "Description=EFI System Partition\n"); + + r = generator_write_fsck_deps(f, arg_dest, what, "/boot", "vfat"); + if (r < 0) + return EXIT_FAILURE; + + fprintf(f, "\n" "[Mount]\n" - "Where=/boot\n" "What=%s\n" + "Where=/boot\n" + "Type=vfat\n" "Options=umask=0077,noauto\n", - fsck, fsck, what); + what); + + fflush(f); + if (ferror(f)) { + log_error("Failed to write mount unit file: %m"); + return EXIT_FAILURE; + } name = strappenda(arg_dest, "/boot.automount"); - f2 = fopen(name, "wxe"); - if (!f2) { + fclose(f); + f = fopen(name, "wxe"); + if (!f) { log_error("Failed to create automount unit file %s: %m", name); return EXIT_FAILURE; } @@ -110,9 +133,15 @@ int main(int argc, char *argv[]) { "[Unit]\n" "Description=EFI System Partition Automount\n\n" "[Automount]\n" - "Where=/boot\n", f2); + "Where=/boot\n", f); + + fflush(f); + if (ferror(f)) { + log_error("Failed to write automount unit file: %m"); + return EXIT_FAILURE; + } - name = strappenda(arg_dest, "/local-fs.target.wants/boot.automount"); + name = strappenda(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/boot.automount"); mkdir_parents(name, 0755); if (symlink("../boot.automount", name) < 0) { |