aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pingu_iface.c4
-rw-r--r--sockaddr_util.c14
-rw-r--r--sockaddr_util.h1
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 */