[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