如何确定eth0模式是静态还是dhcp?

ste*_*hen 6 c linux networking openwrt dhcp

我想使用C程序来获取手动或通过dhcp设置网络接口的IP.

我试过使用下面的代码,它已经在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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码在Debian中运行,但它在OpenWrt中不能正常工作,所以我想知道如何编写程序来获得相同的结果.

MOH*_*MED 8

对于OpenWRT, 您可以使用以下命令获取此类信息:

$uci get network.lan.proto
Run Code Online (Sandbox Code Playgroud)

所以我把你提出的程序放在你的问题中,我只更改用于获取信息的命令:

#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);
}
Run Code Online (Sandbox Code Playgroud)

要查看OpenWRT中可用的所有网络接口,您可以使用以下命令:

$uci show network
Run Code Online (Sandbox Code Playgroud)

你可以避免在你的c中使用调用linux命令libuci.的libuci含有C功能,而不经由POPEN传递给执行UCI命令(popen用于从外壳执行外部命令).

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);
}
Run Code Online (Sandbox Code Playgroud)

(未测试)

编译程序时,必须-luci在编译命令中添加gcc