+/* Following functions are local */
+
+/*****************************************************************************
+ * GetMacAddress: extract the MAC Address
+ *****************************************************************************/
+static int GetMacAddress( int i_socket, char *psz_mac )
+{
+#if defined( SYS_LINUX )
+ struct ifreq interface;
+ int i_ret;
+
+ /*
+ * Looking for information about the eth0 interface
+ */
+ interface.ifr_addr.sa_family = AF_INET;
+ strcpy( interface.ifr_name, INPUT_IFACE_DEFAULT );
+
+ i_ret = ioctl( i_socket, SIOCGIFHWADDR, &interface );
+
+ if( i_ret )
+ {
+ intf_ErrMsg( "network error: ioctl SIOCGIFHWADDR failed" );
+ return( i_ret );
+ }
+
+ sprintf( psz_mac, "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
+ interface.ifr_hwaddr.sa_data[0] & 0xff,
+ interface.ifr_hwaddr.sa_data[1] & 0xff,
+ interface.ifr_hwaddr.sa_data[2] & 0xff,
+ interface.ifr_hwaddr.sa_data[3] & 0xff,
+ interface.ifr_hwaddr.sa_data[4] & 0xff,
+ interface.ifr_hwaddr.sa_data[5] & 0xff );
+
+ return( 0 );
+
+#elif defined( WIN32 )
+ int i, i_ret = -1;
+
+ /* Get adapter list - support for more than one adapter */
+ LANA_ENUM AdapterList;
+ NCB Ncb;
+
+ intf_WarnMsg( 2, "network: looking for MAC address" );
+
+ memset( &Ncb, 0, sizeof( NCB ) );
+ Ncb.ncb_command = NCBENUM;
+ Ncb.ncb_buffer = (unsigned char *)&AdapterList;
+ Ncb.ncb_length = sizeof( AdapterList );
+ Netbios( &Ncb );
+
+ /* Get all of the local ethernet addresses */
+ for ( i = 0; i < AdapterList.length ; ++i )
+ {
+ if ( GetAdapterInfo ( AdapterList.lana[ i ], psz_mac ) == 0 )
+ {
+ i_ret = 0;
+ }
+ }
+
+ return( i_ret );
+
+#else
+ return( -1);
+
+#endif
+}
+
+#ifdef WIN32
+/*****************************************************************************
+ * GetAdapterInfo : gets some informations about the interface using NETBIOS
+ *****************************************************************************/
+static int GetAdapterInfo( int i_adapter, char *psz_string )
+{
+ struct ASTAT
+ {
+ ADAPTER_STATUS adapt;
+ NAME_BUFFER psz_name[30];
+ } Adapter;
+
+ /* Reset the LAN adapter so that we can begin querying it */
+ NCB Ncb;
+ memset( &Ncb, 0, sizeof ( Ncb ) );
+ Ncb.ncb_command = NCBRESET;
+ Ncb.ncb_lana_num = i_adapter;
+
+ if( Netbios( &Ncb ) != NRC_GOODRET )
+ {
+ intf_ErrMsg( "network error: reset returned %i", Ncb.ncb_retcode );
+ return -1;
+ }
+
+ /* Prepare to get the adapter status block */
+ memset( &Ncb, 0, sizeof( Ncb ) ) ; /* Initialization */
+ Ncb.ncb_command = NCBASTAT;
+ Ncb.ncb_lana_num = i_adapter;
+
+ strcpy( (char *)Ncb.ncb_callname, "*" );
+
+ memset( &Adapter, 0, sizeof ( Adapter ) );
+ Ncb.ncb_buffer = ( unsigned char * ) &Adapter;
+ Ncb.ncb_length = sizeof ( Adapter );
+
+ /* Get the adapter's info and, if this works, return it in standard,
+ * colon-delimited form. */
+ if ( Netbios( &Ncb ) == 0 )
+ {
+ sprintf ( psz_string, "%02X:%02X:%02X:%02X:%02X:%02X",
+ (int) ( Adapter.adapt.adapter_address[0] ),
+ (int) ( Adapter.adapt.adapter_address[1] ),
+ (int) ( Adapter.adapt.adapter_address[2] ),
+ (int) ( Adapter.adapt.adapter_address[3] ),
+ (int) ( Adapter.adapt.adapter_address[4] ),
+ (int) ( Adapter.adapt.adapter_address[5] ) );
+
+ intf_WarnMsg( 2, "network: found MAC address %s", psz_string );
+
+ return 0;
+ }
+ else
+ {
+ intf_ErrMsg( "network error: ASTAT returned %i", Ncb.ncb_retcode );
+ return -1;
+ }
+}
+#endif /* WIN32 */
+