summaryrefslogtreecommitdiffstats
path: root/libnetutils/ifc_utils.c
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2011-01-27 14:16:20 -0800
committerDmitry Shmidt <dimitrysh@google.com>2011-01-27 14:16:20 -0800
commit9092b91ccaa4c6069036f72163e6473a5ca408c4 (patch)
treec6f8be1985fc541c0cced51b05d879936545b0ad /libnetutils/ifc_utils.c
parent7d05a80da8c210d11df657bcec8b19a6bf1e8a16 (diff)
downloadsystem_core-9092b91ccaa4c6069036f72163e6473a5ca408c4.zip
system_core-9092b91ccaa4c6069036f72163e6473a5ca408c4.tar.gz
system_core-9092b91ccaa4c6069036f72163e6473a5ca408c4.tar.bz2
libnetutils: Clean all IPs assigned to the interface on cleaning
Change-Id: Ic285bbb4b224fc4e62e88e76b8b448edbe814a17 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'libnetutils/ifc_utils.c')
-rw-r--r--libnetutils/ifc_utils.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c
index 8076496..6788391 100644
--- a/libnetutils/ifc_utils.c
+++ b/libnetutils/ifc_utils.c
@@ -189,6 +189,23 @@ int ifc_set_mask(const char *name, in_addr_t mask)
return ioctl(ifc_ctl_sock, SIOCSIFNETMASK, &ifr);
}
+int ifc_get_addr(const char *name, in_addr_t *addr)
+{
+ struct ifreq ifr;
+ int ret = 0;
+
+ ifc_init_ifr(name, &ifr);
+ if (addr != NULL) {
+ ret = ioctl(ifc_ctl_sock, SIOCGIFADDR, &ifr);
+ if (ret < 0) {
+ *addr = 0;
+ } else {
+ *addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr;
+ }
+ }
+ return ret;
+}
+
int ifc_get_info(const char *name, in_addr_t *addr, in_addr_t *mask, unsigned *flags)
{
struct ifreq ifr;
@@ -312,11 +329,20 @@ int ifc_enable(const char *ifname)
int ifc_disable(const char *ifname)
{
+ unsigned addr, count;
int result;
ifc_init();
result = ifc_down(ifname);
+
ifc_set_addr(ifname, 0);
+ for (count=0, addr=1;((addr != 0) && (count < 255)); count++) {
+ if (ifc_get_addr(ifname, &addr) < 0)
+ break;
+ if (addr)
+ ifc_set_addr(ifname, 0);
+ }
+
ifc_close();
return result;
}