2013-04-18 33 views
5

我想要使用C程序來獲取網絡接口的IP是手動設置還是通過dhcp設置。如何找出eth0模式是靜態還是dhcp?

我試過使用下面的代碼,它在Debian中工作過,但它在OpenWrt中沒有工作。我想知道如何在OpenWrt中編寫一個C程序。 我曾嘗試使用此:

#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); 
} 

此代碼是在Debian的工作,但它不是在OpenWrt的正常工作,所以我想知道如何編寫一個程序來得到相同的結果。

+1

很好的問題(+1),但你有什麼嘗試? – MOHAMED

+0

如果你不提供你曾經嘗試過的帳號,那麼就有可能被拒絕投票 – MOHAMED

+0

你想要一般的還是特定的操作系統? – jbr

回答

7

的OpenWRT你可以用下面的命令這樣一個信息:

$uci get network.lan.proto 

所以我帶你把你的問題的程序,我只更改用於獲取信息的命令:

#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); 
} 

看到所有可用的網絡接口,在你的OpenWRT,您可以使用下面的命令:

$uci show network 

通過使用libuci,可以避免在c中使用調用linux命令。 libuci包含C函數來執行uci命令而不通過popen(popen用於從shell執行外部命令)。

的libuci默認情況下的OpenWRT的發展環境中存在,不需要下載,不需要構建它,也不需要你的OpenWRT安裝到機器上

可以以這種方式使用libuci

#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); 
} 

(未測試)

,當您編譯程序,你必須添加-luci在編譯命令gcc

+0

嗨MOHAMED謝謝你的幫助!第一個使用命令uci的代碼很好!第二個代碼,我不能使用它,因爲我必須使用-luci。也許我會稍後再試,再次感謝 – stephen

+0

@stephen u歡迎 – MOHAMED

+0

我建議可能在uci命令中使用-P/var/state /標誌,它將查看系統的當前狀態而不是默認配置。這樣,如果由於某些奇怪的原因某人改變了uci從靜態使用dhcp並且沒有執行uci commit,它會被反映出來。但是,第二個解決方案是最好的! – 0xception

1

有AFAIK沒有明確的方式。

讀取接口文件只是一個提示:不能保證當前的seup來自那裏。

如果有的話,你可以查看'詢問'DBUS接口。 您可以檢查運行的dhclient進程。 您可以檢查/ etc中指定不同發行版上的網絡設置的其他文件。

我認爲最可靠的選擇將是一個多層次的事情:檢查一大堆提示來想出答案。

另一種選擇:向DHCP服務器發送一個DHCP檢查數據包以驗證地址..如果您沒有得到答案,但可能是網絡已關閉,但在分配地址時已關閉。

+0

我想你不知道我想要什麼。我只是想知道如何編程來獲得網絡接口的方法是dhcp還是靜態的。不使用shell編程和其他方式,只使用linux c編程。 – stephen

+1

我的確認識到......但在界面本身並沒有記錄你想知道的東西,所以你要求的是沒有記錄的東西。 – rivimey

2

OS沒有必要決定如何配置接口。內核(例如GNU/Linux的Linux部分)沒有做出決定,它不會(也不應該)在意,它只是通過操作系統正在使用的任何配置系統被告知哪些網絡地址與哪個接口一起。OpenWRT不是GNU,它的運行方式不同。

相關問題