diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c --- a/usr.sbin/bhyvectl/bhyvectl.c +++ b/usr.sbin/bhyvectl/bhyvectl.c @@ -249,12 +249,12 @@ } } -#ifdef BHYVE_SNAPSHOT static int -send_message(const char *vmname, nvlist_t *nvl) +ipc_send_message(const char *vmname, nvlist_t *nvl) { struct sockaddr_un addr; int err = 0, socket_fd; + const char* errmsg; socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); if (socket_fd < 0) { @@ -278,15 +278,31 @@ if (nvlist_send(socket_fd, nvl) < 0) { perror("nvlist_send() failed"); err = errno; + goto done; } -done: + nvlist_destroy(nvl); + nvl = nvlist_recv(socket_fd, 0); + if (nvl == NULL) { + perror("nvlist_recv() failed"); + goto done; + } + + if (nvlist_exists_string(nvl, "error")) { + errmsg = nvlist_get_string(nvl, "error"); + fprintf(stderr, "%s: IPC command failed: %s\n", __func__, errmsg); + err = -1; + } +done: + if (nvl != NULL) + nvlist_destroy(nvl); if (socket_fd >= 0) close(socket_fd); return (err); } +#ifdef BHYVE_SNAPSHOT static int open_directory(const char *file) { @@ -318,7 +334,7 @@ nvlist_add_bool(nvl, "suspend", suspend); nvlist_move_descriptor(nvl, "fddir", fd); - return (send_message(vmname, nvl)); + return (ipc_send_message(vmname, nvl)); } #endif