From patchwork Tue Mar 12 00:53:17 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 226737 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 68FC42C02BA for ; Tue, 12 Mar 2013 11:58:38 +1100 (EST) Received: from localhost ([::1]:43752 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UFDY4-00022h-Nj for incoming@patchwork.ozlabs.org; Mon, 11 Mar 2013 20:58:36 -0400 Received: from eggs.gnu.org ([208.118.235.92]:42767) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UFDV4-0005UW-PM for qemu-devel@nongnu.org; Mon, 11 Mar 2013 20:55:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UFDV3-0000bK-AQ for qemu-devel@nongnu.org; Mon, 11 Mar 2013 20:55:30 -0400 Received: from mail-ob0-x22b.google.com ([2607:f8b0:4003:c01::22b]:60854) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UFDV3-0000bG-5l for qemu-devel@nongnu.org; Mon, 11 Mar 2013 20:55:29 -0400 Received: by mail-ob0-f171.google.com with SMTP id x4so3959768obh.2 for ; Mon, 11 Mar 2013 17:55:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=liRDmu0PFhIMifmEpg4g7oJuqPQ2R49EjlxZkeqC+C4=; b=rhJjt0d3pcYIcX9xHrppd49qzQgDj7wNlQK5SIfEIoS26cQSYqDYizExTlfvWHKWay eShZHbcjQIMzPXvGQn+HlUZZqvzqumgbOeUac12OOdvYwGO1S8kqzbMw+P5Dw/IMK+ph syT1o6rCtFcDpeC1J2wZ525sre6XFiCB1gk16x9pHGS8a4hQ4cwwdRZmCmZjXcNZ88g1 5MDnySQJQZZnZ9NICyTW0jXttWdHCRNWQQwej3D6f6cL6h8+WpsDDn9Q4g+4ciSjp+4V IAOqTY8rwmvbAbQ/m3QM7E0En5Yp90onvq91Ec61Qosr4to9QTt0SY1e+GvPvEbtkU00 AfAw== X-Received: by 10.60.170.140 with SMTP id am12mr10328938oec.125.1363049728600; Mon, 11 Mar 2013 17:55:28 -0700 (PDT) Received: from localhost ([32.97.110.51]) by mx.google.com with ESMTPS id i19sm19467101obf.0.2013.03.11.17.55.27 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 11 Mar 2013 17:55:28 -0700 (PDT) From: Michael Roth To: qemu-devel@nongnu.org Date: Mon, 11 Mar 2013 19:53:17 -0500 Message-Id: <1363049600-29456-7-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1363049600-29456-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1363049600-29456-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c01::22b Cc: aliguori@us.ibm.com, lersek@redhat.com, lilei@linux.vnet.ibm.com, stefanha@redhat.com Subject: [Qemu-devel] [PATCH 6/9] qga: add guest-set-time command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Lei Li Signed-off-by: Lei Li Reviewed-by: Eric Blake Reviewed-by: Michael Roth *added stub for w32 Signed-off-by: Michael Roth --- qga/commands-posix.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ qga/commands-win32.c | 5 +++++ qga/qapi-schema.json | 26 ++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index c83d26d..c253f97 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -135,6 +135,61 @@ int64_t qmp_guest_get_time(Error **errp) return time_ns; } +void qmp_guest_set_time(int64_t time_ns, Error **errp) +{ + int ret; + int status; + pid_t pid; + Error *local_err = NULL; + struct timeval tv; + + /* year-2038 will overflow in case time_t is 32bit */ + if (time_ns / 1000000000 != (time_t)(time_ns / 1000000000)) { + error_setg(errp, "Time %" PRId64 " is too large", time_ns); + return; + } + + tv.tv_sec = time_ns / 1000000000; + tv.tv_usec = (time_ns % 1000000000) / 1000; + + ret = settimeofday(&tv, NULL); + if (ret < 0) { + error_setg_errno(errp, errno, "Failed to set time to guest"); + 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); + _exit(EXIT_FAILURE); + } else if (pid < 0) { + error_setg_errno(errp, errno, "failed to create child process"); + return; + } + + ga_wait_child(pid, &status, &local_err); + if (error_is_set(&local_err)) { + error_propagate(errp, local_err); + return; + } + + if (!WIFEXITED(status)) { + error_setg(errp, "child process has terminated abnormally"); + return; + } + + if (WEXITSTATUS(status)) { + error_setg(errp, "hwclock failed to set hardware clock to system time"); + return; + } +} + typedef struct GuestFileHandle { uint64_t id; FILE *fh; diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 3ebb856..622c74d 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -284,6 +284,11 @@ int64_t qmp_guest_get_time(Error **errp) return -1; } +void qmp_guest_set_time(int64_t time_ns, Error **errp) +{ + error_set(errp, QERR_UNSUPPORTED); +} + /* register init/cleanup routines for stateful command groups */ void ga_command_state_init(GAState *s, GACommandState *cs) { diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json index bb0f75e..437d750 100644 --- a/qga/qapi-schema.json +++ b/qga/qapi-schema.json @@ -96,6 +96,32 @@ 'returns': 'int' } ## +# @guest-set-time: +# +# Set guest time. +# +# 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 to the given value, +# then sets the Hardware Clock to the current System Time. +# This will make it easier for a guest to resynchronize +# without waiting for NTP. +# +# @time: time of nanoseconds, relative to the Epoch of +# 1970-01-01 in UTC. +# +# Returns: Nothing on success. +# +# Since: 1.5 +## +{ 'command': 'guest-set-time', + 'data': { 'time': 'int' } } + +## # @GuestAgentCommandInfo: # # Information about guest agent commands.