On Mon, Oct 13, 2025 at 5:41 PM Vladimir Sementsov-Ogievskiy
<[email protected]> wrote:
>
> We are going to share new chardev_init_logfd() with further
> alternative initialization interface. Let qemu_char_open() be
> a wrapper for .open(), and its artifacts (handle be_opened if
> was not set to false by backend, and filename).
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>

Reviewed-by: Marc-André Lureau <[email protected]>

> ---
>  chardev/char.c | 49 +++++++++++++++++++++++++++++++------------------
>  1 file changed, 31 insertions(+), 18 deletions(-)
>
> diff --git a/chardev/char.c b/chardev/char.c
> index a43b7e5481..d5a2533e8e 100644
> --- a/chardev/char.c
> +++ b/chardev/char.c
> @@ -250,22 +250,6 @@ static void qemu_char_open(Chardev *chr, ChardevBackend 
> *backend,
>                             bool *be_opened, Error **errp)
>  {
>      ChardevClass *cc = CHARDEV_GET_CLASS(chr);
> -    /* Any ChardevCommon member would work */

maybe keep that comment?


> -    ChardevCommon *common = backend ? backend->u.null.data : NULL;
> -
> -    if (common && common->logfile) {
> -        int flags = O_WRONLY;
> -        if (common->has_logappend &&
> -            common->logappend) {
> -            flags |= O_APPEND;
> -        } else {
> -            flags |= O_TRUNC;
> -        }
> -        chr->logfd = qemu_create(common->logfile, flags, 0666, errp);
> -        if (chr->logfd < 0) {
> -            return;
> -        }
> -    }
>
>      if (cc->open) {
>          cc->open(chr, backend, be_opened, errp);
> @@ -1000,6 +984,28 @@ void qemu_chr_set_feature(Chardev *chr,
>      return set_bit(feature, chr->features);
>  }
>
> +static bool chardev_init_logfd(Chardev *chr, ChardevBackend *backend,
> +                                Error **errp)
> +{
> +    ChardevCommon *common = backend ? backend->u.null.data : NULL;
> +
> +    if (common && common->logfile) {
> +        int flags = O_WRONLY;
> +        if (common->has_logappend &&
> +            common->logappend) {
> +            flags |= O_APPEND;
> +        } else {
> +            flags |= O_TRUNC;
> +        }
> +        chr->logfd = qemu_create(common->logfile, flags, 0666, errp);
> +        if (chr->logfd < 0) {
> +            return false;
> +        }
> +    }
> +
> +    return true;
> +}
> +
>  static Chardev *chardev_new(const char *id, const char *typename,
>                              ChardevBackend *backend,
>                              GMainContext *gcontext,
> @@ -1020,11 +1026,14 @@ static Chardev *chardev_new(const char *id, const 
> char *typename,
>      chr->label = g_strdup(id);
>      chr->gcontext = gcontext;
>
> +    if (!chardev_init_logfd(chr, backend, errp)) {
> +        goto fail;
> +    }
> +
>      qemu_char_open(chr, backend, &be_opened, &local_err);
>      if (local_err) {
>          error_propagate(errp, local_err);
> -        object_unref(obj);
> -        return NULL;
> +        goto fail;
>      }
>
>      if (!chr->filename) {
> @@ -1035,6 +1044,10 @@ static Chardev *chardev_new(const char *id, const char 
> *typename,
>      }
>
>      return chr;
> +
> +fail:
> +    object_unref(obj);
> +    return NULL;
>  }
>
>  Chardev *qemu_chardev_new(const char *id, const char *typename,
> --
> 2.48.1
>
>


--
Marc-André Lureau

Reply via email to