[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] qga-win: Updating guest_set_time action
From: |
Bishara AbuHattoum |
Subject: |
[Qemu-devel] [PATCH] qga-win: Updating guest_set_time action |
Date: |
Tue, 22 Aug 2017 15:20:35 +0300 |
At the moment, Windows libraries don't provide a way to access
RTC, so, a workaround is to use the Windows w32tm command to
resync the time.
Related bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1183874
Signed-off-by: Bishara AbuHattoum <address@hidden>
---
configure | 2 +-
qga/commands-win32.c | 36 +++++++++++++++++++++++++++++++++++-
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/configure b/configure
index dd73cce62f..c7d42d8b00 100755
--- a/configure
+++ b/configure
@@ -824,7 +824,7 @@ if test "$mingw32" = "yes" ; then
sysconfdir="\${prefix}"
local_statedir=
confsuffix=""
- libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -liphlpapi -lnetapi32
$libs_qga"
+ libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lsensapi -liphlpapi
-lnetapi32 $libs_qga"
fi
werror=""
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 619dbd2bc2..f93f69baeb 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -29,6 +29,7 @@
#endif
#include <lm.h>
#include <wtsapi32.h>
+#include <sensapi.h>
#include "qga/guest-agent-core.h"
#include "qga/vss-win32.h"
@@ -1277,8 +1278,41 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns,
Error **errp)
* RTC yet:
*
* https://msdn.microsoft.com/en-us/library/aa908981.aspx
+ *
+ * Instead, a workaround is to use the Windows win32tm command to
+ * resync the time using the Windows Time service.
*/
- error_setg(errp, "Time argument is required on this platform");
+ LPVOID msg_buffer;
+ DWORD ret_flags;
+
+ HRESULT hr = system("w32tm /resync /nowait");
+
+ if (GetLastError() != 0) {
+ strerror_s((LPTSTR) & msg_buffer, 0, errno);
+ error_setg(errp, "system(...) failed: %s", (LPCTSTR)msg_buffer);
+ } else if (hr != 0) {
+ if (hr == HRESULT_FROM_WIN32(ERROR_SERVICE_NOT_ACTIVE)) {
+ error_setg(errp, "Windows Time service not running on the "
+ "guest");
+ } else {
+ if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
+ (DWORD)hr, MAKELANGID(LANG_NEUTRAL,
+ SUBLANG_DEFAULT), (LPTSTR) & msg_buffer, 0,
+ NULL)) {
+ error_setg(errp, "w32tm failed with error (0x%lx), couldn'"
+ "t retrieve error message", hr);
+ } else {
+ error_setg(errp, "w32tm failed with error (0x%lx): %s", hr,
+ (LPCTSTR)msg_buffer);
+ LocalFree(msg_buffer);
+ }
+ }
+ } else if (!IsNetworkAlive(&ret_flags)) {
+ error_setg(errp, "No network connection on guest, sync not"
+ " accurate");
+ }
return;
}
--
2.13.5
- [Qemu-devel] [PATCH] qga-win: Updating guest_set_time action,
Bishara AbuHattoum <=