b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

解决方案:[Smart Router] C代码调用UCI API以阅读openwrt配置文件指南

电脑杂谈  发布时间:2020-12-04 05:03:20  来源:网络整理

路由器配置文件读取_路由器配置文件读取_读取路由器配置文件

[智能路由器]系列文章链接

上一个博客介绍了如何在命令行下使用UCI。该博客arvik将仅分析UCI源代码的一部分,并带您使用C语言调用UCI API来读取配置文件。

实用背景

如果我们编写一个应用程序并想使用UCI来集中管理和配置该应用程序的配置文件,该怎么办?

在阅读arvik的先前博客之后,我相信新手可以快速使用UCI配置特定的配置文件,但是如何使我们的应用程序读取配置文件的内容,本文arvik将回答此问题。

简单的基本关系图

在此处绘制图片可让您大致了解配置文件的内容与UCI的基本结构之间的对应关系。 (示例文件是uhttpd的配置文件)

读取路由器配置文件_路由器配置文件读取_路由器配置文件读取

这里写图片描述

几个结构

struct uci_package:软件包结构。它对应于配置文件的内容

struct uci_package
{
    struct uci_element e;
    struct uci_list sections;
    struct uci_context *ctx;
    bool has_delta;
    char *path;
    /* private: */
    struct uci_backend *backend;
    void *priv;
    int n_section;
    struct uci_list delta;
    struct uci_list saved_delta;
};

struct uci_section:节结构,与配置文件中的节相对应

struct uci_section
{
    struct uci_element e;
    struct uci_list options;
    struct uci_package *package;
    bool anonymous;
    char *type;
};

struct uci_option:选项结构,与配置文件部分中的选项或列表相对应

读取路由器配置文件_路由器配置文件读取_路由器配置文件读取

struct uci_option
{
    struct uci_element e;
    struct uci_section *section;
    enum uci_option_type type;
    union {
        struct uci_list list;
        char *string;
    } v;
};

struct uci_ptr:元素位置指针结构,用于查询和保存相应的位置元素

struct uci_ptr
{
    enum uci_type target;
    enum {
        UCI_LOOKUP_DONE =     (1 << 0),
        UCI_LOOKUP_COMPLETE = (1 << 1),
        UCI_LOOKUP_EXTENDED = (1 << 2),
    } flags;
    struct uci_package *p;
    struct uci_section *s;
    struct uci_option *o;
    struct uci_element *last;
    const char *package;
    const char *section;
    const char *option;
    const char *value;
};

struct uci_context:uci上下文结构,贯穿于查询和更改配置文件的整个过程。

struct uci_context
{
    /* 配置文件包列表 */
    struct uci_list root;
    /* 解析上下文,只用于错误处理 */
    struct uci_parse_context *pctx;
    /* 后端导入导出 */
    struct uci_backend *backend;
    struct uci_list backends;
    /* uci 运行标识 */
    enum uci_flags flags;
    char *confdir;
    char *savedir;
    /* search path for delta files */
    struct uci_list delta_path;
    /* 私有数据 */
    int err;
    const char *func;
    jmp_buf trap;
    bool internal, nested;
    char *buf;
    int bufsz;
};

几个基本的API函数

uci_alloc_context:动态申请uci上下文结构

读取路由器配置文件_路由器配置文件读取_路由器配置文件读取

struct uci_context *uci_alloc_context(void);

uci_free_contex:释放uci_alloc_context请求的uci上下文结构,并包含其所有数据

void uci_free_context(struct uci_context *ctx);

uci_lookup_ptr:从给定的元组中查找元素

/**
 * uci_lookup_ptr: 分离一个uci元组字符串且查找对应元素树
 * @ctx: uci context结构体指针
 * @ptr: 存放元素查询结果的结构体指针
 * @str: 待查找的uci元组字符串
 * @extended: 允许扩展语法查询
 *
 *如果extended被设为ture,则uci_lookup_ptr支持下列扩展语法:
 * 
 *例子:
 *   network.@interface[0].ifname (ifname option of the first interface section)
 *   network.@interface[-1]       (last interface section)
 * Note: 有必要的话uci_lookup_ptr将会自动加载配置文件包
 * @str 不能是一个const类型指针,它在使用的过程中将会被更改且用于将字符串填写到@ptr中,因此
 * 它只要@ptr还在使用,它就必须是可用的
 *
 * 这个函数在指定包元组的的字符串未被找到时返回UCI_ERR_NOTFOUND,否则返回UCI_OK
 *
 * 记住在查找其他部分失败的情况,如果它们同样被指定,包括section和option,同样会返回UCI_OK,
 * 但是ptr->flags * UCI_LOOKUP_COMPLETE标志位不会被置位
 */
int uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool extended);

可以通过上述3个API轻松读取UCI标准配置文件。

代码战斗

路由器配置文件读取_读取路由器配置文件_路由器配置文件读取

尝试在下面编写示例代码

/***********************************
author:arvik
email:1216601195@qq.com
csdn:http://blog.csdn.net/u012819339
************************************/
#include 
#include 
#include 
#include "uci.h"
int main()
{
    struct uci_context *c;
    struct uci_ptr p;
    char *a = strdup("arvik_testconfig.main.home"); 
    c = uci_alloc_context();
    if(UCI_OK != uci_lookup_ptr(c, &p, a, true))
    {
        uci_perror(c, "no found!\n");
        return -1;
    }
    printf("%s\n", p.o->v.string);
    uci_free_context(c);
    free(a);
    return(0);
}

效果:

root@OpenWrt:/# arvik_uci_test 
/www

运行屏幕截图:

这里写图片描述

[智能路由器]系列文章链接


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxingongju/article-337951-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...