svn commit: r245126 - user/hrs/releng/usr.sbin/makevd

Hiroki Sato hrs at svn.freebsd.org
Mon Jan 7 07:30:43 UTC 2013


Author: hrs
Date: Mon Jan  7 07:30:41 2013
New Revision: 245126
URL: http://svnweb.freebsd.org/changeset/base/245126

Log:
  - Use linked-list for chunks to support multiple formats in a consistent
    fashion.
  
  - Define VMDK_SEH_HOSTEDSPARSE_INIT and VHD_HDF_FIXEDHDD_INIT for some
    fixed parameters.
  
  - Fix license boilerplate.

Added:
  user/hrs/releng/usr.sbin/makevd/common.c   (contents, props changed)
  user/hrs/releng/usr.sbin/makevd/common.h   (contents, props changed)
Modified:
  user/hrs/releng/usr.sbin/makevd/Makefile
  user/hrs/releng/usr.sbin/makevd/raw.c
  user/hrs/releng/usr.sbin/makevd/vhd.c
  user/hrs/releng/usr.sbin/makevd/vhd.h
  user/hrs/releng/usr.sbin/makevd/vmdk.c
  user/hrs/releng/usr.sbin/makevd/vmdk.h

Modified: user/hrs/releng/usr.sbin/makevd/Makefile
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/Makefile	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/Makefile	Mon Jan  7 07:30:41 2013	(r245126)
@@ -3,6 +3,7 @@
 PROG=	makevd
 MAN=	makevd.8
 SRCS=	makevd.c \
+	common.c \
 	raw.c \
 	vhd.c \
 	vmdk.c

Added: user/hrs/releng/usr.sbin/makevd/common.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/hrs/releng/usr.sbin/makevd/common.c	Mon Jan  7 07:30:41 2013	(r245126)
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2013
+ *	Hiroki Sato <hrs at FreeBSD.org>  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/queue.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "common.h"
+
+static int rawcopy(int, int);
+static int writebuf(int, void *, ssize_t);
+
+int
+dispatch_bl(int ofd, struct blhead_t *blhead)
+{
+	struct blist *bl;
+	int error;
+
+	TAILQ_FOREACH(bl, blhead, bl_next) {
+		printf("processing section: %s\n", bl->bl_name);
+		switch (bl->bl_type) {
+		case BL_RAWCOPY:
+			error = rawcopy(ofd, bl->bl_tf.blf_fd);
+			break;
+		case BL_RAWDATA:
+			error = writebuf(ofd, bl->bl_tr.blr_data,
+			    bl->bl_tr.blr_len);
+			break;
+		default:
+			error = 1;
+			break;
+		}
+		if (error)
+			return (error);
+	}
+	return (0);
+}
+
+static int
+rawcopy(int ofd, int ifd)
+{
+	ssize_t len0, len = 0;
+	char buf[BUFSIZ];
+
+	for (;;) {
+		len0 = read(ifd, buf, sizeof(buf));
+		if (len0 == 0)
+			break;
+		if (len0 < 0) {
+			warn("read error");
+			return (1);
+		}
+		len = write(ofd, buf, len0);
+		if (len < 0) {
+			warn("write error");
+			return (1);
+		}
+	}
+	return (0);
+}
+
+static int
+writebuf(int ofd, void *buf, ssize_t len)
+{
+	ssize_t len0;
+	u_char *p;
+
+	p = (u_char *)buf;
+	len0 = write(ofd, p, len);
+	if (len0 != len) {
+		warn("write error");
+		return (1);
+	}
+
+	return (0);
+}

Added: user/hrs/releng/usr.sbin/makevd/common.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/hrs/releng/usr.sbin/makevd/common.h	Mon Jan  7 07:30:41 2013	(r245126)
@@ -0,0 +1,64 @@
+/*-
+ * Copyright (c) 2013
+ *	Hiroki Sato <hrs at FreeBSD.org>  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#include <sys/queue.h>
+
+struct blist_raw {
+	size_t		blr_len;
+	void		*blr_data;
+};
+
+struct blist_fd {
+	int		blf_fd;
+};
+
+struct blist {
+	TAILQ_ENTRY(blist)	bl_next;
+
+	int		bl_type;
+#define	BL_UNKNOWN	0
+#define	BL_RAWDATA	1
+#define	BL_RAWCOPY	2
+	const char	*bl_name;
+	const char	*bl_desc;
+	union {
+		struct blist_fd		tf;
+		struct blist_raw	tr;
+	} t;
+#define	bl_tf	t.tf
+#define	bl_tr	t.tr
+};
+
+TAILQ_HEAD(blhead_t, blist);
+
+int dispatch_bl(int, struct blhead_t *);
+
+#endif	/* _COMMON_H */

Modified: user/hrs/releng/usr.sbin/makevd/raw.c
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/raw.c	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/raw.c	Mon Jan  7 07:30:41 2013	(r245126)
@@ -11,10 +11,10 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
@@ -30,6 +30,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/queue.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
@@ -38,19 +39,23 @@ __FBSDID("$FreeBSD$");
 #include <fcntl.h>
 #include <limits.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sysexits.h>
 
 #include "makevd.h"
+#include "common.h"
 
 int
 raw_makeim(struct iminfo *imi)
 {
-	char buf[BUFSIZ], rawfile[PATH_MAX + 10];
-	ssize_t len0, len = 0;
+	struct blhead_t blhead;
+	struct blist *bl;
+	char rawfile[PATH_MAX + 10];
 	int ifd, ofd;
 
+	TAILQ_INIT(&blhead);
 	ifd = imi->imi_fd;
 
 	if (strcmp(imi->imi_imagename, "-") == 0)
@@ -64,20 +69,14 @@ raw_makeim(struct iminfo *imi)
 			err(EX_CANTCREAT, "%s", rawfile);
 	}
 
-	for (;;) {
-		len0 = read(ifd, buf, sizeof(buf));
-		if (len0 == 0)
-			break;
-		if (len0 < 0) {
-			warn("read error");
-			return (1);
-		}
-		len = write(ofd, buf, len0);
-		if (len < 0) {
-			warn("write error");
-			return (1);
-		}
-	}
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWCOPY;
+	bl->bl_name = "rawcopy";
+	bl->bl_tf.blf_fd = ifd;
+
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
 
-	return (0);
+	return (dispatch_bl(ofd, &blhead));
 }

Modified: user/hrs/releng/usr.sbin/makevd/vhd.c
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/vhd.c	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/vhd.c	Mon Jan  7 07:30:41 2013	(r245126)
@@ -11,10 +11,10 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
@@ -30,6 +30,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/queue.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
@@ -47,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <unistd.h>
 
 #include "makevd.h"
+#include "common.h"
 #include "vhd.h"
 
 static uint32_t vhd_checksum(struct HardDiskFooter *);
@@ -54,16 +56,20 @@ static uint32_t vhd_checksum(struct Hard
 int
 vhd_makeim(struct iminfo *imi)
 {
-	struct HardDiskFooter DHF, *imh;
+	struct HardDiskFooter HDF = VHD_HDF_FIXEDHDD_INIT;
+	struct HardDiskFooter *imh;
+	struct blhead_t blhead;
+	struct blist *bl;
 	uint64_t sectors, heads, cylinders, imagesize;
 	uint8_t uuid[16];
 	char vhdfile[PATH_MAX + 10];
 	char buf[BUFSIZ];
 	char *p, *q;
-	ssize_t len0, len = 0;
+	ssize_t len = 0;
 	int ifd, ofd;
 
-	imh = &DHF;
+	TAILQ_INIT(&blhead);
+	imh = &HDF;
 	ifd = imi->imi_fd;
 	imagesize = imi->imi_size;
 
@@ -119,14 +125,7 @@ vhd_makeim(struct iminfo *imi)
 		err(EX_CANTCREAT, "%s", vhdfile);
 
 	/* All of the fields are in BE byte order. */
-	imh->Cookie = htobe64(HDF_COOKIE);
-	imh->Features = htobe32(HDF_FEATURES_RES);
-	imh->FileFormatVersion = htobe32(HDF_FILEFORMATVERSION_DEFAULT);
-	imh->DataOffset = htobe32(HDF_DATAOFFSET_FIXEDHDD);
 	imh->TimeStamp = 0; /* XXX */
-	imh->CreatorApplication = htobe32(HDF_CREATORAPP_VPC);
-	imh->CreatorVersion = htobe32(HDF_CREATORVERSION_VPC2004);
-	imh->CreatorHostOS = htobe32(HDF_CREATORHOSTOS_WIN);
 	imh->OriginalSize = htobe64(imagesize);
 	imh->CurrentSize = htobe64(imagesize);
 
@@ -141,33 +140,28 @@ vhd_makeim(struct iminfo *imi)
 	imh->DiskGeometry.heads = heads;
 	imh->DiskGeometry.sectcyl = sectors;
 
-	imh->DiskType = htobe32(HDF_DISKTYPE_FIXEDHDD);
 	memcpy((char *)imh->UniqueId, (char *)&uuid, sizeof(imh->UniqueId));
-	imh->SavedState = 0;
 
 	imh->Checksum = htobe32(vhd_checksum(imh));
 
-	for (;;) {
-		len0 = read(ifd, buf, sizeof(buf));
-		if (len0 == 0)
-			break;
-		if (len0 < 0) {
-			warn("read error");
-			return (1);
-		}
-		len = write(ofd, buf, len0);
-		if (len < 0) {
-			warn("write error");
-			return (1);
-		}
-	}
-	len0 = write(ofd, imh, sizeof(*imh));
-	if (len0 != sizeof(*imh)) {
-		warn("write error");
-		return (1);
-	}
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWCOPY;
+	bl->bl_name = "Rawcopy";
+	bl->bl_tf.blf_fd = ifd;
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
+
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWDATA;
+	bl->bl_name = "Hard Disk Footer";
+	bl->bl_tr.blr_data = imh;
+	bl->bl_tr.blr_len = sizeof(*imh);
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
 
-	return (0);
+	return (dispatch_bl(ofd, &blhead));
 }
 
 static uint32_t

Modified: user/hrs/releng/usr.sbin/makevd/vhd.h
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/vhd.h	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/vhd.h	Mon Jan  7 07:30:41 2013	(r245126)
@@ -11,10 +11,10 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -70,6 +70,18 @@ struct HardDiskFooter {
 	char		Reserved[427];
 } __attribute__((__packed__));
 
+#define	VHD_HDF_FIXEDHDD_INIT	{					\
+	.Cookie = htobe64(HDF_COOKIE),					\
+	.Features = htobe32(HDF_FEATURES_RES),				\
+	.FileFormatVersion = htobe32(HDF_FILEFORMATVERSION_DEFAULT),	\
+	.DataOffset = htobe32(HDF_DATAOFFSET_FIXEDHDD),			\
+	.CreatorApplication = htobe32(HDF_CREATORAPP_VPC),		\
+	.CreatorVersion = htobe32(HDF_CREATORVERSION_VPC2004),		\
+	.CreatorHostOS = htobe32(HDF_CREATORHOSTOS_WIN),		\
+	.DiskType = htobe32(HDF_DISKTYPE_FIXEDHDD),			\
+	.SavedState = 0,						\
+	}
+
 struct DynamicDiskHeader {
 	uint64_t	Cookie;
 #define DDH_COOKIE	(0x6378737061727365)	/* "cxsparse" */

Modified: user/hrs/releng/usr.sbin/makevd/vmdk.c
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/vmdk.c	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/vmdk.c	Mon Jan  7 07:30:41 2013	(r245126)
@@ -11,10 +11,10 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
@@ -30,6 +30,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/queue.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
@@ -39,27 +40,30 @@ __FBSDID("$FreeBSD$");
 #include <inttypes.h>
 #include <limits.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sysexits.h>
 #include <unistd.h>
 
 #include "makevd.h"
+#include "common.h"
 #include "vmdk.h"
 
 int
 vmdk_makeim(struct iminfo *imi)
 {
-	struct SparseExtentHeader SEH, *imh;
+	struct SparseExtentHeader SEH = VMDK_SEH_HOSTEDSPARSE_INIT;
+	struct SparseExtentHeader *imh;
+	struct blhead_t blhead;
+	struct blist *bl;
 	uint64_t sectors, heads, cylinders, imagesize;
 	char vmdkfile[PATH_MAX + 10], *vmdkfilebase;
-	char buf[BUFSIZ];
 	char desc[1024];
-	ssize_t len0, len = 0;
-	int ifd, ofd;
+	int ofd;
 
+	TAILQ_INIT(&blhead);
 	imh = &SEH;
-	ifd = imi->imi_fd;
 	imagesize = imi->imi_size;
 
 	memset(imh, 0, sizeof(*imh));
@@ -79,22 +83,9 @@ vmdk_makeim(struct iminfo *imi)
 		vmdkfilebase = vmdkfile;
 
 	/* All of the fields are in LE byte order. */
-	imh->magicNumber = htole32(SEH_MAGICNUMBER);
-	imh->version = htole32(SEH_VERSION_DEFAULT);
-	imh->flags = htole32(1);
-	imh->capacity = htole64(0);
-	imh->grainSize = htole64(16);
 	imh->descriptorOffset = htole64((sizeof(*imh) + 511) / 512);
 	imh->descriptorSize = htole64((sizeof(desc) + 511) / 512);
-	imh->numGTEsPerGT = htole32(512);
-	imh->rgdOffset = htole64(0);
-	imh->gdOffset = htole64(0);
 	imh->overHead = htole64(imh->descriptorOffset + imh->descriptorSize);
-	imh->uncleanShutdown = 0;
-	imh->singleEndLineChar = '\n';
-	imh->nonEndLineChar = ' ';
-	imh->doubleEndLineChar1 = '\r';
-	imh->doubleEndLineChar2 = '\n';
 
 	sectors = 63;
 	heads = 16;
@@ -128,30 +119,31 @@ vmdk_makeim(struct iminfo *imi)
 	    cylinders,
 	    imi->imi_uuid);
 
-	len0 = write(ofd, imh, sizeof(*imh));
-	if (len0 != sizeof(*imh)) {
-		warn("write error");
-		return (1);
-	}
-	len0 = write(ofd, desc, sizeof(desc));
-	if (len0 != sizeof(desc)) {
-		warn("write error");
-		return (1);
-	}
-	for (;;) {
-		len0 = read(ifd, buf, sizeof(buf));
-		if (len0 == 0)
-			break;
-		if (len0 < 0) {
-			warn("read error");
-			return (1);
-		}
-		len = write(ofd, buf, len0);
-		if (len < 0) {
-			warn("write error");
-			return (1);
-		}
-	}
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWDATA;
+	bl->bl_name = "Sparse Extent Header";
+	bl->bl_tr.blr_data = imh;
+	bl->bl_tr.blr_len = sizeof(*imh);
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
+
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWDATA;
+	bl->bl_name = "Embedded descriptor";
+	bl->bl_tr.blr_data = &desc;
+	bl->bl_tr.blr_len = sizeof(desc);
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
+
+	bl = calloc(1, sizeof(*bl));
+	if (bl == NULL)
+		err(EX_OSERR, NULL);
+	bl->bl_type = BL_RAWCOPY;
+	bl->bl_name = "Rawcopy";
+	bl->bl_tf.blf_fd = imi->imi_fd;
+	TAILQ_INSERT_TAIL(&blhead, bl, bl_next);
 
-	return (0);
+	return (dispatch_bl(ofd, &blhead));
 }

Modified: user/hrs/releng/usr.sbin/makevd/vmdk.h
==============================================================================
--- user/hrs/releng/usr.sbin/makevd/vmdk.h	Mon Jan  7 07:05:57 2013	(r245125)
+++ user/hrs/releng/usr.sbin/makevd/vmdk.h	Mon Jan  7 07:30:41 2013	(r245126)
@@ -11,10 +11,10 @@
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@@ -62,4 +62,20 @@ struct SparseExtentHeader {
 	uint8	     pad[433];
 } __attribute__((__packed__));
 
+#define	VMDK_SEH_HOSTEDSPARSE_INIT	{			\
+	.magicNumber = htole32(SEH_MAGICNUMBER),		\
+	.version = htole32(SEH_VERSION_DEFAULT),		\
+	.flags = htole32(1),					\
+	.capacity = htole64(0),					\
+	.grainSize = htole64(16),				\
+	.numGTEsPerGT = htole32(512),				\
+	.rgdOffset = htole64(0),				\
+	.gdOffset = htole64(0),					\
+	.uncleanShutdown = 0,					\
+	.singleEndLineChar = '\n',				\
+	.nonEndLineChar = ' ',					\
+	.doubleEndLineChar1 = '\r',				\
+	.doubleEndLineChar2 = '\n',				\
+	 }
+
 #endif	/* _VMDK_H */


More information about the svn-src-user mailing list