From: Marcel Holtmann Date: Sun, 6 Sep 2009 00:22:43 +0000 (+0200) Subject: Add support for correcting loopback settings X-Git-Tag: 2.0_alpha~3261 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=51e57966891efc0c6ae6a6652308ac60f83fc2a9;p=framework%2Fconnectivity%2Fconnman.git Add support for correcting loopback settings --- diff --git a/plugins/loopback.c b/plugins/loopback.c index 59716c2..446d184 100644 --- a/plugins/loopback.c +++ b/plugins/loopback.c @@ -39,6 +39,9 @@ #include #include +static in_addr_t loopback_address; +static in_addr_t loopback_netmask; + #if 0 static GIOChannel *inotify_channel = NULL; @@ -173,6 +176,36 @@ static int setup_hostname(void) return 0; } +static gboolean valid_loopback(int sk, struct ifreq *ifr) +{ + struct sockaddr_in *addr; + int err; + + err = ioctl(sk, SIOCGIFADDR, ifr); + if (err < 0) { + err = -errno; + connman_error("Getting address failed (%s)", strerror(-err)); + return TRUE; + } + + addr = (struct sockaddr_in *) &ifr->ifr_addr; + if (addr->sin_addr.s_addr != loopback_address) + return FALSE; + + err = ioctl(sk, SIOCGIFNETMASK, ifr); + if (err < 0) { + err = -errno; + connman_error("Getting netmask failed (%s)", strerror(-err)); + return TRUE; + } + + addr = (struct sockaddr_in *) &ifr->ifr_netmask; + if (addr->sin_addr.s_addr != loopback_netmask) + return FALSE; + + return TRUE; +} + static int setup_loopback(void) { struct ifreq ifr; @@ -192,9 +225,13 @@ static int setup_loopback(void) } if (ifr.ifr_flags & IFF_UP) { - err = -EALREADY; - connman_info("The loopback interface is already up"); - goto done; + connman_info("Checking loopback interface settings"); + if (valid_loopback(sk, &ifr) == TRUE) { + err = -EALREADY; + goto done; + } + + connman_warn("Correcting wrong lookback settings"); } memset(&addr, 0, sizeof(addr)); @@ -243,6 +280,9 @@ done: static int loopback_init(void) { + loopback_address = inet_addr("127.0.0.1"); + loopback_netmask = inet_addr("255.0.0.0"); + setup_loopback(); setup_hostname();