Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Jul 2008 21:30:39 +0000
From:      Jens Rehsack <rehsack@web.de>
To:        Brooks Davis <brooks@freebsd.org>
Cc:        FreeBSD Net <freebsd-net@freebsd.org>
Subject:   Re: lo0 not in ioctl( SIOCGIFCONF )
Message-ID:  <4884FFFF.9090908@web.de>
In-Reply-To: <20080721204820.GE1699@lor.one-eyed-alien.net>
References:  <4884F401.4050103@web.de> <20080721204820.GE1699@lor.one-eyed-alien.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Brooks Davis wrote:
>> Hi,
>>
>> maybe this question is better asked in this list ...
>>
>> I was searching why ports/net/p5-Net-Interface was not working as
>> expected and found some reasons. Most of them I can answer by implementing
>> some test code as attached, but now I'm wondering why em0 is shown twice
>> and lo0 is not included.
>> The same situation on another machine ..
> 
> The attachment didn't make it through.
> 
> -- Brooks

Copy&Paste starts here ...
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <net/if.h>
#include <errno.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <ifaddrs.h>

#ifndef _SIZEOF_ADDR_IFREQ
#define	_SIZEOF_ADDR_IFREQ(ifr) \
	((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
	 (sizeof(struct ifreq) - sizeof(struct sockaddr) + \
	  (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
#endif

int
main()
{
     struct ifconf ifc;
     struct ifreq *ifr, *lifr;
     int fd;
     unsigned int n;

     fd = socket( AF_INET, SOCK_STREAM, 0 );
     bzero(&ifc, sizeof(ifc));
         n = 3;
         ifr = calloc( ifc.ifc_len, sizeof(*ifr) );
         do
         {
             n *= 2;
             ifr = realloc( ifr, sizeof(*ifr) * n );
             bzero( ifr, sizeof(*ifr) * n );
             ifc.ifc_req = ifr;
             ifc.ifc_len = n * sizeof(*ifr);
         } while( ( ioctl( fd, SIOCGIFCONF, &ifc ) == -1 ) || ( ifc.ifc_len 
== n * sizeof(*ifr)) );

     lifr = (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len];

     while (ifr < lifr)
     {
         printf( "%s\n", ifr->ifr_name );
         ifr = (struct ifreq *)(((char *)ifr) + _SIZEOF_ADDR_IFREQ(*ifr));
     }

     return 0;
}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4884FFFF.9090908>