Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Mar 2021 23:30:48 +0000 (UTC)
From:      Neel Chauhan <nc@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r568621 - in head/emulators: . qemu-guest-agent qemu-guest-agent/files
Message-ID:  <202103162330.12GNUm9r047188@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nc
Date: Tue Mar 16 23:30:47 2021
New Revision: 568621
URL: https://svnweb.freebsd.org/changeset/ports/568621

Log:
  New port: emulators/qemu-guest-agent: QEMU Guest Agent for FreeBSD
  
  PR:		254105
  Submitted by:	zhecka AT gmail DOT com

Added:
  head/emulators/qemu-guest-agent/
  head/emulators/qemu-guest-agent/Makefile   (contents, props changed)
  head/emulators/qemu-guest-agent/distinfo   (contents, props changed)
  head/emulators/qemu-guest-agent/files/
  head/emulators/qemu-guest-agent/files/patch-Makefile   (contents, props changed)
  head/emulators/qemu-guest-agent/files/patch-configure   (contents, props changed)
  head/emulators/qemu-guest-agent/files/patch-qga_commands-posix.c   (contents, props changed)
  head/emulators/qemu-guest-agent/files/patch-qga_main.c   (contents, props changed)
  head/emulators/qemu-guest-agent/files/qemu-guest-agent.in   (contents, props changed)
  head/emulators/qemu-guest-agent/pkg-descr   (contents, props changed)
  head/emulators/qemu-guest-agent/pkg-message   (contents, props changed)
  head/emulators/qemu-guest-agent/pkg-message-11   (contents, props changed)
  head/emulators/qemu-guest-agent/pkg-plist   (contents, props changed)
Modified:
  head/emulators/Makefile

Modified: head/emulators/Makefile
==============================================================================
--- head/emulators/Makefile	Tue Mar 16 23:22:27 2021	(r568620)
+++ head/emulators/Makefile	Tue Mar 16 23:30:47 2021	(r568621)
@@ -113,6 +113,7 @@
     SUBDIR += qemu
     SUBDIR += qemu-cheri
     SUBDIR += qemu-devel
+    SUBDIR += qemu-guest-agent
     SUBDIR += qemu-powernv
     SUBDIR += qemu-user-static
     SUBDIR += qemu-user-static-devel

Added: head/emulators/qemu-guest-agent/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/qemu-guest-agent/Makefile	Tue Mar 16 23:30:47 2021	(r568621)
@@ -0,0 +1,183 @@
+# Created by: Kaltashkin Eugene <zhecka@gmail.com>
+# $FreeBSD$
+
+PORTNAME=	qemu
+DISTVERSION=	5.0.1
+CATEGORIES=	emulators
+MASTER_SITES=	https://download.qemu.org/
+PKGNAMESUFFIX=	-guest-agent
+
+MAINTAINER=	zhecka@gmail.com
+COMMENT=	QEMU guest-agent utilities
+
+LICENSE=	GPLv2
+
+DIST_SUBDIR=	qemu/${PORTVERSION}
+FILESDIR=	${.CURDIR}/files
+HAS_CONFIGURE=	yes
+USES=		gmake gnome pkgconfig python:build tar:xz
+USE_GNOME=	glib20
+USE_RC_SUBR=	qemu-guest-agent
+MAKE_ENV+=	BSD_MAKE="${MAKE}" PREFIX=${PREFIX}
+
+CONFLICTS_INSTALL=	qemu-[0-9]* qemu-devel-* qemu-sbruno-*
+OPTIONS_EXCLUDE=SAMBA X11 GTK3 OPENGL GNUTLS SASL JPEG PNG CURL \
+		CDROM_DMA PCAP USBREDIR GNS3 X86_TARGETS DOCS\
+		STATIC_LINK NCURSES VDE
+
+PLIST=		${.CURDIR}/pkg-plist
+DESCR=		${.CURDIR}/pkg-descr
+
+CONFIGURE_ARGS?=--localstatedir=/var --extra-ldflags=-L\"${LOCALBASE}/lib\" \
+		--mandir=${MANPREFIX}/man \
+		--prefix=${PREFIX} --cc=${CC} --disable-kvm \
+		--python=${PYTHON_CMD} \
+		--extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"\"${PREFIX}\\\"\"\ -DBSD_GUEST_AGENT\ -DFREEBSD \
+		--disable-blobs \
+		--disable-system \
+		--disable-user \
+		--disable-linux-user \
+		--disable-bsd-user \
+		--disable-docs \
+		--enable-guest-agent \
+		--disable-guest-agent-msi \
+		--disable-pie \
+		--disable-modules \
+		--disable-module-upgrades \
+		--disable-debug-tcg \
+		--disable-debug-info \
+		--disable-sparse \
+		--disable-gnutls \
+		--disable-nettle \
+		--disable-gcrypt \
+		--disable-auth-pam \
+		--disable-sdl \
+		--disable-sdl-image \
+		--disable-gtk \
+		--disable-vte \
+		--disable-curses \
+		--disable-iconv \
+		--disable-vnc \
+		--disable-vnc-sasl \
+		--disable-vnc-jpeg \
+		--disable-vnc-png \
+		--disable-cocoa \
+		--disable-virtfs \
+		--disable-mpath \
+		--disable-xen \
+		--disable-xen-pci-passthrough \
+		--disable-brlapi \
+		--disable-curl \
+		--disable-membarrier \
+		--disable-fdt \
+		--disable-kvm \
+		--disable-hax \
+		--disable-hvf \
+		--disable-whpx \
+		--disable-rdma \
+		--disable-pvrdma \
+		--disable-vde \
+		--disable-netmap \
+		--disable-linux-aio \
+		--disable-linux-io-uring \
+		--disable-cap-ng \
+		--disable-attr \
+		--disable-vhost-net \
+		--disable-vhost-vsock \
+		--disable-vhost-scsi \
+		--disable-vhost-crypto \
+		--disable-vhost-kernel \
+		--disable-vhost-user \
+		--disable-spice \
+		--disable-rbd \
+		--disable-libiscsi \
+		--disable-libnfs \
+		--disable-smartcard \
+		--disable-libusb \
+		--disable-live-block-migration \
+		--disable-usb-redir \
+		--disable-lzo \
+		--disable-snappy \
+		--disable-bzip2 \
+		--disable-lzfse \
+		--disable-zstd \
+		--disable-seccomp \
+		--disable-coroutine-pool \
+		--disable-glusterfs \
+		--disable-tpm \
+		--disable-libssh \
+		--disable-numa \
+		--disable-libxml2 \
+		--disable-tcmalloc \
+		--disable-jemalloc \
+		--disable-avx2 \
+		--disable-avx512f \
+		--disable-replication \
+		--disable-opengl \
+		--disable-virglrenderer \
+		--disable-xfsctl \
+		--disable-qom-cast-debug \
+		--enable-tools \
+		--disable-vxhs \
+		--disable-bochs \
+		--disable-cloop \
+		--disable-dmg \
+		--disable-qcow1 \
+		--disable-vdi \
+		--disable-vvfat \
+		--disable-qed \
+		--disable-parallels \
+		--disable-sheepdog \
+		--disable-crypto-afalg \
+		--disable-capstone \
+		--disable-debug-mutex \
+		--disable-libpmem \
+		--disable-xkbcommon
+
+post-install:
+	@${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/qemu-*
+	@${RM} ${STAGEDIR}${PREFIX}/bin/qemu-nbd
+	@${RM} ${STAGEDIR}${PREFIX}/bin/qemu-edid
+	@${RM} ${STAGEDIR}${PREFIX}/bin/qemu-img
+	@${RM} ${STAGEDIR}${PREFIX}/bin/qemu-io
+	@${RMDIR} ${STAGEDIR}${DATADIR}
+	${MKDIR} ${STAGEDIR}${PREFIX}/qemu
+
+.include <bsd.port.options.mk>
+
+.if !defined(STRIP) || ${STRIP} == ""
+CONFIGURE_ARGS+=--disable-strip
+.endif
+
+.if ${ARCH} == "amd64"
+MAKE_ARGS+=	ARCH=x86_64
+.endif
+
+.if ${ARCH} == "powerpc"
+MAKE_ARGS+=	ARCH=ppc
+.endif
+
+.if ${ARCH} == "powerpc64"
+MAKE_ARGS+=	ARCH=ppc64
+.endif
+
+.if ${ARCH} == "sparc64"
+CONFIGURE_ARGS+=	--sparc_cpu=v9
+.endif
+
+.if ${OSVERSION} < 1200000
+PKGMESSAGE=	${.CURDIR}/pkg-message-11
+.else
+PKGMESSAGE=	${.CURDIR}/pkg-message
+.endif
+
+PLIST_SUB+=	LINUXBOOT_DMA=""
+
+# XXX need to disable usb host code on head while it's not ported to the
+# new usb stack yet
+post-configure:
+	@${REINPLACE_CMD} -E \
+		-e "s|^(HOST_USB=)bsd|\1stub|" \
+		${WRKSRC}/config-host.mak
+
+.include <bsd.port.mk>

Added: head/emulators/qemu-guest-agent/distinfo
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/qemu-guest-agent/distinfo	Tue Mar 16 23:30:47 2021	(r568621)
@@ -0,0 +1,7 @@
+TIMESTAMP = 1603483758
+SHA256 (qemu/5.0.1/qemu-5.0.1.tar.xz) = 135fab4c3699a378c9584b3453927e2f5002e440311f21efa66fc189d4bb4982
+SIZE (qemu/5.0.1/qemu-5.0.1.tar.xz) = 62430168
+SHA256 (qemu/5.0.1/55765822804f.patch) = 10c2cc93ad01b02d854e26a9e445ba22bb5434dda1ef25baeb979be6292fa8ef
+SIZE (qemu/5.0.1/55765822804f.patch) = 2271
+SHA256 (qemu/5.0.1/aa4d30f6618d.patch) = eeddc5f5e08a460d2c133b4193d115fa1f00f206e0833f33ec66379981473efe
+SIZE (qemu/5.0.1/aa4d30f6618d.patch) = 2211

Added: head/emulators/qemu-guest-agent/files/patch-Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/qemu-guest-agent/files/patch-Makefile	Tue Mar 16 23:30:47 2021	(r568621)
@@ -0,0 +1,106 @@
+--- Makefile.orig	2020-09-15 19:31:13 UTC
++++ Makefile
+@@ -361,29 +361,6 @@
+ MANUAL_BUILDDIR := docs
+ endif
+ 
+-ifdef BUILD_DOCS
+-DOCS+=$(MANUAL_BUILDDIR)/system/qemu.1
+-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-img.1
+-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-nbd.8
+-DOCS+=$(MANUAL_BUILDDIR)/interop/qemu-ga.8
+-ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy)
+-DOCS+=$(MANUAL_BUILDDIR)/tools/virtiofsd.1
+-endif
+-DOCS+=$(MANUAL_BUILDDIR)/system/qemu-block-drivers.7
+-DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7
+-DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7
+-DOCS+=$(MANUAL_BUILDDIR)/system/qemu-cpu-models.7
+-DOCS+=$(MANUAL_BUILDDIR)/index.html
+-ifdef CONFIG_VIRTFS
+-DOCS+=$(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1
+-endif
+-ifdef CONFIG_TRACE_SYSTEMTAP
+-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1
+-endif
+-else
+-DOCS=
+-endif
+-
+ SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR)
+ SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(filter %-softmmu, $(TARGET_DIRS)))
+ SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %.d, $(SUBDIR_DEVICES_MAK))
+@@ -878,10 +855,6 @@
+ 	$(call install-manual,user)
+ 
+ install-doc: $(DOCS) install-sphinxdocs
+-	$(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)"
+-	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/index.html "$(DESTDIR)$(qemu_docdir)"
+-	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)"
+-	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)"
+ ifdef CONFIG_POSIX
+ 	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
+ 	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu.1 "$(DESTDIR)$(mandir)/man1"
+@@ -889,21 +862,10 @@
+ 	$(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7"
+ 	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7"
+ 	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-cpu-models.7 "$(DESTDIR)$(mandir)/man7"
+-ifeq ($(CONFIG_TOOLS),y)
+-	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-img.1 "$(DESTDIR)$(mandir)/man1"
+-	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
+-	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
+-endif
+ ifdef CONFIG_TRACE_SYSTEMTAP
+ 	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1 "$(DESTDIR)$(mandir)/man1"
+ endif
+-ifneq (,$(findstring qemu-ga,$(TOOLS)))
+-	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/interop/qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
+-	$(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)"
+-	$(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)"
+-	$(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7"
+ endif
+-endif
+ ifdef CONFIG_VIRTFS
+ 	$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
+ 	$(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1"
+@@ -927,7 +889,7 @@
+ install-includedir:
+ 	$(INSTALL_DIR) "$(DESTDIR)$(includedir)"
+ 
+-install: all $(if $(BUILD_DOCS),install-doc) \
++install: all \
+ 	install-datadir install-localstatedir install-includedir \
+ 	$(if $(INSTALL_BLOBS),$(edk2-decompressed)) \
+ 	recurse-install
+@@ -974,31 +936,12 @@
+ 			"$(DESTDIR)$(qemu_datadir)/firmware/$$x"; \
+ 	done
+ endif
+-	for s in $(ICON_SIZES); do \
+-		mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps"; \
+-		$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_$${s}.png \
+-			"$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps/qemu.png"; \
+-	done; \
+-	mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps"; \
+-	$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_32x32.bmp \
+-		"$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps/qemu.bmp"; \
+-	mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps"; \
+-	$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu.svg \
+-		"$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps/qemu.svg"
+-	mkdir -p "$(DESTDIR)$(qemu_desktopdir)"
+-	$(INSTALL_DATA) $(SRC_PATH)/ui/qemu.desktop \
+-		"$(DESTDIR)$(qemu_desktopdir)/qemu.desktop"
+ ifdef CONFIG_GTK
+ 	$(MAKE) -C po $@
+ endif
+ ifeq ($(CONFIG_PLUGIN),y)
+ 	$(INSTALL_DATA) $(SRC_PATH)/include/qemu/qemu-plugin.h "$(DESTDIR)$(includedir)/qemu-plugin.h"
+ endif
+-	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
+-	set -e; for x in $(KEYMAPS); do \
+-		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
+-	done
+-	$(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all"
+ 
+ .PHONY: ctags
+ ctags:

Added: head/emulators/qemu-guest-agent/files/patch-configure
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/qemu-guest-agent/files/patch-configure	Tue Mar 16 23:30:47 2021	(r568621)
@@ -0,0 +1,201 @@
+--- configure.orig	2020-09-15 19:31:13 UTC
++++ configure
+@@ -360,7 +360,7 @@
+ sdl=""
+ sdl_image=""
+ virtfs=""
+-mpath=""
++mpath="no"
+ vnc="yes"
+ sparse="no"
+ vde=""
+@@ -408,7 +408,7 @@
+ modules="no"
+ module_upgrades="no"
+ prefix="/usr/local"
+-mandir="\${prefix}/share/man"
++mandir="\${prefix}/man"
+ datadir="\${prefix}/share"
+ firmwarepath="\${prefix}/share/qemu-firmware"
+ qemu_docdir="\${prefix}/share/doc/qemu"
+@@ -493,6 +493,9 @@
+ tcmalloc="no"
+ jemalloc="no"
+ replication="yes"
++pcap="no"
++pcap_create="no"
++bpf="no"
+ vxhs=""
+ bochs="yes"
+ cloop="yes"
+@@ -509,6 +512,7 @@
+ default_devices="yes"
+ plugins="no"
+ fuzzing="no"
++libudev="no"
+ 
+ supported_cpu="no"
+ supported_os="no"
+@@ -904,7 +908,7 @@
+   kvm="yes"
+   QEMU_INCLUDES="-isystem \$(SRC_PATH)/linux-headers -isystem $PWD/linux-headers $QEMU_INCLUDES"
+   supported_os="yes"
+-  libudev="yes"
++  libudev="no"
+ ;;
+ esac
+ 
+@@ -1168,6 +1172,10 @@
+   ;;
+   --enable-vnc-png) vnc_png="yes"
+   ;;
++  --enable-pcap) pcap="yes"
++  ;;
++  --disable-pcap) pcap="no"
++  ;;
+   --disable-slirp) slirp="no"
+   ;;
+   --enable-slirp=git) slirp="git"
+@@ -3137,6 +3145,14 @@
+ fi
+ 
+ ##########################################
++# getifaddrs (for tests/test-io-channel-socket )
++
++have_ifaddrs_h=yes
++if ! check_include "ifaddrs.h" ; then
++  have_ifaddrs_h=no
++fi
++
++##########################################
+ # VTE probe
+ 
+ if test "$vte" != "no"; then
+@@ -3806,7 +3822,7 @@
+         glib_libs=$($pkg_config --libs $i)
+         QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS"
+         LIBS="$glib_libs $LIBS"
+-        libs_qga="$glib_libs $libs_qga"
++        libs_qga="$glib_libs -lintl $libs_qga"
+     else
+         error_exit "glib-$glib_req_ver $i is required to compile QEMU"
+     fi
+@@ -3926,7 +3942,7 @@
+ ##########################################
+ # pixman support probe
+ 
+-if test "$want_tools" = "no" && test "$softmmu" = "no"; then
++if test "$softmmu" = "no"; then
+   pixman_cflags=
+   pixman_libs=
+ elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then
+@@ -4957,14 +4973,6 @@
+   fi
+   if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then
+     docs=yes
+-  else
+-    if test "$docs" = "yes" ; then
+-      if has $sphinx_build && test "$sphinx_ok" != "yes"; then
+-        echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2
+-      fi
+-      feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx"
+-    fi
+-    docs=no
+   fi
+ fi
+ 
+@@ -5098,7 +5106,7 @@
+ 
+ # check for libusb
+ if test "$libusb" != "no" ; then
+-    if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
++    if $pkg_config libusb-1.0; then
+         libusb="yes"
+         libusb_cflags=$($pkg_config --cflags libusb-1.0)
+         libusb_libs=$($pkg_config --libs libusb-1.0)
+@@ -5501,7 +5509,51 @@
+   fi
+ fi
+ 
++##########################################
++# pcap probe
+ 
++if test "$pcap" = "yes" -a "$pcap" != "no"; then
++  cat > $TMPC << EOF
++#include <pcap.h>
++int main(void) { return (pcap_lib_version() == (char *)0 ? 1 : 0); }
++EOF
++  if test "$mingw32" = "no" ; then
++    libpcap=-lpcap
++  else
++    libpcap=-lwpcap
++  fi
++  if compile_prog "" "$libpcap" ; then
++    :
++  else
++    echo
++    echo "Error: Could not find pcap"
++    echo "Make sure to have the pcap libs and headers installed."
++    echo
++    exit 1
++  fi
++  cat > $TMPC << EOF
++#include <pcap.h>
++int main(void)
++{
++  char errbuf[PCAP_ERRBUF_SIZE];
++  return (pcap_create("foo", errbuf) == (pcap_t *)0 ? 1 : 0);
++}
++EOF
++  if compile_prog "" "$libpcap" ; then
++    pcap_create="yes"
++  fi
++  cat > $TMPC << EOF
++#define PCAP_DONT_INCLUDE_PCAP_BPF_H
++#include <pcap.h>
++#include <net/bpf.h>
++int main(void) { return (BPF_MAJOR_VERSION); }
++EOF
++  if compile_prog ; then
++    bpf="yes"
++  fi
++  libs_softmmu="$libpcap $libs_softmmu"
++fi # test "$pcap"
++
+ ##########################################
+ # check if we have open_by_handle_at
+ 
+@@ -6627,6 +6679,7 @@
+ echo "Block whitelist (rw) $block_drv_rw_whitelist"
+ echo "Block whitelist (ro) $block_drv_ro_whitelist"
+ echo "VirtFS support    $virtfs"
++echo "pcap support      $pcap"
+ echo "Multipath support $mpath"
+ echo "VNC support       $vnc"
+ if test "$vnc" = "yes" ; then
+@@ -6864,6 +6917,15 @@
+ if test "$want_tools" = "yes" ; then
+   echo "CONFIG_TOOLS=y" >> $config_host_mak
+ fi
++if test "$pcap" = "yes" ; then
++  echo "CONFIG_PCAP=y" >> $config_host_mak
++  if test "$pcap_create" = "yes" ; then
++    echo "CONFIG_PCAP_CREATE=y" >> $config_host_mak
++  fi
++  if test "$bpf" = "yes" ; then
++    echo "CONFIG_BPF=y" >> $config_host_mak
++  fi
++fi
+ if test "$slirp" != "no"; then
+   echo "CONFIG_SLIRP=y" >> $config_host_mak
+   echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
+@@ -7120,6 +7182,9 @@
+ # if this macro is set.
+ if test "$have_fsxattr" = "yes" ; then
+     echo "HAVE_FSXATTR=y" >> $config_host_mak
++fi
++if test "$have_ifaddrs_h" = "yes" ; then
++    echo "HAVE_IFADDRS_H=y" >> $config_host_mak
+ fi
+ if test "$have_copy_file_range" = "yes" ; then
+     echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak

Added: head/emulators/qemu-guest-agent/files/patch-qga_commands-posix.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/emulators/qemu-guest-agent/files/patch-qga_commands-posix.c	Tue Mar 16 23:30:47 2021	(r568621)
@@ -0,0 +1,758 @@
+--- qga/commands-posix.c.orig	2020-09-15 16:31:14 UTC
++++ qga/commands-posix.c
+@@ -28,6 +28,21 @@
+ #include "qemu/cutils.h"
+ #include "commands-common.h"
+ 
++#ifdef BSD_GUEST_AGENT
++#include <ifaddrs.h>
++#include <arpa/inet.h>
++#include <sys/socket.h>
++#include <sys/sysctl.h>
++#include <net/if.h>
++#include <sys/socket.h>
++#include <ifaddrs.h>
++#include <sys/statvfs.h>
++#include <net/if_dl.h>
++#include <net/if_types.h>
++#include <net/ethernet.h>
++#include <net/if_var.h>
++#endif
++
+ #ifdef HAVE_UTMPX
+ #include <utmpx.h>
+ #endif
+@@ -85,14 +100,25 @@ void qmp_guest_shutdown(bool has_mode, const char *mod
+ {
+     const char *shutdown_flag;
+     Error *local_err = NULL;
++#ifdef BSD_GUEST_AGENT
++    char *shutdown_mode;
++#endif // BSD_GUEST_AGENT
+     pid_t pid;
+     int status;
+ 
+     slog("guest-shutdown called, mode: %s", mode);
+     if (!has_mode || strcmp(mode, "powerdown") == 0) {
++#ifdef BSD_GUEST_AGENT
++        shutdown_flag = "-p";
++#else
+         shutdown_flag = "-P";
++#endif // BSD_GUEST_AGENT
+     } else if (strcmp(mode, "halt") == 0) {
++#ifdef BSD_GUEST_AGENT
++        shutdown_flag = "-h";
++#else
+         shutdown_flag = "-H";
++#endif // BSD_GUEST_AGENT
+     } else if (strcmp(mode, "reboot") == 0) {
+         shutdown_flag = "-r";
+     } else {
+@@ -108,9 +134,15 @@ void qmp_guest_shutdown(bool has_mode, const char *mod
+         reopen_fd_to_null(0);
+         reopen_fd_to_null(1);
+         reopen_fd_to_null(2);
++#ifdef BSD_GUEST_AGENT
++        shutdown_mode = g_strdup_printf("hypervisor initiated %s", mode);
+ 
++        execle("/sbin/shutdown", "-h", shutdown_flag, "+0",
++               shutdown_mode, (char*)NULL, environ);
++#else
+         execle("/sbin/shutdown", "shutdown", "-h", shutdown_flag, "+0",
+                "hypervisor initiated shutdown", (char*)NULL, environ);
++#endif // BSD_GUEST_AGENT
+         _exit(EXIT_FAILURE);
+     } else if (pid < 0) {
+         error_setg_errno(errp, errno, "failed to create child process");
+@@ -153,9 +185,11 @@ int64_t qmp_guest_get_time(Error **errp)
+ void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp)
+ {
+     int ret;
++#ifndef BSD_GUEST_AGENT
+     int status;
+     pid_t pid;
+     Error *local_err = NULL;
++#endif
+     struct timeval tv;
+     static const char hwclock_path[] = "/sbin/hwclock";
+     static int hwclock_available = -1;
+@@ -193,7 +227,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns
+             return;
+         }
+     }
+-
++#ifndef BSD_GUEST_AGENT
+     /* Now, if user has passed a time to set and the system time is set, we
+      * just need to synchronize the hardware clock. However, if no time was
+      * passed, user is requesting the opposite: set the system time from the
+@@ -230,6 +264,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns
+         error_setg(errp, "hwclock failed to set hardware clock to system time");
+         return;
+     }
++#endif // BSD_GUEST_AGENT
+ }
+ 
+ typedef enum {
+@@ -2625,25 +2660,263 @@ void qmp_guest_suspend_hybrid(Error **errp)
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+ }
+-
++#ifndef BSD_GUEST_AGENT
+ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+     return NULL;
+ }
++#else
++static GuestNetworkInterfaceList *
++guest_find_interface(GuestNetworkInterfaceList *head,
++                     const char *name)
++{
++    for (; head; head = head->next) {
++        if (strcmp(head->value->name, name) == 0) {
++            break;
++        }
++    }
+ 
++    return head;
++}
++
++static int guest_get_network_stats(const char *name,
++                       GuestNetworkInterfaceStat *stats)
++{
++	return -1;
++}
++
++GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
++{
++    GuestNetworkInterfaceList *head = NULL, *cur_item = NULL;
++    struct ifaddrs *ifap, *ifa;
++
++    if (getifaddrs(&ifap) < 0) {
++        error_setg_errno(errp, errno, "getifaddrs failed");
++        goto error;
++    }
++
++    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
++        GuestNetworkInterfaceList *info;
++        GuestIpAddressList **address_list = NULL, *address_item = NULL;
++        GuestNetworkInterfaceStat  *interface_stat = NULL;
++        char addr4[INET_ADDRSTRLEN];
++        char addr6[INET6_ADDRSTRLEN];
++        int sock;
++        struct ifreq ifr;
++        // struct ifnet ifp;
++        // struct if_data ifd;
++        // unsigned char *mac_addr;
++        char mac_addr[18]="00:00:00:00:00:00"; // = char[18];
++        void *p;
++
++        g_debug("Processing %s interface", ifa->ifa_name);
++
++        info = guest_find_interface(head, ifa->ifa_name);
++
++        if (!info) {
++            info = g_malloc0(sizeof(*info));
++            info->value = g_malloc0(sizeof(*info->value));
++            info->value->name = g_strdup(ifa->ifa_name);
++
++            if (!cur_item) {
++                head = cur_item = info;
++            } else {
++                cur_item->next = info;
++                cur_item = info;
++            }
++        }
++
++        if (!info->value->has_hardware_address &&
++            ifa->ifa_flags & SIOCGHWADDR) {
++            /* we haven't obtained HW address yet */
++            sock = socket(PF_INET, SOCK_STREAM, 0);
++            if (sock == -1) {
++                error_setg_errno(errp, errno, "failed to create socket");
++                goto error;
++            }
++            close(sock);
++
++            memset(&ifr, 0, sizeof(ifr));
++            pstrcpy(ifr.ifr_name, IF_NAMESIZE, info->value->name);
++            // memset(&ifp, 0, sizeof(ifp));
++            // memset(&ifd, 0, sizeof(ifd));
++
++            if (ifa->ifa_addr->sa_family == AF_LINK) {
++            	struct sockaddr_dl *sdl =
++            			(struct sockaddr_dl *)ifa->ifa_addr;
++
++                info->value->has_hardware_address = false;
++
++                if (sdl->sdl_type == IFT_ETHER &&
++                		sdl->sdl_alen == ETHER_ADDR_LEN) {
++                        snprintf(mac_addr, 18, "%s", ether_ntoa((struct ether_addr *)LLADDR(sdl)));
++                        info->value->has_hardware_address = true;
++                }
++                else
++                {
++                    info->value->has_hardware_address = true;
++                }
++                info->value->hardware_address = g_strdup_printf("%s", mac_addr);
++             }
++
++        }
++
++        if (ifa->ifa_addr &&
++            ifa->ifa_addr->sa_family == AF_INET) {
++            /* interface with IPv4 address */
++            p = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
++            if (!inet_ntop(AF_INET, p, addr4, sizeof(addr4))) {
++                error_setg_errno(errp, errno, "inet_ntop failed");
++                goto error;
++            }
++
++            address_item = g_malloc0(sizeof(*address_item));
++            address_item->value = g_malloc0(sizeof(*address_item->value));
++            address_item->value->ip_address = g_strdup(addr4);
++            address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4;
++
++            if (ifa->ifa_netmask) {
++                /* Count the number of set bits in netmask.
++                 * This is safe as '1' and '0' cannot be shuffled in netmask. */
++                p = &((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr;
++                address_item->value->prefix = ctpop32(((uint32_t *) p)[0]);
++            }
++        } else if (ifa->ifa_addr &&
++                   ifa->ifa_addr->sa_family == AF_INET6) {
++            /* interface with IPv6 address */
++            p = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
++            if (!inet_ntop(AF_INET6, p, addr6, sizeof(addr6))) {
++                error_setg_errno(errp, errno, "inet_ntop failed");
++                goto error;
++            }
++
++            address_item = g_malloc0(sizeof(*address_item));
++            address_item->value = g_malloc0(sizeof(*address_item->value));
++            address_item->value->ip_address = g_strdup(addr6);
++            address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6;
++
++            if (ifa->ifa_netmask) {
++                /* Count the number of set bits in netmask.
++                 * This is safe as '1' and '0' cannot be shuffled in netmask. */
++                p = &((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
++                address_item->value->prefix =
++                    ctpop32(((uint32_t *) p)[0]) +
++                    ctpop32(((uint32_t *) p)[1]) +
++                    ctpop32(((uint32_t *) p)[2]) +
++                    ctpop32(((uint32_t *) p)[3]);
++            }
++        }
++
++        if (!address_item) {
++            continue;
++        }
++
++        address_list = &info->value->ip_addresses;
++
++        while (*address_list && (*address_list)->next) {
++            address_list = &(*address_list)->next;
++        }
++
++        if (!*address_list) {
++            *address_list = address_item;
++        } else {
++            (*address_list)->next = address_item;
++        }
++
++        info->value->has_ip_addresses = true;
++
++        if (!info->value->has_statistics) {
++            interface_stat = g_malloc0(sizeof(*interface_stat));
++            if (guest_get_network_stats(info->value->name,
++                interface_stat) == -1) {
++                info->value->has_statistics = false;
++                g_free(interface_stat);
++            } else {
++                info->value->statistics = interface_stat;
++                info->value->has_statistics = true;
++            }
++        }
++    }
++
++    freeifaddrs(ifap);
++    return head;
++
++error:
++    freeifaddrs(ifap);
++    qapi_free_GuestNetworkInterfaceList(head);
++    return NULL;
++}
++#endif // BSD_GUEST_AGENT
++
++#ifndef BSD_GUEST_AGENT
+ GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+     return NULL;
+ }
++#else
++GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp)
++{
++    int64_t current;
++    GuestLogicalProcessorList *head, **link;
++    long sc_max;
++    Error *local_err = NULL;
++    int				Query[2];
++    int				NumCpu = 0;
++    size_t			Length = sizeof(NumCpu);
++    Query[0] = CTL_HW;
++    Query[1] = HW_NCPU;
+ 
++    current = 0;
++    head = NULL;
++    link = &head;
++    if (sysctl(Query, 2, &NumCpu, &Length, NULL, 0) == -1) {
++        error_setg(errp, "sysctl get CTL_HW.HW_NCPU failed");
++    }
++    sc_max = NumCpu;
++
++    while (local_err == NULL && current < sc_max) {
++        GuestLogicalProcessor *vcpu;
++        GuestLogicalProcessorList *entry;
++        int64_t id = current++;
++        // char *path = g_strdup_printf("/sys/devices/system/cpu/cpu%" PRId64 "/",
++        //                              id);
++
++        // if (g_file_test(path, G_FILE_TEST_EXISTS)) {
++        vcpu = g_malloc0(sizeof *vcpu);
++        vcpu->logical_id = id;
++        vcpu->has_can_offline = false; /* lolspeak ftw */
++        vcpu->online = true;
++        vcpu->can_offline = false;
++        // transfer_vcpu(vcpu, true, path, &local_err);
++        entry = g_malloc0(sizeof *entry);
++        entry->value = vcpu;
++        *link = entry;
++        link = &entry->next;
++        // }
++        // g_free(path);
++    }
++
++    if (local_err == NULL) {
++        /* there's no guest with zero VCPUs */
++        g_assert(head != NULL);
++        return head;
++    }
++
++    qapi_free_GuestLogicalProcessorList(head);
++    error_propagate(errp, local_err);
++    return NULL;
++}
++#endif // BSD_GUEST_AGENT
++
+ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp)
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+     return -1;
+ }
+ 
++#ifndef BSD_GUEST_AGENT
+ void qmp_guest_set_user_password(const char *username,
+                                  const char *password,
+                                  bool crypted,
+@@ -2651,7 +2924,114 @@ void qmp_guest_set_user_password(const char *username,
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+ }
++#else
++void qmp_guest_set_user_password(const char *username,
++                                 const char *password,
++                                 bool crypted,
++                                 Error **errp)
++{
++    Error *local_err = NULL;
++    char *pw_path = NULL;
++    pid_t pid;
++    int status;
++    int datafd[2] = { -1, -1 };
++    char *rawpasswddata = NULL;
++    size_t rawpasswdlen;
++    char *chpasswddata = NULL;
++    size_t chpasswdlen;
+ 
++    rawpasswddata = (char *)qbase64_decode(password, -1, &rawpasswdlen, errp);
++    if (!rawpasswddata) {
++        return;
++    }
++
++    rawpasswddata = g_renew(char, rawpasswddata, rawpasswdlen + 1);
++    rawpasswddata[rawpasswdlen] = '\0';
++
++    if (strchr(rawpasswddata, '\n')) {
++        error_setg(errp, "forbidden characters in raw password");
++        goto out;
++    }
++
++    if (strchr(username, '\n') ||
++        strchr(username, ':')) {
++        error_setg(errp, "forbidden characters in username");
++        goto out;
++    }
++
++    chpasswddata = g_strdup_printf("%s", rawpasswddata);
++    chpasswdlen = strlen(chpasswddata);
++
++    pw_path = g_find_program_in_path("pw");
++
++    if (!pw_path) {
++        error_setg(errp, "cannot find 'pw' program in PATH");
++        goto out;
++    }
++
++    if (pipe(datafd) < 0) {
++        error_setg(errp, "cannot create pipe FDs");
++        goto out;
++    }
++
++    pid = fork();
++    if (pid == 0) {
++        close(datafd[1]);
++        /* child */
++        setsid();
++        dup2(datafd[0], 0);
++        reopen_fd_to_null(1);
++        reopen_fd_to_null(2);
++
++        if (crypted) {
++            execle(pw_path, "pw", "usermod", username, "-H", "0", (char*)NULL, environ);
++        } else {
++            execle(pw_path, "pw", "usermod", username, "-h", "0", (char*)NULL, environ);
++        }
++        _exit(EXIT_FAILURE);
++    } else if (pid < 0) {
++        error_setg_errno(errp, errno, "failed to create child process");
++        goto out;
++    }
++    close(datafd[0]);
++    datafd[0] = -1;
++
++    if (qemu_write_full(datafd[1], chpasswddata, chpasswdlen) != chpasswdlen) {
++        error_setg_errno(errp, errno, "cannot write new account password");
++        goto out;
++    }
++    close(datafd[1]);
++    datafd[1] = -1;
++
++    ga_wait_child(pid, &status, &local_err);
++    if (local_err) {
++        error_propagate(errp, local_err);
++        goto out;
++    }
++
++    if (!WIFEXITED(status)) {
++        error_setg(errp, "child process has terminated abnormally");
++        goto out;
++    }
++
++    if (WEXITSTATUS(status)) {
++        error_setg(errp, "child process has failed to set user password");
++        goto out;
++    }
++
++out:
++    g_free(chpasswddata);
++    g_free(rawpasswddata);
++    g_free(pw_path);
++    if (datafd[0] != -1) {
++        close(datafd[0]);
++    }
++    if (datafd[1] != -1) {
++        close(datafd[1]);
++    }
++}
++#endif // BSD_GUEST_AGENT
++
+ GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp)
+ {
+     error_setg(errp, QERR_UNSUPPORTED);
+@@ -2675,12 +3055,240 @@ GuestMemoryBlockInfo *qmp_guest_get_memory_block_info(
+ 
+ #if !defined(CONFIG_FSFREEZE)

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103162330.12GNUm9r047188>