diff options
-rw-r--r-- | pingu_iface.c | 4 | ||||
-rw-r--r-- | sockaddr_util.c | 14 | ||||
-rw-r--r-- | sockaddr_util.h | 1 |
3 files changed, 17 insertions, 2 deletions
diff --git a/pingu_iface.c b/pingu_iface.c index d2d0ac9..6905844 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -40,8 +40,8 @@ int pingu_iface_bind_socket(struct pingu_iface *iface, int log_error) int r; if (iface->name[0] == '\0') return 0; - r = setsockopt(iface->fd, SOL_SOCKET, SO_BINDTODEVICE, iface->name, - strlen(iface->name)); + r = bind(iface->fd, &iface->primary_addr.sa, + sockaddr_len(&iface->primary_addr)); if (r < 0 && log_error) log_perror(iface->name); iface->has_binding = (r == 0); diff --git a/sockaddr_util.c b/sockaddr_util.c index a9e2755..57487c1 100644 --- a/sockaddr_util.c +++ b/sockaddr_util.c @@ -86,3 +86,17 @@ char *sockaddr_to_string(union sockaddr_any *sa, char *str, size_t size) } return str; } + +socklen_t sockaddr_len(union sockaddr_any *sa) +{ + socklen_t len = 0; + switch (sa->sa.sa_family) { + case AF_INET: + len = sizeof(sa->sin); + break; + case AF_INET6: + len = sizeof(sa->sin6); + break; + } + return len; +} diff --git a/sockaddr_util.h b/sockaddr_util.h index 97ea182..e716f96 100644 --- a/sockaddr_util.h +++ b/sockaddr_util.h @@ -22,5 +22,6 @@ union sockaddr_any *sockaddr_from_addrinfo(union sockaddr_any *sa, struct addrinfo *ai); char *sockaddr_to_string(union sockaddr_any *sa, char *str, size_t size); +socklen_t sockaddr_len(union sockaddr_any *sa); #endif /* SOCKADDR_UTIL_H */ |