- Timestamp:
- Mar 6, 2014, 11:34:15 AM (11 years ago)
- Branches:
- master
- Children:
- 709c3bc
- Parents:
- 9a2a703
- git-author:
- Sebastian Benoit <benoit-lists@…> (03/05/14 23:12:47)
- git-committer:
- Florian Obser <florian@…> (03/06/14 11:34:15)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
icbd.c
r9a2a703 r6e89d69 56 56 void getpeerinfo(struct icb_session *); 57 57 void icbd_accept(int, short, void *); 58 void icbd_paused(int, short, void *); 58 59 void icbd_drop(struct icb_session *, char *); 59 60 void icbd_ioerr(struct bufferevent *, short, void *); … … 71 72 RB_GENERATE(icbd_sessions, icb_session, node, icbd_session_cmp); 72 73 74 struct icbd_listener { 75 struct event ev, pause; 76 }; 77 73 78 int 74 79 main(int argc, char *argv[]) … … 146 151 for (ch = 0; ch < argc; ch++) { 147 152 struct addrinfo hints, *res, *res0; 148 struct event *ev;153 struct icbd_listener *l; 149 154 char *addr, *port; 150 155 int error, s, on = 1; … … 196 201 (void)listen(s, TCP_BACKLOG); 197 202 198 if (( ev = calloc(1, sizeof *ev)) == NULL)203 if ((l = calloc(1, sizeof *l)) == NULL) 199 204 err(EX_UNAVAILABLE, NULL); 200 event_set( ev, s, EV_READ | EV_PERSIST, icbd_accept, ev);201 if (event_add( ev, NULL) < 0) {205 event_set(&l->ev, s, EV_READ | EV_PERSIST, icbd_accept, l); 206 if (event_add(&l->ev, NULL) < 0) { 202 207 syslog(LOG_ERR, "event_add: %m"); 203 208 return (EX_UNAVAILABLE); 204 209 } 210 evtimer_set(&l->pause, icbd_paused, l); 205 211 206 212 nsocks++; … … 255 261 void 256 262 icbd_accept(int fd, short event __attribute__((__unused__)), 257 void *arg __attribute__((__unused__))) 258 { 263 void *arg) 264 { 265 struct icbd_listener *l = arg; 259 266 struct sockaddr_storage ss; 267 struct timeval p = { 1, 0 }; 260 268 struct icb_session *is; 261 269 socklen_t ss_len = sizeof ss; … … 263 271 264 272 ss.ss_len = ss_len; 265 if ((s = accept(fd, (struct sockaddr *)&ss, &ss_len)) < 0) { 266 syslog(LOG_ERR, "accept: %m"); 267 return; 268 } 273 s = accept(fd, (struct sockaddr *)&ss, &ss_len); 274 if (s == -1) { 275 switch (errno) { 276 case EINTR: 277 case EWOULDBLOCK: 278 case ECONNABORTED: 279 return; 280 case EMFILE: 281 case ENFILE: 282 event_del(&l->ev); 283 evtimer_add(&l->pause, &p); 284 return; 285 default: 286 syslog(LOG_ERR, "accept: %m"); 287 return; 288 } 289 } 290 269 291 if (ss.ss_family == AF_INET) 270 292 if (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof tos) < 0) … … 300 322 /* start icb conversation */ 301 323 icb_start(is); 324 } 325 326 void 327 icbd_paused(int fd __attribute__((__unused__)), 328 short events __attribute__((__unused__)), void *arg) 329 { 330 struct icbd_listener *l = arg; 331 event_add(&l->ev, NULL); 302 332 } 303 333
Note:
See TracChangeset
for help on using the changeset viewer.