svn commit: r263652 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Sat Mar 22 23:34:36 UTC 2014


Author: marcel
Date: Sat Mar 22 23:34:35 2014
New Revision: 263652
URL: http://svnweb.freebsd.org/changeset/base/263652

Log:
  Flesh-out MBR support. The CHS fields need more thought/work...

Modified:
  user/marcel/mkimg/mbr.c

Modified: user/marcel/mkimg/mbr.c
==============================================================================
--- user/marcel/mkimg/mbr.c	Sat Mar 22 22:35:57 2014	(r263651)
+++ user/marcel/mkimg/mbr.c	Sat Mar 22 23:34:35 2014	(r263652)
@@ -29,14 +29,18 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 #include <sys/diskmbr.h>
+#include <sys/endian.h>
 #include <sys/errno.h>
 #include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 
 #include "mkimg.h"
 #include "scheme.h"
 
 static struct mkimg_alias mbr_aliases[] = {
-    {	ALIAS_NONE, 0 }
+    {	ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) },
+    {	ALIAS_NONE, 0 }		/* Keep last! */
 };
 
 static u_int
@@ -49,10 +53,37 @@ mbr_metadata(u_int where, u_int parts __
 }
 
 static int
-mbr_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
-    u_int secsz __unused, void *bootcode __unused)
+mbr_write(int fd, off_t imgsz __unused, u_int parts __unused, u_int secsz,
+    void *bootcode)
 {
-	return (ENOSYS);
+	u_char *mbr;
+	struct dos_partition *dpbase, *dp;
+	struct part *part;
+
+	mbr = malloc(secsz);
+	if (mbr == NULL)
+		return (ENOMEM);
+	if (bootcode != NULL) {
+		memcpy(mbr, bootcode, DOSPARTOFF);
+		memset(mbr + DOSPARTOFF, 0, secsz - DOSPARTOFF);
+	} else
+		memset(mbr, 0, secsz);
+	dpbase = (void *)(mbr + DOSPARTOFF);
+	STAILQ_FOREACH(part, &partlist, link) {
+		dp = dpbase + part->index;
+		dp->dp_flag = (part->index == 0 && bootcode != NULL) ? 0x80 : 0;
+		dp->dp_shd = dp->dp_ssect = dp->dp_scyl = 0xff;	/* XXX */
+		dp->dp_typ = ALIAS_TYPE2INT(part->type);
+		dp->dp_ehd = dp->dp_esect = dp->dp_ecyl = 0xff;	/* XXX */
+		le32enc(&dp[part->index].dp_start, part->offset / secsz);
+		le32enc(&dp[part->index].dp_size, part->size / secsz);
+	}
+	if (lseek(fd, 0, SEEK_SET) != 0 || write(fd, mbr, secsz) != secsz) {
+		free(mbr);
+		return (errno);
+	}
+	free(mbr);
+	return (0);
 }
 
 static struct mkimg_scheme mbr_scheme = {
@@ -61,6 +92,7 @@ static struct mkimg_scheme mbr_scheme = 
 	.aliases = mbr_aliases,
 	.metadata = mbr_metadata,
 	.write = mbr_write,
+	.bootcode = 512,
 	.nparts = NDOSPART
 };
 


More information about the svn-src-user mailing list