From 821d28352b21950012c374f0efc0898f549d05e7 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 15 Jul 2005 08:04:32 +0000 Subject: Attempt gctl verb "write MBR" when updating. This should solve the problem of modifying the MBR while running. --- usr.sbin/boot0cfg/Makefile | 3 +++ usr.sbin/boot0cfg/boot0cfg.c | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'usr.sbin/boot0cfg') diff --git a/usr.sbin/boot0cfg/Makefile b/usr.sbin/boot0cfg/Makefile index 3f87438..dc02cad 100644 --- a/usr.sbin/boot0cfg/Makefile +++ b/usr.sbin/boot0cfg/Makefile @@ -5,4 +5,7 @@ MAN= boot0cfg.8 WARNS?= 2 +DPADD= ${LIBGEOM} +LDADD= -lgeom + .include diff --git a/usr.sbin/boot0cfg/boot0cfg.c b/usr.sbin/boot0cfg/boot0cfg.c index 6783360..6fd0587 100644 --- a/usr.sbin/boot0cfg/boot0cfg.c +++ b/usr.sbin/boot0cfg/boot0cfg.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -256,6 +257,8 @@ write_mbr(const char *fname, int flags, u_int8_t *mbr, int mbr_size) int fd, p; ssize_t n; char *s; + const char *q; + struct gctl_req *grq; fd = open(fname, O_WRONLY | flags, 0666); if (fd != -1) { @@ -265,12 +268,30 @@ write_mbr(const char *fname, int flags, u_int8_t *mbr, int mbr_size) errx(1, "%s: short write", fname); return; } + if (flags != 0) err(1, "%s", fname); + grq = gctl_get_handle(); + gctl_ro_param(grq, "verb", -1, "write MBR"); + gctl_ro_param(grq, "class", -1, "MBR"); + q = strrchr(fname, '/'); + if (q == NULL) + q = fname; + else + q++; + gctl_ro_param(grq, "geom", -1, q); + gctl_ro_param(grq, "data", mbr_size, mbr); + q = gctl_issue(grq); + if (q == NULL) + return; + + warnx("%s: %s", fname, q); + gctl_free(grq); + #ifdef DIOCSMBR for (p = 1; p < 5; p++) { asprintf(&s, "%ss%d", fname, p); - fd = open(s, O_RDWR); + fd = open(s, O_RDONLY); if (fd < 0) { free(s); continue; -- cgit v1.1