diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-13 20:57:12 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-13 20:57:12 +0200 |
commit | 42409f7f228083dad788efd4ed3cc96d26712c6f (patch) | |
tree | 45e11b7c4bdb2a7df98fc1322f4ed977ad850d07 /pingu_iface.c | |
parent | 0a0ed0b5472cd19043799a9953ac06fd11ae7585 (diff) | |
download | pingu-42409f7f228083dad788efd4ed3cc96d26712c6f.tar.bz2 pingu-42409f7f228083dad788efd4ed3cc96d26712c6f.tar.xz |
pingu: try bind socket to interface every burst
It might be an interface that disappeared and came back, e.g ppp0.
We also don't even try unless we have a successful binding.
Diffstat (limited to 'pingu_iface.c')
-rw-r--r-- | pingu_iface.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/pingu_iface.c b/pingu_iface.c index 7b81e44..868c60e 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -27,11 +27,23 @@ static void pingu_iface_socket_cb(struct ev_loop *loop, struct ev_io *w, if (revents & EV_READ) pingu_ping_read_reply(loop, iface); } - + +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)); + if (r < 0 && log_error) + log_perror(iface->name); + iface->has_binding = (r == 0); + return r; +} + static int pingu_iface_init_socket(struct ev_loop *loop, struct pingu_iface *iface) { - int r; iface->fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (iface->fd < 0) { log_perror("socket"); @@ -40,15 +52,7 @@ static int pingu_iface_init_socket(struct ev_loop *loop, ev_io_init(&iface->socket_watcher, pingu_iface_socket_cb, iface->fd, EV_READ); ev_io_start(loop, &iface->socket_watcher); - - if (iface->name[0] == '\0') - return 0; - r = setsockopt(iface->fd, SOL_SOCKET, SO_BINDTODEVICE, iface->name, - strlen(iface->name)); - if (r < 0) { - log_perror(iface->name); - return -1; - } + pingu_iface_bind_socket(iface, 1); return 0; } |