On Thu, Feb 18, 2010 at 05:54:27PM +0000, Daniel P. Berrange wrote: > 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 | 19 +++++++++++++++---- > 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, 71 insertions(+), 16 deletions(-) > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 561fa22..f86b4eb 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -229,6 +229,10 @@ VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST, > "private", > "bridge") > > +VIR_ENUM_IMPL(virDomainClockOffset, VIR_DOMAIN_CLOCK_OFFSET_LAST, > + "utc", > + "localtime"); > + > #define virDomainReportError(code, fmt...) \ > virReportErrorHelper(NULL, VIR_FROM_DOMAIN, code, __FILE__, \ > __FUNCTION__, __LINE__, fmt) > @@ -3478,9 +3482,16 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps, > > > tmp = virXPathString("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(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("string(./bootloader)", ctxt); > def->os.bootloaderArgs = virXPathString("string(./bootloader_args)", ctxt); > @@ -5389,7 +5400,7 @@ char *virDomainDefFormat(virDomainDefPtr def, > goto cleanup; > > virBufferVSprintf(&buf, " <clock offset='%s'/>\n", > - def->localtime ? "localtime" : "utc"); > + virDomainClockOffsetTypeToString(def->clock.offset)); > > if (virDomainLifecycleDefFormat(&buf, def->onPoweroff, > "on_poweroff") < 0) > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 231d8c8..fbbe683 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -609,6 +609,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 */ > @@ -637,7 +650,7 @@ struct _virDomainDef { > char *emulator; > int features; > > - int localtime; > + virDomainClockDef clock; > > int ngraphics; > virDomainGraphicsDefPtr *graphics; > @@ -911,6 +924,7 @@ VIR_ENUM_DECL(virDomainGraphics) > /* from libvirt.h */ > VIR_ENUM_DECL(virDomainState) > VIR_ENUM_DECL(virDomainSeclabel) > +VIR_ENUM_DECL(virDomainClockOffset) > > VIR_ENUM_DECL(virDomainNetdevMacvtap) > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index aa826d6..1af34bd 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -190,6 +190,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 c9fe55b..a207fc7 100644 > --- a/src/qemu/qemu_conf.c > +++ b/src/qemu/qemu_conf.c > @@ -3400,8 +3400,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) { > + qemuReportError(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) > @@ -5218,6 +5224,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > 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; > @@ -5397,7 +5404,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps, > } 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 8a9af52..c414fb8 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 88923c8..c88ea64 100644 > --- a/src/xen/xend_internal.c > +++ b/src/xen/xend_internal.c > @@ -2451,7 +2451,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); > @@ -2462,12 +2462,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" : > @@ -5846,8 +5846,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")) > @@ -5965,7 +5971,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 8d48eda..4c20666 100644 > --- a/src/xen/xm_internal.c > +++ b/src/xen/xm_internal.c > @@ -683,6 +683,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) { > virDomainHostdevDefPtr hostdev = NULL; > int i; > const char *defaultArch, *defaultMachine; > + int vmlocaltime = 0; > > if (VIR_ALLOC(def) < 0) { > virReportOOMError(); > @@ -830,9 +831,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++) { Okay, def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_UTC is the old equivalent of def->localtime == 0 i.e. the default, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list