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 <[email protected]> wrote:
> From: Marc-André Lureau <[email protected]>
>
> It is only needed by char-pty.
>
> Signed-off-by: Marc-André Lureau <[email protected]>
> ---
> 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