The XML will soon be extended to allow more than just a simple localtime/utc boolean flag. This change replaces the plain 'int localtime' with a separate struct to prepare for future extension * src/conf/domain_conf.c, src/conf/domain_conf.h: Add a new virDomainClockDef structure * src/libvirt_private.syms: Export virDomainClockOffsetTypeToString and virDomainClockOffsetTypeFromString * src/qemu/qemu_conf.c, src/vbox/vbox_tmpl.c, src/xen/xend_internal.c, src/xen/xm_internal.c: Updated to use new structure for localtime --- src/conf/domain_conf.c | 20 ++++++++++++++++---- src/conf/domain_conf.h | 16 +++++++++++++++- src/libvirt_private.syms | 2 ++ src/qemu/qemu_conf.c | 11 +++++++++-- src/vbox/vbox_tmpl.c | 2 +- src/xen/xend_internal.c | 16 +++++++++++----- src/xen/xm_internal.c | 21 ++++++++++++++++++--- 7 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 766993c..1daf6f4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -222,6 +222,11 @@ VIR_ENUM_IMPL(virDomainSeclabel, VIR_DOMAIN_SECLABEL_LAST, "dynamic", "static") +VIR_ENUM_IMPL(virDomainClockOffset, VIR_DOMAIN_CLOCK_OFFSET_LAST, + "utc", + "localtime"); + + #define virDomainReportError(conn, code, fmt...) \ virReportErrorHelper(conn, VIR_FROM_DOMAIN, code, __FILE__, \ __FUNCTION__, __LINE__, fmt) @@ -3464,9 +3469,16 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn, tmp = virXPathString(conn, "string(./clock/@offset)", ctxt); - if (tmp && STREQ(tmp, "localtime")) - def->localtime = 1; - VIR_FREE(tmp); + if (tmp) { + if ((def->clock.offset = virDomainClockOffsetTypeFromString(tmp)) < 0) { + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("unknown clock offset '%s'"), tmp); + goto error; + } + VIR_FREE(tmp); + } else { + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC; + } def->os.bootloader = virXPathString(conn, "string(./bootloader)", ctxt); def->os.bootloaderArgs = virXPathString(conn, "string(./bootloader_args)", ctxt); @@ -5408,7 +5420,7 @@ char *virDomainDefFormat(virConnectPtr conn, goto cleanup; virBufferVSprintf(&buf, " <clock offset='%s'/>\n", - def->localtime ? "localtime" : "utc"); + virDomainClockOffsetTypeToString(def->clock.offset)); if (virDomainLifecycleDefFormat(conn, &buf, def->onPoweroff, "on_poweroff") < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0b79e88..5653b18 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -594,6 +594,19 @@ struct _virSecurityLabelDef { int type; }; +enum virDomainClockOffsetType { + VIR_DOMAIN_CLOCK_OFFSET_UTC = 0, + VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME = 1, + + VIR_DOMAIN_CLOCK_OFFSET_LAST, +}; + +typedef struct _virDomainClockDef virDomainClockDef; +typedef virDomainClockDef *virDomainClockDefPtr; +struct _virDomainClockDef { + int offset; +}; + #define VIR_DOMAIN_CPUMASK_LEN 1024 /* Guest VM main configuration */ @@ -622,7 +635,7 @@ struct _virDomainDef { char *emulator; int features; - int localtime; + virDomainClockDef clock; int ngraphics; virDomainGraphicsDefPtr *graphics; @@ -914,5 +927,6 @@ VIR_ENUM_DECL(virDomainGraphics) /* from libvirt.h */ VIR_ENUM_DECL(virDomainState) VIR_ENUM_DECL(virDomainSeclabel) +VIR_ENUM_DECL(virDomainClockOffset) #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e5e8860..e882ae4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -188,6 +188,8 @@ virDomainDefAddDiskControllers; virDomainDefClearPCIAddresses; virDomainDefClearDeviceAliases; virDomainDeviceInfoIterate; +virDomainClockOffsetTypeToString; +virDomainClockOffsetTypeFromString; # domain_event.h diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 389db7b..8109820 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -3312,8 +3312,14 @@ int qemudBuildCommandLine(virConnectPtr conn, } } - if (def->localtime) + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) ADD_ARG_LIT("-localtime"); + else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) { + qemudReportError(conn, NULL, NULL, VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported clock offset '%s'"), + virDomainClockOffsetTypeToString(def->clock.offset)); + goto error; + } if ((qemuCmdFlags & QEMUD_CMD_FLAG_NO_REBOOT) && def->onReboot != VIR_DOMAIN_LIFECYCLE_RESTART) @@ -5127,6 +5133,7 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, def->id = -1; def->memory = def->maxmem = 64 * 1024; def->vcpus = 1; + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC; def->features = (1 << VIR_DOMAIN_FEATURE_ACPI) /*| (1 << VIR_DOMAIN_FEATURE_APIC)*/; def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART; @@ -5306,7 +5313,7 @@ virDomainDefPtr qemuParseCommandLine(virConnectPtr conn, } else if (STREQ(arg, "-full-screen")) { fullscreen = 1; } else if (STREQ(arg, "-localtime")) { - def->localtime = 1; + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; } else if (STREQ(arg, "-kernel")) { WANT_VALUE(); if (!(def->os.kernel = strdup(val))) diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index e40c848..cffdca2 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2051,7 +2051,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) { /* Currently VirtualBox always uses locatime * so locatime is always true here */ - def->localtime = 1; + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; /* dump video options vram/2d/3d/directx/etc. */ { diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 9c5127f..98f6103 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -2452,7 +2452,7 @@ xenDaemonParseSxpr(virConnectPtr conn, } else def->onCrash = VIR_DOMAIN_LIFECYCLE_DESTROY; - + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC; if (hvm) { if (sexpr_int(root, "domain/image/hvm/acpi")) def->features |= (1 << VIR_DOMAIN_FEATURE_ACPI); @@ -2463,12 +2463,12 @@ xenDaemonParseSxpr(virConnectPtr conn, /* Old XenD only allows localtime here for HVM */ if (sexpr_int(root, "domain/image/hvm/localtime")) - def->localtime = 1; + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; } /* Current XenD allows localtime here, for PV and HVM */ if (sexpr_int(root, "domain/localtime")) - def->localtime = 1; + def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME; if (sexpr_node_copy(root, hvm ? "domain/image/hvm/device_model" : @@ -5788,8 +5788,14 @@ xenDaemonFormatSxpr(virConnectPtr conn, virBufferVSprintf(&buf, "(on_crash '%s')", tmp); /* Set localtime here for current XenD (both PV & HVM) */ - if (def->localtime) + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) virBufferAddLit(&buf, "(localtime 1)"); + else if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_UTC) { + virXendError(conn, VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported clock offset '%s'"), + virDomainClockOffsetTypeToString(def->clock.offset)); + goto error; + } if (!def->os.bootloader) { if (STREQ(def->os.type, "hvm")) @@ -5907,7 +5913,7 @@ xenDaemonFormatSxpr(virConnectPtr conn, } /* Set localtime here to keep old XenD happy for HVM */ - if (def->localtime) + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) virBufferAddLit(&buf, "(localtime 1)"); if (def->sounds) { diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index 944d5d5..4e7f844 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -681,6 +681,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { virDomainHostdevDefPtr hostdev = NULL; int i; const char *defaultArch, *defaultMachine; + int vmlocaltime = 0; if (VIR_ALLOC(def) < 0) { virReportOOMError(conn); @@ -828,9 +829,13 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { else if (val) def->features |= (1 << VIR_DOMAIN_FEATURE_APIC); } - if (xenXMConfigGetBool(conn, conf, "localtime", &def->localtime, 0) < 0) + if (xenXMConfigGetBool(conn, conf, "localtime", &vmlocaltime, 0) < 0) goto cleanup; + def->clock.offset = vmlocaltime ? + VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME : + VIR_DOMAIN_CLOCK_OFFSET_UTC; + if (xenXMConfigCopyStringOpt(conn, conf, "device_model", &def->emulator) < 0) goto cleanup; @@ -2323,8 +2328,18 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn, goto no_memory; - if (xenXMConfigSetInt(conf, "localtime", def->localtime ? 1 : 0) < 0) - goto no_memory; + if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME || + def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_UTC) { + if (xenXMConfigSetInt(conf, "localtime", + def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME ? + 1 : 0) < 0) + goto no_memory; + } else { + xenXMError(conn, VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported clock offset '%s'"), + virDomainClockOffsetTypeToString(def->clock.offset)); + goto cleanup; + } if (priv->xendConfigVersion == 1) { for (i = 0 ; i < def->ndisks ; i++) { -- 1.6.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list