Message ID | 20220929075239.1675374-2-alexander.ivanov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qga: Add FreeBSD support | expand |
On Thu, Sep 29, 2022 at 11:56 AM Alexander Ivanov < alexander.ivanov@virtuozzo.com> wrote: > - Fix device path. > - Fix virtio-serial channel initialization. > - Make the code buildable in FreeBSD. > > Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> > --- > meson.build | 2 +- > qga/channel-posix.c | 14 ++++++++++++++ > qga/commands-posix.c | 8 ++++++++ > qga/main.c | 6 +++++- > 4 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/meson.build b/meson.build > index 8dc661363f..5c11abc8aa 100644 > --- a/meson.build > +++ b/meson.build > @@ -75,7 +75,7 @@ have_tools = get_option('tools') \ > .allowed() > have_ga = get_option('guest_agent') \ > .disable_auto_if(not have_system and not have_tools) \ > - .require(targetos in ['sunos', 'linux', 'windows'], > + .require(targetos in ['sunos', 'linux', 'windows', 'freebsd'], > error_message: 'unsupported OS for QEMU guest agent') \ > .allowed() > have_block = have_system or have_tools > diff --git a/qga/channel-posix.c b/qga/channel-posix.c > index 6796a02cff..0f14246563 100644 > --- a/qga/channel-posix.c > +++ b/qga/channel-posix.c > @@ -149,6 +149,20 @@ static gboolean ga_channel_open(GAChannel *c, const > gchar *path, > return false; > } > #endif > +#ifdef __FreeBSD__ > + struct termios tio; > + if (tcgetattr(fd, &tio) < 0) { > + error_setg_errno(errp, errno, "error getting channel termios > attrs"); > + close(fd); > + return false; > + } > + tio.c_lflag &= ~ECHO; > + if (tcsetattr(fd, TCSAFLUSH, &tio) < 0) { > + error_setg_errno(errp, errno, "error setting channel termios > attrs"); > + close(fd); > + return false; > + } > +#endif /* __FreeBSD__ */ > It could help to document why this is needed. I assume this is correct, so: Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> > ret = ga_channel_client_add(c, fd); > if (ret) { > error_setg(errp, "error adding channel to main loop"); > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index eea819cff0..16d67e9f6d 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -51,6 +51,14 @@ > #endif > #endif > > +#ifdef __FreeBSD__ > +/* > + * The code under HAVE_GETIFADDRS condition can't be compiled in FreeBSD. > + * Fix it in one of the following patches. > + */ > +#undef HAVE_GETIFADDRS > +#endif > + > #ifdef HAVE_GETIFADDRS > #include <arpa/inet.h> > #include <sys/socket.h> > diff --git a/qga/main.c b/qga/main.c > index 5a9d8252e0..0d27c97d38 100644 > --- a/qga/main.c > +++ b/qga/main.c > @@ -45,9 +45,13 @@ > #endif > > #ifndef _WIN32 > +#ifdef __FreeBSD__ > +#define QGA_VIRTIO_PATH_DEFAULT "/dev/vtcon/org.qemu.guest_agent.0" > +#else /* __FreeBSD__ */ > #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0" > -#define QGA_STATE_RELATIVE_DIR "run" > +#endif /* __FreeBSD__ */ > #define QGA_SERIAL_PATH_DEFAULT "/dev/ttyS0" > +#define QGA_STATE_RELATIVE_DIR "run" > #else > #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0" > #define QGA_STATE_RELATIVE_DIR "qemu-ga" > -- > 2.34.1 > > >
Hi Marc-André, Thank you for the review. On 29.09.2022 13:29, Marc-André Lureau wrote: > > > On Thu, Sep 29, 2022 at 11:56 AM Alexander Ivanov > <alexander.ivanov@virtuozzo.com> wrote: > > - Fix device path. > - Fix virtio-serial channel initialization. > - Make the code buildable in FreeBSD. > > Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> > --- > meson.build | 2 +- > qga/channel-posix.c | 14 ++++++++++++++ > qga/commands-posix.c | 8 ++++++++ > qga/main.c | 6 +++++- > 4 files changed, 28 insertions(+), 2 deletions(-) > > diff --git a/meson.build b/meson.build > index 8dc661363f..5c11abc8aa 100644 > --- a/meson.build > +++ b/meson.build > @@ -75,7 +75,7 @@ have_tools = get_option('tools') \ > .allowed() > have_ga = get_option('guest_agent') \ > .disable_auto_if(not have_system and not have_tools) \ > - .require(targetos in ['sunos', 'linux', 'windows'], > + .require(targetos in ['sunos', 'linux', 'windows', 'freebsd'], > error_message: 'unsupported OS for QEMU guest agent') \ > .allowed() > have_block = have_system or have_tools > diff --git a/qga/channel-posix.c b/qga/channel-posix.c > index 6796a02cff..0f14246563 100644 > --- a/qga/channel-posix.c > +++ b/qga/channel-posix.c > @@ -149,6 +149,20 @@ static gboolean ga_channel_open(GAChannel *c, > const gchar *path, > return false; > } > #endif > +#ifdef __FreeBSD__ > + struct termios tio; > + if (tcgetattr(fd, &tio) < 0) { > + error_setg_errno(errp, errno, "error getting channel > termios attrs"); > + close(fd); > + return false; > + } > + tio.c_lflag &= ~ECHO; > + if (tcsetattr(fd, TCSAFLUSH, &tio) < 0) { > + error_setg_errno(errp, errno, "error setting channel > termios attrs"); > + close(fd); > + return false; > + } > +#endif /* __FreeBSD__ */ > It is for echo suppressing. In other way a host client gets in return the commands it sends and raises an error. Will add a comment. > It could help to document why this is needed. I assume this is > correct, so: > > Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> > > > > ret = ga_channel_client_add(c, fd); > if (ret) { > error_setg(errp, "error adding channel to main loop"); > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index eea819cff0..16d67e9f6d 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -51,6 +51,14 @@ > #endif > #endif > > +#ifdef __FreeBSD__ > +/* > + * The code under HAVE_GETIFADDRS condition can't be compiled in > FreeBSD. > + * Fix it in one of the following patches. > + */ > +#undef HAVE_GETIFADDRS > +#endif > + > #ifdef HAVE_GETIFADDRS > #include <arpa/inet.h> > #include <sys/socket.h> > diff --git a/qga/main.c b/qga/main.c > index 5a9d8252e0..0d27c97d38 100644 > --- a/qga/main.c > +++ b/qga/main.c > @@ -45,9 +45,13 @@ > #endif > > #ifndef _WIN32 > +#ifdef __FreeBSD__ > +#define QGA_VIRTIO_PATH_DEFAULT "/dev/vtcon/org.qemu.guest_agent.0" > +#else /* __FreeBSD__ */ > #define QGA_VIRTIO_PATH_DEFAULT > "/dev/virtio-ports/org.qemu.guest_agent.0" > -#define QGA_STATE_RELATIVE_DIR "run" > +#endif /* __FreeBSD__ */ > #define QGA_SERIAL_PATH_DEFAULT "/dev/ttyS0" > +#define QGA_STATE_RELATIVE_DIR "run" > #else > #define QGA_VIRTIO_PATH_DEFAULT > "\\\\.\\Global\\org.qemu.guest_agent.0" > #define QGA_STATE_RELATIVE_DIR "qemu-ga" > -- > 2.34.1 > > > > > -- > Marc-André Lureau
diff --git a/meson.build b/meson.build index 8dc661363f..5c11abc8aa 100644 --- a/meson.build +++ b/meson.build @@ -75,7 +75,7 @@ have_tools = get_option('tools') \ .allowed() have_ga = get_option('guest_agent') \ .disable_auto_if(not have_system and not have_tools) \ - .require(targetos in ['sunos', 'linux', 'windows'], + .require(targetos in ['sunos', 'linux', 'windows', 'freebsd'], error_message: 'unsupported OS for QEMU guest agent') \ .allowed() have_block = have_system or have_tools diff --git a/qga/channel-posix.c b/qga/channel-posix.c index 6796a02cff..0f14246563 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -149,6 +149,20 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path, return false; } #endif +#ifdef __FreeBSD__ + struct termios tio; + if (tcgetattr(fd, &tio) < 0) { + error_setg_errno(errp, errno, "error getting channel termios attrs"); + close(fd); + return false; + } + tio.c_lflag &= ~ECHO; + if (tcsetattr(fd, TCSAFLUSH, &tio) < 0) { + error_setg_errno(errp, errno, "error setting channel termios attrs"); + close(fd); + return false; + } +#endif /* __FreeBSD__ */ ret = ga_channel_client_add(c, fd); if (ret) { error_setg(errp, "error adding channel to main loop"); diff --git a/qga/commands-posix.c b/qga/commands-posix.c index eea819cff0..16d67e9f6d 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -51,6 +51,14 @@ #endif #endif +#ifdef __FreeBSD__ +/* + * The code under HAVE_GETIFADDRS condition can't be compiled in FreeBSD. + * Fix it in one of the following patches. + */ +#undef HAVE_GETIFADDRS +#endif + #ifdef HAVE_GETIFADDRS #include <arpa/inet.h> #include <sys/socket.h> diff --git a/qga/main.c b/qga/main.c index 5a9d8252e0..0d27c97d38 100644 --- a/qga/main.c +++ b/qga/main.c @@ -45,9 +45,13 @@ #endif #ifndef _WIN32 +#ifdef __FreeBSD__ +#define QGA_VIRTIO_PATH_DEFAULT "/dev/vtcon/org.qemu.guest_agent.0" +#else /* __FreeBSD__ */ #define QGA_VIRTIO_PATH_DEFAULT "/dev/virtio-ports/org.qemu.guest_agent.0" -#define QGA_STATE_RELATIVE_DIR "run" +#endif /* __FreeBSD__ */ #define QGA_SERIAL_PATH_DEFAULT "/dev/ttyS0" +#define QGA_STATE_RELATIVE_DIR "run" #else #define QGA_VIRTIO_PATH_DEFAULT "\\\\.\\Global\\org.qemu.guest_agent.0" #define QGA_STATE_RELATIVE_DIR "qemu-ga"
- Fix device path. - Fix virtio-serial channel initialization. - Make the code buildable in FreeBSD. Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> --- meson.build | 2 +- qga/channel-posix.c | 14 ++++++++++++++ qga/commands-posix.c | 8 ++++++++ qga/main.c | 6 +++++- 4 files changed, 28 insertions(+), 2 deletions(-)