[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC][PATCH v4 09/18] virtagent: add va_shutdown RPC
From: |
Michael Roth |
Subject: |
[Qemu-devel] [RFC][PATCH v4 09/18] virtagent: add va_shutdown RPC |
Date: |
Tue, 16 Nov 2010 10:01:51 -0600 |
RPC to initiate guest shutdown/reboot/powerdown
Signed-off-by: Michael Roth <address@hidden>
---
virtagent-daemon.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/virtagent-daemon.c b/virtagent-daemon.c
index 0dd72c0..18992dd 100644
--- a/virtagent-daemon.c
+++ b/virtagent-daemon.c
@@ -125,6 +125,62 @@ EXIT_NOCLOSE:
return result;
}
+/* va_shutdown(): initiate guest shutdown
+ * rpc return values: none
+ */
+static xmlrpc_value *va_shutdown(xmlrpc_env *env,
+ xmlrpc_value *param,
+ void *user_data)
+{
+ int ret;
+ const char *shutdown_type, *shutdown_flag;
+ xmlrpc_value *result = xmlrpc_build_value(env, "s", "dummy");
+
+ TRACE("called");
+ xmlrpc_decompose_value(env, param, "(s)", &shutdown_type);
+ if (env->fault_occurred) {
+ goto out_bad;
+ }
+
+ if (strcmp(shutdown_type, "halt") == 0) {
+ shutdown_flag = "-H";
+ } else if (strcmp(shutdown_type, "powerdown") == 0) {
+ shutdown_flag = "-P";
+ } else if (strcmp(shutdown_type, "reboot") == 0) {
+ shutdown_flag = "-r";
+ } else {
+ xmlrpc_faultf(env, "invalid shutdown type: %s", shutdown_type);
+ goto out_bad;
+ }
+
+ SLOG("va_shutdown(), shutdown_type:%s", shutdown_type);
+
+ ret = fork();
+ if (ret == 0) {
+ /* child, start the shutdown */
+ setsid();
+ fclose(stdin);
+ fclose(stdout);
+ fclose(stderr);
+
+ sleep(5);
+ ret = execl("/sbin/shutdown", "shutdown", shutdown_flag, "+0",
+ "hypervisor initiated shutdown", (char*)NULL);
+ if (ret < 0) {
+ LOG("execl() failed: %s", strerror(errno));
+ exit(1);
+ }
+ TRACE("shouldn't be here");
+ exit(0);
+ } else if (ret < 0) {
+ xmlrpc_faultf(env, "fork() failed: %s", strerror(errno));
+ }
+
+ return result;
+out_bad:
+ return NULL;
+}
+
static int va_accept(int listen_fd) {
struct sockaddr_in saddr;
struct sockaddr *addr;
@@ -156,6 +212,8 @@ static RPCFunction guest_functions[] = {
.func_name = "getfile" },
{ .func = getdmesg,
.func_name = "getdmesg" },
+ { .func = va_shutdown,
+ .func_name = "va_shutdown" },
{ NULL, NULL }
};
static RPCFunction host_functions[] = {
--
1.7.0.4
- Re: [Qemu-devel] [RFC][PATCH v4 01/18] virtagent: add common rpc transport defs, (continued)
- [Qemu-devel] [RFC][PATCH v4 03/18] virtagent: qemu-vp, integrate virtagent server, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 04/18] virtagent: base RPC client definitions, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 05/18] virtagent: add getfile RPC, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 06/18] virtagent: add agent_viewfile command, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 07/18] virtagent: add getdmesg RPC, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 08/18] virtagent: add agent_viewdmesg command, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 09/18] virtagent: add va_shutdown RPC,
Michael Roth <=
- [Qemu-devel] [RFC][PATCH v4 12/18] virtagent: add agent_ping monitor command, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 11/18] virtagent: add va_ping RPC, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 16/18] virtagent: add va_send_hello() client function, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 13/18] virtagent: add agent_capabilities monitor function, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 18/18] virtagent: Makefile/configure changes to build virtagent bits, Michael Roth, 2010/11/16
- [Qemu-devel] [RFC][PATCH v4 10/18] virtagent: add agent_shutdown monitor command, Michael Roth, 2010/11/16