Как я могу определить адаптеры Ethernet в GNU / Linux с помощью C - PullRequest
0 голосов
/ 24 января 2019

Я обновляю некоторое программное обеспечение, которое использует жестко запрограммированную сеть 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 и сортировки для прямой совместимости и настраивать вручную. именование.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...