mirror of
https://github.com/dhewm/dhewm3.git
synced 2025-06-01 17:32:09 +00:00
Use the portable getifaddrs() on *nix
Cleanup the OSX specific code in Sys_InitNetworking() and use it for all *nix platforms. Fixes nic detection on BSD.
This commit is contained in:
parent
99864667a7
commit
2d69979be2
1 changed files with 10 additions and 73 deletions
|
@ -40,9 +40,7 @@ If you have questions concerning this license or the applicable additional terms
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#if MACOS_X
|
|
||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sys/platform.h"
|
#include "sys/platform.h"
|
||||||
#include "framework/Common.h"
|
#include "framework/Common.h"
|
||||||
|
@ -275,10 +273,6 @@ NET_InitNetworking
|
||||||
*/
|
*/
|
||||||
void Sys_InitNetworking(void)
|
void Sys_InitNetworking(void)
|
||||||
{
|
{
|
||||||
// haven't been able to clearly pinpoint which standards or RFCs define SIOCGIFCONF, SIOCGIFADDR, SIOCGIFNETMASK ioctls
|
|
||||||
// it seems fairly widespread, in Linux kernel ioctl, and in BSD .. so let's assume it's always available on our targets
|
|
||||||
|
|
||||||
#if MACOS_X
|
|
||||||
unsigned int ip, mask;
|
unsigned int ip, mask;
|
||||||
struct ifaddrs *ifap, *ifp;
|
struct ifaddrs *ifap, *ifp;
|
||||||
|
|
||||||
|
@ -302,85 +296,28 @@ void Sys_InitNetworking(void)
|
||||||
if ( !ifp->ifa_netmask )
|
if ( !ifp->ifa_netmask )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
common->Printf( "found interface %s - ", ifp->ifa_name);
|
||||||
|
|
||||||
ip = ntohl( *( unsigned int *)&ifp->ifa_addr->sa_data[2] );
|
ip = ntohl( *( unsigned int *)&ifp->ifa_addr->sa_data[2] );
|
||||||
mask = ntohl( *( unsigned int *)&ifp->ifa_netmask->sa_data[2] );
|
mask = ntohl( *( unsigned int *)&ifp->ifa_netmask->sa_data[2] );
|
||||||
|
|
||||||
if ( ip == INADDR_LOOPBACK ) {
|
if ( ip == INADDR_LOOPBACK ) {
|
||||||
common->Printf( "loopback\n" );
|
common->Printf( "loopback\n" );
|
||||||
} else {
|
} else {
|
||||||
common->Printf( "IP: %d.%d.%d.%d\n",
|
common->Printf( "%u.%u.%u.%u/%u.%u.%u.%u\n",
|
||||||
(unsigned char)ifp->ifa_addr->sa_data[2],
|
(ip >> 24) & 0xff, (ip >> 16) & 0xff,
|
||||||
(unsigned char)ifp->ifa_addr->sa_data[3],
|
(ip >> 8) & 0xff, ip & 0xff,
|
||||||
(unsigned char)ifp->ifa_addr->sa_data[4],
|
(mask >> 24) & 0xff, (mask >> 16) & 0xff,
|
||||||
(unsigned char)ifp->ifa_addr->sa_data[5] );
|
(mask >> 8) & 0xff, mask & 0xff );
|
||||||
common->Printf( "NetMask: %d.%d.%d.%d\n",
|
|
||||||
(unsigned char)ifp->ifa_netmask->sa_data[2],
|
|
||||||
(unsigned char)ifp->ifa_netmask->sa_data[3],
|
|
||||||
(unsigned char)ifp->ifa_netmask->sa_data[4],
|
|
||||||
(unsigned char)ifp->ifa_netmask->sa_data[5] );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
netint[ num_interfaces ].ip = ip;
|
netint[ num_interfaces ].ip = ip;
|
||||||
netint[ num_interfaces ].mask = mask;
|
netint[ num_interfaces ].mask = mask;
|
||||||
num_interfaces++;
|
num_interfaces++;
|
||||||
}
|
|
||||||
#else
|
|
||||||
int s;
|
|
||||||
char buf[ MAX_INTERFACES*sizeof( ifreq ) ];
|
|
||||||
ifconf ifc;
|
|
||||||
ifreq *ifr;
|
|
||||||
int ifindex;
|
|
||||||
unsigned int ip, mask;
|
|
||||||
|
|
||||||
num_interfaces = 0;
|
if (num_interfaces >= MAX_INTERFACES)
|
||||||
|
break;
|
||||||
s = socket( AF_INET, SOCK_DGRAM, 0 );
|
|
||||||
ifc.ifc_len = MAX_INTERFACES*sizeof( ifreq );
|
|
||||||
ifc.ifc_buf = buf;
|
|
||||||
if ( ioctl( s, SIOCGIFCONF, &ifc ) < 0 ) {
|
|
||||||
common->FatalError( "InitNetworking: SIOCGIFCONF error - %s\n", strerror( errno ) );
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
ifindex = 0;
|
|
||||||
while ( ifindex < ifc.ifc_len ) {
|
|
||||||
common->Printf( "found interface %s - ", ifc.ifc_buf + ifindex );
|
|
||||||
// find the type - ignore interfaces for which we can find we can't get IP and mask ( not configured )
|
|
||||||
ifr = (ifreq*)( ifc.ifc_buf + ifindex );
|
|
||||||
if ( ioctl( s, SIOCGIFADDR, ifr ) < 0 ) {
|
|
||||||
common->Printf( "SIOCGIFADDR failed: %s\n", strerror( errno ) );
|
|
||||||
} else {
|
|
||||||
if ( ifr->ifr_addr.sa_family != AF_INET ) {
|
|
||||||
common->Printf( "not AF_INET\n" );
|
|
||||||
} else {
|
|
||||||
ip = ntohl( *( unsigned int *)&ifr->ifr_addr.sa_data[2] );
|
|
||||||
if ( ip == INADDR_LOOPBACK ) {
|
|
||||||
common->Printf( "loopback\n" );
|
|
||||||
} else {
|
|
||||||
common->Printf( "%d.%d.%d.%d",
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[2],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[3],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[4],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[5] );
|
|
||||||
}
|
|
||||||
if ( ioctl( s, SIOCGIFNETMASK, ifr ) < 0 ) {
|
|
||||||
common->Printf( " SIOCGIFNETMASK failed: %s\n", strerror( errno ) );
|
|
||||||
} else {
|
|
||||||
mask = ntohl( *( unsigned int *)&ifr->ifr_addr.sa_data[2] );
|
|
||||||
if ( ip != INADDR_LOOPBACK ) {
|
|
||||||
common->Printf( "/%d.%d.%d.%d\n",
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[2],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[3],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[4],
|
|
||||||
(unsigned char)ifr->ifr_addr.sa_data[5] );
|
|
||||||
}
|
|
||||||
netint[ num_interfaces ].ip = ip;
|
|
||||||
netint[ num_interfaces ].mask = mask;
|
|
||||||
num_interfaces++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ifindex += sizeof( ifreq );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue