blob: 2234e71d63a795483e36b15a3d3afb9bfae67397 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lynq_uci.h>
#include <log/log.h>
int lynq_del(char *option)
{
int ret;
char buf[LYNQ_UCI_MAX_LEN];
struct uci_context *ctx = uci_alloc_context();
struct uci_ptr ptr;
sprintf(buf, "%s", option);
if(uci_lookup_ptr(ctx, &ptr, buf, true) == UCI_OK)
{
uci_delete(ctx, &ptr);
uci_save(ctx, ptr.p);
ret = LYNQ_UCI_SUCCESS;
}
else
ret = LYNQ_UCI_ERROR;
uci_free_context(ctx);
return ret;
}
static int uci_get_value(struct uci_option *o, char *out_buf)
{
struct uci_element *e;
const char *delimiter = " ";
int lynq_uci_flag = 0;
switch(o->type) {
case UCI_TYPE_STRING:
strcpy(out_buf, o->v.string);
break;
case UCI_TYPE_LIST:
uci_foreach_element(&o->v.list, e)
{
if(lynq_uci_flag)
strcat(out_buf, delimiter);
strcat(out_buf, e->name);
lynq_uci_flag = 1;
}
break;
default:
return UCI_ERR_INVAL;
break;
}
return UCI_OK;
}
int lynq_uci_get(const char *arg, char *out_buf)
{
struct uci_context *ctx;
struct uci_element *e;
struct uci_ptr ptr;
int ret = UCI_OK;
char *para_name = NULL;
if(arg == NULL || out_buf == NULL) return UCI_ERR_INVAL;
para_name = strdup(arg);
if(para_name == NULL) return UCI_ERR_INVAL;
ctx = uci_alloc_context();
if (!ctx) {
free(para_name);
return UCI_ERR_MEM;
}
if (uci_lookup_ptr(ctx, &ptr, para_name, true) != UCI_OK) {
uci_free_context(ctx);
free(para_name);
return UCI_ERR_NOTFOUND;
}
if(UCI_LOOKUP_COMPLETE & ptr.flags)
{
e = ptr.last;
switch(e->type)
{
case UCI_TYPE_SECTION:
ret = UCI_ERR_INVAL;
break;
case UCI_TYPE_OPTION:
ret = uci_get_value(ptr.o, out_buf);
break;
default:
ret = UCI_ERR_NOTFOUND;
break;
}
}
else
ret = UCI_ERR_NOTFOUND;
uci_free_context(ctx);
free(para_name);
return ret;
}
int lynq_uci_set(const char *arg)
{
struct uci_context *ctx;
struct uci_element *e;
struct uci_ptr ptr;
int ret = UCI_OK;
char *name = NULL;
if(arg == NULL) return UCI_ERR_INVAL;
name = strdup(arg);
if(name == NULL) return UCI_ERR_MEM;
ctx = uci_alloc_context();
if (!ctx) {
free(name);
return UCI_ERR_MEM;
}
if (uci_lookup_ptr(ctx, &ptr, name, true) != UCI_OK) {
uci_free_context(ctx);
free(name);
return UCI_ERR_NOTFOUND;
}
ret = uci_set(ctx, &ptr);
if(ret != UCI_OK)
{
uci_free_context(ctx);
free(name);
return ret;
}
ret = uci_save(ctx, ptr.p);
if(ret != UCI_OK)
{
uci_free_context(ctx);
free(name);
return ret;
}
ret = uci_commit(ctx, &ptr.p, false);
if(ret != UCI_OK)
{
uci_free_context(ctx);
free(name);
return ret;
}
uci_free_context(ctx);
free(name);
return ret;
}
int lynq_add_section(char *section_type, char *section)//rita add @2021.7.30 for adding section
{
char buf[128] = "";
sprintf(buf,"lynq_uci.%s=%s", section, section_type);
//printf("[%s-%d] buf = %s\n", __FUNCTION__, __LINE__, buf);
int ret = lynq_uci_set(buf);
return ret;
}
int lynq_set_value(char *section, char *key, char *value)//rita add @2021.7.30 for setting value
{
char buf[LYNQ_UCI_MAX_LEN] = "";
sprintf(buf,"%s.%s.%s=%s", LYNQ_UCI_FILE, section, key, value);
//printf("[%s-%d] buf = %s\n", __FUNCTION__, __LINE__, buf);
int ret = lynq_uci_set(buf);
return ret;
}
int lynq_get_value(char *file, char *section, char *key, char *tmp)//rita add @2021.7.30 for getting value
{
char buf[LYNQ_UCI_MAX_LEN] = "";
int ret = 0;
if(strcmp(file, LYNQ_UCI_RO_FILE) && strcmp(file, LYNQ_UCI_FILE))
{
printf("[%s-%d] invalid file %s!!!\n", __FUNCTION__, __LINE__, file);
return LYNQ_UCI_ERROR;
}
sprintf(buf,"%s.%s.%s", file, section, key);
//printf("[%s-%d] buf = %s\n", __FUNCTION__, __LINE__, buf);
ret = lynq_uci_get(buf, tmp);
return ret;
}
int lynq_load_config(char *filename)
{
struct uci_context * ctx = NULL;
struct uci_element *e;
struct uci_package * pkg = NULL;
ctx = uci_alloc_context();
RLOGD("uci load start \n");
if (UCI_OK != uci_load(ctx, filename, &pkg))
{
RLOGD("uci config fail !!!\n");
uci_free_context(ctx);
ctx = NULL;
return -1;
}
uci_unload(ctx, pkg);
uci_free_context(ctx);
RLOGD("uci config success !!!\n");
ctx = NULL;
return 0;
}