*/
#include "qemu/osdep.h"
-#include "qemu-common.h"
-#include "qemu/compatfd.h"
#include "qemu/thread.h"
-#include <sys/syscall.h>
+#if defined(CONFIG_SIGNALFD)
+#include <sys/signalfd.h>
+#endif
-struct sigfd_compat_info
-{
+struct sigfd_compat_info {
sigset_t mask;
int fd;
};
}
} else {
struct qemu_signalfd_siginfo buffer;
- size_t offset = 0;
-
memset(&buffer, 0, sizeof(buffer));
buffer.ssi_signo = sig;
- while (offset < sizeof(buffer)) {
- ssize_t len;
-
- len = write(info->fd, (char *)&buffer + offset,
- sizeof(buffer) - offset);
- if (len == -1 && errno == EINTR)
- continue;
-
- if (len <= 0) {
- return NULL;
- }
-
- offset += len;
+ if (qemu_write_full(info->fd, &buffer, sizeof(buffer)) != sizeof(buffer)) {
+ return NULL;
}
}
}
QemuThread thread;
int fds[2];
- info = malloc(sizeof(*info));
- if (info == NULL) {
- errno = ENOMEM;
- return -1;
- }
+ info = g_malloc(sizeof(*info));
- if (pipe(fds) == -1) {
- free(info);
+ if (!g_unix_open_pipe(fds, FD_CLOEXEC, NULL)) {
+ g_free(info);
return -1;
}
- qemu_set_cloexec(fds[0]);
- qemu_set_cloexec(fds[1]);
-
memcpy(&info->mask, mask, sizeof(*mask));
info->fd = fds[1];
#if defined(CONFIG_SIGNALFD)
int ret;
- ret = syscall(SYS_signalfd, -1, mask, _NSIG / 8);
+ ret = signalfd(-1, mask, SFD_CLOEXEC);
if (ret != -1) {
- qemu_set_cloexec(ret);
return ret;
}
#endif