[РЕШЕНО] segfault при получении локального адреса ppp

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

[РЕШЕНО] segfault при получении локального адреса ppp

Сообщение IMB »

Доброго дня!
Функция получения имени сконфигурированного интерфейса:

Код: Выделить всё

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-интерфейса?
Спасибо.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: [РЕШЕНО] segfault при получении локального адреса ppp

Сообщение Rootlexx »

IMB писал(а):
23.08.2013 17:17
по не понятной причине программа выпадает

Ну так используйте gdb, чтобы разобраться, в чём дело.
NOTES в man getifaddrs читали?
ip addr ещё покажите.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: [РЕШЕНО] segfault при получении локального адреса ppp

Сообщение IMB »

Как показал опыт в структуреifaddrs заполяются не все поля и заполняемые поля различаются для разных типов интерфейсов, например:

Код: Выделить всё

usb0 ifa_addr 0x54ae1bc0 ifa_netmask (nil) ifa_data 0x54ae1d38
ppp0 ifa_addr (nil) ifa_netmask (nil) ifa_data 0x54ae1dbc

Основываясь на описании в /usr/include/ifaddrs.h я такого не ожидал.

А локальный адрес ppp-интерфейса я потом получаю используя IOCTL SIOCGIFADDR.
Спасибо сказали: