2020-04-03 00:55:14

by Stotland, Inga

[permalink] [raw]
Subject: [PATCH BlueZ 1/2] tools/mescfg-client: Use local routines for config write

This removes dependencies on internal structures of
mesh/mesh-config-json.c.
---
Makefile.tools | 1 -
tools/mesh/mesh-db.c | 63 +++++++++++++++++++++++++++++++++-----------
2 files changed, 47 insertions(+), 17 deletions(-)

diff --git a/Makefile.tools b/Makefile.tools
index f43764adc..9b9236609 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -336,7 +336,6 @@ tools_mesh_cfgclient_SOURCES = tools/mesh-cfgclient.c \
tools/mesh/agent.h tools/mesh/agent.c \
tools/mesh/mesh-db.h tools/mesh/mesh-db.c \
mesh/util.h mesh/util.c \
- mesh/mesh-config.h mesh/mesh-config-json.c \
mesh/crypto.h mesh/crypto.c

tools_mesh_cfgclient_LDADD = lib/libbluetooth-internal.la src/libshared-ell.la \
diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
index 05e96e554..21bccf653 100644
--- a/tools/mesh/mesh-db.c
+++ b/tools/mesh/mesh-db.c
@@ -50,12 +50,44 @@ struct mesh_db {
json_object *jcfg;
char *cfg_fname;
uint8_t token[8];
- uint8_t pad[12];
struct timeval write_time;
};

struct mesh_db *cfg;

+static bool save_config(void)
+{
+ FILE *outfile;
+ const char *str;
+ bool result = false;
+
+ outfile = fopen(cfg->cfg_fname, "w");
+ if (!outfile) {
+ l_error("Failed to save configuration to %s", cfg->cfg_fname);
+ return false;
+ }
+
+ str = json_object_to_json_string_ext(cfg->jcfg,
+ JSON_C_TO_STRING_PRETTY);
+
+ if (fwrite(str, sizeof(char), strlen(str), outfile) < strlen(str))
+ l_warn("Incomplete write of mesh configuration");
+ else
+ result = true;
+
+ fclose(outfile);
+
+ return result;
+}
+
+static void release_config(void)
+{
+ l_free(cfg->cfg_fname);
+ json_object_put(cfg->jcfg);
+ l_free(cfg);
+ cfg = NULL;
+}
+
static json_object *get_node_by_unicast(uint16_t unicast)
{
json_object *jarray;
@@ -430,7 +462,7 @@ static bool add_node_key(json_object *jobj, const char *desc, uint16_t idx)
json_object_object_add(jkey, "index", jval);
json_object_array_add(jarray, jkey);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_node_net_key_add(uint16_t unicast, uint16_t idx)
@@ -461,7 +493,7 @@ bool mesh_db_node_ttl_set(uint16_t unicast, uint8_t ttl)
if (!write_int(jnode, "defaultTTL", ttl))
return false;

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

static void jarray_key_del(json_object *jarray, int16_t idx)
@@ -500,7 +532,7 @@ static bool delete_key(json_object *jobj, const char *desc, uint16_t idx)

jarray_key_del(jarray, idx);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_node_net_key_del(uint16_t unicast, uint16_t net_idx)
@@ -645,7 +677,7 @@ bool mesh_db_net_key_add(uint16_t net_idx)

json_object_array_add(jarray, jkey);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();

fail:
json_object_put(jkey);
@@ -681,7 +713,7 @@ bool mesh_db_net_key_phase_set(uint16_t net_idx, uint8_t phase)

json_object_object_add(jkey, "phase", jval);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
@@ -692,7 +724,7 @@ bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
if (!add_app_key(cfg->jcfg, net_idx, app_idx))
return false;

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_app_key_del(uint16_t app_idx)
@@ -735,7 +767,7 @@ bool mesh_db_add_group(struct mesh_group *grp)

json_object_array_add(jgroups, jgroup);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();

fail:
json_object_put(jgroup);
@@ -873,7 +905,7 @@ bool mesh_db_add_node(uint8_t uuid[16], uint8_t num_els, uint16_t unicast,

json_object_array_add(jnodes, jnode);

- if (!mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL))
+ if (!save_config())
goto fail;

return true;
@@ -919,7 +951,7 @@ bool mesh_db_del_node(uint16_t unicast)

json_object_array_del_idx(jarray, i, 1);

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_get_token(uint8_t token[8])
@@ -966,7 +998,7 @@ bool mesh_db_set_addr_range(uint16_t low, uint16_t high)
if (!write_uint16_hex(cfg->jcfg, "high", high))
return false;

- return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+ return save_config();
}

bool mesh_db_create(const char *fname, const uint8_t token[8],
@@ -1019,14 +1051,13 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],

json_object_object_add(jcfg, "appKeys", jarray);

- if (!mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL))
+ if (!save_config())
goto fail;

return true;

fail:
- mesh_config_release((struct mesh_config *)cfg);
- cfg = NULL;
+ release_config();

return false;
}
@@ -1085,7 +1116,7 @@ bool mesh_db_load(const char *fname)

return true;
fail:
- mesh_config_release((struct mesh_config *)cfg);
- cfg = NULL;
+ release_config();
+
return false;
}
--
2.21.1


2020-04-03 00:55:16

by Stotland, Inga

[permalink] [raw]
Subject: [PATCH BlueZ 2/2] tools/mesh-cfgclient: Store "index" as integer in config

Write "index", "elementIndex", "boundNetKey" as integers
rather than hex strings in configuration file.
---
tools/mesh/mesh-db.c | 164 +++++++++++++++----------------------------
1 file changed, 56 insertions(+), 108 deletions(-)

diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
index 21bccf653..c2e44e3e4 100644
--- a/tools/mesh/mesh-db.c
+++ b/tools/mesh/mesh-db.c
@@ -122,30 +122,6 @@ static json_object *get_node_by_unicast(uint16_t unicast)
return NULL;
}

-static json_object *get_key_object(json_object *jarray, uint16_t idx)
-{
- int i, sz = json_object_array_length(jarray);
-
- for (i = 0; i < sz; ++i) {
- json_object *jentry, *jval;
- const char *str;
- uint16_t jidx;
-
- jentry = json_object_array_get_idx(jarray, i);
- if (!json_object_object_get_ex(jentry, "index", &jval))
- return NULL;
-
- str = json_object_get_string(jval);
- if (sscanf(str, "%04hx", &jidx) != 1)
- return NULL;
-
- if (jidx == idx)
- return jentry;
- }
-
- return NULL;
-}
-
static bool get_int(json_object *jobj, const char *keyword, int *value)
{
json_object *jvalue;
@@ -154,8 +130,11 @@ static bool get_int(json_object *jobj, const char *keyword, int *value)
return false;

*value = json_object_get_int(jvalue);
- if (errno == EINVAL)
+ if (errno != 0) {
+ l_error("Error: %s should contain an integer value\n",
+ keyword);
return false;
+ }

return true;
}
@@ -174,8 +153,27 @@ static bool write_int(json_object *jobj, const char *keyword, int val)
return true;
}

+static json_object *get_key_object(json_object *jarray, uint16_t idx)
+{
+ int i, sz = json_object_array_length(jarray);
+
+ for (i = 0; i < sz; ++i) {
+ json_object *jentry;
+ int jidx;
+
+ jentry = json_object_array_get_idx(jarray, i);
+ if (!get_int(jentry, "index", &jidx))
+ return NULL;
+
+ if (jidx == idx)
+ return jentry;
+ }
+
+ return NULL;
+}
+
static bool write_uint16_hex(json_object *jobj, const char *desc,
- uint16_t value)
+ uint16_t value)
{
json_object *jstring;
char buf[5];
@@ -222,8 +220,8 @@ static json_object *get_node_by_uuid(json_object *jcfg, uint8_t uuid[16])
return NULL;
}

-static bool add_u8_8(json_object *jobj, const uint8_t value[8],
- const char *desc)
+static bool add_u8_8(json_object *jobj, const char *desc,
+ const uint8_t value[8])
{
json_object *jstring;
char buf[17];
@@ -237,8 +235,8 @@ static bool add_u8_8(json_object *jobj, const uint8_t value[8],
return true;
}

-static bool add_u8_16(json_object *jobj, const uint8_t value[16],
- const char *desc)
+static bool add_u8_16(json_object *jobj, const char *desc,
+ const uint8_t value[16])
{
json_object *jstring;
char buf[33];
@@ -252,7 +250,7 @@ static bool add_u8_16(json_object *jobj, const uint8_t value[16],
return true;
}

-static bool add_string(json_object *jobj, const char *str, const char *desc)
+static bool add_string(json_object *jobj, const char *desc, const char *str)
{
json_object *jstring = json_object_new_string(str);

@@ -283,22 +281,17 @@ static bool get_token(json_object *jobj, uint8_t token[8])

static uint16_t node_parse_key(json_object *jarray, int i)
{
- json_object *jkey, *jval;
- const char *str;
- uint16_t idx;
+ json_object *jkey;
+ int idx;

jkey = json_object_array_get_idx(jarray, i);
if (!jkey)
return KEY_IDX_INVALID;

- if (!json_object_object_get_ex(jkey, "index", &jval))
+ if (!get_int(jkey, "index", &idx))
return KEY_IDX_INVALID;

- str = json_object_get_string(jval);
- if (sscanf(str, "%04hx", &idx) != 1)
- return KEY_IDX_INVALID;
-
- return idx;
+ return (uint16_t)idx;
}

static int compare_group_addr(const void *a, const void *b, void *user_data)
@@ -409,8 +402,7 @@ static void load_remotes(json_object *jcfg)

static bool add_app_key(json_object *jobj, uint16_t net_idx, uint16_t app_idx)
{
- json_object *jval, *jkey, *jarray;
- char buf[5];
+ json_object *jkey, *jarray;

json_object_object_get_ex(jobj, "appKeys", &jarray);
if (!jarray || json_object_get_type(jarray) != json_type_array)
@@ -418,20 +410,12 @@ static bool add_app_key(json_object *jobj, uint16_t net_idx, uint16_t app_idx)

jkey = json_object_new_object();

- snprintf(buf, 5, "%4.4x", net_idx);
- jval = json_object_new_string(buf);
- if (!jval)
+ if (!write_int(jkey, "boundNetKey", (int)net_idx))
goto fail;

- json_object_object_add(jkey, "boundNetKey", jval);
-
- snprintf(buf, 5, "%4.4x", app_idx);
- jval = json_object_new_string(buf);
- if (!jval)
+ if (!write_int(jkey, "index", (int)app_idx))
goto fail;

- json_object_object_add(jkey, "index", jval);
-
json_object_array_add(jarray, jkey);

return true;
@@ -442,8 +426,7 @@ fail:

static bool add_node_key(json_object *jobj, const char *desc, uint16_t idx)
{
- json_object *jval, *jkey, *jarray;
- char buf[5];
+ json_object *jkey, *jarray;

json_object_object_get_ex(jobj, desc, &jarray);
if (!jarray || json_object_get_type(jarray) != json_type_array)
@@ -451,15 +434,11 @@ static bool add_node_key(json_object *jobj, const char *desc, uint16_t idx)

jkey = json_object_new_object();

- snprintf(buf, 5, "%4.4x", idx);
-
- jval = json_object_new_string(buf);
- if (!jval) {
+ if (!write_int(jkey, "index", (int)idx)) {
json_object_put(jkey);
return false;
}

- json_object_object_add(jkey, "index", jval);
json_object_array_add(jarray, jkey);

return save_config();
@@ -501,18 +480,12 @@ static void jarray_key_del(json_object *jarray, int16_t idx)
int i, sz = json_object_array_length(jarray);

for (i = 0; i < sz; ++i) {
- json_object *jentry, *jval;
- uint16_t val;
- const char *str;
+ json_object *jentry;
+ int val;

jentry = json_object_array_get_idx(jarray, i);

- if (!json_object_object_get_ex(jentry, "index", &jval))
- continue;
-
- str = json_object_get_string(jval);
-
- if (sscanf(str, "%04hx", &val) != 1)
+ if (!get_int(jentry, "index", &val))
continue;

if (val == idx) {
@@ -579,8 +552,8 @@ bool mesh_db_node_app_key_del(uint16_t unicast, uint16_t idx)

static bool load_keys(json_object *jobj)
{
- json_object *jarray, *jentry, *jval;
- uint16_t net_idx, app_idx;
+ json_object *jarray, *jentry;
+ int net_idx, app_idx;
int i, key_cnt;

json_object_object_get_ex(jobj, "netKeys", &jarray);
@@ -592,20 +565,14 @@ static bool load_keys(json_object *jobj)
return false;

for (i = 0; i < key_cnt; ++i) {
- const char *str;
int phase;

jentry = json_object_array_get_idx(jarray, i);

- if (!json_object_object_get_ex(jentry, "index", &jval))
- return false;
-
- str = json_object_get_string(jval);
-
- if (sscanf(str, "%04hx", &net_idx) != 1)
+ if (!get_int(jentry, "index", &net_idx))
return false;

- keys_add_net_key(net_idx);
+ keys_add_net_key((uint16_t) net_idx);

if (!get_int(jentry, "phase", &phase))
return false;
@@ -622,26 +589,16 @@ static bool load_keys(json_object *jobj)
return false;

for (i = 0; i < key_cnt; ++i) {
- const char *str;

jentry = json_object_array_get_idx(jarray, i);

- if (!json_object_object_get_ex(jentry, "boundNetKey", &jval))
+ if (!get_int(jentry, "boundNetKey", &net_idx))
return false;

- str = json_object_get_string(jval);
-
- if (sscanf(str, "%04hx", &net_idx) != 1)
+ if (!get_int(jentry, "index", &app_idx))
return false;

- if (!json_object_object_get_ex(jentry, "index", &jval))
- return false;
-
- str = json_object_get_string(jval);
-
- if (sscanf(str, "%04hx", &app_idx) != 1)
- return false;
- keys_add_app_key(net_idx, app_idx);
+ keys_add_app_key((uint16_t) net_idx, (uint16_t) app_idx);
}

return true;
@@ -649,8 +606,7 @@ static bool load_keys(json_object *jobj)

bool mesh_db_net_key_add(uint16_t net_idx)
{
- json_object *jval, *jkey, *jarray;
- char buf[5];
+ json_object *jkey, *jarray;

if (!cfg || !cfg->jcfg)
return false;
@@ -664,14 +620,9 @@ bool mesh_db_net_key_add(uint16_t net_idx)

jkey = json_object_new_object();

- snprintf(buf, 5, "%4.4x", net_idx);
-
- jval = json_object_new_string(buf);
- if (!jval)
+ if (!write_int(jkey, "index", net_idx))
goto fail;

- json_object_object_add(jkey, "index", jval);
-
if (!write_int(jkey, "phase", KEY_REFRESH_PHASE_NONE))
goto fail;

@@ -755,14 +706,11 @@ bool mesh_db_add_group(struct mesh_group *grp)
json_object_object_add(jgroup, "name", jval);

if (IS_VIRTUAL(grp->addr)) {
- if (!add_u8_16(jgroup, grp->label, "address"))
+ if (!add_u8_16(jgroup, "address", grp->label))
goto fail;
} else {
- snprintf(buf, 5, "%4.4x", grp->addr);
- jval = json_object_new_string(buf);
- if (!jval)
+ if (!write_uint16_hex(jgroup, "address", grp->addr))
goto fail;
- json_object_object_add(jgroup, "address", jval);
}

json_object_array_add(jgroups, jgroup);
@@ -861,7 +809,7 @@ bool mesh_db_add_node(uint8_t uuid[16], uint8_t num_els, uint16_t unicast,
if (!jnode)
return false;

- if (!add_u8_16(jnode, uuid, "uuid"))
+ if (!add_u8_16(jnode, "uuid", uuid))
goto fail;

jelements = json_object_new_array();
@@ -1022,15 +970,15 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],
cfg->cfg_fname = l_strdup(fname);
memcpy(cfg->token, token, 8);

- if (!add_u8_8(jcfg, token, "token"))
+ if (!add_u8_8(jcfg, "token", token))
goto fail;

l_getrandom(uuid, 16);

- if (!add_u8_16(jcfg, uuid, "uuid"))
+ if (!add_u8_16(jcfg, "uuid", uuid))
goto fail;

- if (mesh_name && !add_string(jcfg, mesh_name, "name"))
+ if (mesh_name && !add_string(jcfg, "name", mesh_name))
goto fail;

jarray = json_object_new_array();
--
2.21.1