qga-win: Updating guest_set_time action
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 <bishara@daynix.com> Reviewed-by: Sameeh Jubran <sameeh@daynix.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
4d80d20fe1
commit
105fad6bb2
2
configure
vendored
2
configure
vendored
@ -827,7 +827,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 -lwininet -liphlpapi -lnetapi32 $libs_qga"
|
||||
fi
|
||||
|
||||
werror=""
|
||||
|
@ -29,6 +29,7 @@
|
||||
#endif
|
||||
#include <lm.h>
|
||||
#include <wtsapi32.h>
|
||||
#include <wininet.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 (!InternetGetConnectedState(&ret_flags, 0)) {
|
||||
error_setg(errp, "No internet connection on guest, sync not "
|
||||
"accurate");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user