qga/commands-posix: qmp_guest_set_time: use ga_run_command helper
There's no need to check for the existence of "/sbin/hwclock", the exec() call will do that for us. Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com> Link: https://lore.kernel.org/r/20240320161648.158226-5-andrey.drobyshev@virtuozzo.com Signed-off-by: Konstantin Kostiuk <kkostiuk@redhat.com>
This commit is contained in:
parent
123f040a6b
commit
1fce82bc40
@ -279,21 +279,9 @@ void qmp_guest_shutdown(const char *mode, Error **errp)
|
||||
void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
int status;
|
||||
pid_t pid;
|
||||
Error *local_err = NULL;
|
||||
struct timeval tv;
|
||||
static const char hwclock_path[] = "/sbin/hwclock";
|
||||
static int hwclock_available = -1;
|
||||
|
||||
if (hwclock_available < 0) {
|
||||
hwclock_available = (access(hwclock_path, X_OK) == 0);
|
||||
}
|
||||
|
||||
if (!hwclock_available) {
|
||||
error_setg(errp, QERR_UNSUPPORTED);
|
||||
return;
|
||||
}
|
||||
const char *argv[] = {"/sbin/hwclock", has_time ? "-w" : "-s", NULL};
|
||||
|
||||
/* If user has passed a time, validate and set it. */
|
||||
if (has_time) {
|
||||
@ -324,37 +312,12 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
|
||||
* just need to synchronize the hardware clock. However, if no time was
|
||||
* passed, user is requesting the opposite: set the system time from the
|
||||
* hardware clock (RTC). */
|
||||
pid = fork();
|
||||
if (pid == 0) {
|
||||
setsid();
|
||||
reopen_fd_to_null(0);
|
||||
reopen_fd_to_null(1);
|
||||
reopen_fd_to_null(2);
|
||||
|
||||
/* Use '/sbin/hwclock -w' to set RTC from the system time,
|
||||
* or '/sbin/hwclock -s' to set the system time from RTC. */
|
||||
execl(hwclock_path, "hwclock", has_time ? "-w" : "-s", NULL);
|
||||
_exit(EXIT_FAILURE);
|
||||
} else if (pid < 0) {
|
||||
error_setg_errno(errp, errno, "failed to create child process");
|
||||
return;
|
||||
}
|
||||
|
||||
ga_wait_child(pid, &status, &local_err);
|
||||
ga_run_command(argv, NULL, "set hardware clock to system time",
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!WIFEXITED(status)) {
|
||||
error_setg(errp, "child process has terminated abnormally");
|
||||
return;
|
||||
}
|
||||
|
||||
if (WEXITSTATUS(status)) {
|
||||
error_setg(errp, "hwclock failed to set hardware clock to system time");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
|
Loading…
Reference in New Issue
Block a user