/*
* Copyright (C) 2010 Vyatta, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
static void
_get_str_vec(vector& vec, const char *strs[], int num_strs)
{
for (int i = 0; i < num_strs; i++) {
vec.push_back(strs[i]);
}
}
void *
cstore_init(void)
{
Cstore *handle = new UnionfsCstore();
return (void *) handle;
}
void
cstore_free(void *handle)
{
UnionfsCstore *h = (UnionfsCstore *) handle;
delete h;
}
int
cstore_validate_tmpl_path(void *handle, const char *path_comps[],
int num_comps, int validate_tags)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
return (cs->validateTmplPath(vs, validate_tags) ? 1 : 0);
}
return 0;
}
int
cstore_validate_tmpl_path_d(void *handle, const char *path_comps[],
int num_comps, int validate_tags, vtw_def *def)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
return (cs->validateTmplPath(vs, validate_tags, *def) ? 1 : 0);
}
return 0;
}
int
cstore_cfg_path_exists(void *handle, const char *path_comps[], int num_comps)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
return (cs->cfgPathExists(vs) ? 1 : 0);
}
return 0;
}
int
cstore_get_var_ref(void *handle, const char *ref_str, vtw_type_e *type,
char **val, int from_active)
{
if (handle) {
Cstore *cs = (Cstore *) handle;
*val = cs->getVarRef(ref_str, *type, from_active);
return (*val ? 1 : 0);
}
return 0;
}
int
cstore_set_var_ref(void *handle, const char *ref_str, const char *value,
int to_active)
{
if (handle) {
Cstore *cs = (Cstore *) handle;
return (cs->setVarRef(ref_str, value, to_active) ? 1 : 0);
}
return 0;
}
int
cstore_cfg_path_deactivated(void *handle, const char *path_comps[],
int num_comps, int in_active)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
return (cs->cfgPathDeactivated(vs, in_active) ? 1 : 0);
}
return 0;
}
char *
cstore_cfg_path_get_effective_value(void *handle, const char *path_comps[],
int num_comps)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
string val;
if (!cs->cfgPathGetEffectiveValue(vs, val)) {
return NULL;
}
int vsize = val.length();
char *buf = (char *) malloc(vsize + 1);
if (!buf) {
return NULL;
}
strncpy(buf, val.c_str(), vsize);
buf[vsize] = 0;
return buf;
}
return NULL;
}
int
cstore_unmark_cfg_path_changed(void *handle, const char *path_comps[],
int num_comps)
{
if (handle) {
vector vs;
_get_str_vec(vs, path_comps, num_comps);
Cstore *cs = (Cstore *) handle;
return (cs->unmarkCfgPathChanged(vs) ? 1 : 0);
}
return 0;
}
char **
cstore_path_string_to_path_comps(const char *path_str, int *num_comps)
{
char *pstr = strdup(path_str);
size_t len = strlen(pstr);
vector vec;
char *start = NULL;
for (size_t i = 0; i < len; i++) {
if (pstr[i] == '/') {
if (start) {
pstr[i] = 0;
vec.push_back(start);
pstr[i] = '/';
start = NULL;
}
continue;
} else if (!start) {
start = &(pstr[i]);
}
}
if (start) {
vec.push_back(start);
}
char **ret = (char **) malloc(sizeof(char *) * vec.size());
if (ret) {
for (size_t i = 0; i < vec.size(); i++) {
ret[i] = strdup(vec[i].c_str());
}
*num_comps = vec.size();
}
free(pstr);
return ret;
}
void
cstore_free_path_comps(char **path_comps, int num_comps)
{
for (int i = 0; i < num_comps; i++) {
free(path_comps[i]);
}
free(path_comps);
}