фрагмент кода:
/* ---------------------------------------------------------------------- */
/* create list mac addresses ofcomputers that program should be allowed to run on */
#define MAX_N_MACS 100
char whitelist_mac[MAX_N_MACS][18];
int nmac = 2;
sprintf( whitelist_mac[0], "a0:b1:c2:d3:e4:f5" );
sprintf( whitelist_mac[0], "a0:b1:c2:d3:e4:f6" );
/* ---------------------------------------------------------------------- */
/* how I verify if computer running my code is on my whitelist */
int Check_Licensing ( void )
{
FILE *fp1;
char mac_thissystem[18];
/* lower case found in /sys/class/net/eth0/address */
fp1 = fopen( "/sys/class/net/eth0/address", "r" );
if ( fp1 == NULL )
{
printf("\n Error: license problem, program quitting\n\n");
exit( 0 );
}
fgets( mac_thissystem, 18, fp1 );
fclose( fp1 );
for ( i = 0; i < nmac; i++ )
{
if ( strcmp( ok_mac[i], mac_thissystem ) == 0 )
return 1;
}
/* current system MAC does not match whitelist */
return 0;
}
Это работает, но моя проблема, кажется, в переносимости с попыткой ссылки /sys/class/net/eth0/address
. Укажите eth0 деталь. С установкой biosdevname
и net.ifnames
на RHEL / CentOS 7 в эти дни нет никакой гарантии, что путь /sys/class/net/eth0/address
будет существовать. eth0
может быть чем-то вроде eno1
. Я также видел enps0...something
.
, что является самым надежным и портативным способом сделать что-то подобное на linux?
- Как узнать сетевое именование схема, чтобы сначала выяснить, есть ли у меня
eth0
или somethingelse
для имени сетевого устройства? - Тогда, есть ли лучший способ получить сетевой MA C адрес работающей системы, лучше чем использовать
/sys/class/net/<device_name>/address
? Я предпочел бы не требовать, чтобы кто-то делал GRUB_CMDLINE_LINUX=net.ifnames=0
, чтобы заставить eth0
из-за моего кодирования. Я не заинтересован в том, чтобы сделать эту работу в Microsoft windows или любой другой, не linux операционной системе.