6

我想使用 C 程序来获取网络接口的 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 中无法正常运行,所以我想知道如何编写程序来获得相同的结果。

4

3 回答 3

8

对于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 函数来执行ucilibuci命令而不通过 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

于 2013-04-18T14:32:15.220 回答
2

操作系统没有必要的方式来决定应该如何配置接口。内核(例如 GNU/Linux 的 Linux 部分)不决定,它不(也不应该)关心,它只是通过操作系统使用的任何配置系统被告知哪些网络地址与哪些接口一起使用。OpenWRT 不是 GNU,它的操作方式不同。

于 2013-04-18T14:53:55.030 回答
1

AFAIK 没有明确的方法。

读取接口文件只是一个提示:不能保证当前的 seup 来自那里。

如果有,您可以查看“询问”DBUS 接口。您可以检查 dhclient 进程是否正在运行。您可以检查 /etc 中指定不同发行版上的网络设置的其他文件。

我认为最可靠的选择是多层次的:检查一大堆提示以得出答案。

另一种选择:向 dhcp 服务器发送一个 DHCP 检查数据包以验证地址。如果您没有得到答案,尽管可能是网络已关闭但在分配地址时已启动。

于 2013-04-18T14:23:56.713 回答