X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=system-linux.c;h=f2f96601658789ba077961d863015d7aa91fddfd;hp=cee41f505dfb20a0039f6b1a521a4a55b82ed6bd;hb=8625bb7339d437ac3b827fa5c8dcc7b69bcf1e1b;hpb=735244cf3ca5bf37f185e8cf52862c1be96b5c21 diff --git a/system-linux.c b/system-linux.c index cee41f5..f2f9660 100644 --- a/system-linux.c +++ b/system-linux.c @@ -9,6 +9,8 @@ #include #include +#include +#include #include #include "netifd.h" @@ -57,11 +59,7 @@ int system_init(void) nlmsg_free(m); } -#ifdef NLA_PUT_DATA rtnl_event.fd = nl_socket_get_fd(sock_rtnl_event); -#else - rtnl_event.fd = sock_rtnl_event->s_fd; // libnl-tiny hack... -#endif uloop_fd_add(&rtnl_event, ULOOP_READ | ULOOP_EDGE_TRIGGER); } @@ -165,8 +163,19 @@ static int system_if_flags(struct device *dev, unsigned add, unsigned rem) return ioctl(sock_ioctl, SIOCSIFFLAGS, &ifr); } +static int system_if_resolve(struct device *dev) +{ + struct ifreq ifr; + strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name)); + if (!ioctl(sock_ioctl, SIOCGIFINDEX, &ifr)) + return ifr.ifr_ifindex; + else + return 0; +} + int system_if_up(struct device *dev) { + dev->ifindex = system_if_resolve(dev); return system_if_flags(dev, IFF_UP, 0); } @@ -177,15 +186,7 @@ int system_if_down(struct device *dev) int system_if_check(struct device *dev) { - struct ifreq ifr; - strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name)); - if (ioctl(sock_ioctl, SIOCGIFINDEX, &ifr)) - return -1; - - dev->ifindex = ifr.ifr_ifindex; - - /* if (!strcmp(dev->ifname, "eth0")) - device_set_present(dev, true); */ + device_set_present(dev, (system_if_resolve(dev) >= 0)); return 0; } @@ -203,7 +204,7 @@ static int system_addr(struct device *dev, struct device_addr *addr, int cmd) return -1; nlmsg_append(msg, &ifa, sizeof(ifa), 0); - nla_put(msg, IFA_ADDRESS, alen, &addr->addr); + nla_put(msg, IFA_LOCAL, alen, &addr->addr); return system_rtnl_call(msg); }