X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fefi-boot-generator%2Fefi-boot-generator.c;h=606d35bf791b099d49133c27380a046f102287e0;hb=e63bb33d71a524e84206ef94ade3eba441e186c5;hp=ee6ec31c0ebc2ec7e7e03c78076c6e3a26399614;hpb=f4ce2b3e5ce93b83f14f8785e205ebb5a9b8c1df;p=elogind.git diff --git a/src/efi-boot-generator/efi-boot-generator.c b/src/efi-boot-generator/efi-boot-generator.c index ee6ec31c0..606d35bf7 100644 --- a/src/efi-boot-generator/efi-boot-generator.c +++ b/src/efi-boot-generator/efi-boot-generator.c @@ -25,14 +25,17 @@ #include "efivars.h" #include "path-util.h" #include "util.h" +#include "mkdir.h" +#include "unit-name.h" -static const char *arg_dest = NULL; +static const char *arg_dest = "/tmp"; int main(int argc, char *argv[]) { int r = EXIT_SUCCESS; sd_id128_t id; - _cleanup_free_ char *name = NULL; - _cleanup_fclose_ FILE *f = NULL; + _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."); @@ -48,13 +51,13 @@ int main(int argc, char *argv[]) { umask(0022); - if (!is_efiboot()) + if (!is_efi_boot()) return EXIT_SUCCESS; if (dir_is_empty("/boot") <= 0) return EXIT_SUCCESS; - r = efi_get_loader_device_part_uuid(&id); + r = efi_loader_get_device_part_uuid(&id); if (r == -ENOENT) return EXIT_SUCCESS; if (r < 0) { @@ -62,56 +65,60 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - name = strjoin(arg_dest, "/boot.mount", NULL); - if (!name) { - log_oom(); - 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; } - fprintf(f, - "# Automatially generated by systemd-efi-boot-generator\n\n" - "[Mount]\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)); - - free(name); - name = strjoin(arg_dest, "/boot.automount", NULL); - if (!name) { + 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; } - fclose(f); - f = fopen(name, "wxe"); - if (!f) { - log_error("Failed to create automount unit file %s: %m", name); + 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" - "[Automount]\n" - "Where=/boot\n"); + "[Unit]\n" + "Description=EFI System Partition\n" + "Requires=%s\n" + "After=%s\n" + "\n" + "[Mount]\n" + "Where=/boot\n" + "What=%s\n" + "Options=umask=0077,noauto\n", + fsck, fsck, what); - free(name); - name = strjoin(arg_dest, "/local-fs.target.wants/boot.automount", NULL); - if (!name) { - log_oom(); + name = strappenda(arg_dest, "/boot.automount"); + f2 = fopen(name, "wxe"); + if (!f2) { + log_error("Failed to create automount unit file %s: %m", name); return EXIT_FAILURE; } + fputs("# Automatially generated by systemd-efi-boot-generator\n\n" + "[Unit]\n" + "Description=EFI System Partition Automount\n\n" + "[Automount]\n" + "Where=/boot\n", f2); + + name = strappenda(arg_dest, "/local-fs.target.wants/boot.automount"); + mkdir_parents(name, 0755); + if (symlink("../boot.automount", name) < 0) { - log_error("Failed to create symlink: %m"); + log_error("Failed to create symlink %s: %m", name); return EXIT_FAILURE; } - return 0; + return EXIT_SUCCESS; }