>>>>> On Thu, 20 Jan 2000 09:20:58 +0000, 
>>>>> Philip Blundell <[EMAIL PROTECTED]> said:

>>>> Sockaddr_in6 does not fit in ifreq{} in BSDs, either. But it doesn't
>>>> matter for us if we carefully parse the result of the ioctl.
>> 
>>> I remember that application increments its pointer manually by 
>>> sizeof(struct sockaddr_in6) - sizeof(struct sockaddr) bytes, 
>>> but it is not good for Linux because we don't know the actual size of 
>>> sockaddr_in6 structure returned from kernel
>> 
>> I don't get it. Why can't you just use sizeof(sockaddr_in6) for
>> AF_INET6? Are you concerned with padding issues?

> The returned structure includes (essentially) an array of `struct sockaddr'.
> You can't just vary the size of this structure since the user program would 
> then have no way to find elements beyond the first.  (For 4.4BSD this is not 
> a 
> problem because you can use sa->sa_len to get this information.)

I may still misunderstand the point, but I think you can calculate the
offset (i.e. sizeof(struct sockaddr_in6)) if you first check the
sa_family likt the following code:

struct ifconf       ifconf;
struct ifreq       *ifrp;

  ioctl(sockt, SIOCGIFCONF, (char *)&ifconf);

  for (i = 0; i < ifconf.ifc_len; i += sizeof(struct ifreq)) {
    ifrp = (struct ifreq *)(ifconfg.ifc_buf + i);

    .../* use ifrp as you want */

    if (ifrp->ifr_addr.sa_family == AF_INET6) /* you may need more cases */
        i += (sizeof(struct sockaddr_in6) - sizeof(struct sockaddr));
  }

                                        JINMEI, Tatuya
                                        Communication Platform Lab.
                                        Corporate R&D Center, Toshiba Corp.
                                        [EMAIL PROTECTED]

Reply via email to