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:
Michal Privoznik 2015-01-21 12:09:50 +01:00 committed by Michael Roth
parent 0dd38a03f5
commit ee17cbdc3c
2 changed files with 26 additions and 23 deletions

View File

@ -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);

View File

@ -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.