Date: Sun, 9 Jun 2013 15:17:39 +0000 (UTC) From: Hiroki Sato <hrs@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r251577 - user/hrs/releng/usr.sbin/makevd Message-ID: <201306091517.r59FHduT056001@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: hrs Date: Sun Jun 9 15:17:38 2013 New Revision: 251577 URL: http://svnweb.freebsd.org/changeset/base/251577 Log: - Fix VMDK and VHD header. - Add chunksize and padding parameter to support aligned blocks in rawcopy() and writebuf(). These are required for upcoming VDI support. - Move uuid handling functions to common.c. - Rename member variable names. Modified: user/hrs/releng/usr.sbin/makevd/common.c user/hrs/releng/usr.sbin/makevd/common.h user/hrs/releng/usr.sbin/makevd/raw.c user/hrs/releng/usr.sbin/makevd/vhd.c user/hrs/releng/usr.sbin/makevd/vmdk.c Modified: user/hrs/releng/usr.sbin/makevd/common.c ============================================================================== --- user/hrs/releng/usr.sbin/makevd/common.c Sun Jun 9 15:08:51 2013 (r251576) +++ user/hrs/releng/usr.sbin/makevd/common.c Sun Jun 9 15:17:38 2013 (r251577) @@ -33,14 +33,88 @@ __FBSDID("$FreeBSD$"); #include <sys/queue.h> #include <err.h> +#include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <unistd.h> #include "common.h" -static int rawcopy(int, int); -static int writebuf(int, void *, ssize_t); +static int rawcopy(int, int, ssize_t, int); +static int writebuf(int, void *, ssize_t, ssize_t, int); + +char * +uuid_str2bin(void *dst, const void *src) +{ + const char *p; + char *q; + char buf[3]; + ssize_t len; + + p = src; + len = 0; +#if _BYTE_ORDER == _BIG_ENDIAN + q = (char *)&dst + 16; +#else + q = (char *)&dst; +#endif + while (len < 16 && strlen(p) > 1) { + long digit; + char *endptr; + + if (*p == '-') { + p++; + continue; + } + buf[0] = p[0]; + buf[1] = p[1]; + buf[2] = '\0'; + errno = 0; + digit = strtol(buf, &endptr, 16); + if (errno == 0 && *endptr != '\0') + errno = EINVAL; + if (errno) { + warn("invalid UUID"); + return (NULL); + } +#if _BYTE_ORDER == _BIG_ENDIAN + *q-- = digit; +#else + *q++ = digit; +#endif + len++; + p += 2; + } +#if 0 + { + int i; + + printf("uuid = "); + for (i = 0; i < 16; i++) + printf("%02x", uuid[i]); + printf("\n"); + } +#endif + return (dst); +} + +char * +uuid_bin2str(void *dst, const void *src) +{ + const char *p; + char *q; + + p = src; + q = dst; + while (p - (char *)src < 16) { + snprintf(q, 3, "%02x", *p++); + q += 2; + } + q = '\0'; + + return (dst); +} int dispatch_bl(int ofd, struct blhead_t *blhead) @@ -52,11 +126,15 @@ dispatch_bl(int ofd, struct blhead_t *bl printf("processing section: %s\n", bl->bl_name); switch (bl->bl_type) { case BL_RAWCOPY: - error = rawcopy(ofd, bl->bl_tf.blf_fd); + error = rawcopy(ofd, bl->bl_tf.fd, + bl->bl_tf.chunksize, + bl->bl_tf.padding); break; case BL_RAWDATA: - error = writebuf(ofd, bl->bl_tr.blr_data, - bl->bl_tr.blr_len); + error = writebuf(ofd, bl->bl_tr.data, + bl->bl_tr.len, + bl->bl_tr.chunksize, + bl->bl_tr.padding); break; default: error = 1; @@ -69,40 +147,91 @@ dispatch_bl(int ofd, struct blhead_t *bl } static int -rawcopy(int ofd, int ifd) +rawcopy(int ofd, int ifd, ssize_t chunksize, int padding) { - ssize_t len0, len = 0; - char buf[BUFSIZ]; - + ssize_t rlen, wlen, len; + size_t remain; + u_char buf[BUFSIZ]; + u_char zero = 0; + + if (chunksize == 0) + chunksize = sizeof(buf); + remain = chunksize; for (;;) { - len0 = read(ifd, buf, sizeof(buf)); - if (len0 == 0) + rlen = (remain < sizeof(buf)) ? remain : sizeof(buf); + len = read(ifd, buf, rlen); + if (len == 0) break; - if (len0 < 0) { + if (len < 0) { warn("read error"); return (1); } - len = write(ofd, buf, len0); + wlen = len; + len = write(ofd, buf, wlen); if (len < 0) { warn("write error"); return (1); } + remain -= rlen; + if (remain == 0) + remain = chunksize; + } + if (padding) { + lseek(ofd, remain - 1, SEEK_CUR); + len = write(ofd, &zero, 1); + if (len != 1) { + warn("write error"); + return (1); + } } return (0); } static int -writebuf(int ofd, void *buf, ssize_t len) +writebuf(int ofd, void *buf, ssize_t len, ssize_t chunksize, int padding) { - ssize_t len0; + ssize_t len0, blks; + int i; u_char *p; + u_char zero = 0; + if (chunksize == 0) + chunksize = len; p = (u_char *)buf; - len0 = write(ofd, p, len); - if (len0 != len) { - warn("write error"); - return (1); - } + blks = (len + chunksize - 1)/ chunksize; + + for (i = 0; i < blks; i++) { + int l; + + fprintf(stderr, "Write %zd\n", chunksize); + fprintf(stderr, "Data:"); + for (l = 0; l < chunksize; l++) { + fprintf(stderr, "%02x", *(p+l)); + } + fprintf(stderr, "\n"); + len0 = write(ofd, p, chunksize); + if (len0 != chunksize) { + warn("write error"); + return (1); + } + p += chunksize; + } + if (0 < len % chunksize) { + len0 = write(ofd, p, len % chunksize); + if (len0 != len % chunksize) { + warn("write error"); + return (1); + } + if (padding) { + lseek(ofd, chunksize - (len % chunksize) - 1, + SEEK_CUR); + len0 = write(ofd, &zero, 1); + if (len0 != 1) { + warn("write error"); + return (1); + } + } + } return (0); } Modified: user/hrs/releng/usr.sbin/makevd/common.h ============================================================================== --- user/hrs/releng/usr.sbin/makevd/common.h Sun Jun 9 15:08:51 2013 (r251576) +++ user/hrs/releng/usr.sbin/makevd/common.h Sun Jun 9 15:17:38 2013 (r251577) @@ -32,12 +32,16 @@ #include <sys/queue.h> struct blist_raw { - size_t blr_len; - void *blr_data; + size_t len; + void *data; + size_t chunksize; + int padding; }; struct blist_fd { - int blf_fd; + int fd; + size_t chunksize; + int padding; }; struct blist { @@ -60,5 +64,7 @@ struct blist { TAILQ_HEAD(blhead_t, blist); int dispatch_bl(int, struct blhead_t *); +char *uuid_str2bin(void *, const void *); +char *uuid_bin2str(void *, const void *); #endif /* _COMMON_H */ Modified: user/hrs/releng/usr.sbin/makevd/raw.c ============================================================================== --- user/hrs/releng/usr.sbin/makevd/raw.c Sun Jun 9 15:08:51 2013 (r251576) +++ user/hrs/releng/usr.sbin/makevd/raw.c Sun Jun 9 15:17:38 2013 (r251577) @@ -74,7 +74,7 @@ raw_makeim(struct iminfo *imi) err(EX_OSERR, NULL); bl->bl_type = BL_RAWCOPY; bl->bl_name = "rawcopy"; - bl->bl_tf.blf_fd = ifd; + bl->bl_tf.fd = ifd; TAILQ_INSERT_TAIL(&blhead, bl, bl_next); Modified: user/hrs/releng/usr.sbin/makevd/vhd.c ============================================================================== --- user/hrs/releng/usr.sbin/makevd/vhd.c Sun Jun 9 15:08:51 2013 (r251576) +++ user/hrs/releng/usr.sbin/makevd/vhd.c Sun Jun 9 15:17:38 2013 (r251577) @@ -63,9 +63,6 @@ vhd_makeim(struct iminfo *imi) uint64_t sectors, heads, cylinders, imagesize; uint8_t uuid[16]; char vhdfile[PATH_MAX + 10]; - char buf[BUFSIZ]; - char *p, *q; - ssize_t len = 0; int ifd, ofd; TAILQ_INIT(&blhead); @@ -73,51 +70,12 @@ vhd_makeim(struct iminfo *imi) ifd = imi->imi_fd; imagesize = imi->imi_size; - memset(imh, 0, sizeof(*imh)); if (imi->imi_uuid == NULL) errx(EX_USAGE, "-o uuid option must be specified."); + uuid_str2bin(&uuid, imi->imi_uuid); + if (uuid == NULL) + return (1); - p = imi->imi_uuid; -#if _BYTE_ORDER == _BIG_ENDIAN - q = (uint8_t *)&uuid + 16; -#else - q = (uint8_t *)&uuid; -#endif - while (len < 16 && strlen(p) > 1) { - long digit; - char *endptr; - - if (*p == '-') { - p++; - continue; - } - buf[0] = p[0]; - buf[1] = p[1]; - buf[2] = '\0'; - errno = 0; - digit = strtol(buf, &endptr, 16); - if (errno == 0 && *endptr != '\0') - errno = EINVAL; - if (errno) - errx(EX_DATAERR, "invalid UUID"); -#if _BYTE_ORDER == _BIG_ENDIAN - *q-- = digit; -#else - *q++ = digit; -#endif - len++; - p += 2; - } -#if 0 - { - int i; - - printf("uuid = "); - for (i = 0; i < 16; i++) - printf("%02x", uuid[i]); - printf("\n"); - } -#endif snprintf(vhdfile, sizeof(vhdfile), "%s.vhd", imi->imi_imagename); ofd = open(vhdfile, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); @@ -149,7 +107,7 @@ vhd_makeim(struct iminfo *imi) err(EX_OSERR, NULL); bl->bl_type = BL_RAWCOPY; bl->bl_name = "Rawcopy"; - bl->bl_tf.blf_fd = ifd; + bl->bl_tf.fd = ifd; TAILQ_INSERT_TAIL(&blhead, bl, bl_next); bl = calloc(1, sizeof(*bl)); @@ -157,8 +115,8 @@ vhd_makeim(struct iminfo *imi) 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); + bl->bl_tr.data = imh; + bl->bl_tr.len = sizeof(*imh); TAILQ_INSERT_TAIL(&blhead, bl, bl_next); return (dispatch_bl(ofd, &blhead)); Modified: user/hrs/releng/usr.sbin/makevd/vmdk.c ============================================================================== --- user/hrs/releng/usr.sbin/makevd/vmdk.c Sun Jun 9 15:08:51 2013 (r251576) +++ user/hrs/releng/usr.sbin/makevd/vmdk.c Sun Jun 9 15:17:38 2013 (r251577) @@ -66,7 +66,6 @@ vmdk_makeim(struct iminfo *imi) imh = &SEH; imagesize = imi->imi_size; - memset(imh, 0, sizeof(*imh)); memset(desc, 0, sizeof(desc)); if (imi->imi_uuid == NULL) @@ -124,8 +123,8 @@ vmdk_makeim(struct iminfo *imi) 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); + bl->bl_tr.data = imh; + bl->bl_tr.len = sizeof(*imh); TAILQ_INSERT_TAIL(&blhead, bl, bl_next); bl = calloc(1, sizeof(*bl)); @@ -133,8 +132,8 @@ vmdk_makeim(struct iminfo *imi) 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); + bl->bl_tr.data = &desc; + bl->bl_tr.len = sizeof(desc); TAILQ_INSERT_TAIL(&blhead, bl, bl_next); bl = calloc(1, sizeof(*bl)); @@ -142,7 +141,7 @@ vmdk_makeim(struct iminfo *imi) err(EX_OSERR, NULL); bl->bl_type = BL_RAWCOPY; bl->bl_name = "Rawcopy"; - bl->bl_tf.blf_fd = imi->imi_fd; + bl->bl_tf.fd = imi->imi_fd; TAILQ_INSERT_TAIL(&blhead, bl, bl_next); return (dispatch_bl(ofd, &blhead));
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306091517.r59FHduT056001>