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