[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5] qga: Add `guest-get-timezone` command
From: |
Michael Roth |
Subject: |
Re: [Qemu-devel] [PATCH v5] qga: Add `guest-get-timezone` command |
Date: |
Tue, 18 Apr 2017 18:19:51 -0500 |
User-agent: |
alot/0.5.1 |
Quoting Vinzenz 'evilissimo' Feenstra (2017-03-23 06:39:13)
> From: Vinzenz Feenstra <address@hidden>
>
> Adds a new command `guest-get-timezone` reporting the currently
> configured timezone on the system. The information on what timezone is
> currently is configured is useful in case of Windows VMs where the
> offset of the hardware clock is required to have the same offset. This
> can be used for management systems like `oVirt` to detect the timezone
> difference and warn administrators of the misconfiguration.
>
> Signed-off-by: Vinzenz Feenstra <address@hidden>
> ---
> qga/commands.c | 29 +++++++++++++++++++++++++++++
> qga/qapi-schema.json | 26 ++++++++++++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/qga/commands.c b/qga/commands.c
> index 4d92946..3b5789c 100644
> --- a/qga/commands.c
> +++ b/qga/commands.c
> @@ -499,3 +499,32 @@ int ga_parse_whence(GuestFileWhence *whence, Error
> **errp)
> error_setg(errp, "invalid whence code %"PRId64, whence->u.value);
> return -1;
> }
> +
> +GuestTimezone *qmp_guest_get_timezone(Error **errp)
> +{
> + GuestTimezone *info = g_new0(GuestTimezone, 1);
> + GTimeZone *tz = g_time_zone_new_local();
> + if (tz == NULL) {
> + error_setg(errp, QERR_QGA_COMMAND_FAILED,
> + "Couldn't retrieve local timezone");
> + goto error;
> + }
> +
> + gint64 now = g_get_real_time() / G_USEC_PER_SEC;
> + gint32 intv = g_time_zone_find_interval(tz, G_TIME_TYPE_UNIVERSAL, now);
> + info->offset = g_time_zone_get_offset(tz, intv);
> + gchar const *name = g_time_zone_get_abbreviation(tz, intv);
Declarations should all go at the start of the block. Since it's a
trivial change and I was late in reviewing this I was planning on applying
and just fixing it up in my tree, but I just noticed a bigger issue:
Our minimum glib version is 2.22 for non-mingw builds, and 2.30 for
mingw, whereas the required versions for these functions are:
g_time_zone_new_local 2.26
g_get_real_time 2.28
g_time_zone_find_interval 2.26
g_time_zone_get_offset 2.26
g_time_zone_get_abbreviation 2.26
g_time_zone_unref 2.26
So assuming there's no simple alternative implementations for these, I think
what we need is a configure probe for glib >= 2.28 in order to enable this
interface for non-mingw builds, and to stub it out with QERR_UNSUPPORTED
errors otherwise.
> + if (name != NULL) {
> + info->has_zone = true;
> + info->zone = g_strdup(name);
> + }
> + g_time_zone_unref(tz);
> +
> + return info;
> +
> +error:
> + g_time_zone_unref(tz);
Harmless, but since "error" label is only reachable when tz == NULL I think you
can drop this.
> + g_free(info);
> + return NULL;
> +}
> +
> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> index a02dbf2..5183ea2 100644
> --- a/qga/qapi-schema.json
> +++ b/qga/qapi-schema.json
> @@ -1042,3 +1042,29 @@
> 'data': { 'path': 'str', '*arg': ['str'], '*env': ['str'],
> '*input-data': 'str', '*capture-output': 'bool' },
> 'returns': 'GuestExec' }
> +
> +
> +##
> +# @GuestTimezone:
> +#
> +# @zone: Timezone name
> +# @offset: Offset to UTC in seconds, negative numbers for time zones west of
> +# GMT, positive numbers for east
> +#
> +# Since: 2.10
> +##
> +{ 'struct': 'GuestTimezone',
> + 'data': { '*zone': 'str', 'offset': 'int' } }
> +
> +
> +##
> +# @guest-get-timezone:
> +#
> +# Retrieves the timezone information from the guest.
> +#
> +# Returns: A GuestTimezone dictionary.
> +#
> +# Since: 2.10
> +##
> +{ 'command': 'guest-get-timezone',
> + 'returns': 'GuestTimezone' }
> --
> 2.9.3
>
>