【智能路由器】C代码调用uci的API读openwrt配置文件指南

【智能路由器】系列文章连接

http://blog.csdn.net/u012819339/article/category/5803489



上篇博客讲解了命令行下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:选项结构体,它对应配置文件里节中的option或者list

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:[email protected]
csdn:http://blog.csdn.net/u012819339
************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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://blog.csdn.net/u012819339/article/category/5803489

时间: 2025-01-04 01:56:57

【智能路由器】C代码调用uci的API读openwrt配置文件指南的相关文章

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest &#160;attilax大总结.docx

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx 1. 为什么需要接口调用??1 1.1. 为了方便集成复用模块类库1 1.2. 嫁接不同的语言与类库,以及嵌入dsl1 1.3. 方便跨机器,跨开发板,跨硬件,跨运行环境的代码复用2 2. 接口api的历史2 2.1. 发展历程2 2.2. API 这个类库默认提供的接口,要求同语言调用一般2 2.3. Cli接口 命令行接口.单机跨语言接口(推荐比较常用)3 2.4. 图形用户

Qt刷新机制的一些总结(Qt内部画的时候是相当于画在后台一个对象里,然后在刷新的时候调用bitblt统一画,调用window的api并不会影响到后面的那个对象)

前段时间做过一个界面刷新的优化,遇到的坑比较多,在这里做一点点总结吧. 优化的方案是滚动滚动条的时候用截屏的方式代替界面全部刷新,优化完成后,界面在滚动时效率能提升大概一倍,背景介绍完毕. 用到最主要的是QT的截屏功能 window原生api会提供截屏滚动的功能.可以用这个ScrollWindowEx这个api.它会根据相应的参数在屏幕中进行滚动相应的区域.是不是很容易?但是结果却是不理想,因为用的是Qt,控件重写过PaintEvent的方法.调用api实时能看到效果,但是触发一次PaintEv

vs2010代码注释自动生成api文档

最近做了一些接口,提供其他人调用,要写个api文档,可是我想代码注释已经写了说明,能不能直接把代码注释生成api?于是找到以下方法 环境:vs2010 先下载安装Sandcastle 和Sandcastle Help File Builder 下载地址 http://sandcastle.codeplex.com/ http://shfb.codeplex.com/ 其中Sandcastle Help File Builder安装较复杂,安装红框内的即可 安装完成后,然后让要使用的项目输出xml

java调用淘宝api

代码下载地址:http://www.zuidaima.com/share/1550463234034688.htm 原文:java调用淘宝api java代码结构: java调用淘宝api,布布扣,bubuko.com

C#调用百度地图 api

转  http://blog.csdn.net/kkkkkxiaofei/article/details/8663377 这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不能直接复制就运行.在实现之前肯定要加载地图,先放一个webbroser控件,然后如下: [csharp] view plaincopyprint? private void Form1_Load(object sender, EventArgs e) { string str_url = Appli

Hadoop-2.6.0上调用C的API实现相似云盘的功能

Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS实现类似云盘的上传.下载,删除,重命名的功能,其他功能还请有意者自行加入,废话少说.開始进入正题. 首先我们要能在hadoop-2.6.0上的C的API訪问HDFS 详情能够訪问:http://blog.csdn.net/u013930856/article/details/47660937 以下開

搜索框关键字智能匹配实例代码实例

搜索框关键字智能匹配实例代码实例:只要使用搜索引擎的朋友应该都有这样的体会,就是当在搜索框输入关键字的时候,会出现自能匹配现象,这绝对是非常好的用户体验,下面就是一段类似的代码,当然这里只是掩饰,所以只能匹配的数据都是本地固定好的,在实际应用中可以才能够数据库读取数据.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="auth

调用域名注册api,查询所有域名组合脚本

今天有个想法,想查询所有短域名是否被注册了,a-z1-9组成的所有3,4位组合的.com域名是否有没被注册的,于是开干,google后知道万网提供一个api可以查询, http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=google.com, 后面的google.com可以换做你想查询的域名,结果会返回一个xml页面,如下  <?xml   version="1.0" encoding="gb2312"?

智能路由器安全特性分析

智能路由器安全特性分析 腾讯安全中心 · 2015/07/21 14:09 博文作者:zhuliang 0x00 前言 随着互联网的发展,越来越多公司推出了智能路由器,这些智能路由器给用户带来了众多便利的功能,同时也采用了一些传统路由器不具备的安全特性,本文在简要分析下这些安全特性,供相关技术人员参考. 0x01 概述 传统路由器有意或无意地使用了种种不安全的特性,如预留后门,这些后门原本是为了现场调试方便,但是也开放了黑客进入的通道.又比如某些路由器WPS(Wi-Fi Protected Se