aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcp.c')
-rw-r--r--tcp.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/tcp.c b/tcp.c
index f028e01..32ce1e9 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2916,20 +2916,31 @@ static int tcp_sock_init_af(const struct ctx *c, int af, in_port_t port,
* @addr: Pointer to address for binding, NULL if not configured
* @ifname: Name of interface to bind to, NULL if not configured
* @port: Port, host order
+ *
+ * Return: 0 on (partial) success, -1 on (complete) failure
*/
-void tcp_sock_init(const struct ctx *c, sa_family_t af, const void *addr,
- const char *ifname, in_port_t port)
+int tcp_sock_init(const struct ctx *c, sa_family_t af, const void *addr,
+ const char *ifname, in_port_t port)
{
+ int ret = 0;
+
if (af == AF_UNSPEC && c->ifi4 && c->ifi6)
/* Attempt to get a dual stack socket */
if (tcp_sock_init_af(c, AF_UNSPEC, port, addr, ifname) >= 0)
- return;
+ return 0;
/* Otherwise create a socket per IP version */
- if ((af == AF_INET || af == AF_UNSPEC) && c->ifi4)
- tcp_sock_init_af(c, AF_INET, port, addr, ifname);
- if ((af == AF_INET6 || af == AF_UNSPEC) && c->ifi6)
- tcp_sock_init_af(c, AF_INET6, port, addr, ifname);
+ if ((af == AF_INET || af == AF_UNSPEC) && c->ifi4) {
+ if (tcp_sock_init_af(c, AF_INET, port, addr, ifname) < 0)
+ ret = -1;
+ }
+
+ if ((af == AF_INET6 || af == AF_UNSPEC) && c->ifi6) {
+ if (tcp_sock_init_af(c, AF_INET6, port, addr, ifname) < 0)
+ ret = -1;
+ }
+
+ return ret;
}
/**