Mercurial > dropbear
comparison svr-main.c @ 1069:2fa71c3b2827 pam
merge pam branch up to date
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Mon, 16 Mar 2015 21:34:05 +0800 |
parents | a00303a7d247 |
children | 2265d7ebfdeb |
comparison
equal
deleted
inserted
replaced
1068:9a6395ddb1b6 | 1069:2fa71c3b2827 |
---|---|
136 { | 136 { |
137 dropbear_exit("No listening ports available."); | 137 dropbear_exit("No listening ports available."); |
138 } | 138 } |
139 | 139 |
140 for (i = 0; i < listensockcount; i++) { | 140 for (i = 0; i < listensockcount; i++) { |
141 set_sock_priority(listensocks[i], DROPBEAR_PRIO_LOWDELAY); | |
142 FD_SET(listensocks[i], &fds); | 141 FD_SET(listensocks[i], &fds); |
143 } | 142 } |
144 | 143 |
145 /* fork */ | 144 /* fork */ |
146 if (svr_opts.forkbg) { | 145 if (svr_opts.forkbg) { |
341 | 340 |
342 while(waitpid(-1, NULL, WNOHANG) > 0); | 341 while(waitpid(-1, NULL, WNOHANG) > 0); |
343 | 342 |
344 sa_chld.sa_handler = sigchld_handler; | 343 sa_chld.sa_handler = sigchld_handler; |
345 sa_chld.sa_flags = SA_NOCLDSTOP; | 344 sa_chld.sa_flags = SA_NOCLDSTOP; |
345 sigemptyset(&sa_chld.sa_mask); | |
346 if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { | 346 if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { |
347 dropbear_exit("signal() error"); | 347 dropbear_exit("signal() error"); |
348 } | 348 } |
349 errno = saved_errno; | 349 errno = saved_errno; |
350 } | 350 } |
400 | 400 |
401 seedrandom(); | 401 seedrandom(); |
402 } | 402 } |
403 | 403 |
404 /* Set up listening sockets for all the requested ports */ | 404 /* Set up listening sockets for all the requested ports */ |
405 static size_t listensockets(int *sock, size_t sockcount, int *maxfd) { | 405 static size_t listensockets(int *socks, size_t sockcount, int *maxfd) { |
406 | 406 |
407 unsigned int i; | 407 unsigned int i, n; |
408 char* errstring = NULL; | 408 char* errstring = NULL; |
409 size_t sockpos = 0; | 409 size_t sockpos = 0; |
410 int nsock; | 410 int nsock; |
411 | 411 |
412 TRACE(("listensockets: %d to try", svr_opts.portcount)) | 412 TRACE(("listensockets: %d to try", svr_opts.portcount)) |
413 | 413 |
414 for (i = 0; i < svr_opts.portcount; i++) { | 414 for (i = 0; i < svr_opts.portcount; i++) { |
415 | 415 |
416 TRACE(("listening on '%s:%s'", svr_opts.addresses[i], svr_opts.ports[i])) | 416 TRACE(("listening on '%s:%s'", svr_opts.addresses[i], svr_opts.ports[i])) |
417 | 417 |
418 nsock = dropbear_listen(svr_opts.addresses[i], svr_opts.ports[i], &sock[sockpos], | 418 nsock = dropbear_listen(svr_opts.addresses[i], svr_opts.ports[i], &socks[sockpos], |
419 sockcount - sockpos, | 419 sockcount - sockpos, |
420 &errstring, maxfd); | 420 &errstring, maxfd); |
421 | 421 |
422 if (nsock < 0) { | 422 if (nsock < 0) { |
423 dropbear_log(LOG_WARNING, "Failed listening on '%s': %s", | 423 dropbear_log(LOG_WARNING, "Failed listening on '%s': %s", |
424 svr_opts.ports[i], errstring); | 424 svr_opts.ports[i], errstring); |
425 m_free(errstring); | 425 m_free(errstring); |
426 continue; | 426 continue; |
427 } | 427 } |
428 | 428 |
429 for (n = 0; n < (unsigned int)nsock; n++) { | |
430 int sock = socks[sockpos + n]; | |
431 set_sock_priority(sock, DROPBEAR_PRIO_LOWDELAY); | |
432 #ifdef DROPBEAR_TCP_FAST_OPEN | |
433 set_listen_fast_open(sock); | |
434 #endif | |
435 } | |
436 | |
429 sockpos += nsock; | 437 sockpos += nsock; |
430 | 438 |
431 } | 439 } |
432 return sockpos; | 440 return sockpos; |
433 } | 441 } |