diff --git a/mesh/node.c b/mesh/node.c
index 6c5cd9c..6a7b4a2 100644
--- a/mesh/node.c
+++ b/mesh/node.c
/* Preserve the last sequence number */
storage_write_sequence_number(net, mesh_net_get_seq_num(net));
- if (storage_save_config(node, true, NULL, NULL))
- l_info("Saved final config to %s", node->cfg_file);
+ storage_save_config(node, true, NULL, NULL);
}
free_node_resources(node);
node->id = id;
}
+uint16_t node_id_get(struct mesh_node *node)
+{
+ if (!node)
+ return 0;
+
+ return node->id;
+}
+
static void attach_io(void *a, void *b)
{
struct mesh_node *node = a;
return false;
}
- if (!storage_save_config(node, true, NULL, NULL))
- return false;
+ storage_save_config(node, true, NULL, NULL);
/* Initialize configuration server model */
mesh_config_srv_init(node, PRIMARY_ELE_IDX);
diff --git a/mesh/node.h b/mesh/node.h
index ee1d4a6..954dfca 100644
--- a/mesh/node.h
+++ b/mesh/node.h
node_attach_ready_func_t cb);
void node_build_attach_reply(struct l_dbus_message *reply, uint64_t token);
void node_id_set(struct mesh_node *node, uint16_t node_id);
+uint16_t node_id_get(struct mesh_node *node);
bool node_dbus_init(struct l_dbus *bus);
void node_cleanup_all(void);
void node_jconfig_set(struct mesh_node *node, void *jconfig);
diff --git a/mesh/storage.c b/mesh/storage.c
index e790373..fe3102f 100644
--- a/mesh/storage.c
+++ b/mesh/storage.c
struct mesh_node *node = mesh_net_node_get(net);
json_object *jnode = node_jconfig_get(node);
bool result;
- l_debug("");
+
result = mesh_db_write_int(jnode, "sequenceNumber", seq);
if (!result)
return false;
- result = storage_save_config(node, false, NULL, NULL);
+ storage_save_config(node, false, NULL, NULL);
- return result;
+ return true;
}
static bool save_config(json_object *jnode, const char *config_name)
l_free(info);
}
-bool storage_save_config(struct mesh_node *node, bool no_wait,
+void storage_save_config(struct mesh_node *node, bool no_wait,
mesh_status_func_t cb, void *user_data)
{
struct write_info *info;
info = l_new(struct write_info, 1);
- if (!info)
- return false;
- l_debug("");
info->jnode = node_jconfig_get(node);
info->config_name = node_cfg_file_get(node);
info->cb = cb;
idle_save_config(info);
else
l_idle_oneshot(idle_save_config, info, NULL);
-
- return true;
}
static int create_dir(const char *dirname)
do {
l_getrandom(&node_id, 2);
- if (!l_queue_find(node_ids, simple_match,
+ if (node_id && !l_queue_find(node_ids, simple_match,
L_UINT_TO_PTR(node_id)))
break;
} while (++num_tries < 10);
node_jconfig_set(node, jnode);
node_cfg_file_set(node, filename);
+ l_queue_push_tail(node_ids, L_UINT_TO_PTR(node_id));
+
return true;
fail:
json_object_put(jnode);
char *cfgname;
struct json_object *jnode;
const char *dir_name;
+ uint16_t node_id;
+ size_t len;
+ char *bak;
if (!node)
return;
+ /* Free the node config json object */
jnode = node_jconfig_get(node);
if (jnode)
json_object_put(jnode);
node_jconfig_set(node, NULL);
+ /* Delete node configuration file */
cfgname = (char *) node_cfg_file_get(node);
if (!cfgname)
return;
l_debug("Delete node config file %s", cfgname);
remove(cfgname);
+ /* Delete the backup file */
+ len = strlen(cfgname) + 5;
+ bak = l_malloc(len);
+ strncpy(bak, cfgname, len);
+ bak = strncat(bak, ".bak", 5);
+ remove(bak);
+ l_free(bak);
+
+ /* Delete the node directory */
dir_name = dirname(cfgname);
l_debug("Delete directory %s", dir_name);
l_free(cfgname);
node_cfg_file_set(node, NULL);
+
+ node_id = node_id_get(node);
+ l_queue_remove(node_ids, L_UINT_TO_PTR(node_id));
}
diff --git a/mesh/storage.h b/mesh/storage.h
index 85f7899..8b14c8e 100644
--- a/mesh/storage.h
+++ b/mesh/storage.h
bool storage_load_nodes(const char *dir);
bool storage_create_node_config(struct mesh_node *node, void *db_node);
void storage_remove_node_config(struct mesh_node *node);
-bool storage_save_config(struct mesh_node *node, bool no_wait,
+void storage_save_config(struct mesh_node *node, bool no_wait,
mesh_status_func_t cb, void *user_data);
bool storage_model_bind(struct mesh_node *node, uint16_t addr, uint32_t id,
uint16_t app_idx, bool unbind);