diff options
author | Harald Welte <laforge@gnumonks.org> | 2011-05-22 21:47:29 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-05-22 21:47:29 +0200 |
commit | 68b1574257fdbf4b06d225c116cfa6a2a6929965 (patch) | |
tree | 9fd6453614ce2e171c91cb9cf743913f21bdafdf | |
parent | 8265939c5e32843990dd14e5d2918f773e285468 (diff) |
socket: use listen() and SO_REUSEADDR, new osmo_sock_init_ofd() function
osmo_sock_init_ofd() is a wrapper around osmo_sock_init() which will
take care of initializing and registering a 'struct osmo_fd' for the
newly-created socket.
-rw-r--r-- | include/osmocom/core/socket.h | 3 | ||||
-rw-r--r-- | src/socket.c | 35 |
2 files changed, 37 insertions, 1 deletions
diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h index a3baa9d5..b2601c76 100644 --- a/include/osmocom/core/socket.h +++ b/include/osmocom/core/socket.h @@ -8,6 +8,9 @@ struct sockaddr; int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, const char *host, uint16_t port, int connect0_bind1); +int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, + const char *host, uint16_t port, int connect0_bind1); + int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type, uint8_t proto, int connect0_bind1); diff --git a/src/socket.c b/src/socket.c index 2414b1ff..66907c8c 100644 --- a/src/socket.c +++ b/src/socket.c @@ -23,7 +23,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, const char *host, uint16_t port, int connect0_bind1) { struct addrinfo hints, *result, *rp; - int sfd, rc; + int sfd, rc, on = 1; char portbuf[16]; sprintf(portbuf, "%u", port); @@ -58,6 +58,39 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto, perror("unable to connect/bind socket"); return -ENODEV; } + + setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + /* Make sure to call 'listen' on a bound, connection-oriented sock */ + if (connect0_bind1 == 1) { + switch (type) { + case SOCK_STREAM: + case SOCK_SEQPACKET: + listen(sfd, 10); + break; + } + } + return sfd; +} + +int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto, + const char *host, uint16_t port, int connect0_bind1) +{ + int sfd, rc; + + sfd = osmo_sock_init(family, type, proto, host, port, connect0_bind1); + if (sfd < 0) + return sfd; + + ofd->fd = sfd; + ofd->when = BSC_FD_READ; + + rc = osmo_fd_register(ofd); + if (rc < 0) { + close(sfd); + return rc; + } + return sfd; } |