diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index fb366d7b43..03dfe0fbe3 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -531,7 +531,7 @@ AddTargetVariableToScript $(script) : makebootable ; AddTargetVariableToScript $(script) : rc ; AddTargetVariableToScript $(script) : resattr ; AddTargetVariableToScript $(script) : unzip ; -AddTargetVariableToScript $(script) : vmdkheader ; +AddTargetVariableToScript $(script) : vmdkimage ; if $(HOST_RM_ATTRS_TARGET) { AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) : rmAttrs ; } else { diff --git a/build/scripts/build_haiku_image b/build/scripts/build_haiku_image index 3405fd48ed..b90442a058 100755 --- a/build/scripts/build_haiku_image +++ b/build/scripts/build_haiku_image @@ -21,7 +21,7 @@ # rc # rmAttrs # unzip -# vmdkheader +# vmdkimage # if [ $# -gt 0 ]; then . $1 @@ -93,17 +93,19 @@ if [ $isImage ]; then if [ ! $updateOnly ]; then echo "Creating image ..." - ddFlags= + ddFlags= if [ $isVMwareImage ]; then - rm -f "$imagePath" - $vmdkheader -h 64k -i${imageSize}M "$imagePath" || exit 1 - ddFlags="conv=notrunc oflag=append" - dontClearImage= + vmdkImageFlags= + if [ ! "$dontClearImage" ]; then + vmdkImageFlags="-c" + fi + $vmdkimage -h 64k -i${imageSize}M $vmdkImageFlags "$imagePath" \ + || exit 1 + elif [ ! -e "$imagePath" -o ! "$dontClearImage" ]; then + dd if=/dev/zero of="$imagePath" bs=1048576 count=$imageSize \ + || exit 1 fi - if [ ! -e "$imagePath" -o ! "$dontClearImage" ]; then - dd if=/dev/zero of="$imagePath" bs=1048576 count=$imageSize $ddFlags - fi $bfsShell --initialize $imageOffsetFlags "$imagePath" Haiku \ "block_size 2048" || exit 1 $makebootable $imageOffsetFlags "$imagePath" diff --git a/src/tools/Jamfile b/src/tools/Jamfile index 7101582271..e5a82ec8ca 100644 --- a/src/tools/Jamfile +++ b/src/tools/Jamfile @@ -104,6 +104,6 @@ SubInclude HAIKU_TOP src tools resattr ; SubInclude HAIKU_TOP src tools rman ; SubInclude HAIKU_TOP src tools translation ; SubInclude HAIKU_TOP src tools unzip ; -SubInclude HAIKU_TOP src tools vmdkheader ; +SubInclude HAIKU_TOP src tools vmdkimage ; SubInclude HAIKU_TOP src tools unflatten ; diff --git a/src/tools/vmdkheader/Jamfile b/src/tools/vmdkheader/Jamfile deleted file mode 100644 index 019cbe7451..0000000000 --- a/src/tools/vmdkheader/Jamfile +++ /dev/null @@ -1,8 +0,0 @@ -SubDir HAIKU_TOP src tools vmdkheader ; - -UsePrivateHeaders kernel ; - -BuildPlatformMain vmdkheader - : vmdkheader.cpp - : $(HOST_LIBSUPC++) -; diff --git a/src/tools/vmdkimage/Jamfile b/src/tools/vmdkimage/Jamfile new file mode 100644 index 0000000000..20ef2f1523 --- /dev/null +++ b/src/tools/vmdkimage/Jamfile @@ -0,0 +1,8 @@ +SubDir HAIKU_TOP src tools vmdkimage ; + +UsePrivateHeaders kernel ; + +BuildPlatformMain vmdkimage + : vmdkimage.cpp + : $(HOST_LIBSUPC++) +; diff --git a/src/tools/vmdkheader/vmdkheader.cpp b/src/tools/vmdkimage/vmdkimage.cpp similarity index 81% rename from src/tools/vmdkheader/vmdkheader.cpp rename to src/tools/vmdkimage/vmdkimage.cpp index 1488bf576e..0343204a71 100644 --- a/src/tools/vmdkheader/vmdkheader.cpp +++ b/src/tools/vmdkimage/vmdkimage.cpp @@ -13,19 +13,22 @@ #include #include -#include "vmdkheader.h" +#include "vmdkimage.h" static void print_usage() { printf("\n"); - printf("vmdkheader\n"); + printf("vmdkimage\n"); printf("\n"); - printf("usage: vmdkheader -i -h [-f] \n"); + printf("usage: vmdkimage -i -h [-c] [-H] [-f] " + "\n"); printf(" -i, --imagesize size of raw partition image file\n"); printf(" -h, --headersize size of the vmdk header to write\n"); printf(" -f, --file the raw partition image file\n"); + printf(" -c, --clear-image set the image content to zero\n"); + printf(" -H, --header-only write only the header\n"); exit(EXIT_FAILURE); } @@ -36,10 +39,12 @@ main(int argc, char *argv[]) uint64 headersize = 0; uint64 imagesize = 0; const char *file = NULL; + bool headerOnly = false; + bool clearImage = false; if (sizeof(SparseExtentHeader) != 512) { - fprintf(stderr, "compilation error: struct size is %lu byte\n", - sizeof(SparseExtentHeader)); + fprintf(stderr, "compilation error: struct size is %u byte\n", + (unsigned)sizeof(SparseExtentHeader)); exit(EXIT_FAILURE); } @@ -50,11 +55,13 @@ main(int argc, char *argv[]) {"headersize", required_argument, 0, 'h'}, {"imagesize", required_argument, 0, 'i'}, {"file", required_argument, 0, 'f'}, + {"clear-image", no_argument, 0, 'c'}, + {"header-only", no_argument, 0, 'H'}, {0, 0, 0, 0} }; opterr = 0; /* don't print errors */ - c = getopt_long(argc, argv, "h:i:f:", long_options, NULL); + c = getopt_long(argc, argv, "h:i:c:H:f:", long_options, NULL); if (c == -1) break; @@ -83,6 +90,14 @@ main(int argc, char *argv[]) file = optarg; break; + case 'c': + clearImage = true; + break; + + case 'H': + headerOnly = true; + break; + default: print_usage(); } @@ -98,8 +113,8 @@ main(int argc, char *argv[]) SparseExtentHeader header; if (headersize < sizeof(desc) + sizeof(header)) { - fprintf(stderr, "Error: header size must be at least %lu byte\n", - sizeof(desc) + sizeof(header)); + fprintf(stderr, "Error: header size must be at least %u byte\n", + (unsigned)(sizeof(desc) + sizeof(header))); exit(EXIT_FAILURE); } @@ -144,6 +159,7 @@ main(int argc, char *argv[]) cylinders /= 2; heads *= 2; } + off_t actualImageSize = (off_t)cylinders * sectors * heads * 512; memset(desc, 0, sizeof(desc)); memset(&header, 0, sizeof(header)); @@ -204,6 +220,15 @@ main(int argc, char *argv[]) if (1 != write(fd, "", 1)) goto write_err; + if (!headerOnly) { + if (clearImage && ftruncate(fd, headersize) != 0 + || ftruncate(fd, actualImageSize) != 0) { + fprintf(stderr, "Error: resizing file %s failed (%s)\n", file, + strerror(errno)); + exit(EXIT_FAILURE); + } + } + close(fd); return 0; diff --git a/src/tools/vmdkheader/vmdkheader.h b/src/tools/vmdkimage/vmdkimage.h similarity index 95% rename from src/tools/vmdkheader/vmdkheader.h rename to src/tools/vmdkimage/vmdkimage.h index dabd6257a3..11ce4124bc 100644 --- a/src/tools/vmdkheader/vmdkheader.h +++ b/src/tools/vmdkimage/vmdkimage.h @@ -2,8 +2,8 @@ * Copyright 2007, Marcus Overhagen. All Rights Reserved. * Distributed under the terms of the MIT License. */ -#ifndef _VMDKHEADER_H -#define _VMDKHEADER_H +#ifndef _VMDKIMAGE_H +#define _VMDKIMAGE_H typedef unsigned char uint8; typedef unsigned int uint32;