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>