Commit 0fa57cc345bccf4ca409945e7bcdbd807c7f2de4

Authored by Grzegorz Jabłoński
1 parent 7fac6064

More EINTR checking

Showing 1 changed file with 11 additions and 3 deletions
epoll4.c
@@ -116,11 +116,18 @@ void server_run() { @@ -116,11 +116,18 @@ void server_run() {
116 116
117 socklen = sizeof(cli_addr); 117 socklen = sizeof(cli_addr);
118 for (;;) { 118 for (;;) {
119 - nfds = epoll_wait(epfd, events, MAX_EVENTS, -1); 119 + do {
  120 + nfds = epoll_wait(epfd, events, MAX_EVENTS, -1);
  121 + } while (nfds == -1 && errno == EINTR);
  122 +
120 for (i = 0; i < nfds; i++) { 123 for (i = 0; i < nfds; i++) {
121 if (events[i].data.fd == listen_sock) { 124 if (events[i].data.fd == listen_sock) {
122 /* handle new connection */ 125 /* handle new connection */
123 - conn_sock = accept(listen_sock, (struct sockaddr *)&cli_addr, &socklen); 126 +
  127 + do {
  128 + conn_sock =
  129 + accept(listen_sock, (struct sockaddr *)&cli_addr, &socklen);
  130 + } while (conn_sock == -1 && errno == EINTR);
124 131
125 inet_ntop(AF_INET, (char *)&(cli_addr.sin_addr), buf, sizeof(buf)); 132 inet_ntop(AF_INET, (char *)&(cli_addr.sin_addr), buf, sizeof(buf));
126 printf("[+] connected with %s:%d\n", buf, ntohs(cli_addr.sin_port)); 133 printf("[+] connected with %s:%d\n", buf, ntohs(cli_addr.sin_port));
@@ -142,7 +149,8 @@ void server_run() { @@ -142,7 +149,8 @@ void server_run() {
142 printf("[+] data: %s\n", buf); 149 printf("[+] data: %s\n", buf);
143 n = 0; 150 n = 0;
144 while (n != strlen(buf)) { 151 while (n != strlen(buf)) {
145 - int rv = send(events[i].data.fd, buf + n, strlen(buf) - n, MSG_NOSIGNAL); 152 + int rv = send(events[i].data.fd, buf + n, strlen(buf) - n,
  153 + MSG_NOSIGNAL);
146 if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) 154 if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
147 continue; // FIXME: busy waiting - should wait using epoll 155 continue; // FIXME: busy waiting - should wait using epoll
148 if (rv == -1) 156 if (rv == -1)