2013-04-18 17 views
5

Chcę użyć programu C, aby uzyskać, jeśli IP interfejsu sieciowego jest ustawiony ręcznie lub przez dhcp.Jak sprawdzić, czy tryb eth0 jest statyczny czy dhcp?

Próbowałem użyć następującego kodu i działało w Debianie, ale nie działało w OpenWrt. Chcę wiedzieć, jak napisać program C robiący to w OpenWrt. Próbowałem użyć to:

#include <stdio.h> 
int main(void) 
{ 
    FILE *fp; 
    char buffer[80]; 
    fp=popen("cat /etc/network/interfaces |grep ^iface\\ br-lan | awk -F ' ' '{print $4}'","r"); 
    fgets(buffer, sizeof(buffer), fp); 
    printf("%s", buffer); 
    pclose(fp); 
} 

Ten kod działa w Debianie, ale to nie działa normalnie w OpenWrt, więc chcę wiedzieć, jak napisać program, aby uzyskać ten sam rezultat.

+1

dobre pytanie (+1), ale co próbowaliście? – MOHAMED

+0

istnieje ryzyko przegłosowania, jeśli nie dostarczysz tego, co wypróbowałeś. – MOHAMED

+0

Czy chcesz go ogólnie lub dla konkretnego systemu operacyjnego? – jbr

Odpowiedz

7

dla OpenWRT można uzyskać taką informację za pomocą następującego polecenia:

$uci get network.lan.proto 

więc biorę program można umieścić w swoim pytaniu i zmieniać tylko polecenie używane, aby uzyskać informacje:

#include <stdio.h> <br> 
int main(void) 
{ 
    FILE *fp; 
    char buffer[80]; 
    fp=popen("uci get network.lan.proto","r"); 
    fgets(buffer, sizeof(buffer), fp); 
    printf("%s", buffer); 
    pclose(fp); 
} 

żeby zobaczyć wszystkie interfejsy sieciowe dostępne w OpenWRT można użyć następującego polecenia:

$uci show network 

Możesz uniknąć używania polecenia linux w twoim c przy użyciu libuci. libuci zawiera funkcję C do wykonywania poleceń uci bez przechodzenia przez popen (popen służy do wykonywania poleceń zewnętrznych z powłoki).

The libuci istnieje domyślnie w środowisku rozwoju OpenWRT, nie trzeba go pobrać, nie trzeba go budować i nie ma potrzeby instalowania go na komputerze OpenWrt

Można użyć libuci w ten sposób

#include <uci.h> 
void main() 
{ 
    char path[]="network.lan.proto"; 
    char buffer[80]; 
    struct uci_ptr ptr; 
    struct uci_context *c = uci_alloc_context(); 

    if(!c) return; 

    if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) || 
     (ptr.o==NULL || ptr.o->v.string==NULL)) { 
     uci_free_context(c); 
     return; 
    } 

    if(ptr.flags & UCI_LOOKUP_COMPLETE) 
      strcpy(buffer, ptr.o->v.string); 

    uci_free_context(c); 

    printf("%s\n", buffer); 
} 

(nie badane)

i podczas kompilacji programu trzeba dodać -luci w poleceniu kompilacji gcc

+0

Cześć MOHAMED dzięki za pomoc! pierwszy kod za pomocą polecenia uci jest w porządku! Drugi kod, którego nie mogę użyć, ponieważ muszę używać -luci. Może spróbuję później i jeszcze raz dziękuję – stephen

+0

@stephen u r welcome – MOHAMED

+0

Sugerowałbym może użycie opcji -P/var/state/flag na komendzie UCI, która będzie wyglądała na bieżący stan systemu zamiast domyślnej konfiguracji. W ten sposób, gdyby z jakiegoś dziwnego powodu ktoś zmienił uci, aby użył dhcp ze statycznego i nie zostało wykonane zatwierdzenie UCI, zostałoby to odzwierciedlone. Ale drugie rozwiązanie jest najlepsze! – 0xception

1

Istnieje AFAIK bez ostatecznego sposobu.

Odczytanie pliku interfejsów byłoby tylko podpowiedzią: nie ma gwarancji, że pochodzi stąd.

Można na przykład "zapytać" interfejs DBUS, jeśli taki istnieje. Można sprawdzić, czy proces dhclient działa. Można sprawdzić inne pliki w/etc, które określają konfigurację sieci w różnych dystrybucjach.

Myślę, że najbardziej niezawodną opcją byłaby wielowarstwowa rzecz: sprawdź cały szereg wskazówek, by znaleźć odpowiedź.

Inna opcja: wyślij pakiet sprawdzania DHCP do serwera DHCP, aby zweryfikować adres. Jeśli nie dostaniesz odpowiedzi, może to oznaczać, że sieć jest wyłączona, ale była podświetlona po przydzieleniu adresu.

+0

Myślę, że nie wiedziałeś, czego chcę. Chcę tylko wiedzieć, jak programować, ale metoda interfejsu sieciowego jest dhcp lub statyczna. Nie używając programowania powłoki i w żaden inny sposób, a jedynie za pomocą programowania linux c. – stephen

+1

Zrozumiałem, że ... ale w interfejsie nie ma zapisów tego, co chcesz wiedzieć, więc pytasz o coś, co nie jest nagrane. – rivimey

2

Nie ma wymaganego sposobu, aby system operacyjny decydował o sposobie konfigurowania interfejsu. Jądro (część Linux np. GNU/Linux) nie decyduje, nie ma (i nie powinno) się troszczyć, po prostu dostaje informacje, które adresy sieciowe idą z którymi interfejsami, niezależnie od systemu konfiguracji, z którego korzysta system operacyjny.OpenWRT nie jest GNU, działa inaczej.

Powiązane problemy