[libvirt] compile fail on FreeBSD

Daniel P. Berrange berrange at redhat.com
Wed Nov 16 10:10:50 UTC 2011


On Tue, Nov 15, 2011 at 03:24:11PM -0700, Eric Blake wrote:
> On 11/15/2011 04:08 AM, Daniel P. Berrange wrote:
> > On Fri, Nov 11, 2011 at 05:31:14PM -0700, Eric Blake wrote:
> >> This failure on FreeBSD 8.2 popped up this week, and I suspect Dan's
> >> virnetdev refactoring, but haven't had time to further investigate and
> >> fix it:
> >>
> >> util/virnetdev.c: In function 'virNetDevExists':
> >> util/virnetdev.c:93: error: storage size of 'ifr' isn't known
> >> util/virnetdev.c:95: warning: implicit declaration of function
> >> 'virNetDevSetupControl'
> >>
> >> and so on.  Probably some conditional compilation going wrong when on a
> >> non-Linux machine.
> > 
> > This code is protected by a
> > 
> > #ifdef HAVE_NET_IF_H
> > 
> > 
> > So if BSD's net/if.h does not provide any 'struct ifreq' then we need to
> > fix things.
> 
> <net/if.h> is standardized by POSIX, but 'struct ifreq' is not (the only
> portable struct in that header is 'struct if_nameindex').
> 
> > 
> > Does anyone know if the 'struct ifreq'  / SIOCGIFHWADDR / SIOCGIFMTU / etc
> > ioctl() stuff is entirely Linux specific, or is it semi portable to other
> > UNIX ?  
> 
> Solaris 10 has struct ifreq, also provided by <net/if.h>, but with
> different fields:
> 
> Linux:
> struct ifreq
>   {
>     union
>       {
> 	char ifrn_name[16];
>       } ifr_ifrn;
>     union
>       {
> 	struct sockaddr ifru_addr;
> 	struct sockaddr ifru_dstaddr;
> 	struct sockaddr ifru_broadaddr;
> 	struct sockaddr ifru_netmask;
> 	struct sockaddr ifru_hwaddr;
> 	short int ifru_flags;
> 	int ifru_ivalue;
> 	int ifru_mtu;
> 	struct ifmap ifru_map;
> 	char ifru_slave[16];
> 	char ifru_newname[16];
> 	__caddr_t ifru_data;
>       } ifr_ifru;
>   };
> 
> Solaris:
> struct ifreq {
> 
>  char ifr_name[16];
>  union {
>   struct sockaddr ifru_addr;
>   struct sockaddr ifru_dstaddr;
>   char ifru_oname[16];
>   struct sockaddr ifru_broadaddr;
>   int ifru_index;
>   short ifru_flags;
>   int ifru_metric;
>   char ifru_data[1];
>   char ifru_enaddr[6];
>   int if_muxid[2];
>   struct ifr_ppaflags {
>    short ifrup_flags;
>    short ifrup_filler;
>    uint_t ifrup_ppa;
>   } ifru_ppaflags;
>   struct ifr_dnld_reqs {
>    uint32_t v_addr;
>    uint32_t m_addr;
>    uint32_t ex_addr;
>    uint32_t size;
>   } ifru_dnld_req;
>   struct ifr_fddi_stats {
>    uint32_t stat_size;
>    uint32_t fddi_stats;
>   } ifru_fddi_stat;
>   struct ifr_netmapents {
>    uint32_t map_ent_size,
>     entry_number;
>    uint32_t fddi_map_ent;
>   } ifru_netmapent;
>   struct ifr_fddi_gen_struct {
>    uint32_t ifru_fddi_gioctl;
>    uint32_t ifru_fddi_gaddr;
>   } ifru_fddi_gstruct;
>  } ifr_ifru;
> };
> 
> ifr_name is common between the two, but I'm thinking the ioctl's are
> going to be Linux-specific, so we're better off conditionalizing the
> code to not even attempt use of 'struct ifreq' outside Linux.

Ok, lets just change it to #ifdef __linux__ then, and if someone wants
to port it to Solaris / BSD they can figure out the better approach :-)

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list