summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/vmctl/main.c8
-rw-r--r--usr.sbin/vmd/control.c13
-rw-r--r--usr.sbin/vmd/vmd.c26
-rw-r--r--usr.sbin/vmd/vmd.h4
4 files changed, 33 insertions, 18 deletions
diff --git a/usr.sbin/vmctl/main.c b/usr.sbin/vmctl/main.c
index 5c4b53c8b5d..5beca174496 100644
--- a/usr.sbin/vmctl/main.c
+++ b/usr.sbin/vmctl/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.27 2017/05/04 16:54:41 reyk Exp $ */
+/* $OpenBSD: main.c,v 1.28 2017/05/04 19:41:58 reyk Exp $ */
/*
* Copyright (c) 2015 Reyk Floeter <reyk@openbsd.org>
@@ -250,7 +250,11 @@ vmmaction(struct parse_result *res)
break;
if (imsg.hdr.type == IMSG_CTL_FAIL) {
- if (IMSG_DATA_SIZE(&imsg) == sizeof(ret)) {
+ if (IMSG_DATA_SIZE(&imsg) == sizeof(ret))
+ memcpy(&ret, imsg.data, sizeof(ret));
+ else
+ ret = 0;
+ if (ret != 0) {
memcpy(&ret, imsg.data, sizeof(ret));
errno = ret;
err(1, "command failed");
diff --git a/usr.sbin/vmd/control.c b/usr.sbin/vmd/control.c
index d67b19001ed..1e7eba2f0b3 100644
--- a/usr.sbin/vmd/control.c
+++ b/usr.sbin/vmd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.18 2017/05/04 16:54:41 reyk Exp $ */
+/* $OpenBSD: control.c,v 1.19 2017/05/04 19:41:58 reyk Exp $ */
/*
* Copyright (c) 2010-2015 Reyk Floeter <reyk@openbsd.org>
@@ -86,6 +86,8 @@ control_dispatch_vmd(int fd, struct privsep_proc *p, struct imsg *imsg)
case IMSG_VMDOP_TERMINATE_VM_RESPONSE:
case IMSG_VMDOP_GET_INFO_VM_DATA:
case IMSG_VMDOP_GET_INFO_VM_END_DATA:
+ case IMSG_CTL_FAIL:
+ case IMSG_CTL_OK:
if ((c = control_connbyfd(imsg->hdr.peerid)) == NULL) {
log_warnx("%s: lost control connection: fd %d",
__func__, imsg->hdr.peerid);
@@ -367,11 +369,10 @@ control_dispatch_imsg(int fd, short event, void *arg)
case IMSG_VMDOP_LOAD:
case IMSG_VMDOP_RELOAD:
case IMSG_CTL_RESET:
- proc_forward_imsg(ps, &imsg, PROC_PARENT, -1);
-
- /* Report success to the control client */
- imsg_compose_event(&c->iev, IMSG_CTL_OK,
- 0, 0, -1, NULL, 0);
+ if (proc_compose_imsg(ps, PROC_PARENT, -1,
+ imsg.hdr.type, fd, -1,
+ imsg.data, IMSG_DATA_SIZE(&imsg)) == -1)
+ goto fail;
break;
case IMSG_VMDOP_START_VM_REQUEST:
if (IMSG_DATA_SIZE(&imsg) < sizeof(vmc))
diff --git a/usr.sbin/vmd/vmd.c b/usr.sbin/vmd/vmd.c
index df84346c388..013bf26be8a 100644
--- a/usr.sbin/vmd/vmd.c
+++ b/usr.sbin/vmd/vmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vmd.c,v 1.60 2017/05/04 08:26:06 reyk Exp $ */
+/* $OpenBSD: vmd.c,v 1.61 2017/05/04 19:41:58 reyk Exp $ */
/*
* Copyright (c) 2015 Reyk Floeter <reyk@openbsd.org>
@@ -137,13 +137,19 @@ vmd_dispatch_control(int fd, struct privsep_proc *p, struct imsg *imsg)
str = get_string((uint8_t *)imsg->data,
IMSG_DATA_SIZE(imsg));
case IMSG_VMDOP_RELOAD:
- vmd_reload(0, str);
+ if (vmd_reload(0, str) == -1)
+ cmd = IMSG_CTL_FAIL;
+ else
+ cmd = IMSG_CTL_OK;
free(str);
break;
case IMSG_CTL_RESET:
IMSG_SIZE_CHECK(imsg, &v);
memcpy(&v, imsg->data, sizeof(v));
- vmd_reload(v, str);
+ if (vmd_reload(v, NULL) == -1)
+ cmd = IMSG_CTL_FAIL;
+ else
+ cmd = IMSG_CTL_OK;
break;
case IMSG_CTL_VERBOSE:
IMSG_SIZE_CHECK(imsg, &verbose);
@@ -152,6 +158,7 @@ vmd_dispatch_control(int fd, struct privsep_proc *p, struct imsg *imsg)
proc_forward_imsg(ps, imsg, PROC_VMM, -1);
proc_forward_imsg(ps, imsg, PROC_PRIV, -1);
+ cmd = IMSG_CTL_OK;
break;
default:
return (-1);
@@ -339,7 +346,7 @@ vmd_sighdlr(int sig, short event, void *arg)
* This is safe because libevent uses async signal handlers
* that run in the event loop and not in signal context.
*/
- vmd_reload(0, NULL);
+ (void)vmd_reload(0, NULL);
break;
case SIGPIPE:
log_info("%s: ignoring SIGPIPE", __func__);
@@ -569,7 +576,7 @@ vmd_configure(void)
return (0);
}
-void
+int
vmd_reload(unsigned int reset, const char *filename)
{
struct vmd_vm *vm, *next_vm;
@@ -605,12 +612,13 @@ vmd_reload(unsigned int reset, const char *filename)
/* Update shared global configuration in all children */
if (config_setconfig(env) == -1)
- return;
+ return (-1);
}
if (parse_config(filename) == -1) {
log_debug("%s: failed to load config file %s",
__func__, filename);
+ return (-1);
}
TAILQ_FOREACH(vsw, env->vmd_switches, sw_entry) {
@@ -620,7 +628,7 @@ vmd_reload(unsigned int reset, const char *filename)
log_warn("%s: failed to create switch %s",
__func__, vsw->sw_name);
switch_remove(vsw);
- return;
+ return (-1);
}
}
@@ -633,7 +641,7 @@ vmd_reload(unsigned int reset, const char *filename)
continue;
}
if (config_setvm(&env->vmd_ps, vm, -1, 0) == -1)
- return;
+ return (-1);
} else {
log_debug("%s: not creating vm \"%s\": "
"(running)", __func__,
@@ -641,6 +649,8 @@ vmd_reload(unsigned int reset, const char *filename)
}
}
}
+
+ return (0);
}
void
diff --git a/usr.sbin/vmd/vmd.h b/usr.sbin/vmd/vmd.h
index e111b3a6406..05294c98897 100644
--- a/usr.sbin/vmd/vmd.h
+++ b/usr.sbin/vmd/vmd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: vmd.h,v 1.53 2017/05/04 08:26:06 reyk Exp $ */
+/* $OpenBSD: vmd.h,v 1.54 2017/05/04 19:41:58 reyk Exp $ */
/*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@@ -258,7 +258,7 @@ ssize_t decode_udp_ip_header(unsigned char *, size_t, size_t,
struct packet_ctx *);
/* vmd.c */
-void vmd_reload(unsigned int, const char *);
+int vmd_reload(unsigned int, const char *);
struct vmd_vm *vm_getbyid(uint32_t);
struct vmd_vm *vm_getbyvmid(uint32_t);
uint32_t vm_id2vmid(uint32_t, struct vmd_vm *);