From 74c041ac57c7d0f7f93977f0adbe1510932a543c Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Sun, 26 Jan 2003 21:55:43 +0000 Subject: [PATCH] If we fail to open O_RDWR, try opening O_RDONLY, if we use ioctls to fiddle the disk we can get away with it. Try to use DIOCBSDBB to write boot code. --- sbin/bsdlabel/bsdlabel.c | 6 ++++++ sbin/disklabel/disklabel.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index d01f0ea00be2..ecb1705e9efd 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -228,6 +228,10 @@ main(int argc, char *argv[]) np = namebuf + strlen(specname) + 1; f = open(specname, op == READ ? O_RDONLY : O_RDWR); } + if (f < 0 && errno == EBUSY) { + /* lets try to get by with ioctls */ + f = open(specname, O_RDONLY); + } if (f < 0) err(4, "%s", specname); @@ -378,6 +382,8 @@ writelabel(int f, const char *boot, struct disklabel *lp) sum += p[i]; p[63] = sum; #endif + if (ioctl(f, DIOCBSDBB, &boot) == 0) + return (0); if (write(f, boot, lp->d_bbsize) != (int)lp->d_bbsize) { warn("write"); return (1); diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c index d01f0ea00be2..ecb1705e9efd 100644 --- a/sbin/disklabel/disklabel.c +++ b/sbin/disklabel/disklabel.c @@ -228,6 +228,10 @@ main(int argc, char *argv[]) np = namebuf + strlen(specname) + 1; f = open(specname, op == READ ? O_RDONLY : O_RDWR); } + if (f < 0 && errno == EBUSY) { + /* lets try to get by with ioctls */ + f = open(specname, O_RDONLY); + } if (f < 0) err(4, "%s", specname); @@ -378,6 +382,8 @@ writelabel(int f, const char *boot, struct disklabel *lp) sum += p[i]; p[63] = sum; #endif + if (ioctl(f, DIOCBSDBB, &boot) == 0) + return (0); if (write(f, boot, lp->d_bbsize) != (int)lp->d_bbsize) { warn("write"); return (1);