Code

liboping.c: Catch `EHOSTUNREACH' and `ENETUNREACH'
authorFlorian Forster <octo@verplant.org>
Sun, 16 Jul 2006 10:19:42 +0000 (12:19 +0200)
committerFlorian Forster <octo@verplant.org>
Sun, 16 Jul 2006 10:19:42 +0000 (12:19 +0200)
When the kernel cannot send out a packet to a host because the host or network
is unreachable, `sendto' may return with `EHOSTUNREACH' or `ENETUNREACH'. So
far all errors returned by `sendto' were considered fatal and the pinging was
aborted. This is wrong when the host is unreachable, so catching and ignoring
these errors is reasonable..
Thanks to Wolfgang Kroener for reporting and debigging this problem with me :)

src/liboping.c

index debd432fd7f7793d7345858094c575aad0997c01..13bcc92088e58a35a7ed1dc96d6b1025b353bd7b 100644 (file)
@@ -537,7 +537,17 @@ static ssize_t ping_sendto (pingobj_t *obj, pinghost_t *ph,
                        (struct sockaddr *) ph->addr, ph->addrlen);
 
        if (ret < 0)
+       {
+#if defined(EHOSTUNREACH)
+               if (errno == EHOSTUNREACH)
+                       return (0);
+#endif
+#if defined(ENETUNREACH)
+               if (errno == ENETUNREACH)
+                       return (0);
+#endif
                ping_set_error (obj, "sendto", strerror (errno));
+       }
 
        return (ret);
 }