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

Reply via email to