X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fefi-boot-generator%2Fefi-boot-generator.c;h=d4d778036f3e07320d8a9e0facad994920118388;hp=05b95ed455180438c3104c3597e16a27e74de226;hb=d2d66d1ce7da459ee2a01ac033197dbd053df9f8;hpb=c51d84dc09476d9c06b8aac726220bf3c7d62e8d diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c index 05b95ed45..d4d778036 100644 --- a/src/efi-boot-generator/efi-boot-generator.c +++ b/src/efi-boot-generator/efi-boot-generator.c @@ -26,14 +26,19 @@ #include "path-util.h" #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 *name = NULL; - _cleanup_fclose_ FILE *f = NULL; + char *name; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); @@ -49,49 +54,77 @@ int main(int argc, char *argv[]) { umask(0022); - if (!is_efi_boot()) + if (in_initrd()) { + log_debug("In initrd, exiting."); return EXIT_SUCCESS; + } - if (dir_is_empty("/boot") <= 0) + if (detect_container(NULL) > 0) { + log_debug("In a container, exiting."); return EXIT_SUCCESS; + } - r = efi_loader_get_device_part_uuid(&id); - if (r == -ENOENT) + if (!is_efi_boot()) { + log_debug("Not an EFI boot, exiting."); return EXIT_SUCCESS; - if (r < 0) { - log_error("Failed to read ESP partition UUID: %s", strerror(-r)); - return EXIT_FAILURE; } - name = strjoin(arg_dest, "/boot.mount", NULL); - if (!name) { - log_oom(); + if (path_is_mount_point("/boot", true) <= 0 && + 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) { + log_debug("EFI loader partition unknown, exiting."); + return EXIT_SUCCESS; + } else if (r < 0) { + log_error("Failed to read ESP partition UUID: %s", strerror(-r)); return EXIT_FAILURE; } + name = strappenda(arg_dest, "/boot.mount"); f = fopen(name, "wxe"); if (!f) { log_error("Failed to create mount unit file %s: %m", name); return EXIT_FAILURE; } + r = asprintf(&what, + "/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + SD_ID128_FORMAT_VAL(id)); + if (r < 0) { + log_oom(); + return EXIT_FAILURE; + } + fprintf(f, "# Automatially generated by systemd-efi-boot-generator\n\n" "[Unit]\n" - "Description=EFI System Partition\n\n" + "Description=EFI System Partition\n" + "Documentation=man:systemd-efi-boot-generator(8)\n"); + + r = generator_write_fsck_deps(f, arg_dest, what, "/boot", "vfat"); + if (r < 0) + return EXIT_FAILURE; + + fprintf(f, + "\n" "[Mount]\n" + "What=%s\n" "Where=/boot\n" - "What=/dev/disk/by-partuuid/%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n" - "Options=umask=0077\n", - SD_ID128_FORMAT_VAL(id)); + "Type=vfat\n" + "Options=umask=0077,noauto\n", + what); - free(name); - name = strjoin(arg_dest, "/boot.automount", NULL); - if (!name) { - log_oom(); + fflush(f); + if (ferror(f)) { + log_error("Failed to write mount unit file: %m"); return EXIT_FAILURE; } + name = strappenda(arg_dest, "/boot.automount"); fclose(f); f = fopen(name, "wxe"); if (!f) { @@ -105,13 +138,13 @@ int main(int argc, char *argv[]) { "[Automount]\n" "Where=/boot\n", f); - free(name); - name = strjoin(arg_dest, "/local-fs.target.wants/boot.automount", NULL); - if (!name) { - log_oom(); + fflush(f); + if (ferror(f)) { + log_error("Failed to write automount unit file: %m"); return EXIT_FAILURE; } + name = strappenda(arg_dest, "/" SPECIAL_LOCAL_FS_TARGET ".wants/boot.automount"); mkdir_parents(name, 0755); if (symlink("../boot.automount", name) < 0) { @@ -119,5 +152,5 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - return 0; + return EXIT_SUCCESS; }