]> git.proxmox.com Git - qemu.git/blob - qga/commands-win32.c
qemu-ga: add guest-suspend-disk
[qemu.git] / qga / commands-win32.c
1 /*
2 * QEMU Guest Agent win32-specific command implementations
3 *
4 * Copyright IBM Corp. 2012
5 *
6 * Authors:
7 * Michael Roth <mdroth@linux.vnet.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
12
13 #include <glib.h>
14 #include "qga/guest-agent-core.h"
15 #include "qga-qmp-commands.h"
16 #include "qerror.h"
17
18 #ifndef SHTDN_REASON_FLAG_PLANNED
19 #define SHTDN_REASON_FLAG_PLANNED 0x80000000
20 #endif
21
22 void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
23 {
24 HANDLE token;
25 TOKEN_PRIVILEGES priv;
26 UINT shutdown_flag = EWX_FORCE;
27
28 slog("guest-shutdown called, mode: %s", mode);
29
30 if (!has_mode || strcmp(mode, "powerdown") == 0) {
31 shutdown_flag |= EWX_POWEROFF;
32 } else if (strcmp(mode, "halt") == 0) {
33 shutdown_flag |= EWX_SHUTDOWN;
34 } else if (strcmp(mode, "reboot") == 0) {
35 shutdown_flag |= EWX_REBOOT;
36 } else {
37 error_set(err, QERR_INVALID_PARAMETER_VALUE, "mode",
38 "halt|powerdown|reboot");
39 return;
40 }
41
42 /* Request a shutdown privilege, but try to shut down the system
43 anyway. */
44 if (OpenProcessToken(GetCurrentProcess(),
45 TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &token))
46 {
47 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
48 &priv.Privileges[0].Luid);
49
50 priv.PrivilegeCount = 1;
51 priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
52
53 AdjustTokenPrivileges(token, FALSE, &priv, 0, NULL, 0);
54 }
55
56 if (!ExitWindowsEx(shutdown_flag, SHTDN_REASON_FLAG_PLANNED)) {
57 slog("guest-shutdown failed: %d", GetLastError());
58 error_set(err, QERR_UNDEFINED_ERROR);
59 }
60 }
61
62 int64_t qmp_guest_file_open(const char *path, bool has_mode, const char *mode, Error **err)
63 {
64 error_set(err, QERR_UNSUPPORTED);
65 return 0;
66 }
67
68 void qmp_guest_file_close(int64_t handle, Error **err)
69 {
70 error_set(err, QERR_UNSUPPORTED);
71 }
72
73 GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count,
74 int64_t count, Error **err)
75 {
76 error_set(err, QERR_UNSUPPORTED);
77 return 0;
78 }
79
80 GuestFileWrite *qmp_guest_file_write(int64_t handle, const char *buf_b64,
81 bool has_count, int64_t count, Error **err)
82 {
83 error_set(err, QERR_UNSUPPORTED);
84 return 0;
85 }
86
87 GuestFileSeek *qmp_guest_file_seek(int64_t handle, int64_t offset,
88 int64_t whence, Error **err)
89 {
90 error_set(err, QERR_UNSUPPORTED);
91 return 0;
92 }
93
94 void qmp_guest_file_flush(int64_t handle, Error **err)
95 {
96 error_set(err, QERR_UNSUPPORTED);
97 }
98
99 /*
100 * Return status of freeze/thaw
101 */
102 GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **err)
103 {
104 error_set(err, QERR_UNSUPPORTED);
105 return 0;
106 }
107
108 /*
109 * Walk list of mounted file systems in the guest, and freeze the ones which
110 * are real local file systems.
111 */
112 int64_t qmp_guest_fsfreeze_freeze(Error **err)
113 {
114 error_set(err, QERR_UNSUPPORTED);
115 return 0;
116 }
117
118 /*
119 * Walk list of frozen file systems in the guest, and thaw them.
120 */
121 int64_t qmp_guest_fsfreeze_thaw(Error **err)
122 {
123 error_set(err, QERR_UNSUPPORTED);
124 return 0;
125 }
126
127 void qmp_guest_suspend_disk(Error **err)
128 {
129 error_set(err, QERR_UNSUPPORTED);
130 }
131
132 /* register init/cleanup routines for stateful command groups */
133 void ga_command_state_init(GAState *s, GACommandState *cs)
134 {
135 }