我正在更新一些使用硬编码网络的软件(
eth0
)为了各种目的。我想做的是先检测哪个以太网接口。我了解systemd的变化以及如何
小精灵
使用新命名方案的这些系统很可能不存在。所以我要做的是运行所有接口并检测以太网适配器。我想避免
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
要将其识别为以太网设备?
第二部分,如果是的话,当我只需要以太网适配器时,我如何排除蓝牙PAN和其他潜在设备的选择?
请注意,这需要同时在systemd和non-systemd系统上工作,我宁愿避免从iface名称推断类型(no
strncmp(if_name, "eth", 3) == 0
,
strncmp(if_name, "en", 2) == 0
以及转发兼容性和手动配置命名的排序。