Subject: Re: Updating arp(8) to use getifaddrs (cf. bin/8566)
To: Andrew Brown <atatat@atatdot.net>
From: None <itojun@iijlab.net>
List: tech-net
Date: 11/08/2002 11:11:26
>On Thu, Nov 07, 2002 at 09:17:35AM -0500, Andrew Brown wrote:
> | >The problem with SIOCGIFCONF as used by most programs is that it
> | >doesn't cater for when the number of interfaces * sizeof(struct ifreq)
> | >(== 32) exceeds the buffer size passed in, so you might get truncated
> | >results. There is a way to detect and work around this, except non
> | >of the programs in usr.sbin/* that use SIOCGIFCONF do this, and won't
> | >work correctly if the buffer size is exceeded.
> | >(I checked various programs in usr.sbin which use SIOCGIFCONF, and
> | >they support between 10, 16, 32, 256 (or 1 case, 512) addresses.)
> |
> | they're done incredibly wrong then. my understanding of the
> | "canonical" way to use SIOCGIFCONF was to call it once with an empty
> | struct ifconf (ie, ifc_buf is null and ifc_len is zero), and then
> | malloc a buffer of the size returned in ifc_len. probably with a pad
> | so that any *new* addresses that show up in between your first a
> | second calls are also covered. it's simple to check that you didn't
> | "get back" more data than you expected if you save the value of
> | ifc_len between the first and second calls.
SIOCGIFCONF is way too hard to get right, that's the very reason why
we now have getifaddrs(3). i'm all for the change.
itojun