From: Marc-André Lureau <marcandre.lur...@redhat.com> QGA calls qemu_open_old() in various places. Calling qemu_open() instead isn't a great alternative, as it has special "/dev/fdset" handling and depends on QEMU internal monitor data structures.
Instead, provide a simple helper for QGA needs, with Error* support. The following patches will make use of it. Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- qga/cutils.c | 37 +++++++++++++++++++++++++++++++++++++ qga/cutils.h | 8 ++++++++ qga/meson.build | 1 + 3 files changed, 46 insertions(+) create mode 100644 qga/cutils.c create mode 100644 qga/cutils.h diff --git a/qga/cutils.c b/qga/cutils.c new file mode 100644 index 0000000000..37dd877451 --- /dev/null +++ b/qga/cutils.c @@ -0,0 +1,37 @@ +/* + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#include "cutils.h" + +#include "qapi/error.h" + +/** + * qga_open_cloexec: + * @name: the pathname to open + * @flags: as in open() + * @mode: as in open() + * @errp: pointer to Error*, or NULL + * + * A wrapper for open() function which sets O_CLOEXEC. + * + * On error, -1 is returned and @errp is set. + */ +int qga_open_cloexec(const char *name, int flags, mode_t mode, Error **errp) +{ + int ret; + +#ifdef O_CLOEXEC + ret = open(name, flags | O_CLOEXEC, mode); +#else + ret = open(name, flags, mode); + if (ret >= 0) { + qemu_set_cloexec(ret); + } +#endif + if (ret == -1) { + error_setg_errno(errp, errno, "Failed to open file '%s'", name); + } + + return ret; +} diff --git a/qga/cutils.h b/qga/cutils.h new file mode 100644 index 0000000000..caccf79e45 --- /dev/null +++ b/qga/cutils.h @@ -0,0 +1,8 @@ +#ifndef CUTILS_H_ +#define CUTILS_H_ + +#include "qemu/osdep.h" + +int qga_open_cloexec(const char *name, int flags, mode_t mode, Error **errp); + +#endif /* CUTILS_H_ */ diff --git a/qga/meson.build b/qga/meson.build index 6d9f39bb32..35fe2229e9 100644 --- a/qga/meson.build +++ b/qga/meson.build @@ -65,6 +65,7 @@ qga_ss.add(files( 'commands.c', 'guest-agent-command-state.c', 'main.c', + 'cutils.c', )) qga_ss.add(when: 'CONFIG_POSIX', if_true: files( 'channel-posix.c', -- 2.36.1