From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:41258) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UG7qr-0004gu-6c for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:05:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UG7qk-0001Td-CF for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:05:45 -0400 Received: from e23smtp09.au.ibm.com ([202.81.31.142]:51048) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UG7qj-0001T5-Q6 for qemu-devel@nongnu.org; Thu, 14 Mar 2013 09:05:38 -0400 Received: from /spool/local by e23smtp09.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 14 Mar 2013 22:57:39 +1000 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [9.190.234.120]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id BCD7B2CE804A for ; Fri, 15 Mar 2013 00:05:29 +1100 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r2ECqgVv41681136 for ; Thu, 14 Mar 2013 23:52:43 +1100 Received: from d23av01.au.ibm.com (loopback [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r2ED5Sw3015941 for ; Fri, 15 Mar 2013 00:05:28 +1100 Message-ID: <5141CB0B.1070403@linux.vnet.ibm.com> Date: Thu, 14 Mar 2013 21:05:15 +0800 From: Lei Li MIME-Version: 1.0 References: <1363244871-11973-1-git-send-email-lilei@linux.vnet.ibm.com> <1363244871-11973-2-git-send-email-lilei@linux.vnet.ibm.com> <20130314123232.GK4005@vm> In-Reply-To: <20130314123232.GK4005@vm> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/2] qga: add windows implementation for guest-get-time List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: mdroth Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org On 03/14/2013 08:32 PM, mdroth wrote: > On Thu, Mar 14, 2013 at 03:07:50PM +0800, Lei Li wrote: >> Signed-off-by: Lei Li >> --- >> qga/commands-win32.c | 33 +++++++++++++++++++++++++++++++++ >> 1 file changed, 33 insertions(+) >> >> diff --git a/qga/commands-win32.c b/qga/commands-win32.c >> index 7e8ecb3..e24fb4a 100644 >> --- a/qga/commands-win32.c >> +++ b/qga/commands-win32.c >> @@ -22,6 +22,12 @@ >> #define SHTDN_REASON_FLAG_PLANNED 0x80000000 >> #endif >> >> +/* multiple of 100 nanoseconds elapsed between windows baseline >> + (1/1/1601) and Unix Epoch (1/1/1970), accounting for leap years */ >> +#define W32_FT_OFFSET (10000000ULL * 60 * 60 * 24 * \ >> + (365 * (1970 - 1601) + \ >> + (1970 - 1601) / 4 - 3)) >> + >> static void acquire_privilege(const char *name, Error **err) >> { >> HANDLE token; >> @@ -108,6 +114,33 @@ void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err) >> } >> } >> >> +int64_t qmp_guest_get_time(Error **errp) >> +{ >> + SYSTEMTIME *ts = g_malloc0(sizeof(SYSTEMTIME)); > I still don't understand why we do just do: > > SYSTEM ts = {0}; > >> + int64_t time_ns; >> + FILETIME tf; >> + >> + GetSystemTime(ts); > followed by: > > GetSystemTime(&ts); > > (and same for SystemTimeToFileTime() below) > > This would avoid the need to add common cleanup code for all the > return paths. > >> + if (!ts) { > this is gonna always be false since we initialize it at the start of > this function. > > also, GetSystemTime() does seem to provide any error indication > whatsoever, which is strange. But it also doesn't seem to have any > guarantee this it will always succeed... > > I think the best we could do is probably just some kind of sanity > check, like making sure ts.wYear != 0, or maybe that > 1601 <= ts.wYear <= 30827 I was trying to check it by ts.wYear != 0 this afternoon... OK, I will send update later as you suggested. Thanks! > >> + error_setg(errp, "Failed to get time"); >> + goto out; >> + } >> + >> + if (!SystemTimeToFileTime(ts, &tf)) { >> + error_setg_errno(errp, errno, "Failed to convert system time"); >> + goto out; >> + } >> + >> + time_ns = ((((int64_t)tf.dwHighDateTime << 32) | tf.dwLowDateTime) >> + - W32_FT_OFFSET) * 100; >> + >> + return time_ns; >> + >> +out: >> + g_free(ts); >> + return -1; >> +} >> + >> int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, Error **err) >> { >> error_set(err, QERR_UNSUPPORTED); >> -- >> 1.7.11.7 >> -- Lei