From d4611c0ee3654989be9244a72db4b02c29ae92ad Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Rouault Date: Wed, 11 Jul 2012 12:16:35 +0200 Subject: [PATCH] vmx: handle shared folders parsing This patch adds support for parsing vmx files with shared folders enabled. Update test suite accordingly. --- src/vmx/vmx.c | 138 ++++++++++++++++++++- src/vmx/vmx.h | 2 + tests/vmx2xmldata/vmx2xml-sharedfolder.vmx | 9 ++ tests/vmx2xmldata/vmx2xml-sharedfolder.xml | 22 ++++ tests/vmx2xmltest.c | 2 + 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 tests/vmx2xmldata/vmx2xml-sharedfolder.vmx create mode 100644 tests/vmx2xmldata/vmx2xml-sharedfolder.xml diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index e9131272f8..e3dd125fc5 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -1233,6 +1233,8 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx) bool present; int scsi_virtualDev[4] = { -1, -1, -1, -1 }; int unit; + bool hgfs_disabled = true; + long long sharedFolder_maxNum = 0; if (ctx->parseFileName == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -1672,7 +1674,39 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx) } /* def:fss */ - /* FIXME */ + if (virVMXGetConfigBoolean(conf, "isolation.tools.hgfs.disable", + &hgfs_disabled, true, true) < 0) { + goto cleanup; + } + + if (!hgfs_disabled) { + if (virVMXGetConfigLong(conf, "sharedFolder.maxNum", &sharedFolder_maxNum, + 0, true) < 0) { + goto cleanup; + } + + if (sharedFolder_maxNum > 0) { + int number; + + if (VIR_ALLOC_N(def->fss, sharedFolder_maxNum) < 0) { + virReportOOMError(); + goto cleanup; + } + + def->nfss = 0; + + for (number = 0; number < sharedFolder_maxNum; ++number) { + if (virVMXParseFileSystem(conf, number, + &def->fss[def->nfss]) < 0) { + goto cleanup; + } + + if (def->fss[def->nfss] != NULL) { + ++def->nfss; + } + } + } + } /* def:nets */ if (VIR_ALLOC_N(def->nets, 4) < 0) { @@ -2284,6 +2318,108 @@ virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, +int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def) +{ + int result = -1; + char prefix[48] = ""; + + char present_name[48] = ""; + bool present = false; + + char enabled_name[48] = ""; + bool enabled = false; + + char hostPath_name[48] = ""; + char *hostPath = NULL; + + char guestName_name[48] = ""; + char *guestName = NULL; + + char writeAccess_name[48] = ""; + bool writeAccess = false; + + if (def == NULL || *def != NULL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); + return -1; + } + + if (VIR_ALLOC(*def) < 0) { + virReportOOMError(); + return -1; + } + + (*def)->type = VIR_DOMAIN_FS_TYPE_MOUNT; + + snprintf(prefix, sizeof(prefix), "sharedFolder%d", number); + + VMX_BUILD_NAME(present); + VMX_BUILD_NAME(enabled); + VMX_BUILD_NAME(hostPath); + VMX_BUILD_NAME(guestName); + VMX_BUILD_NAME(writeAccess); + + /* vmx:present */ + if (virVMXGetConfigBoolean(conf, present_name, &present, false, true) < 0) { + goto cleanup; + } + + /* vmx:enabled */ + if (virVMXGetConfigBoolean(conf, enabled_name, &enabled, false, true) < 0) { + goto cleanup; + } + + if (!(present && enabled)) { + goto ignore; + } + + /* vmx:hostPath */ + if (virVMXGetConfigString(conf, hostPath_name, &hostPath, false) < 0) { + goto cleanup; + } + + (*def)->src = hostPath; + hostPath = NULL; + + /* vmx:guestName */ + if (virVMXGetConfigString(conf, guestName_name, &guestName, false) < 0) { + goto cleanup; + } + + (*def)->dst = guestName; + guestName = NULL; + + /* vmx:writeAccess */ + if (virVMXGetConfigBoolean(conf, writeAccess_name, &writeAccess, false, + true) < 0) { + goto cleanup; + } + + (*def)->readonly = !writeAccess; + + result = 0; + + cleanup: + if (result < 0) { + virDomainFSDefFree(*def); + *def = NULL; + } + + VIR_FREE(hostPath); + VIR_FREE(guestName); + + return result; + + ignore: + virDomainFSDefFree(*def); + *def = NULL; + + result = 0; + + goto cleanup; +} + + + int virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) { diff --git a/src/vmx/vmx.h b/src/vmx/vmx.h index 64f5abce00..f9093133af 100644 --- a/src/vmx/vmx.h +++ b/src/vmx/vmx.h @@ -90,6 +90,8 @@ int virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, int device, int busType, int controllerOrBus, int unit, virDomainDiskDefPtr *def); +int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def); + int virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def); int virVMXParseSerial(virVMXContext *ctx, virConfPtr conf, int port, diff --git a/tests/vmx2xmldata/vmx2xml-sharedfolder.vmx b/tests/vmx2xmldata/vmx2xml-sharedfolder.vmx new file mode 100644 index 0000000000..e60fcd493b --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-sharedfolder.vmx @@ -0,0 +1,9 @@ +config.version = "8" +virtualHW.version = "4" +isolation.tools.hgfs.disable = "false" +sharedFolder.maxnum = "1" +sharedFolder0.present = "true" +sharedFolder0.enabled = "true" +sharedFolder0.hostPath = "/path/to/shared" +sharedFolder0.guestName = "shared" +sharedFolder0.writeAccess = "true" diff --git a/tests/vmx2xmldata/vmx2xml-sharedfolder.xml b/tests/vmx2xmldata/vmx2xml-sharedfolder.xml new file mode 100644 index 0000000000..52b75de0d8 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-sharedfolder.xml @@ -0,0 +1,22 @@ + + 00000000-0000-0000-0000-000000000000 + 32768 + 32768 + 1 + + hvm + + + destroy + restart + destroy + + + + + + + + diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 35740ea423..49131524e0 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -240,6 +240,8 @@ mymain(void) DO_TEST("floppy-file", "floppy-file"); DO_TEST("floppy-device", "floppy-device"); + DO_TEST("sharedfolder", "sharedfolder"); + DO_TEST("ethernet-e1000", "ethernet-e1000"); DO_TEST("ethernet-vmxnet2", "ethernet-vmxnet2");