Travis: stifle progress on git clone
[beanstalkd.git] / linux.c
blob29e515164a9883c5f2b2db270f98b217fac7203c
1 #define _XOPEN_SOURCE 600
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <stdint.h>
5 #include <fcntl.h>
6 #include <stdlib.h>
7 #include <errno.h>
8 #include <sys/epoll.h>
9 #include "dat.h"
11 #ifndef EPOLLRDHUP
12 #define EPOLLRDHUP 0x2000
13 #endif
15 static int epfd;
18 /* Allocate disk space.
19 * Expects fd's offset to be 0; may also reset fd's offset to 0.
20 * Returns 0 on success, and a positive errno otherwise. */
21 int
22 rawfalloc(int fd, int len)
24 return ftruncate(fd, len);
28 int
29 sockinit(void)
31 epfd = epoll_create(1);
32 if (epfd == -1) {
33 twarn("epoll_create");
34 return -1;
36 return 0;
40 int
41 sockwant(Socket *s, int rw)
43 int op;
44 struct epoll_event ev = {};
46 if (!s->added && !rw) {
47 return 0;
48 } else if (!s->added && rw) {
49 s->added = 1;
50 op = EPOLL_CTL_ADD;
51 } else if (!rw) {
52 op = EPOLL_CTL_DEL;
53 } else {
54 op = EPOLL_CTL_MOD;
57 switch (rw) {
58 case 'r':
59 ev.events = EPOLLIN;
60 break;
61 case 'w':
62 ev.events = EPOLLOUT;
63 break;
65 ev.events |= EPOLLRDHUP | EPOLLPRI;
66 ev.data.ptr = s;
68 return epoll_ctl(epfd, op, s->fd, &ev);
72 int
73 socknext(Socket **s, int64 timeout)
75 int r;
76 struct epoll_event ev;
78 r = epoll_wait(epfd, &ev, 1, (int)(timeout/1000000));
79 if (r == -1 && errno != EINTR) {
80 twarn("epoll_wait");
81 exit(1);
84 if (r > 0) {
85 *s = ev.data.ptr;
86 if (ev.events & (EPOLLHUP|EPOLLRDHUP)) {
87 return 'h';
88 } else if (ev.events & EPOLLIN) {
89 return 'r';
90 } else if (ev.events & EPOLLOUT) {
91 return 'w';
94 return 0;