aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch
diff options
context:
space:
mode:
Diffstat (limited to 'tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch')
-rw-r--r--tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch b/tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch
new file mode 100644
index 0000000000..86451ea24d
--- /dev/null
+++ b/tools/qemu/patches/0004-VMDK-probe-for-monolithicFlat-images.patch
@@ -0,0 +1,74 @@
+From 930e57ecb64bbab75c2b71d0d1ba07451fec4567 Mon Sep 17 00:00:00 2001
+From: Fam Zheng <famcool@gmail.com>
+Date: Tue, 12 Jul 2011 19:56:30 +0800
+Subject: [PATCH 04/12] VMDK: probe for monolithicFlat images
+
+Probe as the same behavior as VMware does.
+Recognize image as monolithicFlat descriptor file when the file is text
+and the first effective line (not '#' leaded comment or space line) is
+either 'version=1' or 'version=2'. No space or upper case charactors
+accepted.
+
+Signed-off-by: Fam Zheng <famcool@gmail.com>
+Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
+Signed-off-by: Kevin Wolf <kwolf@redhat.com>
+---
+ block/vmdk.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 43 insertions(+), 2 deletions(-)
+
+--- a/block/vmdk.c
++++ b/block/vmdk.c
+@@ -103,10 +103,51 @@ static int vmdk_probe(const uint8_t *buf
+ return 0;
+ magic = be32_to_cpu(*(uint32_t *)buf);
+ if (magic == VMDK3_MAGIC ||
+- magic == VMDK4_MAGIC)
++ magic == VMDK4_MAGIC) {
+ return 100;
+- else
++ } else {
++ const char *p = (const char *)buf;
++ const char *end = p + buf_size;
++ while (p < end) {
++ if (*p == '#') {
++ /* skip comment line */
++ while (p < end && *p != '\n') {
++ p++;
++ }
++ p++;
++ continue;
++ }
++ if (*p == ' ') {
++ while (p < end && *p == ' ') {
++ p++;
++ }
++ /* skip '\r' if windows line endings used. */
++ if (p < end && *p == '\r') {
++ p++;
++ }
++ /* only accept blank lines before 'version=' line */
++ if (p == end || *p != '\n') {
++ return 0;
++ }
++ p++;
++ continue;
++ }
++ if (end - p >= strlen("version=X\n")) {
++ if (strncmp("version=1\n", p, strlen("version=1\n")) == 0 ||
++ strncmp("version=2\n", p, strlen("version=2\n")) == 0) {
++ return 100;
++ }
++ }
++ if (end - p >= strlen("version=X\r\n")) {
++ if (strncmp("version=1\r\n", p, strlen("version=1\r\n")) == 0 ||
++ strncmp("version=2\r\n", p, strlen("version=2\r\n")) == 0) {
++ return 100;
++ }
++ }
++ return 0;
++ }
+ return 0;
++ }
+ }
+
+ #define CHECK_CID 1