core.c 915 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "core.h"
  2. #include <errno.h>
  3. #include <fcntl.h> /* O_CLOEXEC */
  4. #include <sys/ioctl.h>
  5. #include <sys/syscall.h>
  6. #include <sys/eventfd.h>
  7. int make_fd_cloexec(int fd, int set)
  8. {
  9. int flags;
  10. int r;
  11. do {
  12. r = fcntl(fd, F_GETFD);
  13. }while (r == -1 && errno == EINTR);
  14. if (r == -1)
  15. return -1;
  16. /* Bail out now if already set/clear. */
  17. if (!!(r & FD_CLOEXEC) == !!set)
  18. return 0;
  19. if (set)
  20. flags = r | FD_CLOEXEC;
  21. else
  22. flags = r & ~FD_CLOEXEC;
  23. do {
  24. r = fcntl(fd, F_SETFD, flags);
  25. }while (r == -1 && errno == EINTR);
  26. if (r == -1)
  27. return -1;
  28. return 0;
  29. }
  30. int make_fd_nonblock(int fd, int set)
  31. {
  32. int r;
  33. do {
  34. r = ioctl(fd, FIONBIO, &set);
  35. }while (r == -1 && errno == EINTR);
  36. if (r)
  37. return -1;
  38. return 0;
  39. }
  40. int async_fd_create()
  41. {
  42. int fd;
  43. fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
  44. if (fd == -1) {
  45. return -1;
  46. }
  47. return fd;
  48. }
  49. void async_fd_close(int fd)
  50. {
  51. close(fd);
  52. }