Commit 0354f79351baa7a4355ba3d6141fe19d95386439

Authored by Grzegorz Jabłoński
1 parent d7575a75

Added more error handling

Showing 1 changed file with 30 additions and 9 deletions
epoll4.c
1   -/*
2   - * Attention:
3   - * To keep things simple, do not handle
4   - * socket/bind/listen/.../epoll_create/epoll_wait API error
5   - */
6 1 #include <arpa/inet.h>
7 2 #include <errno.h>
8 3 #include <fcntl.h>
... ... @@ -68,9 +63,15 @@ static void set_sockaddr(struct sockaddr_in *addr) {
68 63 }
69 64  
70 65 static int setnonblocking(int sockfd) {
  66 + int prev = fcntl(sockfd, F_GETFL, 0);
  67 + if (prev == -1) {
  68 + perror("fcntl");
  69 + exit(1);
  70 + }
  71 +
71 72 if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK) == -1) {
72   - perror("fcntl set nonblock");
73   - return -1;
  73 + perror("fcntl");
  74 + exit(1);
74 75 }
75 76 return 0;
76 77 }
... ... @@ -93,12 +94,19 @@ void server_run() {
93 94  
94 95 listen_sock = socket(AF_INET, SOCK_STREAM, 0);
95 96  
  97 + if (listen_sock == -1) {
  98 + perror("socket");
  99 + exit(1);
  100 + }
  101 +
96 102 set_sockaddr(&srv_addr);
97 103  
98 104 int reuseaddr = 1;
99 105 if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
100   - sizeof(int)) < 0)
  106 + sizeof(int)) < 0) {
101 107 perror("setsockopt(SO_REUSEADDR)");
  108 + exit(1);
  109 + }
102 110  
103 111 if (bind(listen_sock, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) < 0) {
104 112 perror("bind");
... ... @@ -112,6 +120,11 @@ void server_run() {
112 120 }
113 121  
114 122 epfd = epoll_create(1);
  123 + if (epfd == -1) {
  124 + perror("epoll_create");
  125 + exit(1);
  126 + }
  127 +
115 128 epoll_ctl_add(epfd, listen_sock, EPOLLIN | EPOLLOUT);
116 129  
117 130 socklen = sizeof(cli_addr);
... ... @@ -164,7 +177,11 @@ void server_run() {
164 177 /* check if the connection is closing */
165 178 if (events[i].events & (EPOLLRDHUP | EPOLLHUP)) {
166 179 printf("[+] connection closed\n");
167   - epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
  180 +
  181 + if (epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL) == -1) {
  182 + perror("epoll_ctl");
  183 + exit(1);
  184 + }
168 185 close(events[i].data.fd);
169 186 continue;
170 187 }
... ... @@ -183,6 +200,10 @@ void client_run() {
183 200 struct sockaddr_in srv_addr;
184 201  
185 202 sockfd = socket(AF_INET, SOCK_STREAM, 0);
  203 + if (sockfd == -1) {
  204 + perror("socket");
  205 + exit(1);
  206 + }
186 207  
187 208 set_sockaddr(&srv_addr);
188 209  
... ...