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:
parent
c3f32c13a3
commit
123f040a6b
@ -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 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user