| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #include "core.h"
- #include <errno.h>
- #include <fcntl.h> /* O_CLOEXEC */
- #include <sys/ioctl.h>
- #include <sys/syscall.h>
- #include <sys/eventfd.h>
- int make_fd_cloexec(int fd, int set)
- {
- int flags;
- int r;
- do {
- r = fcntl(fd, F_GETFD);
- }while (r == -1 && errno == EINTR);
- if (r == -1)
- return -1;
- /* Bail out now if already set/clear. */
- if (!!(r & FD_CLOEXEC) == !!set)
- return 0;
- if (set)
- flags = r | FD_CLOEXEC;
- else
- flags = r & ~FD_CLOEXEC;
- do {
- r = fcntl(fd, F_SETFD, flags);
- }while (r == -1 && errno == EINTR);
- if (r == -1)
- return -1;
- return 0;
- }
- int make_fd_nonblock(int fd, int set)
- {
- int r;
- do {
- r = ioctl(fd, FIONBIO, &set);
- }while (r == -1 && errno == EINTR);
- if (r)
- return -1;
- return 0;
- }
- int async_fd_create()
- {
- int fd;
- fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
- if (fd == -1) {
- return -1;
- }
- return fd;
- }
- void async_fd_close(int fd)
- {
- close(fd);
- }
|