Następująca funkcja określa, czy dany ciąg znaków jest prawidłową nazwą urządzenia sieciowego.Ifreq's ifr_names są niepoprawne?
int isValidNDevice(char *name) {
char data[4096];
struct ifconf ifc;
struct ifreq *ifr;
int sk;
int nIntfcs;
sk = socket(AF_INET, SOCK_DGRAM, 0);
if(sk < 0)
{
perror("socket");
return 0;
}
ifc.ifc_len = sizeof(data);
ifc.ifc_buf = (caddr_t)data;
if(ioctl(sk, SIOCGIFCONF, &ifc) < 0)
{
perror("ioctl(SIOCGIFCONF)");
return 0;
}
ifr = (struct ifreq*)data;
nIntfcs = ifc.ifc_len/sizeof(struct ifreq);
for(int i=0; i < nIntfcs; i++)
{
safe_printf("%s\n", (&ifr[i])->ifr_name);
if (!strcmp((&ifr[i])->ifr_name, name)) {
return 1;
}
}
return 0;
}
Kiedy uruchomić tę funkcję, otrzymuję następujący wynik.
lo0
stf0
2> s
en1j
Kod ten działał dobrze kilka miesięcy temu. Co się zmieniło? Czy robię coś niepoprawnie?
OS: OSX El Capitan
Ah, więc to Mac OS. Ponieważ dla Linuksa twój kod jest poprawny, ale Mac jest inny, widziałeś [ten kod] (https://gist.github.com/OrangeTide/909204) (linie 57-63)? Chociaż może łatwiej użyć po prostu 'getifaddrs()' lub nawet 'if_nameindex()' (nie jestem pewny czy ten ostatni jest obsługiwany w Mac OS). –
Czy możesz dołączyć minimalny, ale kompletny program, który kompiluje i uruchamia twój problem? Będziesz miał znacznie większą szansę na uzyskanie pomocy. Zobacz także http://stackoverflow.com/help/mcve – sigjuice
nIntfcs = ifc.ifc_len/sizeof (struct ifreq) nie jest poprawna w systemie OS X, ponieważ zwracane wartości ifreqs nie mają takiego samego rozmiaru jak Linux. Pomocne może być odwołanie się do kodu Apple [ifconfig] (https://opensource.apple.com/source/network_cmds/network_cmds-306/ifconfig.tproj/ifconfig.c). – sigjuice