FreeBSD Bugzilla – Attachment 223065 Details for
Bug 254105
[new port] emulators/qemu-guest-agent: QEMU Guest Agent for FreeBSD
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
emulators/qemu-guest-agent port shell archive
qemu-guest-agent.shar (text/plain), 55.28 KB, created by
aborche
on 2021-03-07 17:59:46 UTC
(
hide
)
Description:
emulators/qemu-guest-agent port shell archive
Filename:
MIME Type:
Creator:
aborche
Created:
2021-03-07 17:59:46 UTC
Size:
55.28 KB
patch
obsolete
>#!/bin/sh ># This is a shell archive >echo x qemu-guest-agent >mkdir -p qemu-guest-agent > /dev/null 2>&1 >echo x qemu-guest-agent/Makefile >sed 's/^X//' > qemu-guest-agent/Makefile << 'SHAR_END' >X# Created by: Kaltashkin Eugene <zhecka@gmail.com> >X# $FreeBSD$ >X >XPORTNAME= qemu >XDISTVERSION= 5.0.1 >XCATEGORIES= emulators >XMASTER_SITES= https://download.qemu.org/ >XPKGNAMESUFFIX= -guest-agent >X >XMAINTAINER= zhecka@gmail.com >XCOMMENT= QEMU guest-agent utilities >X >XLICENSE= GPLv2 >X >XDIST_SUBDIR= qemu/${PORTVERSION} >XFILESDIR= ${.CURDIR}/files >XHAS_CONFIGURE= yes >XUSES= gmake gnome pkgconfig python:build tar:xz >XUSE_GNOME= glib20 >XUSE_RC_SUBR= qemu-guest-agent >XMAKE_ENV+= BSD_MAKE="${MAKE}" PREFIX=${PREFIX} >X >XCONFLICTS_INSTALL= qemu-[0-9]* qemu-devel-* qemu-sbruno-* >XOPTIONS_EXCLUDE=SAMBA X11 GTK3 OPENGL GNUTLS SASL JPEG PNG CURL \ >X CDROM_DMA PCAP USBREDIR GNS3 X86_TARGETS DOCS\ >X STATIC_LINK NCURSES VDE >X >XPLIST= ${.CURDIR}/pkg-plist >XDESCR= ${.CURDIR}/pkg-descr >X >XCONFIGURE_ARGS?=--localstatedir=/var --extra-ldflags=-L\"${LOCALBASE}/lib\" \ >X --mandir=${MANPREFIX}/man \ >X --prefix=${PREFIX} --cc=${CC} --disable-kvm \ >X --python=${PYTHON_CMD} \ >X --extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"\"${PREFIX}\\\"\"\ -DBSD_GUEST_AGENT\ -DFREEBSD \ >X --disable-blobs \ >X --disable-system \ >X --disable-user \ >X --disable-linux-user \ >X --disable-bsd-user \ >X --disable-docs \ >X --enable-guest-agent \ >X --disable-guest-agent-msi \ >X --disable-pie \ >X --disable-modules \ >X --disable-module-upgrades \ >X --disable-debug-tcg \ >X --disable-debug-info \ >X --disable-sparse \ >X --disable-gnutls \ >X --disable-nettle \ >X --disable-gcrypt \ >X --disable-auth-pam \ >X --disable-sdl \ >X --disable-sdl-image \ >X --disable-gtk \ >X --disable-vte \ >X --disable-curses \ >X --disable-iconv \ >X --disable-vnc \ >X --disable-vnc-sasl \ >X --disable-vnc-jpeg \ >X --disable-vnc-png \ >X --disable-cocoa \ >X --disable-virtfs \ >X --disable-mpath \ >X --disable-xen \ >X --disable-xen-pci-passthrough \ >X --disable-brlapi \ >X --disable-curl \ >X --disable-membarrier \ >X --disable-fdt \ >X --disable-kvm \ >X --disable-hax \ >X --disable-hvf \ >X --disable-whpx \ >X --disable-rdma \ >X --disable-pvrdma \ >X --disable-vde \ >X --disable-netmap \ >X --disable-linux-aio \ >X --disable-linux-io-uring \ >X --disable-cap-ng \ >X --disable-attr \ >X --disable-vhost-net \ >X --disable-vhost-vsock \ >X --disable-vhost-scsi \ >X --disable-vhost-crypto \ >X --disable-vhost-kernel \ >X --disable-vhost-user \ >X --disable-spice \ >X --disable-rbd \ >X --disable-libiscsi \ >X --disable-libnfs \ >X --disable-smartcard \ >X --disable-libusb \ >X --disable-live-block-migration \ >X --disable-usb-redir \ >X --disable-lzo \ >X --disable-snappy \ >X --disable-bzip2 \ >X --disable-lzfse \ >X --disable-zstd \ >X --disable-seccomp \ >X --disable-coroutine-pool \ >X --disable-glusterfs \ >X --disable-tpm \ >X --disable-libssh \ >X --disable-numa \ >X --disable-libxml2 \ >X --disable-tcmalloc \ >X --disable-jemalloc \ >X --disable-avx2 \ >X --disable-avx512f \ >X --disable-replication \ >X --disable-opengl \ >X --disable-virglrenderer \ >X --disable-xfsctl \ >X --disable-qom-cast-debug \ >X --enable-tools \ >X --disable-vxhs \ >X --disable-bochs \ >X --disable-cloop \ >X --disable-dmg \ >X --disable-qcow1 \ >X --disable-vdi \ >X --disable-vvfat \ >X --disable-qed \ >X --disable-parallels \ >X --disable-sheepdog \ >X --disable-crypto-afalg \ >X --disable-capstone \ >X --disable-debug-mutex \ >X --disable-libpmem \ >X --disable-xkbcommon >X >Xpost-install: >X @${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/qemu-* >X @${RM} ${STAGEDIR}${PREFIX}/bin/qemu-nbd >X @${RM} ${STAGEDIR}${PREFIX}/bin/qemu-edid >X @${RM} ${STAGEDIR}${PREFIX}/bin/qemu-img >X @${RM} ${STAGEDIR}${PREFIX}/bin/qemu-io >X @${RMDIR} ${STAGEDIR}${DATADIR} >X ${MKDIR} ${STAGEDIR}${PREFIX}/qemu >X >X.include <bsd.port.options.mk> >X >X.if !defined(STRIP) || ${STRIP} == "" >XCONFIGURE_ARGS+=--disable-strip >X.endif >X >X.if ${ARCH} == "amd64" >XMAKE_ARGS+= ARCH=x86_64 >X.endif >X >X.if ${ARCH} == "powerpc" >XMAKE_ARGS+= ARCH=ppc >X.endif >X >X.if ${ARCH} == "powerpc64" >XMAKE_ARGS+= ARCH=ppc64 >X.endif >X >X.if ${ARCH} == "sparc64" >XCONFIGURE_ARGS+= --sparc_cpu=v9 >X.endif >X >X.if ${OSVERSION} < 1200000 >XPKGMESSAGE= ${.CURDIR}/pkg-message-11 >X.else >XPKGMESSAGE= ${.CURDIR}/pkg-message >X.endif >X >XPLIST_SUB+= LINUXBOOT_DMA="" >X >X# XXX need to disable usb host code on head while it's not ported to the >X# new usb stack yet >Xpost-configure: >X @${REINPLACE_CMD} -E \ >X -e "s|^(HOST_USB=)bsd|\1stub|" \ >X ${WRKSRC}/config-host.mak >X >X.include <bsd.port.mk> >SHAR_END >echo x qemu-guest-agent/README.md >sed 's/^X//' > qemu-guest-agent/README.md << 'SHAR_END' >X# QEMU Guest Agent >X >XQEMU Guest Agent version for FreeBSD guest >X >X## WARNING!!! >X >XThis port provides "as is". Some commands is not working, for example "fsfreeze". We try to make a patches for vcpu and fs features at FreeBSD. >XCommand reference and current command support status in FreeBSD can be found [here](https://github.com/aborche/qemu-guest-agent/blob/master/supported_command_reference.md) >XBe Careful. Port builds without any docs. >X >X## Supported systems >X >XPort tested at FreeBSD 12 >X >X## FreeBSD 11 issues >X >X*virtio_console* driver in FreeBSD 11 doesn't support aliasing virtio channels in devfs. Use direct path for control device. eq: >X >X``` >Xqemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log -p /dev/ttyV0.2" >X``` >X >X## Getting Started >X >XBefore using and compiling QEMU Guest Agent, make sure the module "virtio_console" is loaded >X >X### Prerequisites >X >XRun following command in console >X >X``` >X# kldload virtio_console >X``` >X >XFor permanent loading virtio_console driver add next line to /boot/loader.conf >X >X``` >Xvirtio_console_load="YES" >X``` >X >XAnd check filesystem contents >X >X``` >X# ls -al /dev/vtcon/ >Xtotal 1 >Xdr-xr-xr-x 2 root wheel 512 Oct 22 16:05 . >Xdr-xr-xr-x 11 root wheel 512 Oct 22 16:05 .. >Xlrwxr-xr-x 1 root wheel 10 Oct 22 16:05 com.redhat.spice.0 -> ../ttyV0.1 >Xlrwxr-xr-x 1 root wheel 10 Oct 22 16:05 org.qemu.guest_agent.0 -> ../ttyV0.2 >X``` >X >X### Installing >X >XClone this repo and run `make` and then `make install` >X >XAdd next lines to `/etc/rc.conf` file >X >X``` >Xqemu_guest_agent_enable="YES" >Xqemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log" >X``` >X >XFlags means: >X``` >X -d - daemon >X -v - verbose >X -l /var/log/qemu-ga.log - log all to file >X``` >X >XFor detailed help use `qemu-ga -h` >X >X## Run Agent >X >XAfter installing qemu-guest-agent, run it with command: >X >X``` >X# service qemu-guest-agent start >X``` >X >X## Check Logs >X >XNavigate to `/var/log` directory and check file `qemu-ga.log`. >XYou should see next log records. >X >X``` >X1540239465.752180: debug: disabling command: guest-suspend-disk >X1540239465.752205: debug: disabling command: guest-suspend-ram >X1540239465.752215: debug: disabling command: guest-suspend-hybrid >X1540239465.752241: debug: disabling command: guest-set-vcpus >X1540239465.752250: debug: disabling command: guest-get-memory-blocks >X1540239465.752259: debug: disabling command: guest-set-memory-blocks >X1540239465.752267: debug: disabling command: guest-get-memory-block-size >X1540239465.752285: debug: disabling command: guest-fsfreeze-status >X1540239465.752293: debug: disabling command: guest-fsfreeze-freeze >X1540239465.752302: debug: disabling command: guest-fsfreeze-freeze-list >X1540239465.752310: debug: disabling command: guest-fsfreeze-thaw >X1540239465.752327: debug: disabling command: guest-fstrim >X``` >X >X## Send commands from QEMU/KVM >X >XOpen console at Linux QEMU/KVM machine, locate name of FreeBSD virtual >Xmachine, and run command >X >X``` >X# virsh qemu-agent-command freebsd-nginx-12 '{"execute":"guest-get-osinfo"}' >X``` >X >XReturned string must be like >X >X``` >X{"return":{"kernel-release":"12.0-BETA1","kernel-version":"FreeBSD 12.0-BETA1 r339443 GENERIC","machine":"amd64"}} >X``` >X >XIf you get an error - check control port for qemu-ga at guest machine. >X >XAlso you can check `qemu-ga.log` for detailed info >X >X``` >X1540239784.932925: debug: read data, count: 59, data: {"execute":"guest-sync", "arguments":{"id":1540239785425}} >X >X1540239784.932996: debug: process_event: called >X1540239784.933100: debug: processing command >X1540239784.933182: debug: sending count: 26, data: [{"return": 1540239785425}] >X1540239784.933589: debug: read data, count: 31, data: {"execute":"guest-get-osinfo"} >X >X1540239784.933668: debug: process_event: called >X1540239784.933689: debug: processing command >X1540239784.934186: debug: sending count: 121, data: [{"return": {"kernel-release": "12.0-BETA1", "kernel-version": "FreeBSD 12.0-BETA1 r339443 GENERIC", "machine": "amd64"}}] >X``` >X >XIf you do not need verbose logging, just remove '-v' flag from qemu_guest_agent_flags section in `/etc/rc.conf` >X >X## QAPI command reference and struct >X >X* [qapi-schema](https://github.com/qemu/qemu/blob/master/qga/qapi-schema.json) >X >X## Port authors >X >X* **Kaltashkin Eugene** - [aborche](https://github.com/aborche) >X >X## License >X >XThis project is licensed under the BSD License - see the [LICENSE.md](LICENSE.md) file for details >X >SHAR_END >echo x qemu-guest-agent/distinfo >sed 's/^X//' > qemu-guest-agent/distinfo << 'SHAR_END' >XTIMESTAMP = 1603483758 >XSHA256 (qemu/5.0.1/qemu-5.0.1.tar.xz) = 135fab4c3699a378c9584b3453927e2f5002e440311f21efa66fc189d4bb4982 >XSIZE (qemu/5.0.1/qemu-5.0.1.tar.xz) = 62430168 >XSHA256 (qemu/5.0.1/55765822804f.patch) = 10c2cc93ad01b02d854e26a9e445ba22bb5434dda1ef25baeb979be6292fa8ef >XSIZE (qemu/5.0.1/55765822804f.patch) = 2271 >XSHA256 (qemu/5.0.1/aa4d30f6618d.patch) = eeddc5f5e08a460d2c133b4193d115fa1f00f206e0833f33ec66379981473efe >XSIZE (qemu/5.0.1/aa4d30f6618d.patch) = 2211 >SHAR_END >echo x qemu-guest-agent/files >mkdir -p qemu-guest-agent/files > /dev/null 2>&1 >echo x qemu-guest-agent/pkg-descr >sed 's/^X//' > qemu-guest-agent/pkg-descr << 'SHAR_END' >XQEMU Guest Agent for FreeBSD >X >XPort homepage https://github.com/aborche/qemu-guest-agent >X >XWWW: http://wiki.qemu.org/Main_Page >SHAR_END >echo x qemu-guest-agent/pkg-message >sed 's/^X//' > qemu-guest-agent/pkg-message << 'SHAR_END' >X[ >X{ type: install >X message: <<EOM >X======================================================= >XModify your `/etc/rc.conf` by adding these settings >X >Xqemu_guest_agent_enable="YES" >Xqemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log" >X >Xand run >X# service qemu-guest-agent start >X >XFor detailed help use `qemu-ga -h` >X======================================================= >XEOM >X} >X] >SHAR_END >echo x qemu-guest-agent/pkg-plist >sed 's/^X//' > qemu-guest-agent/pkg-plist << 'SHAR_END' >Xbin/qemu-ga >SHAR_END >echo x qemu-guest-agent/qemu-guest-agent-test.sh >sed 's/^X//' > qemu-guest-agent/qemu-guest-agent-test.sh << 'SHAR_END' >X#!/bin/sh >X >Xset -x >Xhost='freebsd12' >Xvirsh qemu-agent-command $host '{"execute":"guest-get-osinfo"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-get-timezone"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-get-users"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-get-host-name"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-network-get-interfaces"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-info"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-ping"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-get-time"}' | jq . >Xvirsh qemu-agent-command $host '{"execute":"guest-get-fsinfo"}' | jq . >SHAR_END >echo x qemu-guest-agent/qemu-guest-agent.in >ln -fs files/qemu-guest-agent.in qemu-guest-agent/qemu-guest-agent.in >echo x qemu-guest-agent/supported_command_reference.json >sed 's/^X//' > qemu-guest-agent/supported_command_reference.json << 'SHAR_END' >X{ >X "return": { >X "version": "2.12.0", >X "supported_commands": [ >X { >X "enabled": true, >X "name": "guest-get-osinfo", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-timezone", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-users", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-host-name", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-exec", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-exec-status", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-memory-block-info", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-set-memory-blocks", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-get-memory-blocks", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-set-user-password", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-fsinfo", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-set-vcpus", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-vcpus", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-network-get-interfaces", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-suspend-hybrid", >X "freebsd-support": false, >X "success-response": false >X }, >X { >X "enabled": false, >X "name": "guest-suspend-ram", >X "freebsd-support": false, >X "success-response": false >X }, >X { >X "enabled": false, >X "name": "guest-suspend-disk", >X "freebsd-support": false, >X "success-response": false >X }, >X { >X "enabled": false, >X "name": "guest-fstrim", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-fsfreeze-thaw", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-fsfreeze-freeze-list", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-fsfreeze-freeze", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": false, >X "name": "guest-fsfreeze-status", >X "freebsd-support": false, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-flush", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-seek", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-write", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-read", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-close", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-file-open", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-shutdown", >X "freebsd-support": true, >X "success-response": false >X }, >X { >X "enabled": true, >X "name": "guest-info", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-set-time", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-get-time", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-ping", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-sync", >X "freebsd-support": true, >X "success-response": true >X }, >X { >X "enabled": true, >X "name": "guest-sync-delimited", >X "freebsd-support": true, >X "success-response": true >X } >X ] >X } >X} >SHAR_END >echo x qemu-guest-agent/supported_command_reference.md >sed 's/^X//' > qemu-guest-agent/supported_command_reference.md << 'SHAR_END' >X| name | enabled | freebsd-support | success-response | >X|:--------------------------------|:----------|:------------------|:-------------------| >X| guest-get-osinfo | True | True | True | >X| guest-get-timezone | True | True | True | >X| guest-get-users | True | True | True | >X| guest-get-host-name | True | True | True | >X| guest-exec | True | True | True | >X| guest-exec-status | True | True | True | >X| ~~guest-get-memory-block-info~~ | True | **False** | True | >X| ~~guest-set-memory-blocks~~ | False | **False** | True | >X| ~~guest-get-memory-blocks~~ | False | **False** | True | >X| guest-set-user-password | True | True | True | >X| guest-get-fsinfo | True | True | True | >X| ~~guest-set-vcpus~~ | False | **False** | True | >X| guest-get-vcpus | True | True | True | >X| guest-network-get-interfaces | True | True | True | >X| ~~guest-suspend-hybrid~~ | False | **False** | False | >X| ~~guest-suspend-ram~~ | False | **False** | False | >X| ~~guest-suspend-disk~~ | False | **False** | False | >X| ~~guest-fstrim~~ | False | **False** | True | >X| ~~guest-fsfreeze-thaw~~ | False | **False** | True | >X| ~~guest-fsfreeze-freeze-list~~ | False | **False** | True | >X| ~~guest-fsfreeze-freeze~~ | False | **False** | True | >X| ~~guest-fsfreeze-status~~ | False | **False** | True | >X| guest-file-flush | True | True | True | >X| guest-file-seek | True | True | True | >X| guest-file-write | True | True | True | >X| guest-file-read | True | True | True | >X| guest-file-close | True | True | True | >X| guest-file-open | True | True | True | >X| guest-shutdown | True | True | False | >X| guest-info | True | True | True | >X| guest-set-time | True | True | True | >X| guest-get-time | True | True | True | >X| guest-ping | True | True | True | >X| guest-sync | True | True | True | >X| guest-sync-delimited | True | True | True | >SHAR_END >echo x qemu-guest-agent/pkg-message-11 >sed 's/^X//' > qemu-guest-agent/pkg-message-11 << 'SHAR_END' >X[ >X{ type: install >X message: <<EOM >X======================================================= >XModify your `/etc/rc.conf` by adding these settings >X >Xqemu_guest_agent_enable="YES" >Xqemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log" >X >Xand run >X# service qemu-guest-agent start >X >XFor FreeBSD less than 12 >X------------------------ >Xvirtio_console driver in FreeBSD 11 doesn't support aliasing virtio channels in devfs. Use direct path for control device. eq: >Xqemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log -p /dev/ttyV0.2" >X >XFor detailed help use `qemu-ga -h` >X >XAlso read port homepage https://github.com/aborche/qemu-guest-agent >X======================================================= >XEOM >X} >X] >SHAR_END >echo x qemu-guest-agent/files/patch-configure >sed 's/^X//' > qemu-guest-agent/files/patch-configure << 'SHAR_END' >X--- configure.orig 2020-09-15 19:31:13 UTC >X+++ configure >X@@ -360,7 +360,7 @@ >X sdl="" >X sdl_image="" >X virtfs="" >X-mpath="" >X+mpath="no" >X vnc="yes" >X sparse="no" >X vde="" >X@@ -408,7 +408,7 @@ >X modules="no" >X module_upgrades="no" >X prefix="/usr/local" >X-mandir="\${prefix}/share/man" >X+mandir="\${prefix}/man" >X datadir="\${prefix}/share" >X firmwarepath="\${prefix}/share/qemu-firmware" >X qemu_docdir="\${prefix}/share/doc/qemu" >X@@ -493,6 +493,9 @@ >X tcmalloc="no" >X jemalloc="no" >X replication="yes" >X+pcap="no" >X+pcap_create="no" >X+bpf="no" >X vxhs="" >X bochs="yes" >X cloop="yes" >X@@ -509,6 +512,7 @@ >X default_devices="yes" >X plugins="no" >X fuzzing="no" >X+libudev="no" >X >X supported_cpu="no" >X supported_os="no" >X@@ -904,7 +908,7 @@ >X kvm="yes" >X QEMU_INCLUDES="-isystem \$(SRC_PATH)/linux-headers -isystem $PWD/linux-headers $QEMU_INCLUDES" >X supported_os="yes" >X- libudev="yes" >X+ libudev="no" >X ;; >X esac >X >X@@ -1168,6 +1172,10 @@ >X ;; >X --enable-vnc-png) vnc_png="yes" >X ;; >X+ --enable-pcap) pcap="yes" >X+ ;; >X+ --disable-pcap) pcap="no" >X+ ;; >X --disable-slirp) slirp="no" >X ;; >X --enable-slirp=git) slirp="git" >X@@ -3137,6 +3145,14 @@ >X fi >X >X ########################################## >X+# getifaddrs (for tests/test-io-channel-socket ) >X+ >X+have_ifaddrs_h=yes >X+if ! check_include "ifaddrs.h" ; then >X+ have_ifaddrs_h=no >X+fi >X+ >X+########################################## >X # VTE probe >X >X if test "$vte" != "no"; then >X@@ -3806,7 +3822,7 @@ >X glib_libs=$($pkg_config --libs $i) >X QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS" >X LIBS="$glib_libs $LIBS" >X- libs_qga="$glib_libs $libs_qga" >X+ libs_qga="$glib_libs -lintl $libs_qga" >X else >X error_exit "glib-$glib_req_ver $i is required to compile QEMU" >X fi >X@@ -3926,7 +3942,7 @@ >X ########################################## >X # pixman support probe >X >X-if test "$want_tools" = "no" && test "$softmmu" = "no"; then >X+if test "$softmmu" = "no"; then >X pixman_cflags= >X pixman_libs= >X elif $pkg_config --atleast-version=0.21.8 pixman-1 > /dev/null 2>&1; then >X@@ -4957,14 +4973,6 @@ >X fi >X if has makeinfo && has pod2man && test "$sphinx_ok" = "yes"; then >X docs=yes >X- else >X- if test "$docs" = "yes" ; then >X- if has $sphinx_build && test "$sphinx_ok" != "yes"; then >X- echo "Warning: $sphinx_build exists but it is either too old or uses too old a Python version" >&2 >X- fi >X- feature_not_found "docs" "Install texinfo, Perl/perl-podlators and a Python 3 version of python-sphinx" >X- fi >X- docs=no >X fi >X fi >X >X@@ -5098,7 +5106,7 @@ >X >X # check for libusb >X if test "$libusb" != "no" ; then >X- if $pkg_config --atleast-version=1.0.13 libusb-1.0; then >X+ if $pkg_config libusb-1.0; then >X libusb="yes" >X libusb_cflags=$($pkg_config --cflags libusb-1.0) >X libusb_libs=$($pkg_config --libs libusb-1.0) >X@@ -5501,7 +5509,51 @@ >X fi >X fi >X >X+########################################## >X+# pcap probe >X >X+if test "$pcap" = "yes" -a "$pcap" != "no"; then >X+ cat > $TMPC << EOF >X+#include <pcap.h> >X+int main(void) { return (pcap_lib_version() == (char *)0 ? 1 : 0); } >X+EOF >X+ if test "$mingw32" = "no" ; then >X+ libpcap=-lpcap >X+ else >X+ libpcap=-lwpcap >X+ fi >X+ if compile_prog "" "$libpcap" ; then >X+ : >X+ else >X+ echo >X+ echo "Error: Could not find pcap" >X+ echo "Make sure to have the pcap libs and headers installed." >X+ echo >X+ exit 1 >X+ fi >X+ cat > $TMPC << EOF >X+#include <pcap.h> >X+int main(void) >X+{ >X+ char errbuf[PCAP_ERRBUF_SIZE]; >X+ return (pcap_create("foo", errbuf) == (pcap_t *)0 ? 1 : 0); >X+} >X+EOF >X+ if compile_prog "" "$libpcap" ; then >X+ pcap_create="yes" >X+ fi >X+ cat > $TMPC << EOF >X+#define PCAP_DONT_INCLUDE_PCAP_BPF_H >X+#include <pcap.h> >X+#include <net/bpf.h> >X+int main(void) { return (BPF_MAJOR_VERSION); } >X+EOF >X+ if compile_prog ; then >X+ bpf="yes" >X+ fi >X+ libs_softmmu="$libpcap $libs_softmmu" >X+fi # test "$pcap" >X+ >X ########################################## >X # check if we have open_by_handle_at >X >X@@ -6627,6 +6679,7 @@ >X echo "Block whitelist (rw) $block_drv_rw_whitelist" >X echo "Block whitelist (ro) $block_drv_ro_whitelist" >X echo "VirtFS support $virtfs" >X+echo "pcap support $pcap" >X echo "Multipath support $mpath" >X echo "VNC support $vnc" >X if test "$vnc" = "yes" ; then >X@@ -6864,6 +6917,15 @@ >X if test "$want_tools" = "yes" ; then >X echo "CONFIG_TOOLS=y" >> $config_host_mak >X fi >X+if test "$pcap" = "yes" ; then >X+ echo "CONFIG_PCAP=y" >> $config_host_mak >X+ if test "$pcap_create" = "yes" ; then >X+ echo "CONFIG_PCAP_CREATE=y" >> $config_host_mak >X+ fi >X+ if test "$bpf" = "yes" ; then >X+ echo "CONFIG_BPF=y" >> $config_host_mak >X+ fi >X+fi >X if test "$slirp" != "no"; then >X echo "CONFIG_SLIRP=y" >> $config_host_mak >X echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak >X@@ -7120,6 +7182,9 @@ >X # if this macro is set. >X if test "$have_fsxattr" = "yes" ; then >X echo "HAVE_FSXATTR=y" >> $config_host_mak >X+fi >X+if test "$have_ifaddrs_h" = "yes" ; then >X+ echo "HAVE_IFADDRS_H=y" >> $config_host_mak >X fi >X if test "$have_copy_file_range" = "yes" ; then >X echo "HAVE_COPY_FILE_RANGE=y" >> $config_host_mak >SHAR_END >echo x qemu-guest-agent/files/patch-Makefile >sed 's/^X//' > qemu-guest-agent/files/patch-Makefile << 'SHAR_END' >X--- Makefile.orig 2020-09-15 19:31:13 UTC >X+++ Makefile >X@@ -361,29 +361,6 @@ >X MANUAL_BUILDDIR := docs >X endif >X >X-ifdef BUILD_DOCS >X-DOCS+=$(MANUAL_BUILDDIR)/system/qemu.1 >X-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-img.1 >X-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-nbd.8 >X-DOCS+=$(MANUAL_BUILDDIR)/interop/qemu-ga.8 >X-ifeq ($(CONFIG_LINUX)$(CONFIG_SECCOMP)$(CONFIG_LIBCAP_NG),yyy) >X-DOCS+=$(MANUAL_BUILDDIR)/tools/virtiofsd.1 >X-endif >X-DOCS+=$(MANUAL_BUILDDIR)/system/qemu-block-drivers.7 >X-DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7 >X-DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7 >X-DOCS+=$(MANUAL_BUILDDIR)/system/qemu-cpu-models.7 >X-DOCS+=$(MANUAL_BUILDDIR)/index.html >X-ifdef CONFIG_VIRTFS >X-DOCS+=$(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1 >X-endif >X-ifdef CONFIG_TRACE_SYSTEMTAP >X-DOCS+=$(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1 >X-endif >X-else >X-DOCS= >X-endif >X- >X SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR) >X SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(filter %-softmmu, $(TARGET_DIRS))) >X SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %.d, $(SUBDIR_DEVICES_MAK)) >X@@ -878,10 +855,6 @@ >X $(call install-manual,user) >X >X install-doc: $(DOCS) install-sphinxdocs >X- $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)" >X- $(INSTALL_DATA) $(MANUAL_BUILDDIR)/index.html "$(DESTDIR)$(qemu_docdir)" >X- $(INSTALL_DATA) docs/interop/qemu-qmp-ref.html "$(DESTDIR)$(qemu_docdir)" >X- $(INSTALL_DATA) docs/interop/qemu-qmp-ref.txt "$(DESTDIR)$(qemu_docdir)" >X ifdef CONFIG_POSIX >X $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1" >X $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu.1 "$(DESTDIR)$(mandir)/man1" >X@@ -889,21 +862,10 @@ >X $(INSTALL_DATA) docs/interop/qemu-qmp-ref.7 "$(DESTDIR)$(mandir)/man7" >X $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-block-drivers.7 "$(DESTDIR)$(mandir)/man7" >X $(INSTALL_DATA) $(MANUAL_BUILDDIR)/system/qemu-cpu-models.7 "$(DESTDIR)$(mandir)/man7" >X-ifeq ($(CONFIG_TOOLS),y) >X- $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-img.1 "$(DESTDIR)$(mandir)/man1" >X- $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8" >X- $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-nbd.8 "$(DESTDIR)$(mandir)/man8" >X-endif >X ifdef CONFIG_TRACE_SYSTEMTAP >X $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/qemu-trace-stap.1 "$(DESTDIR)$(mandir)/man1" >X endif >X-ifneq (,$(findstring qemu-ga,$(TOOLS))) >X- $(INSTALL_DATA) $(MANUAL_BUILDDIR)/interop/qemu-ga.8 "$(DESTDIR)$(mandir)/man8" >X- $(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)" >X- $(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)" >X- $(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7" >X endif >X-endif >X ifdef CONFIG_VIRTFS >X $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1" >X $(INSTALL_DATA) $(MANUAL_BUILDDIR)/tools/virtfs-proxy-helper.1 "$(DESTDIR)$(mandir)/man1" >X@@ -927,7 +889,7 @@ >X install-includedir: >X $(INSTALL_DIR) "$(DESTDIR)$(includedir)" >X >X-install: all $(if $(BUILD_DOCS),install-doc) \ >X+install: all \ >X install-datadir install-localstatedir install-includedir \ >X $(if $(INSTALL_BLOBS),$(edk2-decompressed)) \ >X recurse-install >X@@ -974,31 +936,12 @@ >X "$(DESTDIR)$(qemu_datadir)/firmware/$$x"; \ >X done >X endif >X- for s in $(ICON_SIZES); do \ >X- mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps"; \ >X- $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_$${s}.png \ >X- "$(DESTDIR)$(qemu_icondir)/hicolor/$${s}/apps/qemu.png"; \ >X- done; \ >X- mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps"; \ >X- $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_32x32.bmp \ >X- "$(DESTDIR)$(qemu_icondir)/hicolor/32x32/apps/qemu.bmp"; \ >X- mkdir -p "$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps"; \ >X- $(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu.svg \ >X- "$(DESTDIR)$(qemu_icondir)/hicolor/scalable/apps/qemu.svg" >X- mkdir -p "$(DESTDIR)$(qemu_desktopdir)" >X- $(INSTALL_DATA) $(SRC_PATH)/ui/qemu.desktop \ >X- "$(DESTDIR)$(qemu_desktopdir)/qemu.desktop" >X ifdef CONFIG_GTK >X $(MAKE) -C po $@ >X endif >X ifeq ($(CONFIG_PLUGIN),y) >X $(INSTALL_DATA) $(SRC_PATH)/include/qemu/qemu-plugin.h "$(DESTDIR)$(includedir)/qemu-plugin.h" >X endif >X- $(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps" >X- set -e; for x in $(KEYMAPS); do \ >X- $(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \ >X- done >X- $(INSTALL_DATA) $(BUILD_DIR)/trace-events-all "$(DESTDIR)$(qemu_datadir)/trace-events-all" >X >X .PHONY: ctags >X ctags: >SHAR_END >echo x qemu-guest-agent/files/qemu-guest-agent.in >sed 's/^X//' > qemu-guest-agent/files/qemu-guest-agent.in << 'SHAR_END' >X#!/bin/sh >X# >X# PROVIDE: qemu_guest_agent >X# REQUIRE: DAEMON >X# KEYWORD: nojail >X# >X >X# >X# Add the following lines to /etc/rc.conf to enable qemu-guest-agent: >X# >X#qemu_guest_agent_enable="YES" >X# >X# For detailed logging add flags -v and -l to /etc/rc.conf >X# >X#qemu_guest_agent_flags="-d -v -l /var/log/qemu-ga.log" >X >X. /etc/rc.subr >X >Xname=qemu_guest_agent >Xrcvar=qemu_guest_agent_enable >X >Xload_rc_config $name >X >Xqemu_guest_agent_flags=${qemu_guest_agent_flags-"-d"} >Xqemu_guest_agent_enable=${qemu_guest_agent_enable:-"NO"} >X >Xqemu_guest_agent_bin=/usr/local/bin/qemu-ga >Xcommand=${qemu_guest_agent_bin} >Xpidfile="/var/run/qemu-ga.pid" >X >Xrun_rc_command "$1" >SHAR_END >echo x qemu-guest-agent/files/patch-qga_commands-posix.c >sed 's/^X//' > qemu-guest-agent/files/patch-qga_commands-posix.c << 'SHAR_END' >X--- qga/commands-posix.c.orig 2020-09-15 16:31:14 UTC >X+++ qga/commands-posix.c >X@@ -28,6 +28,21 @@ >X #include "qemu/cutils.h" >X #include "commands-common.h" >X >X+#ifdef BSD_GUEST_AGENT >X+#include <ifaddrs.h> >X+#include <arpa/inet.h> >X+#include <sys/socket.h> >X+#include <sys/sysctl.h> >X+#include <net/if.h> >X+#include <sys/socket.h> >X+#include <ifaddrs.h> >X+#include <sys/statvfs.h> >X+#include <net/if_dl.h> >X+#include <net/if_types.h> >X+#include <net/ethernet.h> >X+#include <net/if_var.h> >X+#endif >X+ >X #ifdef HAVE_UTMPX >X #include <utmpx.h> >X #endif >X@@ -85,14 +100,25 @@ void qmp_guest_shutdown(bool has_mode, const char *mod >X { >X const char *shutdown_flag; >X Error *local_err = NULL; >X+#ifdef BSD_GUEST_AGENT >X+ char *shutdown_mode; >X+#endif // BSD_GUEST_AGENT >X pid_t pid; >X int status; >X >X slog("guest-shutdown called, mode: %s", mode); >X if (!has_mode || strcmp(mode, "powerdown") == 0) { >X+#ifdef BSD_GUEST_AGENT >X+ shutdown_flag = "-p"; >X+#else >X shutdown_flag = "-P"; >X+#endif // BSD_GUEST_AGENT >X } else if (strcmp(mode, "halt") == 0) { >X+#ifdef BSD_GUEST_AGENT >X+ shutdown_flag = "-h"; >X+#else >X shutdown_flag = "-H"; >X+#endif // BSD_GUEST_AGENT >X } else if (strcmp(mode, "reboot") == 0) { >X shutdown_flag = "-r"; >X } else { >X@@ -108,9 +134,15 @@ void qmp_guest_shutdown(bool has_mode, const char *mod >X reopen_fd_to_null(0); >X reopen_fd_to_null(1); >X reopen_fd_to_null(2); >X+#ifdef BSD_GUEST_AGENT >X+ shutdown_mode = g_strdup_printf("hypervisor initiated %s", mode); >X >X+ execle("/sbin/shutdown", "-h", shutdown_flag, "+0", >X+ shutdown_mode, (char*)NULL, environ); >X+#else >X execle("/sbin/shutdown", "shutdown", "-h", shutdown_flag, "+0", >X "hypervisor initiated shutdown", (char*)NULL, environ); >X+#endif // BSD_GUEST_AGENT >X _exit(EXIT_FAILURE); >X } else if (pid < 0) { >X error_setg_errno(errp, errno, "failed to create child process"); >X@@ -153,9 +185,11 @@ int64_t qmp_guest_get_time(Error **errp) >X void qmp_guest_set_time(bool has_time, int64_t time_ns, Error **errp) >X { >X int ret; >X+#ifndef BSD_GUEST_AGENT >X int status; >X pid_t pid; >X Error *local_err = NULL; >X+#endif >X struct timeval tv; >X static const char hwclock_path[] = "/sbin/hwclock"; >X static int hwclock_available = -1; >X@@ -193,7 +227,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns >X return; >X } >X } >X- >X+#ifndef BSD_GUEST_AGENT >X /* Now, if user has passed a time to set and the system time is set, we >X * just need to synchronize the hardware clock. However, if no time was >X * passed, user is requesting the opposite: set the system time from the >X@@ -230,6 +264,7 @@ void qmp_guest_set_time(bool has_time, int64_t time_ns >X error_setg(errp, "hwclock failed to set hardware clock to system time"); >X return; >X } >X+#endif // BSD_GUEST_AGENT >X } >X >X typedef enum { >X@@ -2625,25 +2660,263 @@ void qmp_guest_suspend_hybrid(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X } >X- >X+#ifndef BSD_GUEST_AGENT >X GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X return NULL; >X } >X+#else >X+static GuestNetworkInterfaceList * >X+guest_find_interface(GuestNetworkInterfaceList *head, >X+ const char *name) >X+{ >X+ for (; head; head = head->next) { >X+ if (strcmp(head->value->name, name) == 0) { >X+ break; >X+ } >X+ } >X >X+ return head; >X+} >X+ >X+static int guest_get_network_stats(const char *name, >X+ GuestNetworkInterfaceStat *stats) >X+{ >X+ return -1; >X+} >X+ >X+GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp) >X+{ >X+ GuestNetworkInterfaceList *head = NULL, *cur_item = NULL; >X+ struct ifaddrs *ifap, *ifa; >X+ >X+ if (getifaddrs(&ifap) < 0) { >X+ error_setg_errno(errp, errno, "getifaddrs failed"); >X+ goto error; >X+ } >X+ >X+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { >X+ GuestNetworkInterfaceList *info; >X+ GuestIpAddressList **address_list = NULL, *address_item = NULL; >X+ GuestNetworkInterfaceStat *interface_stat = NULL; >X+ char addr4[INET_ADDRSTRLEN]; >X+ char addr6[INET6_ADDRSTRLEN]; >X+ int sock; >X+ struct ifreq ifr; >X+ // struct ifnet ifp; >X+ // struct if_data ifd; >X+ // unsigned char *mac_addr; >X+ char mac_addr[18]="00:00:00:00:00:00"; // = char[18]; >X+ void *p; >X+ >X+ g_debug("Processing %s interface", ifa->ifa_name); >X+ >X+ info = guest_find_interface(head, ifa->ifa_name); >X+ >X+ if (!info) { >X+ info = g_malloc0(sizeof(*info)); >X+ info->value = g_malloc0(sizeof(*info->value)); >X+ info->value->name = g_strdup(ifa->ifa_name); >X+ >X+ if (!cur_item) { >X+ head = cur_item = info; >X+ } else { >X+ cur_item->next = info; >X+ cur_item = info; >X+ } >X+ } >X+ >X+ if (!info->value->has_hardware_address && >X+ ifa->ifa_flags & SIOCGHWADDR) { >X+ /* we haven't obtained HW address yet */ >X+ sock = socket(PF_INET, SOCK_STREAM, 0); >X+ if (sock == -1) { >X+ error_setg_errno(errp, errno, "failed to create socket"); >X+ goto error; >X+ } >X+ close(sock); >X+ >X+ memset(&ifr, 0, sizeof(ifr)); >X+ pstrcpy(ifr.ifr_name, IF_NAMESIZE, info->value->name); >X+ // memset(&ifp, 0, sizeof(ifp)); >X+ // memset(&ifd, 0, sizeof(ifd)); >X+ >X+ if (ifa->ifa_addr->sa_family == AF_LINK) { >X+ struct sockaddr_dl *sdl = >X+ (struct sockaddr_dl *)ifa->ifa_addr; >X+ >X+ info->value->has_hardware_address = false; >X+ >X+ if (sdl->sdl_type == IFT_ETHER && >X+ sdl->sdl_alen == ETHER_ADDR_LEN) { >X+ snprintf(mac_addr, 18, "%s", ether_ntoa((struct ether_addr *)LLADDR(sdl))); >X+ info->value->has_hardware_address = true; >X+ } >X+ else >X+ { >X+ info->value->has_hardware_address = true; >X+ } >X+ info->value->hardware_address = g_strdup_printf("%s", mac_addr); >X+ } >X+ >X+ } >X+ >X+ if (ifa->ifa_addr && >X+ ifa->ifa_addr->sa_family == AF_INET) { >X+ /* interface with IPv4 address */ >X+ p = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; >X+ if (!inet_ntop(AF_INET, p, addr4, sizeof(addr4))) { >X+ error_setg_errno(errp, errno, "inet_ntop failed"); >X+ goto error; >X+ } >X+ >X+ address_item = g_malloc0(sizeof(*address_item)); >X+ address_item->value = g_malloc0(sizeof(*address_item->value)); >X+ address_item->value->ip_address = g_strdup(addr4); >X+ address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4; >X+ >X+ if (ifa->ifa_netmask) { >X+ /* Count the number of set bits in netmask. >X+ * This is safe as '1' and '0' cannot be shuffled in netmask. */ >X+ p = &((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr; >X+ address_item->value->prefix = ctpop32(((uint32_t *) p)[0]); >X+ } >X+ } else if (ifa->ifa_addr && >X+ ifa->ifa_addr->sa_family == AF_INET6) { >X+ /* interface with IPv6 address */ >X+ p = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; >X+ if (!inet_ntop(AF_INET6, p, addr6, sizeof(addr6))) { >X+ error_setg_errno(errp, errno, "inet_ntop failed"); >X+ goto error; >X+ } >X+ >X+ address_item = g_malloc0(sizeof(*address_item)); >X+ address_item->value = g_malloc0(sizeof(*address_item->value)); >X+ address_item->value->ip_address = g_strdup(addr6); >X+ address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6; >X+ >X+ if (ifa->ifa_netmask) { >X+ /* Count the number of set bits in netmask. >X+ * This is safe as '1' and '0' cannot be shuffled in netmask. */ >X+ p = &((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr; >X+ address_item->value->prefix = >X+ ctpop32(((uint32_t *) p)[0]) + >X+ ctpop32(((uint32_t *) p)[1]) + >X+ ctpop32(((uint32_t *) p)[2]) + >X+ ctpop32(((uint32_t *) p)[3]); >X+ } >X+ } >X+ >X+ if (!address_item) { >X+ continue; >X+ } >X+ >X+ address_list = &info->value->ip_addresses; >X+ >X+ while (*address_list && (*address_list)->next) { >X+ address_list = &(*address_list)->next; >X+ } >X+ >X+ if (!*address_list) { >X+ *address_list = address_item; >X+ } else { >X+ (*address_list)->next = address_item; >X+ } >X+ >X+ info->value->has_ip_addresses = true; >X+ >X+ if (!info->value->has_statistics) { >X+ interface_stat = g_malloc0(sizeof(*interface_stat)); >X+ if (guest_get_network_stats(info->value->name, >X+ interface_stat) == -1) { >X+ info->value->has_statistics = false; >X+ g_free(interface_stat); >X+ } else { >X+ info->value->statistics = interface_stat; >X+ info->value->has_statistics = true; >X+ } >X+ } >X+ } >X+ >X+ freeifaddrs(ifap); >X+ return head; >X+ >X+error: >X+ freeifaddrs(ifap); >X+ qapi_free_GuestNetworkInterfaceList(head); >X+ return NULL; >X+} >X+#endif // BSD_GUEST_AGENT >X+ >X+#ifndef BSD_GUEST_AGENT >X GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X return NULL; >X } >X+#else >X+GuestLogicalProcessorList *qmp_guest_get_vcpus(Error **errp) >X+{ >X+ int64_t current; >X+ GuestLogicalProcessorList *head, **link; >X+ long sc_max; >X+ Error *local_err = NULL; >X+ int Query[2]; >X+ int NumCpu = 0; >X+ size_t Length = sizeof(NumCpu); >X+ Query[0] = CTL_HW; >X+ Query[1] = HW_NCPU; >X >X+ current = 0; >X+ head = NULL; >X+ link = &head; >X+ if (sysctl(Query, 2, &NumCpu, &Length, NULL, 0) == -1) { >X+ error_setg(errp, "sysctl get CTL_HW.HW_NCPU failed"); >X+ } >X+ sc_max = NumCpu; >X+ >X+ while (local_err == NULL && current < sc_max) { >X+ GuestLogicalProcessor *vcpu; >X+ GuestLogicalProcessorList *entry; >X+ int64_t id = current++; >X+ // char *path = g_strdup_printf("/sys/devices/system/cpu/cpu%" PRId64 "/", >X+ // id); >X+ >X+ // if (g_file_test(path, G_FILE_TEST_EXISTS)) { >X+ vcpu = g_malloc0(sizeof *vcpu); >X+ vcpu->logical_id = id; >X+ vcpu->has_can_offline = false; /* lolspeak ftw */ >X+ vcpu->online = true; >X+ vcpu->can_offline = false; >X+ // transfer_vcpu(vcpu, true, path, &local_err); >X+ entry = g_malloc0(sizeof *entry); >X+ entry->value = vcpu; >X+ *link = entry; >X+ link = &entry->next; >X+ // } >X+ // g_free(path); >X+ } >X+ >X+ if (local_err == NULL) { >X+ /* there's no guest with zero VCPUs */ >X+ g_assert(head != NULL); >X+ return head; >X+ } >X+ >X+ qapi_free_GuestLogicalProcessorList(head); >X+ error_propagate(errp, local_err); >X+ return NULL; >X+} >X+#endif // BSD_GUEST_AGENT >X+ >X int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X return -1; >X } >X >X+#ifndef BSD_GUEST_AGENT >X void qmp_guest_set_user_password(const char *username, >X const char *password, >X bool crypted, >X@@ -2651,7 +2924,114 @@ void qmp_guest_set_user_password(const char *username, >X { >X error_setg(errp, QERR_UNSUPPORTED); >X } >X+#else >X+void qmp_guest_set_user_password(const char *username, >X+ const char *password, >X+ bool crypted, >X+ Error **errp) >X+{ >X+ Error *local_err = NULL; >X+ char *pw_path = NULL; >X+ pid_t pid; >X+ int status; >X+ int datafd[2] = { -1, -1 }; >X+ char *rawpasswddata = NULL; >X+ size_t rawpasswdlen; >X+ char *chpasswddata = NULL; >X+ size_t chpasswdlen; >X >X+ rawpasswddata = (char *)qbase64_decode(password, -1, &rawpasswdlen, errp); >X+ if (!rawpasswddata) { >X+ return; >X+ } >X+ >X+ rawpasswddata = g_renew(char, rawpasswddata, rawpasswdlen + 1); >X+ rawpasswddata[rawpasswdlen] = '\0'; >X+ >X+ if (strchr(rawpasswddata, '\n')) { >X+ error_setg(errp, "forbidden characters in raw password"); >X+ goto out; >X+ } >X+ >X+ if (strchr(username, '\n') || >X+ strchr(username, ':')) { >X+ error_setg(errp, "forbidden characters in username"); >X+ goto out; >X+ } >X+ >X+ chpasswddata = g_strdup_printf("%s", rawpasswddata); >X+ chpasswdlen = strlen(chpasswddata); >X+ >X+ pw_path = g_find_program_in_path("pw"); >X+ >X+ if (!pw_path) { >X+ error_setg(errp, "cannot find 'pw' program in PATH"); >X+ goto out; >X+ } >X+ >X+ if (pipe(datafd) < 0) { >X+ error_setg(errp, "cannot create pipe FDs"); >X+ goto out; >X+ } >X+ >X+ pid = fork(); >X+ if (pid == 0) { >X+ close(datafd[1]); >X+ /* child */ >X+ setsid(); >X+ dup2(datafd[0], 0); >X+ reopen_fd_to_null(1); >X+ reopen_fd_to_null(2); >X+ >X+ if (crypted) { >X+ execle(pw_path, "pw", "usermod", username, "-H", "0", (char*)NULL, environ); >X+ } else { >X+ execle(pw_path, "pw", "usermod", username, "-h", "0", (char*)NULL, environ); >X+ } >X+ _exit(EXIT_FAILURE); >X+ } else if (pid < 0) { >X+ error_setg_errno(errp, errno, "failed to create child process"); >X+ goto out; >X+ } >X+ close(datafd[0]); >X+ datafd[0] = -1; >X+ >X+ if (qemu_write_full(datafd[1], chpasswddata, chpasswdlen) != chpasswdlen) { >X+ error_setg_errno(errp, errno, "cannot write new account password"); >X+ goto out; >X+ } >X+ close(datafd[1]); >X+ datafd[1] = -1; >X+ >X+ ga_wait_child(pid, &status, &local_err); >X+ if (local_err) { >X+ error_propagate(errp, local_err); >X+ goto out; >X+ } >X+ >X+ if (!WIFEXITED(status)) { >X+ error_setg(errp, "child process has terminated abnormally"); >X+ goto out; >X+ } >X+ >X+ if (WEXITSTATUS(status)) { >X+ error_setg(errp, "child process has failed to set user password"); >X+ goto out; >X+ } >X+ >X+out: >X+ g_free(chpasswddata); >X+ g_free(rawpasswddata); >X+ g_free(pw_path); >X+ if (datafd[0] != -1) { >X+ close(datafd[0]); >X+ } >X+ if (datafd[1] != -1) { >X+ close(datafd[1]); >X+ } >X+} >X+#endif // BSD_GUEST_AGENT >X+ >X GuestMemoryBlockList *qmp_guest_get_memory_blocks(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X@@ -2675,12 +3055,240 @@ GuestMemoryBlockInfo *qmp_guest_get_memory_block_info( >X >X #if !defined(CONFIG_FSFREEZE) >X >X+#ifndef BSD_GUEST_AGENT >X GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X return NULL; >X } >X+#else >X >X+/* ===================================================================== */ >X+typedef struct FsMount { >X+ char *dirname; >X+ char *devtype; >X+ char *size; >X+ char *used; >X+ char *free; >X+ char *load; >X+ char *mntpoint; >X+ unsigned int devmajor, devminor; >X+ QTAILQ_ENTRY(FsMount) next; >X+} FsMount; >X+ >X+typedef QTAILQ_HEAD(FsMountList, FsMount) FsMountList; >X+ >X+static void free_fs_mount_list(FsMountList *mounts) >X+{ >X+ FsMount *mount, *temp; >X+ >X+ if (!mounts) { >X+ return; >X+ } >X+ >X+ QTAILQ_FOREACH_SAFE(mount, mounts, next, temp) { >X+ QTAILQ_REMOVE(mounts, mount, next); >X+ g_free(mount->dirname); >X+ g_free(mount->devtype); >X+ g_free(mount->size); >X+ g_free(mount->used); >X+ g_free(mount->free); >X+ g_free(mount->load); >X+ g_free(mount->mntpoint); >X+ g_free(mount); >X+ } >X+} >X+ >X+ >X+#define BUFSIZE 2048 >X+ >X+static void build_fs_mount_list(FsMountList *mounts, Error **errp) >X+{ >X+ FsMount *mount; >X+ char const *dfcmd = "/bin/df -hT"; >X+ //char buf[BUFSIZE]; >X+ >X+ FILE *fp; >X+ char *line = NULL; >X+ //, *dash; >X+ size_t n; >X+ int ret; >X+ //, dir_s, dir_e, type_s, type_e, dev_s, dev_e; >X+ char dev_name[30], fstype[10], size[10], used[10], free[10], load[10], mounted[30]; >X+ //int dev_name, fstype, size, used, free, load, mounted; >X+ >X+ if ((fp = popen(dfcmd, "r")) == NULL) { >X+ g_debug("Cannot open '%s'!!\n", dfcmd); >X+ return; >X+ } >X+ while (getline(&line, &n, fp) != -1) { >X+ //g_debug("line '%s'", line); >X+ ret = sscanf(line, "%s%s%s%s%s%s%s", >X+ dev_name, fstype, size, used, free, load, mounted); >X+ if (g_str_equal(dev_name, "Filesystem") >X+ ||g_str_equal(fstype,"devfs") >X+ ||g_str_equal(fstype,"procfs") >X+ ||g_str_equal(fstype,"fdescfs")) { >X+ continue; >X+ } >X+ //g_debug("ret '%d'", ret); >X+ >X+ if (ret < 7) { >X+ continue; >X+ } >X+ mount = g_new0(FsMount, 1); >X+ mount->dirname = g_strdup(dev_name); >X+ mount->devtype = g_strdup(fstype); >X+ mount->free = g_strdup(free); >X+ mount->load = g_strdup(load); >X+ mount->size = g_strdup(size); >X+ mount->used = g_strdup(used); >X+ mount->mntpoint = g_strdup(mounted); >X+ mount->devmajor = 0; >X+ mount->devminor = 0; >X+ >X+ QTAILQ_INSERT_TAIL(mounts, mount, next); >X+ } >X+ //free(line); >X+ >X+ fclose(fp); >X+} >X+ >X+/* ======================================================= */ >X+ >X+ >X+/* Return a list of the disk device(s)' info which @mount lies on */ >X+static GuestFilesystemInfo *build_guest_fsinfo(struct FsMount *mount, >X+ Error **errp) >X+{ >X+ GuestFilesystemInfo *fs = g_malloc0(sizeof(*fs)); >X+ struct statvfs buf; >X+ unsigned long used, nonroot_total, fr_size; >X+ >X+ fs->name = g_strdup(mount->dirname); >X+ fs->mountpoint = g_strdup(mount->mntpoint); >X+ fs->type = g_strdup(mount->devtype); >X+ >X+ /* >X+ * if you need extended structure like this >X+ * >X+ { >X+ "name": "/dev/vtbd0p2", >X+ "total-bytes": 9079570432, >X+ "mountpoint": "/", >X+ "disk": [ >X+ { >X+ "serial": "serial", >X+ "bus-type": "virtio", >X+ "bus": 0, >X+ "unit": 0, >X+ "pci-controller": { >X+ "bus": 0, >X+ "slot": 0, >X+ "domain": 0, >X+ "function": 0 >X+ }, >X+ "dev": "/dev/vtbd0p2", >X+ "target": 0 >X+ } >X+ ], >X+ "used-bytes": 7378640896, >X+ "type": "ufs" >X+ } >X+ >X+ instead >X+ >X+ { >X+ "name": "/dev/vtbd0p2", >X+ "total-bytes": 9079570432, >X+ "mountpoint": "/", >X+ "disk": [], >X+ "used-bytes": 7378747392, >X+ "type": "ufs" >X+ } >X+ >X+ uncomment next block with pciaddr >X+ >X+ */ >X+ /* >X+ GuestPCIAddress *pciaddr = NULL; >X+ GuestDiskAddressList *list = NULL; >X+ GuestDiskAddress *disk; >X+ pciaddr = g_malloc0(sizeof(*pciaddr)); >X+ pciaddr->domain = 0; >X+ pciaddr->bus = 0; >X+ pciaddr->slot = 0; >X+ pciaddr->function = 0; >X+ >X+ disk = g_malloc0(sizeof(*disk)); >X+ disk->pci_controller = pciaddr; >X+ >X+ disk->dev = g_strdup(mount->dirname); >X+ disk->has_dev = true; >X+ disk->bus_type = GUEST_DISK_BUS_TYPE_VIRTIO; >X+ disk->serial = g_strdup("serial"); >X+ disk->has_serial = true; >X+ >X+ list = g_malloc0(sizeof(*list)); >X+ list->value = disk; >X+ >X+ list->next = fs->disk; >X+ fs->disk = list; >X+ */ >X+ >X+ if (statvfs(fs->mountpoint, &buf) == 0) { >X+ fr_size = buf.f_frsize; >X+ used = buf.f_blocks - buf.f_bfree; >X+ nonroot_total = used + buf.f_bavail; >X+ fs->used_bytes = used * fr_size; >X+ fs->total_bytes = nonroot_total * fr_size; >X+ >X+ fs->has_total_bytes = true; >X+ fs->has_used_bytes = true; >X+ } >X+ >X+ //g_free(devpath); >X+ >X+ return fs; >X+} >X+ >X+GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp) >X+{ >X+ FsMountList mounts; >X+ struct FsMount *mount; >X+ GuestFilesystemInfoList *new, *ret = NULL; >X+ Error *local_err = NULL; >X+ >X+ QTAILQ_INIT(&mounts); >X+ >X+ //g_debug("Entering to guest_get_fsinfo"); >X+ build_fs_mount_list(&mounts, &local_err); >X+ if (local_err) { >X+ error_propagate(errp, local_err); >X+ return NULL; >X+ } >X+ >X+ >X+ QTAILQ_FOREACH(mount, &mounts, next) { >X+ //g_debug("Building guest fsinfo for '%s'", mount->dirname); >X+ //g_debug("Devtype '%s'", mount->devtype); >X+ new = g_malloc0(sizeof(*ret)); >X+ new->value = build_guest_fsinfo(mount, &local_err); >X+ new->next = ret; >X+ ret = new; >X+ if (local_err) { >X+ error_propagate(errp, local_err); >X+ qapi_free_GuestFilesystemInfoList(ret); >X+ ret = NULL; >X+ break; >X+ } >X+ } >X+ >X+ free_fs_mount_list(&mounts); >X+ return ret; >X+} >X+#endif // BSD_GUEST_AGENT >X+ >X GuestFsfreezeStatus qmp_guest_fsfreeze_status(Error **errp) >X { >X error_setg(errp, QERR_UNSUPPORTED); >X@@ -2726,6 +3334,7 @@ GList *ga_command_blacklist_init(GList *blacklist) >X { >X #if !defined(__linux__) >X { >X+#ifndef BSD_GUEST_AGENT >X const char *list[] = { >X "guest-suspend-disk", "guest-suspend-ram", >X "guest-suspend-hybrid", "guest-network-get-interfaces", >X@@ -2733,6 +3342,15 @@ GList *ga_command_blacklist_init(GList *blacklist) >X "guest-get-memory-blocks", "guest-set-memory-blocks", >X "guest-get-memory-block-size", "guest-get-memory-block-info", >X NULL}; >X+#else >X+ const char *list[] = { >X+ "guest-suspend-disk", "guest-suspend-ram", >X+ "guest-suspend-hybrid", >X+ "guest-set-vcpus", >X+ "guest-get-memory-blocks", "guest-set-memory-blocks", >X+ "guest-get-memory-block-size", "guest-get-memory-block-info", >X+ NULL}; >X+#endif // BSD_GUEST_AGENT >X char **p = (char **)list; >X >X while (*p) { >X@@ -2743,10 +3361,17 @@ GList *ga_command_blacklist_init(GList *blacklist) >X >X #if !defined(CONFIG_FSFREEZE) >X { >X+#ifndef BSD_GUEST_AGENT >X const char *list[] = { >X "guest-get-fsinfo", "guest-fsfreeze-status", >X "guest-fsfreeze-freeze", "guest-fsfreeze-freeze-list", >X "guest-fsfreeze-thaw", "guest-get-fsinfo", NULL}; >X+#else >X+ const char *list[] = { >X+ "guest-fsfreeze-status", >X+ "guest-fsfreeze-freeze", "guest-fsfreeze-freeze-list", >X+ "guest-fsfreeze-thaw", NULL}; >X+#endif // BSD_GUEST_AGENT >X char **p = (char **)list; >X >X while (*p) { >SHAR_END >echo x qemu-guest-agent/files/patch-qga_main.c >sed 's/^X//' > qemu-guest-agent/files/patch-qga_main.c << 'SHAR_END' >X--- qga/main.c.orig 2020-09-15 16:31:14 UTC >X+++ qga/main.c >X@@ -46,9 +46,15 @@ >X #endif >X >X #ifndef _WIN32 >X+#ifdef BSD_GUEST_AGENT >X+#define QGA_VIRTIO_PATH_DEFAULT "/dev/vtcon/org.qemu.guest_agent.0" >X+#define QGA_STATE_RELATIVE_DIR "run" >X+#define QGA_SERIAL_PATH_DEFAULT "/dev/vtcon/org.qemu.guest_agent.0" >X+#else >X #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0" >X #define QGA_STATE_RELATIVE_DIR "run" >X #define QGA_SERIAL_PATH_DEFAULT "/dev/ttyS0" >X+#endif // BSD_GUEST_AGENT >X #else >X #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0" >X #define QGA_STATE_RELATIVE_DIR "qemu-ga" >X@@ -1478,7 +1484,11 @@ int main(int argc, char **argv) >X } >X >X if (config->method == NULL) { >X+#ifdef BSD_GUEST_AGENT >X+ config->method = g_strdup("isa-serial"); >X+#else >X config->method = g_strdup("virtio-serial"); >X+#endif // BSD_GUEST_AGENT >X } >X >X socket_activation = check_socket_activation(); >SHAR_END >exit
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 254105
: 223065