From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:33017) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tsvth-00016G-Nr for qemu-devel@nongnu.org; Wed, 09 Jan 2013 08:40:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tsvtf-0004mS-Um for qemu-devel@nongnu.org; Wed, 09 Jan 2013 08:40:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50289) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tsvtf-0004mK-L6 for qemu-devel@nongnu.org; Wed, 09 Jan 2013 08:40:47 -0500 Date: Wed, 9 Jan 2013 11:40:28 -0200 From: Luiz Capitulino Message-ID: <20130109114028.5258d721@doriath.home> In-Reply-To: <1357466820-12860-4-git-send-email-lilei@linux.vnet.ibm.com> References: <1357466820-12860-1-git-send-email-lilei@linux.vnet.ibm.com> <1357466820-12860-4-git-send-email-lilei@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 3/3] qga: add guest-set-time command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Lei Li Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com On Sun, 6 Jan 2013 18:07:00 +0800 Lei Li wrote: > Signed-off-by: Lei Li > --- > qga/commands-posix.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ > qga/qapi-schema.json | 32 ++++++++++++++++++++++++++++ > 2 files changed, 89 insertions(+), 0 deletions(-) > > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index 190199d..7fff49a 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -121,6 +121,63 @@ struct HostTimeInfo *qmp_guest_get_time(Error **errp) > return host_time; > } > > +void qmp_guest_set_time(bool has_seconds, int64_t seconds, > + bool has_microseconds, int64_t microseconds, > + bool has_utc_offset, int64_t utc_offset, Error **errp) > +{ > + int ret; > + int status; > + pid_t pid, rpid; > + struct timeval tv; > + HostTimeInfo *host_time; > + > + if ((!has_seconds) && (!has_microseconds) && (!has_utc_offset)) { > + host_time = get_host_time(); > + if (!host_time) { > + error_set(errp, QERR_QGA_COMMAND_FAILED, "Failed to set guest time"); If you change get_host_time() to take an Error * argument, you can drop this. > + return; > + } > + tv.tv_sec = host_time->seconds; > + tv.tv_usec = host_time->microseconds; > + } else if (has_seconds && has_microseconds && has_utc_offset) { > + tv.tv_sec = (time_t) seconds + utc_offset; > + tv.tv_usec = (time_t) microseconds; > + } else { > + error_set(errp, QERR_INVALID_PARAMETER, "parameter missing"); Please, use error_setg() instead. > + return; > + } > + > + ret = settimeofday(&tv, NULL); > + if (ret < 0) { > + error_set(errp, QERR_QGA_COMMAND_FAILED, strerror(errno)); Please, use error_setg_errno(). > + return; > + } > + > + /* Set the Hardware Clock to the current System Time. */ > + pid = fork(); > + if (pid == 0) { > + setsid(); > + reopen_fd_to_null(0); > + reopen_fd_to_null(1); > + reopen_fd_to_null(2); > + > + execle("/sbin/hwclock", "hwclock", "-w", NULL, environ); Honest question: is this really necessary? Can't we do whatever hwclock does? > + _exit(EXIT_FAILURE); > + } else if (pid < 0) { > + goto exit_err; > + } > + > + do { > + rpid = waitpid(pid, &status, 0); > + } while (rpid == -1 && errno == EINTR); > + if (rpid == pid && WIFEXITED(status) && !WEXITSTATUS(status)) { > + return; > + } > + > +exit_err: > + error_set(errp, QERR_UNDEFINED_ERROR); > +} > + > typedef struct GuestFileHandle { > uint64_t id; > FILE *fh; > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index 4a8b93c..4649b55 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -117,6 +117,38 @@ > 'returns': 'HostTimeInfo' } > > ## > +# @guest-set-time: > +# > +# Set guest time. If none arguments were given, will set > +# host time to guest. > +# > +# Right now, when a guest is paused or migrated to a file > +# then loaded from that file, the guest OS has no idea that > +# there was a big gap in the time. Depending on how long > +# the gap was, NTP might not be able to resynchronize the > +# guest. > +# > +# This command tries to set guest time based on the information > +# from host or an absolute value given by management app, and > +# set the Hardware Clock to the current System Time. This > +# will make it easier for a guest to resynchronize without > +# waiting for NTP. > +# > +# @seconds: #optional "seconds" time. > +# > +# @microseconds: #optional "microseconds" time. > +# > +# @utc-offset: #optional utc offset. > +# > +# Returns: Nothing on success. > +# > +# Since: 1.4 > +## > +{ 'command': 'guest-set-time', > + 'data': { '*seconds': 'int', '*microseconds': 'int', > + '*utc-offset': 'int' } } > + > +## > # @GuestAgentCommandInfo: > # > # Information about guest agent commands.