| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| |
| static uchar loopbacknet[IPaddrlen] = { |
| 0, 0, 0, 0, |
| 0, 0, 0, 0, |
| 0, 0, 0xff, 0xff, |
| 127, 0, 0, 0 |
| }; |
| static uchar loopbackmask[IPaddrlen] = { |
| 0xff, 0xff, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff, |
| 0xff, 0xff, 0xff, 0xff, |
| 0xff, 0, 0, 0 |
| }; |
| |
| /* find first ip addr that isn't the friggin loopback address */ |
| /* unless there are no others */ |
| int |
| myipaddr(uchar *ip, char *net) |
| { |
| Ipifc *nifc; |
| Iplifc *lifc; |
| Ipifc *ifc; |
| uchar mynet[IPaddrlen]; |
| |
| ifc = readipifc(net, nil, -1); |
| for(nifc = ifc; nifc; nifc = nifc->next) |
| for(lifc = nifc->lifc; lifc; lifc = lifc->next){ |
| maskip(lifc->ip, loopbackmask, mynet); |
| if(ipcmp(mynet, loopbacknet) == 0){ |
| continue; |
| } |
| if(ipcmp(lifc->ip, IPnoaddr) != 0){ |
| ipmove(ip, lifc->ip); |
| freeipifc(ifc); |
| return 0; |
| } |
| } |
| ipmove(ip, IPnoaddr); |
| freeipifc(ifc); |
| return -1; |
| } |
| |