git: f49f33ef8c53 - main - bhyvectl: Generalize bhyve IPC code

Bojan Novković <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a8ae195.30c13.6d961535__44407.3006323137$1787486637$gmane$org@gitrepo.freebsd.org>
The branch main has been updated by bnovkov:

URL: https://cgit.FreeBSD.org/src/commit/?id=f49f33ef8c5315ada2ec1a1ca5626d5608e4e6e0

commit f49f33ef8c5315ada2ec1a1ca5626d5608e4e6e0
Author:     Bojan Novković <[email protected]>
AuthorDate: 2025-11-24 21:47:46 +0000
Commit:     Bojan Novković <[email protected]>
CommitDate: 2026-08-23 12:02:50 +0000

    bhyvectl: Generalize bhyve IPC code
    
    Move the nvlist-based bhyve IPC code into a separate function.
    No functional change intended.
    
    Reviewed by:    rew
    Differential Revision:  https://reviews.freebsd.org/D54652
---
 usr.sbin/bhyvectl/Makefile   |  2 +-
 usr.sbin/bhyvectl/bhyvectl.c | 36 +++++++++++++++++++++++++-----------
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/usr.sbin/bhyvectl/Makefile b/usr.sbin/bhyvectl/Makefile
index e5c6ad18d286..8cfb1169e585 100644
--- a/usr.sbin/bhyvectl/Makefile
+++ b/usr.sbin/bhyvectl/Makefile
@@ -20,7 +20,7 @@ CFLAGS+= -DBHYVE_SNAPSHOT
 
 # usr.sbin/bhyve/snapshot.h needs ucl header
 CFLAGS+= -I${SRCTOP}/contrib/libucl/include
-CFLAGS+= -I${SRCTOP}/usr.sbin/bhyve
 .endif
+CFLAGS+= -I${SRCTOP}/usr.sbin/bhyve
 
 .include <bsd.prog.mk>
diff --git a/usr.sbin/bhyvectl/bhyvectl.c b/usr.sbin/bhyvectl/bhyvectl.c
index b63cd5dc8c6e..ba2518267b14 100644
--- a/usr.sbin/bhyvectl/bhyvectl.c
+++ b/usr.sbin/bhyvectl/bhyvectl.c
@@ -52,6 +52,7 @@
 #include <machine/vmm_dev.h>
 #include <vmmapi.h>
 
+#include "ipc.h"
 #ifdef BHYVE_SNAPSHOT
 #include "snapshot.h"
 #endif
@@ -253,12 +254,13 @@ show_memseg(struct vmctx *ctx)
 	}
 }
 
-#ifdef BHYVE_SNAPSHOT
-static int
-send_message(const char *vmname, nvlist_t *nvl, const char *rundir)
+static int __unused
+ipc_send_message(const char *vmname, nvlist_t *request, const char *rundir)
 {
+	int err = 0, socket_fd, ret;
 	struct sockaddr_un addr;
-	int err = 0, ret, socket_fd;
+	const char* errmsg;
+	nvlist_t *reply;
 
 	socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
 	if (socket_fd < 0) {
@@ -286,18 +288,27 @@ send_message(const char *vmname, nvlist_t *nvl, const char *rundir)
 		goto done;
 	}
 
-	if (nvlist_send(socket_fd, nvl) < 0) {
-		perror("nvlist_send() failed");
-		err = errno;
+	reply = nvlist_xfer(socket_fd, request, 0);
+	request = NULL;
+	if (reply == NULL) {
+		perror("nvlist_xfer() failed");
+		goto done;
+	}
+	if (nvlist_exists_string(reply, "error")) {
+		errmsg = nvlist_get_string(reply, "error");
+		fprintf(stderr, "%s: IPC command failed: %s\n", __func__, errmsg);
+		err = -1;
 	}
 done:
-	nvlist_destroy(nvl);
+	if (request != NULL)
+		nvlist_destroy(request);
 
 	if (socket_fd >= 0)
 		close(socket_fd);
 	return (err);
 }
 
+#ifdef BHYVE_SNAPSHOT
 static int
 open_directory(const char *file)
 {
@@ -329,7 +340,7 @@ snapshot_request(const char *vmname, char *file, bool suspend, const char *rundi
 	nvlist_add_bool(nvl, "suspend", suspend);
 	nvlist_move_descriptor(nvl, "fddir", fd);
 
-	return (send_message(vmname, nvl, rundir));
+	return (ipc_send_message(vmname, nvl, rundir));
 }
 #endif
 
@@ -345,8 +356,8 @@ main(int argc, char *argv[])
 	struct option *opts;
 #ifdef BHYVE_SNAPSHOT
 	char *checkpoint_file = NULL;
-	char *rundir = NULL;
 #endif
+	const char *rundir = NULL;
 
 	opts = setup_options();
 
@@ -406,6 +417,9 @@ main(int argc, char *argv[])
 	if (vmname == NULL)
 		usage(opts);
 
+	if (rundir == NULL)
+		rundir = BHYVE_RUN_DIR;
+
 	action_opts = create + destroy + force_reset + force_poweroff;
 #ifdef BHYVE_SNAPSHOT
 	if (checkpoint_file)
@@ -546,7 +560,7 @@ main(int argc, char *argv[])
 	if (!error && checkpoint_file)
 		error = snapshot_request(vmname, checkpoint_file,
 				vm_suspend_opt,
-				rundir ? rundir : BHYVE_RUN_DIR);
+				rundir);
 #endif
 
 	if (error)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.