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 :|