diff options
-rw-r--r-- | usr.sbin/vmctl/main.c | 8 | ||||
-rw-r--r-- | usr.sbin/vmd/control.c | 13 | ||||
-rw-r--r-- | usr.sbin/vmd/vmd.c | 26 | ||||
-rw-r--r-- | usr.sbin/vmd/vmd.h | 4 |
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 *); |