[Midnightbsd-cvs] src [10863] sync with freebsd
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Wed Jun 13 18:31:30 EDT 2018
Revision: 10863
http://svnweb.midnightbsd.org/src/?rev=10863
Author: laffer1
Date: 2018-06-13 18:31:29 -0400 (Wed, 13 Jun 2018)
Log Message:
-----------
sync with freebsd
Modified Paths:
--------------
trunk/usr.sbin/boot0cfg/boot0cfg.8
trunk/usr.sbin/boot0cfg/boot0cfg.c
Property Changed:
----------------
trunk/usr.sbin/boot0cfg/boot0cfg.8
Modified: trunk/usr.sbin/boot0cfg/boot0cfg.8
===================================================================
--- trunk/usr.sbin/boot0cfg/boot0cfg.8 2018-06-13 22:28:40 UTC (rev 10862)
+++ trunk/usr.sbin/boot0cfg/boot0cfg.8 2018-06-13 22:31:29 UTC (rev 10863)
@@ -23,8 +23,9 @@
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $MidnightBSD$
+.\" $FreeBSD: stable/10/usr.sbin/boot0cfg/boot0cfg.8 293692 2016-01-11 20:10:14Z trasz $
.\"
-.Dd February 4, 2012
+.Dd October 1, 2013
.Dt BOOT0CFG 8
.Os
.Sh NAME
@@ -173,22 +174,20 @@
.Sh EXAMPLES
To boot slice 2 on the next boot:
.Pp
-.Dl "boot0cfg -s 2 ad0"
+.Dl "boot0cfg -s 2 ada0"
.Pp
To enable just slices 1 and 3 in the menu:
.Pp
-.Dl "boot0cfg -m 0x5 ad0"
+.Dl "boot0cfg -m 0x5 ada0"
.Pp
To go back to non-interactive booting, use
-.Xr fdisk 8
+.Xr gpart 8
to install the default MBR:
.Pp
-.Dl "fdisk -B ad0"
-.Pp
+.Dl "gpart bootcode -b /boot/mbr ada0"
.Sh SEE ALSO
.Xr geom 4 ,
.Xr boot 8 ,
-.Xr fdisk 8 ,
.Xr gpart 8
.Sh AUTHORS
.An Robert Nordier Aq rnordier at FreeBSD.org .
Property changes on: trunk/usr.sbin/boot0cfg/boot0cfg.8
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/usr.sbin/boot0cfg/boot0cfg.c
===================================================================
--- trunk/usr.sbin/boot0cfg/boot0cfg.c 2018-06-13 22:28:40 UTC (rev 10862)
+++ trunk/usr.sbin/boot0cfg/boot0cfg.c 2018-06-13 22:31:29 UTC (rev 10863)
@@ -60,13 +60,13 @@
int ticks;
};
-struct opt_offsets b0_ofs[] = {
+static struct opt_offsets b0_ofs[] = {
{ 0x0, 0x0, 0x0, 0x0 }, /* no boot block */
{ 0x1b9, 0x1ba, 0x1bb, 0x1bc }, /* original block */
{ 0x1b5, 0x1b6, 0x1b7, 0x1bc }, /* NT_SERIAL block */
};
-int b0_ver; /* boot block version set by boot0bs */
+static int b0_ver; /* boot block version set by boot0bs */
#define OFF_OPT (b0_ofs[b0_ver].opt) /* default boot option */
#define OFF_DRIVE (b0_ofs[b0_ver].drive) /* setdrv drive */
@@ -96,6 +96,7 @@
static const char fmt1[] = "%d 0x%02x %4u:%3u:%2u 0x%02x"
" %4u:%3u:%2u %10u %10u\n";
+static int geom_class_available(const char *);
static int read_mbr(const char *, u_int8_t **, int);
static void write_mbr(const char *, int, u_int8_t *, int);
static void display_mbr(u_int8_t *);
@@ -106,9 +107,9 @@
static int set_bell(u_int8_t *, int, int);
static void usage(void);
-unsigned vol_id[5]; /* 4 plus 1 for flag */
+static unsigned vol_id[5]; /* 4 plus 1 for flag */
-int v_flag;
+static int v_flag;
/*
* Boot manager installation/configuration utility.
*/
@@ -332,14 +333,39 @@
err(1, "%s", disk);
if (n != mbr_size)
errx(1, "%s: short read", disk);
+ close(fd);
return (mbr_size);
}
- *mbr = malloc(sizeof(buf));
+ if ((*mbr = malloc(sizeof(buf))) == NULL)
+ errx(1, "%s: unable to allocate MBR buffer", disk);
memcpy(*mbr, buf, sizeof(buf));
+ close(fd);
return sizeof(buf);
}
+static int
+geom_class_available(const char *name)
+{
+ struct gclass *class;
+ struct gmesh mesh;
+ int error;
+
+ error = geom_gettree(&mesh);
+ if (error != 0)
+ errc(1, error, "Cannot get GEOM tree");
+
+ LIST_FOREACH(class, &mesh.lg_class, lg_class) {
+ if (strcmp(class->lg_name, name) == 0) {
+ geom_deletetree(&mesh);
+ return (1);
+ }
+ }
+
+ geom_deletetree(&mesh);
+ return (0);
+}
+
/*
* Write out the mbr to the specified file.
*/
@@ -346,61 +372,67 @@
static void
write_mbr(const char *fname, int flags, u_int8_t *mbr, int mbr_size)
{
- int fd;
- ssize_t n;
- const char *errmsg;
- char *pname;
- struct gctl_req *grq;
-
- fd = open(fname, O_WRONLY | flags, 0666);
- if (fd != -1) {
- n = write(fd, mbr, mbr_size);
- close(fd);
- if (n != mbr_size)
- errx(1, "%s: short write", fname);
- return;
- }
+ struct gctl_req *grq;
+ const char *errmsg;
+ char *pname;
+ ssize_t n;
+ int fd;
- /*
- * If we're called to write to a backup file, don't try to
- * write through GEOM. It only generates additional errors.
- */
- if (flags != 0)
- return;
+ fd = open(fname, O_WRONLY | flags, 0666);
+ if (fd != -1) {
+ n = write(fd, mbr, mbr_size);
+ close(fd);
+ if (n != mbr_size)
+ errx(1, "%s: short write", fname);
+ return;
+ }
- /* Try open it read only. */
- fd = open(fname, O_RDONLY);
- if (fd == -1) {
- warn("error opening %s", fname);
- return;
- }
- pname = g_providername(fd);
- if (pname == NULL) {
- warn("error getting providername for %s", fname);
- return;
- }
- grq = gctl_get_handle();
- gctl_ro_param(grq, "class", -1, "PART");
- gctl_ro_param(grq, "arg0", -1, pname);
- gctl_ro_param(grq, "verb", -1, "bootcode");
- gctl_ro_param(grq, "bootcode", mbr_size, mbr);
- gctl_ro_param(grq, "flags", -1, "C");
- errmsg = gctl_issue(grq);
- if (errmsg == NULL)
- goto out;
+ /*
+ * If we're called to write to a backup file, don't try to
+ * write through GEOM.
+ */
+ if (flags != 0)
+ err(1, "can't open file %s to write backup", fname);
- grq = gctl_get_handle();
- gctl_ro_param(grq, "verb", -1, "write MBR");
- gctl_ro_param(grq, "class", -1, "MBR");
- gctl_ro_param(grq, "geom", -1, pname);
- gctl_ro_param(grq, "data", mbr_size, mbr);
- errmsg = gctl_issue(grq);
- if (errmsg != NULL)
- err(1, "write_mbr: %s", fname);
+ /* Try open it read only. */
+ fd = open(fname, O_RDONLY);
+ if (fd == -1) {
+ warn("error opening %s", fname);
+ return;
+ }
-out:
- free(pname);
- gctl_free(grq);
+ pname = g_providername(fd);
+ if (pname == NULL) {
+ warn("error getting providername for %s", fname);
+ return;
+ }
+
+ /* First check that GEOM_PART is available */
+ if (geom_class_available("PART") != 0) {
+ grq = gctl_get_handle();
+ gctl_ro_param(grq, "class", -1, "PART");
+ gctl_ro_param(grq, "arg0", -1, pname);
+ gctl_ro_param(grq, "verb", -1, "bootcode");
+ gctl_ro_param(grq, "bootcode", mbr_size, mbr);
+ gctl_ro_param(grq, "flags", -1, "C");
+ errmsg = gctl_issue(grq);
+ if (errmsg != NULL && errmsg[0] != '\0')
+ errx(1, "GEOM_PART: write bootcode to %s failed: %s",
+ fname, errmsg);
+ gctl_free(grq);
+ } else if (geom_class_available("MBR") != 0) {
+ grq = gctl_get_handle();
+ gctl_ro_param(grq, "verb", -1, "write MBR");
+ gctl_ro_param(grq, "class", -1, "MBR");
+ gctl_ro_param(grq, "geom", -1, pname);
+ gctl_ro_param(grq, "data", mbr_size, mbr);
+ errmsg = gctl_issue(grq);
+ if (errmsg != NULL)
+ err(1, "GEOM_MBR: write MBR to %s failed", fname);
+ gctl_free(grq);
+ } else
+ errx(1, "can't write MBR to %s", fname);
+ free(pname);
}
/*
More information about the Midnightbsd-cvs
mailing list