Return to BSD News archive
Newsgroups: comp.unix.bsd
Path: sserve!manuel.anu.edu.au!munnari.oz.au!labtam!labtam!mark
From: mark@labtam.labtam.oz.au (Mark Treacy)
Subject: Re: getting net config with SIOCGIFCONF ioctl call
Organization: Labtam Australia Pty. Ltd., Melbourne, Australia
Date: Thu, 8 Oct 1992 11:20:44 GMT
Message-ID: <mark.718543244@labtam>
References: <7519@vtserf.cc.vt.edu>
Keywords: ioctl ifconf ifreq
Lines: 60
linkt@GroupW.cns.vt.edu (Tim Link) writes:
>I'm working on a program that needs to determine the network
>configuration under 386BSD. I'm using the SIOCGIFCONF IOCTL function
>which *I THINK* should return to me an array of ifreq structures which
>have the name of the interface and it's ip address. This ain't what I'm
>gettin'. I've poked and prodded and looked at if.c to try to figure out
>what's going on, but I can't see where the problem is. Just as a test I
>compiled the program on an Ultrix machine and the results were close to
>what I expected, but still not exact. Can anybody look at this and tell
>me if I'm completely wrong in what I'm doing of if SIOCGIFCONF isn't
>returning what it should be???
I haven't seen any replies to this, so either you're still in the dark
or our news feed is dropping articles.
In the 4.3bsd-reno and net2 release the ifreq's returned by SIOCGIFCONF
are not fixed length. See ifconf() in usr/src/sys/net/if.c .
You need something similar to the code in inet.c in tcpdump.
i.e. (fragment taken from tcpdump)
ifc.ifc_len = sizeof ibuf;
ifc.ifc_buf = (caddr_t)ibuf;
if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 ||
ifc.ifc_len < sizeof(struct ifreq)) {
perror("tcpdump: SIOCGIFCONF: ");
exit(1);
}
...
ifrp = ibuf;
ifend = (struct ifreq *)((char *)ibuf + ifc.ifc_len);
while (ifrp < ifend) {
....
#if BSD >= 199006
n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name);
if (n < sizeof(*ifrp))
++ifrp;
else
ifrp = (struct ifreq *)((char *)ifrp + n);
#else
++ifrp;
#endif
}
...
You're probably only interested in AF_INET addresses, so skip
over the ones that aren't. if_attach() creates an AF_LINK
address for an interface which isn't terribly usefull
since it only gets filled in with the interface name.
The function in libc to handle AF_LINK addresses wouldn't
display the address correctly anyway.
>As always, any and all help appreciated.
> Tim
- Mark.