Date: Fri, 9 May 2014 01:13:15 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r265725 - user/marcel/mkimg Message-ID: <201405090113.s491DFdE088614@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Fri May 9 01:13:14 2014 New Revision: 265725 URL: http://svnweb.freebsd.org/changeset/base/265725 Log: Add image_get_size() so formats can query about the image size. Create the VMDK (embedded) descriptor file and round its size to a multiple of 512. TODO: We need the name of the output file -- it's in the extent description. For now, just use "mkimg.vmdk". Modified: user/marcel/mkimg/image.c user/marcel/mkimg/image.h user/marcel/mkimg/vmdk.c Modified: user/marcel/mkimg/image.c ============================================================================== --- user/marcel/mkimg/image.c Fri May 9 00:34:29 2014 (r265724) +++ user/marcel/mkimg/image.c Fri May 9 01:13:14 2014 (r265725) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); static char image_tmpfile[] = "/tmp/mkimg-XXXXXX"; static int image_fd = -1; +static lba_t image_size; static void cleanup(void) @@ -123,10 +124,18 @@ image_copyout(int fd) return (error); } +lba_t +image_get_size(void) +{ + + return (image_size); +} + int image_set_size(lba_t blk) { + image_size = blk; if (ftruncate(image_fd, blk * secsz) == -1) return (errno); return (0); Modified: user/marcel/mkimg/image.h ============================================================================== --- user/marcel/mkimg/image.h Fri May 9 00:34:29 2014 (r265724) +++ user/marcel/mkimg/image.h Fri May 9 01:13:14 2014 (r265725) @@ -33,6 +33,7 @@ typedef int64_t lba_t; int image_copyin(lba_t blk, int fd, uint64_t *sizep); int image_copyout(int fd); +lba_t image_get_size(void); int image_init(void); int image_set_size(lba_t blk); int image_write(lba_t blk, void *buf, ssize_t len); Modified: user/marcel/mkimg/vmdk.c ============================================================================== --- user/marcel/mkimg/vmdk.c Fri May 9 00:34:29 2014 (r265724) +++ user/marcel/mkimg/vmdk.c Fri May 9 01:13:14 2014 (r265725) @@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$"); #include <sys/apm.h> #include <sys/endian.h> #include <sys/errno.h> +#include <stdint.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -67,9 +69,34 @@ struct vmdk_header { char padding[433]; } __attribute__((__packed__)); +static const char desc_fmt[] = + "# Disk DescriptorFile\n" + "version=%d\n" + "CID=%08x\n" + "parentCID=ffffffff\n" + "createType=\"monolithicSparse\"\n" + "# Extent description\n" + "RW %ju SPARSE \"%s\"\n" + "# The Disk Data Base\n" + "#DDB\n" + "ddb.adapterType = \"ide\"\n" + "ddb.geometry.cylinders = \"%u\"\n" + "ddb.geometry.heads = \"%u\"\n" + "ddb.geometry.sectors = \"%u\"\n"; + static int vmdk_write(int fd __unused) { + char *desc; + lba_t imgsz; + int desc_len; + + imgsz = image_get_size(); + desc_len = asprintf(&desc, desc_fmt, 1 /*version*/, 0 /*CID*/, + (uintmax_t)imgsz /*size*/, "mkimg.vmdk" /*name*/, + ncyls /*cylinders*/, nheads /*heads*/, nsecs /*sectors*/); + desc_len = (desc_len + 512 - 1) & ~(512 - 1); + desc = realloc(desc, desc_len); /* * Steps:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405090113.s491DFdE088614>