freebsd
This commit is contained in:
parent
07683d0ef7
commit
51b2002482
3 changed files with 24 additions and 18 deletions
|
|
@ -32,8 +32,8 @@ sockaddr2ip(uchar *ip, struct sockaddr *sa)
|
||||||
Ipifc*
|
Ipifc*
|
||||||
readipifc(char *net, Ipifc *ifc, int index)
|
readipifc(char *net, Ipifc *ifc, int index)
|
||||||
{
|
{
|
||||||
char *p, *ep, *q;
|
char *p, *ep, *q, *bp;
|
||||||
int i, mib[6], n, alloc;
|
int i, mib[6], n;
|
||||||
Ipifc *list, **last;
|
Ipifc *list, **last;
|
||||||
Iplifc *lifc, **lastlifc;
|
Iplifc *lifc, **lastlifc;
|
||||||
struct if_msghdr *mh, *nmh;
|
struct if_msghdr *mh, *nmh;
|
||||||
|
|
@ -60,15 +60,18 @@ readipifc(char *net, Ipifc *ifc, int index)
|
||||||
mib[4] = NET_RT_IFLIST;
|
mib[4] = NET_RT_IFLIST;
|
||||||
mib[5] = 0;
|
mib[5] = 0;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
if(sysctl(mib, 6, nil, &n, nil, 0) < 0)
|
if(sysctl(mib, 6, nil, &n, nil, 0) < 0)
|
||||||
return nil;
|
return nil;
|
||||||
p = mallocz(n, 1);
|
bp = mallocz(n, 1);
|
||||||
if(p == nil)
|
if(bp == nil)
|
||||||
return nil;
|
return nil;
|
||||||
if(sysctl(mib, 6, p, &n, nil, 0) < 0){
|
if(sysctl(mib, 6, bp, &n, nil, 0) < 0){
|
||||||
free(p);
|
free(bp);
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p = bp;
|
||||||
ep = p+n;
|
ep = p+n;
|
||||||
while(p < ep){
|
while(p < ep){
|
||||||
mh = (struct if_msghdr*)p;
|
mh = (struct if_msghdr*)p;
|
||||||
|
|
@ -89,30 +92,27 @@ readipifc(char *net, Ipifc *ifc, int index)
|
||||||
ifc->rp.linkmtu = mh->ifm_data.ifi_mtu;
|
ifc->rp.linkmtu = mh->ifm_data.ifi_mtu;
|
||||||
lastlifc = &ifc->lifc;
|
lastlifc = &ifc->lifc;
|
||||||
|
|
||||||
|
if(sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == 6)
|
||||||
|
memmove(ifc->ether, LLADDR(sdl), 6);
|
||||||
|
|
||||||
while(p < ep){
|
while(p < ep){
|
||||||
ah = (struct ifa_msghdr*)p;
|
ah = (struct ifa_msghdr*)p;
|
||||||
nmh = (struct if_msghdr*)p;
|
nmh = (struct if_msghdr*)p;
|
||||||
if(nmh->ifm_type != RTM_NEWADDR)
|
if(nmh->ifm_type != RTM_NEWADDR)
|
||||||
break;
|
break;
|
||||||
p += nmh->ifm_msglen;
|
p += nmh->ifm_msglen;
|
||||||
alloc = 0;
|
lifc = nil;
|
||||||
for(i=0, q=(char*)(ah+1); i<RTAX_MAX && q<p; i++){
|
for(i=0, q=(char*)(ah+1); i<RTAX_MAX && q<p; i++){
|
||||||
if(!(ah->ifam_addrs & (1<<i)))
|
if(!(ah->ifam_addrs & (1<<i)))
|
||||||
continue;
|
continue;
|
||||||
sa = (struct sockaddr*)q;
|
sa = (struct sockaddr*)q;
|
||||||
q += (sa->sa_len+sizeof(long)-1) & ~(sizeof(long)-1);
|
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)
|
if(sa->sa_family != AF_INET)
|
||||||
continue;
|
continue;
|
||||||
if(alloc == 0){
|
if(lifc == nil){
|
||||||
alloc = 1;
|
|
||||||
lifc = mallocz(sizeof *lifc, 1);
|
lifc = mallocz(sizeof *lifc, 1);
|
||||||
|
if(lifc == nil)
|
||||||
|
continue;
|
||||||
*lastlifc = lifc;
|
*lastlifc = lifc;
|
||||||
lastlifc = &lifc->next;
|
lastlifc = &lifc->next;
|
||||||
}
|
}
|
||||||
|
|
@ -137,8 +137,10 @@ readipifc(char *net, Ipifc *ifc, int index)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
maskip(lifc->ip, lifc->mask, lifc->net);
|
if(lifc)
|
||||||
|
maskip(lifc->ip, lifc->mask, lifc->net);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(bp);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,3 +18,8 @@ HFILES=\
|
||||||
ip.h
|
ip.h
|
||||||
|
|
||||||
<$PLAN9/src/mksyslib
|
<$PLAN9/src/mksyslib
|
||||||
|
|
||||||
|
testreadipifc: testreadipifc.o $LIBDIR/$LIB
|
||||||
|
$LD -o testreadipifc testreadipifc.o
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ main(void)
|
||||||
{
|
{
|
||||||
Ipifc *ifc, *list;
|
Ipifc *ifc, *list;
|
||||||
Iplifc *lifc;
|
Iplifc *lifc;
|
||||||
int i;
|
|
||||||
|
|
||||||
fmtinstall('I', eipfmt);
|
fmtinstall('I', eipfmt);
|
||||||
fmtinstall('M', eipfmt);
|
fmtinstall('M', eipfmt);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue