Функция получения имени сконфигурированного интерфейса:
Код: Выделить всё
static void found_iface(char *iface)
{
struct ifaddrs *ifaddr = NULL, *ifa = NULL;
if (NULL == iface)
return;
if (getifaddrs(&ifaddr))
return;
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
daemon_info("%d: interface %s", __LINE__, ifa->ifa_name); //line 35
if (ifa->ifa_flags & IFF_LOOPBACK)
continue;
else if (ifa->ifa_flags & IFF_UP) {
daemon_info("%d: interface %s & IFF_UP (flag %d)", __LINE__, ifa->ifa_name, ifa->ifa_flags); //line 39
daemon_info("%d: ifa_addr %#x, ifa_netmask %#x, ifu_dstaddr %#x", __LINE__,
/*((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr*/0xff, /*((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr.s_addr*/0xcc, ((struct sockaddr_in *)ifa->ifa_dstaddr)->sin_addr.s_addr);
daemon_info("%d:", __LINE__);
if (((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr !=
INADDR_ANY) {
daemon_info("%d: interface %s != INADDR_ANY", __LINE__, ifa->ifa_name);
strncpy(iface, ifa->ifa_name, IFNAMSIZ);
freeifaddrs(ifaddr);
break;
}
}
}
}Работа проверена на интерфейсах eth0 и usb0, но сейчас переходим на работу через ppp-интерфейс и по не понятной причине программа выпадает в этой функции с segmentation fault.
Вывод в консоли:
Код: Выделить всё
configd: 35: interface lo
configd: 35: interface ppp0
configd: 39: interface ppp0 & IFF_UP (flag 69841)
[1]+ Segmentation fault configd -fdИнтерфейс ppp скрнфигурирован, лог pppd:
Код: Выделить всё
Serial connection established.
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB0
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 10.209.79.99
remote IP address 10.64.64.64
primary DNS address 10.77.48.33
secondary DNS address 10.77.48.49Если закомментировать все строки работы с адресом, то всё работает.
Вопрос - как необходимо работать с сетевыми адресами в случае ppp-интерфейса?
Спасибо.