X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=src%2Fodhcpd.c;h=bf1d496307a1e6b579ed9678fc78727eb7519399;hb=c4f9ace5560562d3ba7dfefb9e422240d594a460;hp=6a3ba868436d5c7f5eacbe02b7893858d4a66d6a;hpb=44965f14d7abed2d5327ca1c89e4bcf481473e53;p=project%2Fodhcpd.git diff --git a/src/odhcpd.c b/src/odhcpd.c index 6a3ba86..bf1d496 100644 --- a/src/odhcpd.c +++ b/src/odhcpd.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -68,7 +69,7 @@ int main(int argc, char **argv) { openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON); int opt; - int log_level = LOG_WARNING; + int log_level = LOG_INFO; while ((opt = getopt(argc, argv, "hl:")) != -1) { switch (opt) { case 'h': @@ -236,48 +237,56 @@ ssize_t odhcpd_get_interface_addresses(int ifindex, continue; syslog(LOG_WARNING, "Failed to receive IPv6 address rtnetlink message (%s)", strerror(errno)); - return ret; + ret = -1; + goto out; } } - if (nhm->nlmsg_type != RTM_NEWADDR) { - syslog(LOG_WARNING, "Unexpected rtnetlink message (%d) in response to IPv6 address dump", nhm->nlmsg_type); - break; - } - - // Skip address but keep clearing socket buffer - if (ret >= (ssize_t)cnt) - continue; + switch (nhm->nlmsg_type) { + case RTM_NEWADDR: { + // Skip address but keep clearing socket buffer + if (ret >= (ssize_t)cnt) + continue; - struct ifaddrmsg *ifa = NLMSG_DATA(nhm); - if (ifa->ifa_scope != RT_SCOPE_UNIVERSE || - (ifindex && ifa->ifa_index != (unsigned)ifindex)) - continue; + struct ifaddrmsg *ifa = NLMSG_DATA(nhm); + if (ifa->ifa_scope != RT_SCOPE_UNIVERSE || + (ifindex && ifa->ifa_index != (unsigned)ifindex)) + continue; - struct rtattr *rta = (struct rtattr*)&ifa[1]; - size_t alen = NLMSG_PAYLOAD(nhm, sizeof(*ifa)); - memset(&addrs[ret], 0, sizeof(addrs[ret])); - addrs[ret].prefix = ifa->ifa_prefixlen; - - while (RTA_OK(rta, alen)) { - if (rta->rta_type == IFA_ADDRESS) { - memcpy(&addrs[ret].addr, RTA_DATA(rta), - sizeof(struct in6_addr)); - } else if (rta->rta_type == IFA_CACHEINFO) { - struct ifa_cacheinfo *ifc = RTA_DATA(rta); - addrs[ret].preferred = ifc->ifa_prefered; - addrs[ret].valid = ifc->ifa_valid; + struct rtattr *rta = (struct rtattr*)&ifa[1]; + size_t alen = NLMSG_PAYLOAD(nhm, sizeof(*ifa)); + memset(&addrs[ret], 0, sizeof(addrs[ret])); + addrs[ret].prefix = ifa->ifa_prefixlen; + + while (RTA_OK(rta, alen)) { + if (rta->rta_type == IFA_ADDRESS) { + memcpy(&addrs[ret].addr, RTA_DATA(rta), + sizeof(struct in6_addr)); + } else if (rta->rta_type == IFA_CACHEINFO) { + struct ifa_cacheinfo *ifc = RTA_DATA(rta); + addrs[ret].preferred = ifc->ifa_prefered; + addrs[ret].valid = ifc->ifa_valid; + } + + rta = RTA_NEXT(rta, alen); } - rta = RTA_NEXT(rta, alen); - } + if (ifa->ifa_flags & IFA_F_DEPRECATED) + addrs[ret].preferred = 0; - if (ifa->ifa_flags & IFA_F_DEPRECATED) - addrs[ret].preferred = 0; + ++ret; + break; + } + case NLMSG_DONE: + goto out; + default: + syslog(LOG_WARNING, "Unexpected rtnetlink message (%d) in response to IPv6 address dump", nhm->nlmsg_type); + ret = -1; + goto out; + } - ++ret; } - +out: return ret; }