Мне нужно получить активный сетевой интерфейс устройства на языке c с помощью системной команды, и должен быть передан ответ системы, чтобы получить адрес ma c устройства, и для того же самого ниже приведен образец, который я использовал,
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <netdb.h>
char interface[100];
char reader_mac[13] = {00};
int main()
{
FILE *f = popen("ip addr show | awk '/inet.*brd/{print $NF}'", "r");
while (fgets(interface, 100, f) != NULL) {
}
printf( "interface :: %s\n", interface );
pclose(f);
struct ifreq s;
int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
// strcpy(s.ifr_name, "eth0");
strcpy(s.ifr_name, interface);
if (0 == ioctl(fd, SIOCGIFHWADDR, &s)) {
int i;
for (i = 0; i < 6; ++i){
unsigned char data = s.ifr_addr.sa_data[i];
// printf("ddd:::%02x\n", data );
sprintf(reader_mac+(i*2), "%02x", data);
}
reader_mac[12] = '\0';
printf("reader_mac ::: %s\n",reader_mac);
}
}
Как решить эту проблему?
Я могу получить активный интерфейс как,
interface :: wlp1s0
Тогда как то же самое интерфейс передается в strcpy (s.ifr_name, interface) и для того же не может получить адрес. Вместо strcpy (s.ifr_name, interface), если я использую его как strcpy (s.ifr_name, "wlp1s0), он без проблем возвращает адрес ma c.