svn commit: r263442 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Thu Mar 20 20:14:29 UTC 2014


Author: marcel
Date: Thu Mar 20 20:14:26 2014
New Revision: 263442
URL: http://svnweb.freebsd.org/changeset/base/263442

Log:
  Add a scheme-specific write callback to write the metadata.
  While here:
  1.  Move FreeBSD-specific headers to a more centralized place, so that
      it's easier to port mkimg.
  2.  Remove inclusion of <uuid.h> where we don't need it (copy-pasted).
  3.  Check the partition data given on the command line before we do any
      I/O.
  4.  Add scheme_round() for rounding the partition size.
  5.  Have scheme_write call the scheme-specific write callback and have
      it propagate errors back to the caller.

Modified:
  user/marcel/mkimg/apm.c
  user/marcel/mkimg/bsd.c
  user/marcel/mkimg/ebr.c
  user/marcel/mkimg/gpt.c
  user/marcel/mkimg/mbr.c
  user/marcel/mkimg/mkimg.c
  user/marcel/mkimg/mkimg.h
  user/marcel/mkimg/pc98.c
  user/marcel/mkimg/scheme.c
  user/marcel/mkimg/scheme.h
  user/marcel/mkimg/vtoc8.c

Modified: user/marcel/mkimg/apm.c
==============================================================================
--- user/marcel/mkimg/apm.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/apm.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -29,8 +29,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 #include <sys/apm.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/errno.h>
 #include <stdlib.h>
 
 #include "mkimg.h"
@@ -49,11 +48,19 @@ apm_metadata(u_int where, u_int parts, u
 	return (secs);
 }
 
+static int
+apm_write(int fd __unused, off_t imgsz __unused, u_int parts __unused,
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme apm_scheme = {
 	.name = "apm",
 	.description = "Apple Partition Map",
 	.aliases = apm_aliases,
 	.metadata = apm_metadata,
+	.write = apm_write,
 	.nparts = 4096
 };
 

Modified: user/marcel/mkimg/bsd.c
==============================================================================
--- user/marcel/mkimg/bsd.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/bsd.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -28,10 +28,9 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/disklabel.h>
+#include <sys/errno.h>
 #include <stdlib.h>
-#include <uuid.h>
 
 #include "mkimg.h"
 #include "scheme.h"
@@ -49,11 +48,19 @@ bsd_metadata(u_int where, u_int parts __
 	return (secs);
 }
 
+static int
+bsd_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme bsd_scheme = {
 	.name = "bsd",
 	.description = "BSD disk label",
 	.aliases = bsd_aliases,
 	.metadata = bsd_metadata,
+	.write = bsd_write,
 	.nparts = 20
 };
 

Modified: user/marcel/mkimg/ebr.c
==============================================================================
--- user/marcel/mkimg/ebr.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/ebr.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -28,10 +28,9 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/diskmbr.h>
+#include <sys/errno.h>
 #include <stdlib.h>
-#include <uuid.h>
 
 #include "mkimg.h"
 #include "scheme.h"
@@ -49,11 +48,19 @@ ebr_metadata(u_int where, u_int parts __
 	return (secs);
 }
 
+static int
+ebr_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme ebr_scheme = {
 	.name = "ebr",
 	.description = "Extended Boot Record",
 	.aliases = ebr_aliases,
 	.metadata = ebr_metadata,
+	.write = ebr_write,
 	.nparts = 4096
 };
 

Modified: user/marcel/mkimg/gpt.c
==============================================================================
--- user/marcel/mkimg/gpt.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/gpt.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -28,9 +28,8 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <sys/errno.h>
 #include <sys/gpt.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
 #include <stdlib.h>
 #include <uuid.h>
 
@@ -58,11 +57,19 @@ gpt_metadata(u_int where, u_int parts, u
 	return (secs);
 }
 
+static int
+gpt_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme gpt_scheme = {
 	.name = "gpt",
 	.description = "GUID Partition Table",
 	.aliases = gpt_aliases,
 	.metadata = gpt_metadata,
+	.write = gpt_write,
 	.nparts = 4096
 };
 

Modified: user/marcel/mkimg/mbr.c
==============================================================================
--- user/marcel/mkimg/mbr.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/mbr.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -29,10 +29,8 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 #include <sys/diskmbr.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/errno.h>
 #include <stdlib.h>
-#include <uuid.h>
 
 #include "mkimg.h"
 #include "scheme.h"
@@ -50,11 +48,19 @@ mbr_metadata(u_int where, u_int parts __
 	return (secs);
 }
 
+static int
+mbr_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme mbr_scheme = {
 	.name = "mbr",
 	.description = "Master Boot Record",
 	.aliases = mbr_aliases,
 	.metadata = mbr_metadata,
+	.write = mbr_write,
 	.nparts = NDOSPART
 };
 

Modified: user/marcel/mkimg/mkimg.c
==============================================================================
--- user/marcel/mkimg/mkimg.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/mkimg.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -216,6 +216,13 @@ mkimg(void)
 		errc(EX_DATAERR, ENOSPC, "only %d partitions are supported",
 		    scheme_max_parts());
 
+	/* First check partition information */
+	STAILQ_FOREACH(part, &partlist, link) {
+		error = scheme_check_part(part);
+		if (error)
+			errc(EX_DATAERR, error, "partition %d", part->index+1);
+	}
+
 	offset = scheme_first_offset(nparts);
 	STAILQ_FOREACH(part, &partlist, link) {
 		part->offset = offset;
@@ -245,14 +252,14 @@ mkimg(void)
 				error = errno;
 			break;
 		}
-		part->size = size;
-		error = scheme_check_part(part);
 		if (error)
-			errc(EX_DATAERR, error, "partition %d", part->index+1);
+			errc(EX_IOERR, error, "partition %d", part->index+1);
+		size = scheme_round(size);
+		part->size = size;
 		offset = scheme_next_offset(offset, size);
 	}
 
-	scheme_write(tmpfd, offset);
+	error = (scheme_write(tmpfd, offset));
 }
 
 int

Modified: user/marcel/mkimg/mkimg.h
==============================================================================
--- user/marcel/mkimg/mkimg.h	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/mkimg.h	Thu Mar 20 20:14:26 2014	(r263442)
@@ -29,6 +29,8 @@
 #ifndef _MKIMG_MKIMG_H_
 #define	_MKIMG_MKIMG_H_
 
+#include <sys/queue.h>
+
 struct part {
 	STAILQ_ENTRY(part) link;
 	char	*alias;		/* Partition type alias. */

Modified: user/marcel/mkimg/pc98.c
==============================================================================
--- user/marcel/mkimg/pc98.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/pc98.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -29,10 +29,8 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 #include <sys/diskpc98.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/errno.h>
 #include <stdlib.h>
-#include <uuid.h>
 
 #include "mkimg.h"
 #include "scheme.h"
@@ -50,11 +48,19 @@ pc98_metadata(u_int where, u_int parts _
 	return (secs);
 }
 
+static int
+pc98_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme pc98_scheme = {
 	.name = "pc98",
 	.description = "PC-9800 disk partitions",
 	.aliases = pc98_aliases,
 	.metadata = pc98_metadata,
+	.write = pc98_write,
 	.nparts = PC98_NPARTS
 };
 

Modified: user/marcel/mkimg/scheme.c
==============================================================================
--- user/marcel/mkimg/scheme.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/scheme.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -96,6 +96,14 @@ scheme_max_parts(void)
 	return (scheme->nparts);
 }
 
+uint64_t
+scheme_round(uint64_t sz)
+{
+
+	sz = (sz + secsz - 1) & ~(secsz - 1);
+	return (sz);
+}
+
 off_t
 scheme_first_offset(u_int parts)
 {
@@ -111,17 +119,17 @@ scheme_next_offset(off_t off, uint64_t s
 {
 	u_int secs;
 
-	sz = (sz + secsz - 1) & ~(secsz - 1);
 	secs = scheme->metadata(SCHEME_META_PART_AFTER, 0, secsz) +
 	    scheme->metadata(SCHEME_META_PART_BEFORE, 0, secsz);
 	sz += (secs * secsz);
 	return (off + sz);
 }
 
-void
+int
 scheme_write(int fd, off_t off)
 {
 	u_int secs;
+	int error;
 
 	/* Fixup offset: it has an extra metadata before the partition */
 	secs = scheme->metadata(SCHEME_META_PART_BEFORE, 0, secsz);
@@ -129,5 +137,9 @@ scheme_write(int fd, off_t off)
 
 	secs = scheme->metadata(SCHEME_META_IMG_END, nparts, secsz);
 	off += (secs * secsz);
-	ftruncate(fd, off);
+	if (ftruncate(fd, off) == -1)
+		return (errno);
+
+	error = scheme->write(fd, off, nparts, secsz);
+	return (error);
 }

Modified: user/marcel/mkimg/scheme.h
==============================================================================
--- user/marcel/mkimg/scheme.h	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/scheme.h	Thu Mar 20 20:14:26 2014	(r263442)
@@ -29,6 +29,8 @@
 #ifndef _MKIMG_SCHEME_H_
 #define	_MKIMG_SCHEME_H_
 
+#include <sys/linker_set.h>
+
 struct mkimg_alias {
 	const char	*name;
 	uintptr_t	tp;
@@ -45,6 +47,7 @@ struct mkimg_scheme {
 #define	SCHEME_META_IMG_END	2
 #define	SCHEME_META_PART_BEFORE	3
 #define	SCHEME_META_PART_AFTER	4
+	int		(*write)(int, off_t, u_int, u_int);
 	int		nparts;
 };
 
@@ -56,8 +59,9 @@ struct mkimg_scheme *scheme_selected(voi
 
 int scheme_check_part(struct part *);
 u_int scheme_max_parts(void);
+uint64_t scheme_round(uint64_t);
 off_t scheme_first_offset(u_int);
 off_t scheme_next_offset(off_t, uint64_t);
-void scheme_write(int, off_t);
+int scheme_write(int, off_t);
 
 #endif /* _MKIMG_SCHEME_H_ */

Modified: user/marcel/mkimg/vtoc8.c
==============================================================================
--- user/marcel/mkimg/vtoc8.c	Thu Mar 20 20:14:04 2014	(r263441)
+++ user/marcel/mkimg/vtoc8.c	Thu Mar 20 20:14:26 2014	(r263442)
@@ -28,11 +28,9 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
+#include <sys/errno.h>
 #include <sys/vtoc.h>
 #include <stdlib.h>
-#include <uuid.h>
 
 #include "mkimg.h"
 #include "scheme.h"
@@ -50,11 +48,19 @@ vtoc8_metadata(u_int where, u_int parts 
 	return (secs);
 }
 
+static int
+vtoc8_write(int fd __unused, off_t imgsz __unused, u_int parts __unused, 
+    u_int secsz __unused)
+{
+	return (ENOSYS);
+}
+
 static struct mkimg_scheme vtoc8_scheme = {
 	.name = "vtoc8",
 	.description = "SMI VTOC8 disk labels",
 	.aliases = vtoc8_aliases,
 	.metadata = vtoc8_metadata,
+	.write = vtoc8_write,
 	.nparts = VTOC8_NPARTS
 };
 


More information about the svn-src-user mailing list