On Mon, Nov 21, 2022 at 03:09:25PM +0000, Klemens Nanni wrote: > On Mon, Nov 21, 2022 at 03:42:37PM +0100, Tobias Heider wrote: > > Here is a more cleaned up version of the previous diff. I moved all the > > firmware logic to a new write_firmware() function. This should be easy > > to extend if we decide to ship more firmware this way. > > This seems more tidy. > > > > > The diff passes regress and manual tests with and without $ESP/m1n1/, > > /etc/firmware and /etc/firmware/apple-boot.bin. > > Reads good, but I haven't compile- or run-tested it. > > Comments inline.
One more version with your comments addressed. better? Index: efi_installboot.c =================================================================== RCS file: /cvs/src/usr.sbin/installboot/efi_installboot.c,v retrieving revision 1.7 diff -u -p -r1.7 efi_installboot.c --- efi_installboot.c 6 Nov 2022 12:33:41 -0000 1.7 +++ efi_installboot.c 21 Nov 2022 17:58:19 -0000 @@ -70,6 +70,7 @@ static int create_filesystem(struct disklabel *, char); static void write_filesystem(struct disklabel *, char); +static int write_firmware(const char *, const char *); static int findgptefisys(int, struct disklabel *); static int findmbrfat(int, struct disklabel *); @@ -308,6 +309,13 @@ write_filesystem(struct disklabel *dl, c goto umount; } + dst[mntlen] = '\0'; + rslt = write_firmware(root, dst); + if (rslt == -1) { + warnx("unable to write firmware"); + goto umount; + } + rslt = 0; umount: @@ -325,6 +333,61 @@ rmdir: if (rslt == -1) exit(1); +} + +static int +write_firmware(const char *root, const char *mnt) +{ + char dst[PATH_MAX]; + char fw[PATH_MAX]; + char *src; + struct stat st; + int rslt; + + strlcpy(dst, mnt, sizeof(dst)); + + /* Skip if no /etc/firmware exists */ + rslt = snprintf(fw, sizeof(fw), "%s/%s", root, "etc/firmware"); + if (rslt < 0 || rslt >= PATH_MAX) { + warnx("unable to build /etc/firmware path"); + return -1; + } + if ((stat(fw, &st) != 0) || !S_ISDIR(st.st_mode)) + return 0; + + /* Copy apple-boot firmware to /m1n1/boot.bin if available */ + src = fileprefix(fw, "/apple-boot.bin"); + if (src == NULL) + return -1; + if (access(src, R_OK) == 0) { + if (strlcat(dst, "/m1n1", sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warnx("unable to build /m1n1 path"); + goto cleanup; + } + if ((stat(dst, &st) != 0) || !S_ISDIR(st.st_mode)) { + rslt = 0; + goto cleanup; + } + if (strlcat(dst, "/boot.bin", sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warnx("unable to build /m1n1/boot.bin path"); + goto cleanup; + } + if (verbose) + fprintf(stderr, "%s %s to %s\n", + (nowrite ? "would copy" : "copying"), + src, dst); + if (!nowrite) + rslt = filecopy(src, dst); + if (rslt == -1) + goto cleanup; + } + rslt = 0; + + cleanup: + free(src); + return rslt; } /*