loopback: Recover Loopback on Setup when Up but No Address
authorGrant Erickson <marathon96@gmail.com>
Fri, 15 Jul 2011 17:21:34 +0000 (10:21 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 15 Jul 2011 20:33:54 +0000 (22:33 +0200)
It is possible to end up in situations in which the loopback interface
is up but has no valid address. In that case, we expect SIOCGIFADDR
will return EADDRNOTAVAIL and valid_loopback should return FALSE such
that connman can add a loopback address back to the interface.

This is a partial fix for bug 21001
<https://bugs.meego.com/show_bug.cgi?id=21001>.

plugins/loopback.c

index ac3e2fc..f962415 100644 (file)
@@ -188,11 +188,16 @@ static gboolean valid_loopback(int sk, struct ifreq *ifr)
        int err;
        char buf[INET_ADDRSTRLEN];
 
+       /* It is possible to end up in situations in which the
+        * loopback interface is up but has no valid address. In that
+        * case, we expect EADDRNOTAVAIL and should return FALSE.
+        */
+
        err = ioctl(sk, SIOCGIFADDR, ifr);
        if (err < 0) {
                err = -errno;
                connman_error("Getting address failed (%s)", strerror(-err));
-               return TRUE;
+               return err != -EADDRNOTAVAIL ? TRUE : FALSE;
        }
 
        addr = (struct sockaddr_in *) &ifr->ifr_addr;