Paolo, This patch is ok, but in some (new?) circumstances it fails with freebsd and reveals that -lutil was missing for kinfo_getproc() in util/oslib-posix.c. Please add:
-util_ss.add(when: 'CONFIG_POSIX', if_true: files('oslib-posix.c')) +util_ss.add(when: 'CONFIG_POSIX', if_true: [files('oslib-posix.c'), util]) (even better if we made this specific to freebsd I guess, but not strictly necessary) On Tue, Feb 22, 2022 at 11:53 PM <marcandre.lur...@redhat.com> wrote: > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > It is only needed by char-pty. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > include/qemu-common.h | 2 - > chardev/char-pty.c | 104 +++++++++++++++++++++++++++++++ > util/qemu-openpty.c | 139 ------------------------------------------ > chardev/meson.build | 4 +- > util/meson.build | 1 - > 5 files changed, 106 insertions(+), 144 deletions(-) > delete mode 100644 util/qemu-openpty.c > > diff --git a/include/qemu-common.h b/include/qemu-common.h > index 68b2e3bc1091..0248a324cdcd 100644 > --- a/include/qemu-common.h > +++ b/include/qemu-common.h > @@ -33,8 +33,6 @@ ssize_t qemu_write_full(int fd, const void *buf, size_t > count) > > #ifndef _WIN32 > int qemu_pipe(int pipefd[2]); > -/* like openpty() but also makes it raw; return master fd */ > -int qemu_openpty_raw(int *aslave, char *pty_name); > #endif > > #ifdef _WIN32 > diff --git a/chardev/char-pty.c b/chardev/char-pty.c > index a2d1e7c985bc..f28779bcc9d2 100644 > --- a/chardev/char-pty.c > +++ b/chardev/char-pty.c > @@ -197,6 +197,110 @@ static void char_pty_finalize(Object *obj) > qemu_chr_be_event(chr, CHR_EVENT_CLOSED); > } > > +#if defined HAVE_PTY_H > +# include <pty.h> > +#elif defined CONFIG_BSD > +# include <termios.h> > +# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || > defined(__DragonFly__) > +# include <libutil.h> > +# else > +# include <util.h> > +# endif > +#elif defined CONFIG_SOLARIS > +# include <termios.h> > +# include <stropts.h> > +#else > +# include <termios.h> > +#endif > + > +#ifdef __sun__ > + > +#if !defined(HAVE_OPENPTY) > +/* Once illumos has openpty(), this is going to be removed. */ > +static int openpty(int *amaster, int *aslave, char *name, > + struct termios *termp, struct winsize *winp) > +{ > + const char *slave; > + int mfd = -1, sfd = -1; > + > + *amaster = *aslave = -1; > + > + mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY); > + if (mfd < 0) > + goto err; > + > + if (grantpt(mfd) == -1 || unlockpt(mfd) == -1) > + goto err; > + > + if ((slave = ptsname(mfd)) == NULL) > + goto err; > + > + if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1) > + goto err; > + > + if (ioctl(sfd, I_PUSH, "ptem") == -1 || > + (termp != NULL && tcgetattr(sfd, termp) < 0)) > + goto err; > + > + *amaster = mfd; > + *aslave = sfd; > + > + if (winp) > + ioctl(sfd, TIOCSWINSZ, winp); > + > + return 0; > + > +err: > + if (sfd != -1) > + close(sfd); > + close(mfd); > + return -1; > +} > +#endif > + > +static void cfmakeraw (struct termios *termios_p) > +{ > + termios_p->c_iflag &= > + ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); > + termios_p->c_oflag &= ~OPOST; > + termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); > + termios_p->c_cflag &= ~(CSIZE|PARENB); > + termios_p->c_cflag |= CS8; > + > + termios_p->c_cc[VMIN] = 0; > + termios_p->c_cc[VTIME] = 0; > +} > +#endif > + > +/* like openpty() but also makes it raw; return master fd */ > +static int qemu_openpty_raw(int *aslave, char *pty_name) > +{ > + int amaster; > + struct termios tty; > +#if defined(__OpenBSD__) || defined(__DragonFly__) > + char pty_buf[PATH_MAX]; > +#define q_ptsname(x) pty_buf > +#else > + char *pty_buf = NULL; > +#define q_ptsname(x) ptsname(x) > +#endif > + > + if (openpty(&amaster, aslave, pty_buf, NULL, NULL) < 0) { > + return -1; > + } > + > + /* Set raw attributes on the pty. */ > + tcgetattr(*aslave, &tty); > + cfmakeraw(&tty); > + tcsetattr(*aslave, TCSAFLUSH, &tty); > + > + if (pty_name) { > + strcpy(pty_name, q_ptsname(amaster)); > + } > + > + return amaster; > +} > + > static void char_pty_open(Chardev *chr, > ChardevBackend *backend, > bool *be_opened, > diff --git a/util/qemu-openpty.c b/util/qemu-openpty.c > deleted file mode 100644 > index 427f43a76973..000000000000 > --- a/util/qemu-openpty.c > +++ /dev/null > @@ -1,139 +0,0 @@ > -/* > - * qemu-openpty.c > - * > - * Copyright (c) 2003-2008 Fabrice Bellard > - * Copyright (c) 2010 Red Hat, Inc. > - * > - * Wrapper function qemu_openpty() implementation. > - * > - * Permission is hereby granted, free of charge, to any person obtaining > a copy > - * of this software and associated documentation files (the "Software"), > to deal > - * in the Software without restriction, including without limitation the > rights > - * to use, copy, modify, merge, publish, distribute, sublicense, and/or > sell > - * copies of the Software, and to permit persons to whom the Software is > - * furnished to do so, subject to the following conditions: > - * > - * The above copyright notice and this permission notice shall be > included in > - * all copies or substantial portions of the Software. > - * > - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER > - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > ARISING FROM, > - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > IN > - * THE SOFTWARE. > - */ > - > -/* > - * This is not part of oslib-posix.c because this function > - * uses openpty() which often in -lutil, and if we add this > - * dependency to oslib-posix.o, every app will have to be > - * linked with -lutil. > - */ > - > -#include "qemu/osdep.h" > -#include "qemu-common.h" > - > -#if defined HAVE_PTY_H > -# include <pty.h> > -#elif defined CONFIG_BSD > -# include <termios.h> > -# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || > defined(__DragonFly__) > -# include <libutil.h> > -# else > -# include <util.h> > -# endif > -#elif defined CONFIG_SOLARIS > -# include <termios.h> > -# include <stropts.h> > -#else > -# include <termios.h> > -#endif > - > -#ifdef __sun__ > - > -#if !defined(HAVE_OPENPTY) > -/* Once illumos has openpty(), this is going to be removed. */ > -static int openpty(int *amaster, int *aslave, char *name, > - struct termios *termp, struct winsize *winp) > -{ > - const char *slave; > - int mfd = -1, sfd = -1; > - > - *amaster = *aslave = -1; > - > - mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY); > - if (mfd < 0) > - goto err; > - > - if (grantpt(mfd) == -1 || unlockpt(mfd) == -1) > - goto err; > - > - if ((slave = ptsname(mfd)) == NULL) > - goto err; > - > - if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1) > - goto err; > - > - if (ioctl(sfd, I_PUSH, "ptem") == -1 || > - (termp != NULL && tcgetattr(sfd, termp) < 0)) > - goto err; > - > - *amaster = mfd; > - *aslave = sfd; > - > - if (winp) > - ioctl(sfd, TIOCSWINSZ, winp); > - > - return 0; > - > -err: > - if (sfd != -1) > - close(sfd); > - close(mfd); > - return -1; > -} > -#endif > - > -static void cfmakeraw (struct termios *termios_p) > -{ > - termios_p->c_iflag &= > - ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); > - termios_p->c_oflag &= ~OPOST; > - termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); > - termios_p->c_cflag &= ~(CSIZE|PARENB); > - termios_p->c_cflag |= CS8; > - > - termios_p->c_cc[VMIN] = 0; > - termios_p->c_cc[VTIME] = 0; > -} > -#endif > - > -int qemu_openpty_raw(int *aslave, char *pty_name) > -{ > - int amaster; > - struct termios tty; > -#if defined(__OpenBSD__) || defined(__DragonFly__) > - char pty_buf[PATH_MAX]; > -#define q_ptsname(x) pty_buf > -#else > - char *pty_buf = NULL; > -#define q_ptsname(x) ptsname(x) > -#endif > - > - if (openpty(&amaster, aslave, pty_buf, NULL, NULL) < 0) { > - return -1; > - } > - > - /* Set raw attributes on the pty. */ > - tcgetattr(*aslave, &tty); > - cfmakeraw(&tty); > - tcsetattr(*aslave, TCSAFLUSH, &tty); > - > - if (pty_name) { > - strcpy(pty_name, q_ptsname(amaster)); > - } > - > - return amaster; > -} > diff --git a/chardev/meson.build b/chardev/meson.build > index 325ba2bdb97d..664f77b8879a 100644 > --- a/chardev/meson.build > +++ b/chardev/meson.build > @@ -12,11 +12,11 @@ chardev_ss.add(files( > 'char-udp.c', > 'char.c', > )) > -chardev_ss.add(when: 'CONFIG_POSIX', if_true: files( > +chardev_ss.add(when: 'CONFIG_POSIX', if_true: [files( > 'char-fd.c', > 'char-parallel.c', > 'char-pty.c', > -)) > +), util]) > chardev_ss.add(when: 'CONFIG_WIN32', if_true: files( > 'char-console.c', > 'char-win-stdio.c', > diff --git a/util/meson.build b/util/meson.build > index 3736988b9f6e..d6263ccc1b82 100644 > --- a/util/meson.build > +++ b/util/meson.build > @@ -12,7 +12,6 @@ util_ss.add(when: 'CONFIG_POSIX', if_true: > files('compatfd.c')) > util_ss.add(when: 'CONFIG_POSIX', if_true: > files('event_notifier-posix.c')) > util_ss.add(when: 'CONFIG_POSIX', if_true: files('mmap-alloc.c')) > util_ss.add(when: 'CONFIG_POSIX', if_true: files('oslib-posix.c')) > -util_ss.add(when: 'CONFIG_POSIX', if_true: [files('qemu-openpty.c'), > util]) > util_ss.add(when: 'CONFIG_POSIX', if_true: files('qemu-thread-posix.c')) > util_ss.add(when: 'CONFIG_POSIX', if_true: files('memfd.c')) > util_ss.add(when: 'CONFIG_WIN32', if_true: files('aio-win32.c')) > -- > 2.35.1.273.ge6ebfd0e8cbb > > > -- Marc-André Lureau