]> git.proxmox.com Git - qemu.git/blame - qga/commands-win32.c
qemu-ga: add guest-suspend-disk
[qemu.git] / qga / commands-win32.c
CommitLineData
d8ca685a
MR
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
546b60d0
MR
18#ifndef SHTDN_REASON_FLAG_PLANNED
19#define SHTDN_REASON_FLAG_PLANNED 0x80000000
20#endif
21
d8ca685a
MR
22void qmp_guest_shutdown(bool has_mode, const char *mode, Error **err)
23{
546b60d0
MR
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 }
d8ca685a
MR
60}
61
62int64_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
68void qmp_guest_file_close(int64_t handle, Error **err)
69{
70 error_set(err, QERR_UNSUPPORTED);
71}
72
73GuestFileRead *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
80GuestFileWrite *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
87GuestFileSeek *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
94void 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 */
102GuestFsfreezeStatus 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 */
112int64_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 */
121int64_t qmp_guest_fsfreeze_thaw(Error **err)
122{
123 error_set(err, QERR_UNSUPPORTED);
124 return 0;
125}
126
11d0f125
LC
127void qmp_guest_suspend_disk(Error **err)
128{
129 error_set(err, QERR_UNSUPPORTED);
130}
131
d8ca685a
MR
132/* register init/cleanup routines for stateful command groups */
133void ga_command_state_init(GAState *s, GACommandState *cs)
134{
135}