mirror of https://github.com/xqemu/xqemu.git
qemu-ga-win: Fail loudly on bare 'set-time'
The command is not implemented correctly yet. The documentation allows to not pass any value to set, in which case the time is re-read from RTC. However, reading CMOS on Windows is not trivial to implement. So instead of pretending we've set the correct time, fail explicitly. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
0dd38a03f5
commit
ee17cbdc3c
|
@ -625,31 +625,31 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
|
||||||
FILETIME tf;
|
FILETIME tf;
|
||||||
LONGLONG time;
|
LONGLONG time;
|
||||||
|
|
||||||
if (has_time) {
|
if (!has_time) {
|
||||||
/* Okay, user passed a time to set. Validate it. */
|
/* Unfortunately, Windows libraries don't provide an easy way to access
|
||||||
if (time_ns < 0 || time_ns / 100 > INT64_MAX - W32_FT_OFFSET) {
|
* RTC yet:
|
||||||
error_setg(errp, "Time %" PRId64 "is invalid", time_ns);
|
*
|
||||||
return;
|
* https://msdn.microsoft.com/en-us/library/aa908981.aspx
|
||||||
}
|
*/
|
||||||
|
error_setg(errp, "Time argument is required on this platform");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
time = time_ns / 100 + W32_FT_OFFSET;
|
/* Validate time passed by user. */
|
||||||
|
if (time_ns < 0 || time_ns / 100 > INT64_MAX - W32_FT_OFFSET) {
|
||||||
|
error_setg(errp, "Time %" PRId64 "is invalid", time_ns);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tf.dwLowDateTime = (DWORD) time;
|
time = time_ns / 100 + W32_FT_OFFSET;
|
||||||
tf.dwHighDateTime = (DWORD) (time >> 32);
|
|
||||||
|
|
||||||
if (!FileTimeToSystemTime(&tf, &ts)) {
|
tf.dwLowDateTime = (DWORD) time;
|
||||||
error_setg(errp, "Failed to convert system time %d",
|
tf.dwHighDateTime = (DWORD) (time >> 32);
|
||||||
(int)GetLastError());
|
|
||||||
return;
|
if (!FileTimeToSystemTime(&tf, &ts)) {
|
||||||
}
|
error_setg(errp, "Failed to convert system time %d",
|
||||||
} else {
|
(int)GetLastError());
|
||||||
/* Otherwise read the time from RTC which contains the correct value.
|
return;
|
||||||
* Hopefully. */
|
|
||||||
GetSystemTime(&ts);
|
|
||||||
if (ts.wYear < 1601 || ts.wYear > 30827) {
|
|
||||||
error_setg(errp, "Failed to get time");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
acquire_privilege(SE_SYSTEMTIME_NAME, &local_err);
|
acquire_privilege(SE_SYSTEMTIME_NAME, &local_err);
|
||||||
|
|
|
@ -121,7 +121,10 @@
|
||||||
# given value, then sets the Hardware Clock (RTC) to the
|
# given value, then sets the Hardware Clock (RTC) to the
|
||||||
# current System Time. This will make it easier for a guest
|
# current System Time. This will make it easier for a guest
|
||||||
# to resynchronize without waiting for NTP. If no @time is
|
# to resynchronize without waiting for NTP. If no @time is
|
||||||
# specified, then the time to set is read from RTC.
|
# specified, then the time to set is read from RTC. However,
|
||||||
|
# this may not be supported on all platforms (i.e. Windows).
|
||||||
|
# If that's the case users are advised to always pass a
|
||||||
|
# value.
|
||||||
#
|
#
|
||||||
# @time: #optional time of nanoseconds, relative to the Epoch
|
# @time: #optional time of nanoseconds, relative to the Epoch
|
||||||
# of 1970-01-01 in UTC.
|
# of 1970-01-01 in UTC.
|
||||||
|
|
Loading…
Reference in New Issue