c - UCI C API - 如何使用列表选项

标签 c openwrt

使用 UCI,我们可以使用以下命令检索整个列表:

$ uci get system.ntp.server

这将读取以下配置类型:

config system
    option hostname 'OpenWrt'
    option timezone 'UTC'

config timeserver 'ntp'
    list server '0.openwrt.pool.ntp.org'
    list server '1.openwrt.pool.ntp.org'
    list server '2.openwrt.pool.ntp.org'
    list server '3.openwrt.pool.ntp.org'
    option enabled '1'
    option enable_server '0'

这会在一个长字符串中返回所有 ntp 服务器。

0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org

我希望使用 C api 实现相同(或等效)。

我整理了以下代码:

#include <uci.h>
#include <string.h>
void main()
{
    //char path[] = "system.ntp.enabled";
    char path[] = "system.ntp.server";
    char buffer[80];
    get_config_entry(path, &buffer);
    printf("%s\n", buffer);

}

int get_config_entry (char *path, char *buffer)
{
  struct uci_context *c;
  struct uci_ptr ptr;

  c = uci_alloc_context ();
  if (uci_lookup_ptr (c, &ptr, path, true) != UCI_OK)
    {
      uci_perror (c, "XXX");
      return 1;
    }

  strcpy(buffer, ptr.o->v.string);
  uci_free_context (c);
  return 0;
}

运行它只会在输出字符串中返回垃圾。

我应该如何使用 UCI C API 处理列表内容?

最佳答案

如果请求列表元素,它存储在 v.list 而不是 v.string 中。

我在 uci cli 代码中找到了 uci_show_value 函数,这对我很有帮助。我已设法使以下代码能够很好地处理列表选项。

#include <uci.h>
#include <string.h>

static const char *delimiter = " ";

static void uci_show_value(struct uci_option *o)
{
    struct uci_element *e;
    bool sep = false;

    switch(o->type) {
    case UCI_TYPE_STRING:
        printf("%s\n", o->v.string);
        break;
    case UCI_TYPE_LIST:
        uci_foreach_element(&o->v.list, e) {
            printf("%s%s", (sep ? delimiter : ""), e->name);
            sep = true;
        }
        printf("\n");
        break;
    default:
        printf("<unknown>\n");
        break;
    }
}

int show_config_entry (char *path)
{
  struct uci_context *c;
  struct uci_ptr ptr;

  c = uci_alloc_context ();
  if (uci_lookup_ptr (c, &ptr, path, true) != UCI_OK)
    {
      uci_perror (c, "get_config_entry Error");
      return 1;
    }

  uci_show_value(ptr.o);
  uci_free_context (c);
  return 0;
}

void main()
{
    char path[] = "system.ntp.server";
    show_config_entry(path);

}

关于c - UCI C API - 如何使用列表选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021599/

相关文章:

dependencies - OpenWRT - 重新编译时包缺少依赖项

linux - openWRT Dropbear SSH key 身份验证失败,显示 "unknown algo"

C:如何将任意数组放入可用内存中? (基本的)

Lua string.format %c 与 string.char

c - 如何在 GO 中将 "_Ctype_int"更改为 "int"?

c - C NULL 是否等于 C++11 nullptr

linux - Qemu x86 和 Linux 3.12.17 启动时内核崩溃

linux - 3g Dongle 切换到一个奇怪的产品 ID

c - 内联汇编问题

C语言: is it bad to define functions in ..h文件中没有声明的c文件?