aboutsummaryrefslogtreecommitdiff
path: root/qga
diff options
context:
space:
mode:
Diffstat (limited to 'qga')
-rw-r--r--qga/commands-posix.c87
1 files changed, 55 insertions, 32 deletions
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 7b7c78d85a..bd2c3514d8 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -1474,15 +1474,38 @@ qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp)
#define LINUX_SYS_STATE_FILE "/sys/power/state"
#define SUSPEND_SUPPORTED 0
#define SUSPEND_NOT_SUPPORTED 1
+#define SUSPEND_MODE_DISK 1
+#define SUSPEND_MODE_RAM 2
+#define SUSPEND_MODE_HYBRID 3
-static void bios_supports_mode(const char *pmutils_bin, const char *pmutils_arg,
- const char *sysfile_str, Error **errp)
+static void bios_supports_mode(int suspend_mode, Error **errp)
{
Error *local_err = NULL;
+ const char *pmutils_arg, *sysfile_str;
+ const char *pmutils_bin = "pm-is-supported";
char *pmutils_path;
pid_t pid;
int status;
+ switch (suspend_mode) {
+
+ case SUSPEND_MODE_DISK:
+ pmutils_arg = "--hibernate";
+ sysfile_str = "disk";
+ break;
+ case SUSPEND_MODE_RAM:
+ pmutils_arg = "--suspend";
+ sysfile_str = "mem";
+ break;
+ case SUSPEND_MODE_HYBRID:
+ pmutils_arg = "--suspend-hybrid";
+ sysfile_str = NULL;
+ break;
+ default:
+ error_setg(errp, "guest suspend mode not supported");
+ return;
+ }
+
pmutils_path = g_find_program_in_path(pmutils_bin);
pid = fork();
@@ -1559,14 +1582,39 @@ out:
g_free(pmutils_path);
}
-static void guest_suspend(const char *pmutils_bin, const char *sysfile_str,
- Error **errp)
+static void guest_suspend(int suspend_mode, Error **errp)
{
Error *local_err = NULL;
+ const char *pmutils_bin, *sysfile_str;
char *pmutils_path;
pid_t pid;
int status;
+ bios_supports_mode(suspend_mode, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ switch (suspend_mode) {
+
+ case SUSPEND_MODE_DISK:
+ pmutils_bin = "pm-hibernate";
+ sysfile_str = "disk";
+ break;
+ case SUSPEND_MODE_RAM:
+ pmutils_bin = "pm-suspend";
+ sysfile_str = "mem";
+ break;
+ case SUSPEND_MODE_HYBRID:
+ pmutils_bin = "pm-suspend-hybrid";
+ sysfile_str = NULL;
+ break;
+ default:
+ error_setg(errp, "unknown guest suspend mode");
+ return;
+ }
+
pmutils_path = g_find_program_in_path(pmutils_bin);
pid = fork();
@@ -1629,42 +1677,17 @@ out:
void qmp_guest_suspend_disk(Error **errp)
{
- Error *local_err = NULL;
-
- bios_supports_mode("pm-is-supported", "--hibernate", "disk", &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- guest_suspend("pm-hibernate", "disk", errp);
+ guest_suspend(SUSPEND_MODE_DISK, errp);
}
void qmp_guest_suspend_ram(Error **errp)
{
- Error *local_err = NULL;
-
- bios_supports_mode("pm-is-supported", "--suspend", "mem", &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- guest_suspend("pm-suspend", "mem", errp);
+ guest_suspend(SUSPEND_MODE_RAM, errp);
}
void qmp_guest_suspend_hybrid(Error **errp)
{
- Error *local_err = NULL;
-
- bios_supports_mode("pm-is-supported", "--suspend-hybrid", NULL,
- &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- return;
- }
-
- guest_suspend("pm-suspend-hybrid", NULL, errp);
+ guest_suspend(SUSPEND_MODE_HYBRID, errp);
}
static GuestNetworkInterfaceList *