iproute: fix handling of "dev IFACE" selector

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index f6071b4..14fc16c 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -31,8 +31,8 @@
 	//int type; - read-only
 	//int typemask; - unused
 	//int tos, tosmask; - unused
-	int iif, iifmask;
-	int oif, oifmask;
+	int iif;
+	int oif;
 	//int realm, realmmask; - unused
 	//inet_prefix rprefsrc; - read-only
 	inet_prefix rvia;
@@ -182,17 +182,25 @@
 	) {
 		return 0;
 	}
-	if (G_filter.flushb
-	 && r->rtm_family == AF_INET6
-	 && r->rtm_dst_len == 0
-	 && r->rtm_type == RTN_UNREACHABLE
-	 && tb[RTA_PRIORITY]
-	 && *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1
-	) {
-		return 0;
+	if (G_filter.oif != 0) {
+		if (!tb[RTA_OIF])
+			return 0;
+		if (G_filter.oif != *(int*)RTA_DATA(tb[RTA_OIF]))
+			return 0;
 	}
 
 	if (G_filter.flushb) {
+		/* We are creating route flush commands */
+
+		if (r->rtm_family == AF_INET6
+		 && r->rtm_dst_len == 0
+		 && r->rtm_type == RTN_UNREACHABLE
+		 && tb[RTA_PRIORITY]
+		 && *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1
+		) {
+			return 0;
+		}
+
 		struct nlmsghdr *fn;
 		if (NLMSG_ALIGN(G_filter.flushp) + n->nlmsg_len > G_filter.flushe) {
 			if (flush_update())
@@ -208,6 +216,8 @@
 		return 0;
 	}
 
+	/* We are printing routes */
+
 	if (n->nlmsg_type == RTM_DELROUTE) {
 		printf("Deleted ");
 	}
@@ -257,10 +267,12 @@
 					RTA_DATA(tb[RTA_GATEWAY]),
 					abuf, sizeof(abuf)));
 	}
-	if (tb[RTA_OIF] && G_filter.oifmask != -1) {
+	if (tb[RTA_OIF]) {
 		printf("dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
 	}
 
+	/* Todo: parse & show "proto kernel", "scope link" here */
+
 	if (tb[RTA_PREFSRC] && /*G_filter.rprefsrc.bitlen - always 0*/ 0 != host_len) {
 		/* Do not use format_host(). It is our local addr
 		   and symbolic name will not be useful.
@@ -292,7 +304,7 @@
 				printf(" error %d", ci->rta_error);
 		}
 	}
-	if (tb[RTA_IIF] && G_filter.iifmask != -1) {
+	if (tb[RTA_IIF] && G_filter.iif == 0) {
 		printf(" iif %s", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_IIF])));
 	}
 	bb_putchar('\n');
@@ -662,12 +674,10 @@
 		if (id) {
 			idx = xll_name_to_index(id);
 			G_filter.iif = idx;
-			G_filter.iifmask = -1;
 		}
 		if (od) {
 			idx = xll_name_to_index(od);
 			G_filter.oif = idx;
-			G_filter.oifmask = -1;
 		}
 	}
 
diff --git a/networking/libiproute/libnetlink.c b/networking/libiproute/libnetlink.c
index 7291ee2..547013f 100644
--- a/networking/libiproute/libnetlink.c
+++ b/networking/libiproute/libnetlink.c
@@ -55,6 +55,7 @@
 	return rtnl_send(rth, (void*)&req, sizeof(req));
 }
 
+//TODO: pass rth->fd instead of full rth?
 int FAST_FUNC rtnl_send(struct rtnl_handle *rth, char *buf, int len)
 {
 	struct sockaddr_nl nladdr;