chardev: Propagate error from logfile opening

If a chardev has a logfile the file is opened using
qemu_open_old() which does the job, but since @errp is not
propagated into qemu_open_internal() we lose much more accurate
error and just report "Unable to open logfile $errno".  When
using plain files, it's probably okay as nothing complex is
happening behind the curtains. But the problem becomes more
prominent when passing an "/dev/fdset/XXX" path since much more
needs to be done.

The fix is to use qemu_create() which passes @errp further down.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <f34ee80866e6f591bcb98401dee27682f5543fca.1629190206.git.mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2021-08-17 10:56:27 +02:00 committed by Marc-André Lureau
parent 2a2d51bc07
commit 692277f38d

View File

@ -241,18 +241,15 @@ static void qemu_char_open(Chardev *chr, ChardevBackend *backend,
ChardevCommon *common = backend ? backend->u.null.data : NULL; ChardevCommon *common = backend ? backend->u.null.data : NULL;
if (common && common->has_logfile) { if (common && common->has_logfile) {
int flags = O_WRONLY | O_CREAT; int flags = O_WRONLY;
if (common->has_logappend && if (common->has_logappend &&
common->logappend) { common->logappend) {
flags |= O_APPEND; flags |= O_APPEND;
} else { } else {
flags |= O_TRUNC; flags |= O_TRUNC;
} }
chr->logfd = qemu_open_old(common->logfile, flags, 0666); chr->logfd = qemu_create(common->logfile, flags, 0666, errp);
if (chr->logfd < 0) { if (chr->logfd < 0) {
error_setg_errno(errp, errno,
"Unable to open logfile %s",
common->logfile);
return; return;
} }
} }