Я обновляю некоторое программное обеспечение, которое использует жестко запрограммированную сеть iface (eth0
) для различных целей. Что я хотел бы сделать, это определить, какой интерфейс Ethernet будет первым. Я понимаю изменения в systemd и то, как eth0
может не существовать в этих системах с новой схемой именования. Итак, я пытаюсь выполнить все интерфейсы и обнаружить адаптеры Ethernet. Я хотел бы избежать lo
, tun
и других виртуальных устройств. Пока все хорошо с этим кодом:
char* getMainEthernetIfaceName() {
char *name = NULL;
struct if_nameindex *ifacenames = if_nameindex(), *idx;
if (!ifacenames) return name;
for (idx = ifacenames; !(!idx->if_index && !idx->if_name); ++idx) {
char path[256];
sprintf(path,"/sys/class/net/%s/type", idx->if_name);
FILE *fp = fopen(path, "re");
if (fp) {
int type;
if (fscanf(fp, "%d", &type) == 1) {
if (type == ARPHRD_ETHER) {
name = malloc(IF_NAMESIZE);
strncpy(name, idx->if_name, IF_NAMESIZE-1);
fclose(fp);
break;
}
}
fclose(fp);
}
}
if_freenameindex(ifacenames);
return name;
}
Тем не менее, мой тест по-прежнему обнаруживает pan0
как действительный, поскольку его тип ARPHRD_ETHER
.
Первая часть вопроса, имеет ли смысл использовать sysfs
, чтобы идентифицировать это как устройство Ethernet?
Вторая часть, если так, как я могу исключить Bluetooth PAN и, возможно, другие устройства, выбранные, когда мне нужны только адаптеры Ethernet?
Обратите внимание, это должно работать как на системных, так и на несистемных системах, и я бы предпочел не выводить тип из имени iface (без strncmp(if_name, "eth", 3) == 0
, strncmp(if_name, "en", 2) == 0
и сортировки для прямой совместимости и настраивать вручную. именование.)