我想使用C程序来获取网络接口(interface)的IP是手动设置还是通过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中却不能正常工作,所以我想知道如何编写程序来获得相同的结果。

最佳答案

对于 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中可用的所有网络接口(interface),可以使用以下命令:
$uci show network

您可以避免使用libuci在c语言中调用linux命令。 libuci包含C函数,无需通过popen即可执行uci命令(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

关于c - 如何确定eth0模式是static还是dhcp?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16085222/

10-10 09:30