Commit Diff


commit - 07683d0ef7798fdf4289ad1f9496a824f4178362
commit + 51b2002482faac9a8d4a8ebde27562ff64cd55fd
blob - 71fb3ff3058c7b6bd8d085020b59855420e8a28b
blob + 2e35330df33fb0589ae2a8824977f98129ebf0f9
--- src/libip/FreeBSD.c
+++ src/libip/FreeBSD.c
@@ -32,8 +32,8 @@ sockaddr2ip(uchar *ip, struct sockaddr *sa)
 Ipifc*
 readipifc(char *net, Ipifc *ifc, int index)
 {
-	char *p, *ep, *q;
-	int i, mib[6], n, alloc;
+	char *p, *ep, *q, *bp;
+	int i, mib[6], n;
 	Ipifc *list, **last;
 	Iplifc *lifc, **lastlifc;
 	struct if_msghdr *mh, *nmh;
@@ -60,15 +60,18 @@ readipifc(char *net, Ipifc *ifc, int index)
 	mib[4] = NET_RT_IFLIST;
 	mib[5] = 0;
 	
+	n = 0;
 	if(sysctl(mib, 6, nil, &n, nil, 0) < 0)
 		return nil;
-	p = mallocz(n, 1);
-	if(p == nil)
+	bp = mallocz(n, 1);
+	if(bp == nil)
 		return nil;
-	if(sysctl(mib, 6, p, &n, nil, 0) < 0){
-		free(p);
+	if(sysctl(mib, 6, bp, &n, nil, 0) < 0){
+		free(bp);
 		return nil;
 	}
+
+	p = bp;
 	ep = p+n;
 	while(p < ep){
 		mh = (struct if_msghdr*)p;
@@ -89,30 +92,27 @@ readipifc(char *net, Ipifc *ifc, int index)
 		ifc->rp.linkmtu = mh->ifm_data.ifi_mtu;
 		lastlifc = &ifc->lifc;
 
+		if(sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == 6)
+			memmove(ifc->ether, LLADDR(sdl), 6);
+
 		while(p < ep){
 			ah = (struct ifa_msghdr*)p;
 			nmh = (struct if_msghdr*)p;
 			if(nmh->ifm_type != RTM_NEWADDR)
 				break;
 			p += nmh->ifm_msglen;
-			alloc = 0;
+			lifc = nil;
 			for(i=0, q=(char*)(ah+1); i<RTAX_MAX && q<p; i++){
 				if(!(ah->ifam_addrs & (1<<i)))
 					continue;
 				sa = (struct sockaddr*)q;
 				q += (sa->sa_len+sizeof(long)-1) & ~(sizeof(long)-1);
-
-				if(sa->sa_family == AF_LINK && i == RTAX_IFA){
-					struct sockaddr_dl *e;
-					
-					if(e->sdl_type == IFT_ETHER && e->sdl_alen == 6)
-						memmove(ifc->ether, LLADDR(e), 6);
-				}
 				if(sa->sa_family != AF_INET)
 					continue;
-				if(alloc == 0){
-					alloc = 1;
+				if(lifc == nil){
 					lifc = mallocz(sizeof *lifc, 1);
+					if(lifc == nil)
+						continue;
 					*lastlifc = lifc;
 					lastlifc = &lifc->next;
 				}	
@@ -137,8 +137,10 @@ readipifc(char *net, Ipifc *ifc, int index)
 					break;
 				}
 			}
-			maskip(lifc->ip, lifc->mask, lifc->net);
+			if(lifc)
+				maskip(lifc->ip, lifc->mask, lifc->net);
 		}
 	}
+	free(bp);
 	return list;
 }
blob - 35399d7165c11afbdcd90a483e2462463739a008
blob + 6f8ad2f8757a4ff7782b770997c86ab0948b2748
--- src/libip/mkfile
+++ src/libip/mkfile
@@ -18,3 +18,8 @@ HFILES=\
 	ip.h
 
 <$PLAN9/src/mksyslib
+
+testreadipifc: testreadipifc.o $LIBDIR/$LIB
+	$LD -o testreadipifc testreadipifc.o
+
+
blob - 3515e7f25874e1b056aba1cc149802b9dd1a05a6
blob + 1282f3b78323babcff67d57961c262c951b9765d
--- src/libip/testreadipifc.c
+++ src/libip/testreadipifc.c
@@ -7,7 +7,6 @@ main(void)
 {
 	Ipifc *ifc, *list;
 	Iplifc *lifc;
-	int i;
 
 	fmtinstall('I', eipfmt);
 	fmtinstall('M', eipfmt);