summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/socket.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/socket.c b/src/socket.c
index 03789700..2310d75f 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -91,8 +91,11 @@ static int socket_helper(const struct addrinfo *rp, unsigned int flags)
int sfd, on = 1;
sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
- if (sfd == -1)
+ if (sfd == -1) {
+ LOGP(DLGLOBAL, LOGL_ERROR,
+ "unable to create socket: %s\n", strerror(errno));
return sfd;
+ }
if (flags & OSMO_SOCK_F_NONBLOCK) {
if (ioctl(sfd, FIONBIO, (unsigned char *)&on) < 0) {
LOGP(DLGLOBAL, LOGL_ERROR,
@@ -212,20 +215,29 @@ int osmo_sock_init2(uint16_t family, uint16_t type, uint8_t proto,
"cannot setsockopt socket:"
" %s:%u: %s\n",
local_host, local_port, strerror(errno));
- break;
+ close(sfd);
+ continue;
}
- if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
- break;
- close(sfd);
+ if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == -1) {
+ LOGP(DLGLOBAL, LOGL_ERROR, "unable to bind socket: %s:%u: %s\n",
+ local_host, local_port, strerror(errno));
+ close(sfd);
+ continue;
+ }
+ break;
}
freeaddrinfo(result);
if (rp == NULL) {
- LOGP(DLGLOBAL, LOGL_ERROR, "unable to bind socket: %s:%u: %s\n",
- local_host, local_port, strerror(errno));
+ LOGP(DLGLOBAL, LOGL_ERROR, "no suitable local addr found for: %s:%u\n",
+ local_host, local_port);
return -ENODEV;
}
}
+ /* Reached this point, if OSMO_SOCK_F_BIND then sfd is valid (>=0) or it
+ was already closed and func returned. If OSMO_SOCK_F_BIND is not
+ set, then sfd = -1 */
+
/* figure out remote side of socket */
if (flags & OSMO_SOCK_F_CONNECT) {
result = addrinfo_helper(family, type, proto, remote_host, remote_port, false);