}
static bool write_main_config_files(meshlink_handle_t *mesh) {
+ if(!mesh->confbase) {
+ return true;
+ }
+
uint8_t buf[4096];
/* Write the main config file */
config_t config = {buf, packmsg_output_size(&out, buf)};
- if(!main_config_write(mesh, &config)) {
+ if(!main_config_write(mesh, "current", &config, mesh->config_key)) {
return false;
}
mesh->self->devclass = devclass;
// Initialize configuration directory
- if(!config_init(mesh)) {
+ if(!config_init(mesh, "current")) {
return false;
}
node_add(mesh, n);
- if(!config_write(mesh, n->name, &config)) {
+ if(!config_write(mesh, "current", n->name, &config, mesh->config_key)) {
return false;
}
}
}
static bool meshlink_setup(meshlink_handle_t *mesh) {
- if(!config_init(mesh)) {
- logger(mesh, MESHLINK_ERROR, "Could not set up configuration in %s: %s\n", mesh->confbase, strerror(errno));
+ if(!config_init(mesh, "current")) {
+ logger(mesh, MESHLINK_ERROR, "Could not set up configuration in %s/current: %s\n", mesh->confbase, strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
return false;
}
mesh->self->ecdsa = ecdsa_set_public_key(ecdsa_get_public_key(mesh->private_key));
if(!write_main_config_files(mesh)) {
+ logger(mesh, MESHLINK_ERROR, "Could not write main config files into %s/current: %s\n", mesh->confbase, strerror(errno));
+ meshlink_errno = MESHLINK_ESTORAGE;
return false;
}
config_t config;
- if(!main_config_read(mesh, &config)) {
+ if(!main_config_read(mesh, "current", &config, mesh->config_key)) {
logger(NULL, MESHLINK_ERROR, "Could not read main configuration file!");
return false;
}
// If no configuration exists yet, create it.
- if(!main_config_exists(mesh)) {
+ if(!meshlink_confbase_exists(mesh)) {
if(!meshlink_setup(mesh)) {
logger(NULL, MESHLINK_ERROR, "Cannot create initial configuration\n");
meshlink_close(mesh);
return false;
}
- return config_destroy(confbase);
+ if(!config_destroy(confbase, "current")) {
+ logger(NULL, MESHLINK_ERROR, "Cannot remove confbase sub-directories %s: %s\n", confbase, strerror(errno));
+ return false;
+ }
+
+ config_destroy(confbase, "new");
+ config_destroy(confbase, "old");
+
+ if(rmdir(confbase) && errno != ENOENT) {
+ logger(NULL, MESHLINK_ERROR, "Cannot remove directory %s: %s\n", confbase, strerror(errno));
+ meshlink_errno = MESHLINK_ESTORAGE;
+ return false;
+ }
+
+ return true;
}
void meshlink_set_receive_cb(meshlink_handle_t *mesh, meshlink_receive_cb_t cb) {
static bool search_node_by_dev_class(const node_t *node, const void *condition) {
dev_class_t *devclass = (dev_class_t *)condition;
- if(*devclass == node->devclass) {
+ if(*devclass == (dev_class_t)node->devclass) {
return true;
}
mesh->self = new_node();
mesh->self->name = xstrdup(mesh->name);
mesh->self->devclass = mesh->devclass;
+ xasprintf(&mesh->myport, "%d", port);
if(!node_read_public_key(mesh, mesh->self)) {
logger(NULL, MESHLINK_ERROR, "Could not read our host configuration file!");
}
// Ensure no host configuration file with that name exists
- if(config_exists(mesh, name)) {
+ if(config_exists(mesh, "current", name)) {
logger(mesh, MESHLINK_DEBUG, "A host config file for %s already exists!\n", name);
meshlink_errno = MESHLINK_EEXIST;
pthread_mutex_unlock(&(mesh->mesh_mutex));
config_t configs[5] = {NULL};
int count = 0;
- if(config_read(mesh, mesh->self->name, &configs[count])) {
+ if(config_read(mesh, "current", mesh->self->name, &configs[count], mesh->config_key)) {
count++;
}
config_t config = {outbuf, packmsg_output_size(&inv, outbuf)};
- if(!invitation_write(mesh, cookiehash, &config)) {
+ if(!invitation_write(mesh, "current", cookiehash, &config, mesh->config_key)) {
logger(mesh, MESHLINK_DEBUG, "Could not create invitation file %s: %s\n", cookiehash, strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
pthread_mutex_unlock(&(mesh->mesh_mutex));
break;
}
- config_write(mesh, n->name, &config);
+ config_write(mesh, "current", n->name, &config, mesh->config_key);
node_add(mesh, n);
}