X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=compatfd.c;h=31654c62a690aff68d7350bbe96ed80391e36b7a;hb=4a97e18b878afb95d2bc6a027f0d9b38e358d142;hp=519b4d8f3fbeb54db7d74ba2cda5f0195b5bf8cf;hpb=b8ae75538e8a9db54207e6bf3da484939bb5df7e;p=qemu.git diff --git a/compatfd.c b/compatfd.c index 519b4d8f3..31654c62a 100644 --- a/compatfd.c +++ b/compatfd.c @@ -26,45 +26,45 @@ struct sigfd_compat_info static void *sigwait_compat(void *opaque) { struct sigfd_compat_info *info = opaque; - int err; sigset_t all; sigfillset(&all); - sigprocmask(SIG_BLOCK, &all, NULL); - - do { - siginfo_t siginfo; - - err = sigwaitinfo(&info->mask, &siginfo); - if (err == -1 && errno == EINTR) { - err = 0; - continue; - } - - if (err > 0) { - char buffer[128]; + pthread_sigmask(SIG_BLOCK, &all, NULL); + + while (1) { + int sig; + int err; + + err = sigwait(&info->mask, &sig); + if (err != 0) { + if (errno == EINTR) { + continue; + } else { + return NULL; + } + } else { + struct qemu_signalfd_siginfo buffer; size_t offset = 0; - memcpy(buffer, &err, sizeof(err)); + memset(&buffer, 0, sizeof(buffer)); + buffer.ssi_signo = sig; + while (offset < sizeof(buffer)) { ssize_t len; - len = write(info->fd, buffer + offset, + len = write(info->fd, (char *)&buffer + offset, sizeof(buffer) - offset); if (len == -1 && errno == EINTR) continue; if (len <= 0) { - err = -1; - break; + return NULL; } offset += len; } } - } while (err >= 0); - - return NULL; + } } static int qemu_signalfd_compat(const sigset_t *mask) @@ -85,6 +85,9 @@ static int qemu_signalfd_compat(const sigset_t *mask) return -1; } + qemu_set_cloexec(fds[0]); + qemu_set_cloexec(fds[1]); + memcpy(&info->mask, mask, sizeof(*mask)); info->fd = fds[1]; @@ -100,29 +103,26 @@ static int qemu_signalfd_compat(const sigset_t *mask) int qemu_signalfd(const sigset_t *mask) { -#if defined(SYS_signalfd) +#if defined(CONFIG_SIGNALFD) int ret; ret = syscall(SYS_signalfd, -1, mask, _NSIG / 8); - if (!(ret == -1 && errno == ENOSYS)) + if (ret != -1) { + qemu_set_cloexec(ret); return ret; + } #endif return qemu_signalfd_compat(mask); } -int qemu_eventfd(int *fds) +bool qemu_signalfd_available(void) { -#if defined(SYS_eventfd) - int ret; - - ret = syscall(SYS_eventfd, 0); - if (ret >= 0) { - fds[0] = fds[1] = ret; - return 0; - } else if (!(ret == -1 && errno == ENOSYS)) - return ret; +#ifdef CONFIG_SIGNALFD + errno = 0; + syscall(SYS_signalfd, -1, NULL, _NSIG / 8); + return errno != ENOSYS; +#else + return false; #endif - - return pipe(fds); }