diff options
Diffstat (limited to 'os-posix.c')
-rw-r--r-- | os-posix.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/os-posix.c b/os-posix.c index 6321e990c5..612b641737 100644 --- a/os-posix.c +++ b/os-posix.c @@ -43,6 +43,10 @@ #include <sys/prctl.h> #endif +#ifdef CONFIG_EVENTFD +#include <sys/eventfd.h> +#endif + static struct passwd *user_pwd; static const char *chroot_dir; static int daemonize; @@ -329,3 +333,31 @@ void os_set_line_buffering(void) { setvbuf(stdout, NULL, _IOLBF, 0); } + +/* + * Creates an eventfd that looks like a pipe and has EFD_CLOEXEC set. + */ +int qemu_eventfd(int fds[2]) +{ +#ifdef CONFIG_EVENTFD + int ret; + + ret = eventfd(0, 0); + if (ret >= 0) { + fds[0] = ret; + qemu_set_cloexec(ret); + if ((fds[1] = dup(ret)) == -1) { + close(ret); + return -1; + } + qemu_set_cloexec(fds[1]); + return 0; + } + + if (errno != ENOSYS) { + return -1; + } +#endif + + return qemu_pipe(fds); +} |