@ -2473,72 +2473,226 @@ char *ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
 
			
		
	
		
			
				
						return  os ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__Darwin__)  
			
		
	
		
			
				
					# include  <ifaddrs.h>  
			
		
	
		
			
				
					# include  <net/if_dl.h>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  ast_set_default_eid ( struct  ast_eid  * eid )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
					# if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_IFRU_IFRU_HWADDR)  
			
		
	
		
			
				
						int  s ,  x  =  0 ; 
 
			
		
	
		
			
				
						struct  ifaddrs  * ifap ,  * ifaphead ; 
 
			
		
	
		
			
				
						int  rtnerr ; 
 
			
		
	
		
			
				
						const  struct  sockaddr_dl  * sdl ; 
 
			
		
	
		
			
				
						int  alen ; 
 
			
		
	
		
			
				
						caddr_t  ap ; 
 
			
		
	
		
			
				
						char  eid_str [ 20 ] ; 
 
			
		
	
		
			
				
						struct  ifreq  ifr ; 
 
			
		
	
		
			
				
						static  const  unsigned  int  MAXIF  =  10 ; 
 
			
		
	
		
			
				
						unsigned  char  empty_mac [ 6 ]  =  { 0 ,  0 ,  0 ,  0 ,  0 ,  0 } ; 
 
			
		
	
		
			
				
						unsigned  char  full_mac [ 6 ]   =  { 0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF } ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						s  =  socket ( AF_INET ,  SOCK_STREAM ,  0 ) ; 
 
			
		
	
		
			
				
						if  ( s  <  0 )  { 
 
			
		
	
		
			
				
						rtnerr  =  getifaddrs ( & ifaphead ) ; 
 
			
		
	
		
			
				
						if  ( rtnerr )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						for  ( x  =  0 ;  x  <  MAXIF ;  x + + )  { 
 
			
		
	
		
			
				
							static  const  char  * prefixes [ ]  =  {  " eth " ,  " em " ,  " eno " ,  " ens "  } ; 
 
			
		
	
		
			
				
							unsigned  int  i ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							for  ( i  =  0 ;  i  <  ARRAY_LEN ( prefixes ) ;  i + + )  { 
 
			
		
	
		
			
				
								memset ( & ifr ,  0 ,  sizeof ( ifr ) ) ; 
 
			
		
	
		
			
				
								snprintf ( ifr . ifr_name ,  sizeof ( ifr . ifr_name ) ,  " %s%d " ,  prefixes [ i ] ,  x ) ; 
 
			
		
	
		
			
				
								if  ( ! ioctl ( s ,  SIOCGIFHWADDR ,  & ifr ) )  { 
 
			
		
	
		
			
				
									break ; 
 
			
		
	
		
			
				
						if  ( ! ifaphead )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						for  ( ifap  =  ifaphead ;  ifap ;  ifap  =  ifap - > ifa_next )  { 
 
			
		
	
		
			
				
							if  ( ifap - > ifa_addr - > sa_family  ! =  AF_LINK )  { 
 
			
		
	
		
			
				
								continue ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( i  = =  ARRAY_LEN ( prefixes ) )  { 
 
			
		
	
		
			
				
								/* Try pciX#[1..N] */ 
 
			
		
	
		
			
				
								for  ( i  =  0 ;  i  <  MAXIF ;  i + + )  { 
 
			
		
	
		
			
				
									memset ( & ifr ,  0 ,  sizeof ( ifr ) ) ; 
 
			
		
	
		
			
				
									snprintf ( ifr . ifr_name ,  sizeof ( ifr . ifr_name ) ,  " pci%d#%u " ,  x ,  i ) ; 
 
			
		
	
		
			
				
									if  ( ! ioctl ( s ,  SIOCGIFHWADDR ,  & ifr ) )  { 
 
			
		
	
		
			
				
										break ; 
 
			
		
	
		
			
				
							sdl  =  ( const  struct  sockaddr_dl  * )  ifap - > ifa_addr ; 
 
			
		
	
		
			
				
							ap  =  ( ( caddr_t )  ( ( sdl ) - > sdl_data  +  ( sdl ) - > sdl_nlen ) ) ; 
 
			
		
	
		
			
				
							alen  =  sdl - > sdl_alen ; 
 
			
		
	
		
			
				
							if  ( alen  ! =  6  | |  ! ( memcmp ( ap ,  & empty_mac ,  6 )  & &  memcmp ( ap ,  & full_mac ,  6 ) ) )  { 
 
			
		
	
		
			
				
								continue ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							memcpy ( eid ,  ap ,  sizeof ( * eid ) ) ; 
 
			
		
	
		
			
				
							ast_debug ( 1 ,  " Seeding global EID '%s' \n " , 
 
			
		
	
		
			
				
									ast_eid_to_str ( eid_str ,  sizeof ( eid_str ) ,  eid ) ) ; 
 
			
		
	
		
			
				
							freeifaddrs ( ifaphead ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
								if  ( i  = =  MAXIF )  { 
 
			
		
	
		
			
				
									continue ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
							" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
						freeifaddrs ( ifaphead ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# elif defined(SOLARIS)  
			
		
	
		
			
				
					# include  <sys/sockio.h>  
			
		
	
		
			
				
					# include  <net/if_arp.h>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  ast_set_default_eid ( struct  ast_eid  * eid )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						int  s ; 
 
			
		
	
		
			
				
						int  x ; 
 
			
		
	
		
			
				
						int  res  =  0 ; 
 
			
		
	
		
			
				
						struct  lifreq  * ifr  =  NULL ; 
 
			
		
	
		
			
				
						struct  lifnum  ifn ; 
 
			
		
	
		
			
				
						struct  lifconf  ifc ; 
 
			
		
	
		
			
				
						struct  arpreq  ar ; 
 
			
		
	
		
			
				
						struct  sockaddr_in  * sa ,  * sa2 ; 
 
			
		
	
		
			
				
						char  * buf  =  NULL ; 
 
			
		
	
		
			
				
						char  eid_str [ 20 ] ; 
 
			
		
	
		
			
				
						int  bufsz ; 
 
			
		
	
		
			
				
						unsigned  char  empty_mac [ 6 ]  =  { 0 ,  0 ,  0 ,  0 ,  0 ,  0 } ; 
 
			
		
	
		
			
				
						unsigned  char  full_mac [ 6 ]   =  { 0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF } ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						s  =  socket ( AF_INET ,  SOCK_STREAM ,  0 ) ; 
 
			
		
	
		
			
				
						if  ( s  < =  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " Unable to open a socket for seeding global EID.  " 
 
			
		
	
		
			
				
								"  You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Get a count of interfaces on the machine */ 
 
			
		
	
		
			
				
						ifn . lifn_family  =  AF_UNSPEC ; 
 
			
		
	
		
			
				
						ifn . lifn_flags  =  0 ; 
 
			
		
	
		
			
				
						ifn . lifn_count  =  0 ; 
 
			
		
	
		
			
				
						if  ( ioctl ( s ,  SIOCGLIFNUM ,  & ifn )  <  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
								"  You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							memcpy ( eid ,  ( ( unsigned  char  * ) & ifr . ifr_hwaddr )  +  2 ,  sizeof ( * eid ) ) ; 
 
			
		
	
		
			
				
							ast_debug ( 1 ,  " Seeding global EID '%s' from '%s' using 'siocgifhwaddr' \n " ,  ast_eid_to_str ( eid_str ,  sizeof ( eid_str ) ,  eid ) ,  ifr . ifr_name ) ; 
 
			
		
	
		
			
				
						bufsz  =  ifn . lifn_count  *  sizeof ( struct  lifreq ) ; 
 
			
		
	
		
			
				
						if  ( ! ( buf  =  ast_malloc ( bufsz ) ) )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " Unable to allocate memory for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						memset ( buf ,  0 ,  bufsz ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Get a list of interfaces on the machine */ 
 
			
		
	
		
			
				
						ifc . lifc_len  =  bufsz ; 
 
			
		
	
		
			
				
						ifc . lifc_buf  =  buf ; 
 
			
		
	
		
			
				
						ifc . lifc_family  =  AF_UNSPEC ; 
 
			
		
	
		
			
				
						ifc . lifc_flags  =  0 ; 
 
			
		
	
		
			
				
						if  ( ioctl ( s ,  SIOCGLIFCONF ,  & ifc )  <  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							ast_free ( buf ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						for  ( ifr  =  ( struct  lifreq  * ) buf ,  x  =  0 ;  x  <  ifn . lifn_count ;  ifr + + ,  x + + )  { 
 
			
		
	
		
			
				
							unsigned  char  * p ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							sa  =  ( struct  sockaddr_in  * ) & ( ifr - > lifr_addr ) ; 
 
			
		
	
		
			
				
							sa2  =  ( struct  sockaddr_in  * ) & ( ar . arp_pa ) ; 
 
			
		
	
		
			
				
							* sa2  =  * sa ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if ( ioctl ( s ,  SIOCGARP ,  & ar )  > =  0 )  { 
 
			
		
	
		
			
				
								p  =  ( unsigned  char  * ) & ( ar . arp_ha . sa_data ) ; 
 
			
		
	
		
			
				
								if  ( ! ( memcmp ( p ,  & empty_mac ,  6 )  & &  memcmp ( p ,  & full_mac ,  6 ) ) )  { 
 
			
		
	
		
			
				
									continue ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								memcpy ( eid ,  p ,  sizeof ( * eid ) ) ; 
 
			
		
	
		
			
				
								ast_debug ( 1 ,  " Seeding global EID '%s' \n " , 
 
			
		
	
		
			
				
									ast_eid_to_str ( eid_str ,  sizeof ( eid_str ) ,  eid ) ) ; 
 
			
		
	
		
			
				
								ast_free ( buf ) ; 
 
			
		
	
		
			
				
								close ( s ) ; 
 
			
		
	
		
			
				
								return ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
							" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
						ast_free ( buf ) ; 
 
			
		
	
		
			
				
						close ( s ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# else  
			
		
	
		
			
				
					# if defined(ifa_broadaddr) && !defined(SOLARIS)  
			
		
	
		
			
				
					void  ast_set_default_eid ( struct  ast_eid  * eid )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						int  s ; 
 
			
		
	
		
			
				
						int  i ; 
 
			
		
	
		
			
				
						struct  ifreq  * ifr ; 
 
			
		
	
		
			
				
						struct  ifreq  * ifrp ; 
 
			
		
	
		
			
				
						struct  ifconf  ifc ; 
 
			
		
	
		
			
				
						char  * buf  =  NULL ; 
 
			
		
	
		
			
				
						char  eid_str [ 20 ] ; 
 
			
		
	
		
			
				
						struct  ifaddrs  * ifap ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( getifaddrs ( & ifap )  = =  0 )  { 
 
			
		
	
		
			
				
							struct  ifaddrs  * p ; 
 
			
		
	
		
			
				
							for  ( p  =  ifap ;  p ;  p  =  p - > ifa_next )  { 
 
			
		
	
		
			
				
								if  ( ( p - > ifa_addr - > sa_family  = =  AF_LINK )  & &  ! ( p - > ifa_flags  &  IFF_LOOPBACK )  & &  ( p - > ifa_flags  &  IFF_RUNNING ) )  { 
 
			
		
	
		
			
				
									struct  sockaddr_dl *  sdp  =  ( struct  sockaddr_dl * )  p - > ifa_addr ; 
 
			
		
	
		
			
				
									memcpy ( & ( eid - > eid ) ,  sdp - > sdl_data  +  sdp - > sdl_nlen ,  6 ) ; 
 
			
		
	
		
			
				
									ast_debug ( 1 ,  " Seeding global EID '%s' from '%s' using 'getifaddrs' \n " ,  ast_eid_to_str ( eid_str ,  sizeof ( eid_str ) ,  eid ) ,  p - > ifa_name ) ; 
 
			
		
	
		
			
				
									freeifaddrs ( ifap ) ; 
 
			
		
	
		
			
				
						int  bufsz ,  num_interfaces ; 
 
			
		
	
		
			
				
						unsigned  char  empty_mac [ 6 ]  =  { 0 ,  0 ,  0 ,  0 ,  0 ,  0 } ; 
 
			
		
	
		
			
				
						unsigned  char  full_mac [ 6 ]   =  { 0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF ,  0xFF } ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						s  =  socket ( AF_INET ,  SOCK_STREAM ,  0 ) ; 
 
			
		
	
		
			
				
						if  ( s  < =  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " Unable to open socket for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ifc . ifc_len  =  0 ; 
 
			
		
	
		
			
				
						ifc . ifc_buf  =  NULL ; 
 
			
		
	
		
			
				
						if  ( ioctl ( s ,  SIOCGIFCONF ,  & ifc )  | |  ifc . ifc_len  < =  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
							freeifaddrs ( ifap ) ; 
 
			
		
	
		
			
				
						bufsz  =  ifc . ifc_len ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						if  ( ! ( buf  =  ast_malloc ( bufsz ) ) )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " Unable to allocate memory for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
					# endif  
			
		
	
		
			
				
						ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID. You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ifc . ifc_buf  =  buf ; 
 
			
		
	
		
			
				
						if  ( ioctl ( s ,  SIOCGIFCONF ,  & ifc )  <  0 )  { 
 
			
		
	
		
			
				
							ast_log ( LOG_WARNING ,  " Unable to retrieve ethernet interfaces for seeding global EID.  " 
 
			
		
	
		
			
				
								" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
							ast_free ( buf ) ; 
 
			
		
	
		
			
				
							close ( s ) ; 
 
			
		
	
		
			
				
							return ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ifrp  =  ifc . ifc_req ; 
 
			
		
	
		
			
				
						num_interfaces  =  ifc . ifc_len  /  sizeof ( * ifr ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						for  ( i  =  0 ;  i  <  num_interfaces ;  i + + )  { 
 
			
		
	
		
			
				
							ifr  =  & ifrp [ i ] ; 
 
			
		
	
		
			
				
							if  ( ! ioctl ( s ,  SIOCGIFHWADDR ,  ifr ) )  { 
 
			
		
	
		
			
				
								unsigned  char  * hwaddr  =  ( unsigned  char  * )  ifr - > ifr_hwaddr . sa_data ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( ! ( memcmp ( hwaddr ,  & empty_mac ,  6 )  & &  memcmp ( hwaddr ,  & full_mac ,  6 ) ) )  { 
 
			
		
	
		
			
				
									continue ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								memcpy ( eid ,  hwaddr ,  sizeof ( * eid ) ) ; 
 
			
		
	
		
			
				
								ast_debug ( 1 ,  " Seeding global EID '%s' from '%s' using 'siocgifhwaddr' \n " , 
 
			
		
	
		
			
				
									ast_eid_to_str ( eid_str ,  sizeof ( eid_str ) ,  eid ) ,  ifr - > ifr_name ) ; 
 
			
		
	
		
			
				
								ast_free ( buf ) ; 
 
			
		
	
		
			
				
								close ( s ) ; 
 
			
		
	
		
			
				
								return ; 
 
			
		
	
		
			
				
							} 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						ast_log ( LOG_WARNING ,  " No ethernet interface found for seeding global EID.  " 
 
			
		
	
		
			
				
							" You will have to set it manually. \n " ) ; 
 
			
		
	
		
			
				
						ast_free ( buf ) ; 
 
			
		
	
		
			
				
						close ( s ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						return ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					# endif  /* LINUX */  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					int  ast_str_to_eid ( struct  ast_eid  * eid ,  const  char  * s )  
			
		
	
		
			
				
					{