diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2011-01-27 14:16:20 -0800 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2011-01-27 14:16:20 -0800 |
commit | 9092b91ccaa4c6069036f72163e6473a5ca408c4 (patch) | |
tree | c6f8be1985fc541c0cced51b05d879936545b0ad /libnetutils/ifc_utils.c | |
parent | 7d05a80da8c210d11df657bcec8b19a6bf1e8a16 (diff) | |
download | system_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.c | 26 |
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; } |