Message ID | 20221003093911.1844031-2-alexander.ivanov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qga: Add FreeBSD support | expand |
On Mon, Oct 3, 2022 at 1:39 PM 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> > Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > meson.build | 2 +- > qga/channel-posix.c | 19 +++++++++++++++++++ > qga/commands-posix.c | 8 ++++++++ > qga/main.c | 6 +++++- > 4 files changed, 33 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..568350ded4 100644 > --- a/qga/channel-posix.c > +++ b/qga/channel-posix.c > @@ -149,6 +149,25 @@ static gboolean ga_channel_open(GAChannel *c, const > gchar *path, > return false; > } > #endif > +#ifdef __FreeBSD__ > + /* > + * In the default state channel sends echo of every command to a > + * client. The client programm doesn't expect this and raises an > + * error. Suppress echo by resetting ECHO terminal flag. > + */ > + 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" > -- > 2.34.1 > >
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com> On Mon, Oct 3, 2022 at 12:58 PM Marc-André Lureau < marcandre.lureau@gmail.com> wrote: > > > On Mon, Oct 3, 2022 at 1:39 PM 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> >> > > Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> > > >> --- >> meson.build | 2 +- >> qga/channel-posix.c | 19 +++++++++++++++++++ >> qga/commands-posix.c | 8 ++++++++ >> qga/main.c | 6 +++++- >> 4 files changed, 33 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..568350ded4 100644 >> --- a/qga/channel-posix.c >> +++ b/qga/channel-posix.c >> @@ -149,6 +149,25 @@ static gboolean ga_channel_open(GAChannel *c, const >> gchar *path, >> return false; >> } >> #endif >> +#ifdef __FreeBSD__ >> + /* >> + * In the default state channel sends echo of every command to a >> + * client. The client programm doesn't expect this and raises an >> + * error. Suppress echo by resetting ECHO terminal flag. >> + */ >> + 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" >> -- >> 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..568350ded4 100644 --- a/qga/channel-posix.c +++ b/qga/channel-posix.c @@ -149,6 +149,25 @@ static gboolean ga_channel_open(GAChannel *c, const gchar *path, return false; } #endif +#ifdef __FreeBSD__ + /* + * In the default state channel sends echo of every command to a + * client. The client programm doesn't expect this and raises an + * error. Suppress echo by resetting ECHO terminal flag. + */ + 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 | 19 +++++++++++++++++++ qga/commands-posix.c | 8 ++++++++ qga/main.c | 6 +++++- 4 files changed, 33 insertions(+), 2 deletions(-)