summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2011-05-22 21:47:29 +0200
committerHarald Welte <laforge@gnumonks.org>2011-05-22 21:47:29 +0200
commit68b1574257fdbf4b06d225c116cfa6a2a6929965 (patch)
tree9fd6453614ce2e171c91cb9cf743913f21bdafdf
parent8265939c5e32843990dd14e5d2918f773e285468 (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.h3
-rw-r--r--src/socket.c35
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;
}