qga/commands-posix: qmp_guest_shutdown: use ga_run_command helper

Also remove the G_GNUC_UNUSED attribute added in the previous commit from
the helper.

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-4-andrey.drobyshev@virtuozzo.com
Signed-off-by: Konstantin Kostiuk <kkostiuk@redhat.com>
This commit is contained in:
Andrey Drobyshev 2024-03-20 18:16:44 +02:00 committed by Konstantin Kostiuk
parent c3f32c13a3
commit 123f040a6b

View File

@ -108,7 +108,6 @@ static ssize_t ga_pipe_read_str(int fd[2], char **str)
* sending string to stdin and taking error message from * sending string to stdin and taking error message from
* stdout/err. * stdout/err.
*/ */
G_GNUC_UNUSED
static int ga_run_command(const char *argv[], const char *in_str, static int ga_run_command(const char *argv[], const char *in_str,
const char *action, Error **errp) const char *action, Error **errp)
{ {
@ -230,8 +229,6 @@ void qmp_guest_shutdown(const char *mode, Error **errp)
{ {
const char *shutdown_flag; const char *shutdown_flag;
Error *local_err = NULL; Error *local_err = NULL;
pid_t pid;
int status;
#ifdef CONFIG_SOLARIS #ifdef CONFIG_SOLARIS
const char *powerdown_flag = "-i5"; const char *powerdown_flag = "-i5";
@ -260,46 +257,22 @@ void qmp_guest_shutdown(const char *mode, Error **errp)
return; return;
} }
pid = fork(); const char *argv[] = {"/sbin/shutdown",
if (pid == 0) {
/* child, start the shutdown */
setsid();
reopen_fd_to_null(0);
reopen_fd_to_null(1);
reopen_fd_to_null(2);
#ifdef CONFIG_SOLARIS #ifdef CONFIG_SOLARIS
execl("/sbin/shutdown", "shutdown", shutdown_flag, "-g0", "-y", shutdown_flag, "-g0", "-y",
"hypervisor initiated shutdown", (char *)NULL);
#elif defined(CONFIG_BSD) #elif defined(CONFIG_BSD)
execl("/sbin/shutdown", "shutdown", shutdown_flag, "+0", shutdown_flag, "+0",
"hypervisor initiated shutdown", (char *)NULL);
#else #else
execl("/sbin/shutdown", "shutdown", "-h", shutdown_flag, "+0", "-h", shutdown_flag, "+0",
"hypervisor initiated shutdown", (char *)NULL);
#endif #endif
_exit(EXIT_FAILURE); "hypervisor initiated shutdown", (char *) NULL};
} 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, "shutdown", &local_err);
if (local_err) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return; return;
} }
if (!WIFEXITED(status)) {
error_setg(errp, "child process has terminated abnormally");
return;
}
if (WEXITSTATUS(status)) {
error_setg(errp, "child process has failed to shutdown");
return;
}
/* succeeded */ /* succeeded */
} }