diff options
author | dimitri staessens <[email protected]> | 2016-12-08 16:55:24 +0100 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2016-12-08 17:14:36 +0100 |
commit | 12935222221e316d188075602f07c372e00c855e (patch) | |
tree | e2cc741142545bf8469d0e550b2b36ca0fc64025 | |
parent | 82ae7959d21c654fe9fd14de504f47d18b1ebcfc (diff) | |
download | ouroboros-12935222221e316d188075602f07c372e00c855e.tar.gz ouroboros-12935222221e316d188075602f07c372e00c855e.zip |
irmd, ipcp: Call select on FreeBSD
*BSD accept() doesn't timeout on the timeval set by setsockopt
SO_RCVTIMEO. The irmd and ipcp will now call select on the irmd fd
with the same timeout.
-rw-r--r-- | src/ipcpd/ipcp.c | 12 | ||||
-rw-r--r-- | src/irmd/main.c | 12 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index 00dd69cb..71340fb4 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -230,6 +230,11 @@ void * ipcp_main_loop(void * o) (void) o; while (true) { +#ifdef __FreeBSD__ + fd_set fds; + struct timeval timeout = {(IPCP_ACCEPT_TIMEOUT / 1000), + (IPCP_ACCEPT_TIMEOUT % 1000) * 1000}; +#endif int fd = -1; pthread_rwlock_rdlock(&ipcpi.state_lock); @@ -242,7 +247,12 @@ void * ipcp_main_loop(void * o) pthread_rwlock_unlock(&ipcpi.state_lock); ret_msg.code = IPCP_MSG_CODE__IPCP_REPLY; - +#ifdef __FreeBSD__ + FD_ZERO(&fds); + FD_SET(ipcpi.sockfd, &fds); + if (select(ipcpi.sockfd, &fds, NULL, NULL, &timeout) <= 0) + continue; +#endif lsockfd = accept(ipcpi.sockfd, 0, 0); if (lsockfd < 0) continue; diff --git a/src/irmd/main.c b/src/irmd/main.c index d8cb27fa..dc0c26f2 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1804,6 +1804,11 @@ void * mainloop(void * o) (void) o; while (true) { +#ifdef __FreeBSD__ + fd_set fds; + struct timeval timeout = {(IRMD_ACCEPT_TIMEOUT / 1000), + (IRMD_ACCEPT_TIMEOUT % 1000) * 1000}; +#endif int cli_sockfd; irm_msg_t * msg; ssize_t count; @@ -1822,7 +1827,12 @@ void * mainloop(void * o) pthread_rwlock_unlock(&irmd->state_lock); ret_msg.code = IRM_MSG_CODE__IRM_REPLY; - +#ifdef __FreeBSD__ + FD_ZERO(&fds); + FD_SET(irmd->sockfd, &fds); + if (select(irmd->sockfd, &fds, NULL, NULL, &timeout) <= 0) + continue; +#endif cli_sockfd = accept(irmd->sockfd, 0, 0); if (cli_sockfd < 0) continue; |