return false;
}
+ char src_filename[PATH_MAX];
+ char dst_filename[PATH_MAX];
+ struct dirent *ent;
+
DIR *src_dir = opendir(src_dir_name);
if(!src_dir) {
return false;
}
- struct dirent *ent;
+ // Delete if already exists and create a new destination directory
+ deltree(dst_dir_name);
+
+ if(mkdir(dst_dir_name, 0700)) {
+ logger(NULL, MESHLINK_ERROR, "Could not create directory %s\n", dst_filename);
+ return false;
+ }
while((ent = readdir(src_dir))) {
if(ent->d_name[0] == '.') {
continue;
}
- char src_filename[PATH_MAX];
- char dst_filename[PATH_MAX];
-
snprintf(dst_filename, sizeof(dst_filename), "%s" SLASH "%s", dst_dir_name, ent->d_name);
snprintf(src_filename, sizeof(src_filename), "%s" SLASH "%s", src_dir_name, ent->d_name);
if(ent->d_type == DT_DIR) {
-
- // Delete if already exists and create a new destination directory
- deltree(dst_filename);
-
- if(mkdir(dst_filename, 0700)) {
- logger(NULL, MESHLINK_ERROR, "Could create directory %s\n", dst_filename);
- return false;
- }
-
if(!copytree(src_filename, src_key, dst_filename, dst_key)) {
logger(NULL, MESHLINK_ERROR, "Copying %s to %s failed\n", src_filename, dst_filename);
return false;
if(!sync_path(dst_filename)) {
return false;
}
-
} else if(ent->d_type == DT_REG) {
struct stat st;
config_t config;
snprintf(dst_filename, sizeof(dst_filename), "%s" SLASH "%s", mesh->confbase, dst_dir_name);
snprintf(src_filename, sizeof(src_filename), "%s" SLASH "%s", mesh->confbase, src_dir_name);
- if(main_config_exists(mesh, dst_dir_name)) {
- deltree(dst_dir_name);
- }
-
- if(mkdir(dst_filename, 0700)) {
- logger(NULL, MESHLINK_ERROR, "Could create directory %s\n", dst_filename);
- return false;
- }
-
return copytree(src_filename, src_key, dst_filename, dst_key);
}
return false;
}
- if(fclose(f)) {
- logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
- return false;
- }
+ fclose(f);
return true;
}
}
char path[PATH_MAX];
+ char tmp_path[PATH_MAX + 4];
make_host_path(mesh, conf_subdir, name, path, sizeof(path));
+ snprintf(tmp_path, sizeof(tmp_path), "%s.tmp", path);
- FILE *f = fopen(path, "w");
+ FILE *f = fopen(tmp_path, "w");
if(!f) {
- logger(mesh, MESHLINK_ERROR, "Failed to open `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to open `%s': %s", tmp_path, strerror(errno));
return false;
}
if(!config_write_file(mesh, f, config, key)) {
- logger(mesh, MESHLINK_ERROR, "Failed to write `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to write `%s': %s", tmp_path, strerror(errno));
+ fclose(f);
+ return false;
+ }
+
+ if(fsync(fileno(f))) {
+ logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", tmp_path, strerror(errno));
fclose(f);
return false;
}
if(fclose(f)) {
- logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", tmp_path, strerror(errno));
+ return false;
+ }
+
+ if(rename(tmp_path, path)) {
+ logger(mesh, MESHLINK_ERROR, "Failed to rename `%s' to `%s': %s", tmp_path, path, strerror(errno));
return false;
}
return false;
}
- if(fclose(f)) {
- logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
- return false;
- }
+ fclose(f);
return true;
}
}
char path[PATH_MAX];
+ char tmp_path[PATH_MAX + 4];
make_main_path(mesh, conf_subdir, path, sizeof(path));
+ snprintf(tmp_path, sizeof(tmp_path), "%s.tmp", path);
- FILE *f = fopen(path, "w");
+ FILE *f = fopen(tmp_path, "w");
if(!f) {
- logger(mesh, MESHLINK_ERROR, "Failed to open `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to open `%s': %s", tmp_path, strerror(errno));
return false;
}
if(!config_write_file(mesh, f, config, key)) {
- logger(mesh, MESHLINK_ERROR, "Failed to write `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to write `%s': %s", tmp_path, strerror(errno));
+ fclose(f);
+ return false;
+ }
+
+ if(fsync(fileno(f))) {
+ logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", tmp_path, strerror(errno));
fclose(f);
return false;
}
+ if(rename(tmp_path, path)) {
+ logger(mesh, MESHLINK_ERROR, "Failed to rename `%s' to `%s': %s", tmp_path, path, strerror(errno));
+ return false;
+ }
+
if(fclose(f)) {
- logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
+ logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", tmp_path, strerror(errno));
return false;
}
return false;
}
- if(time(NULL) > st.st_mtime + mesh->invitation_timeout) {
+ if(mesh->loop.now.tv_sec > st.st_mtime + mesh->invitation_timeout) {
logger(mesh, MESHLINK_ERROR, "Peer tried to use an outdated invitation file %s\n", name);
fclose(f);
unlink(used_path);
return false;
}
- if(fclose(f)) {
- logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
- return false;
- }
+ fclose(f);
unlink(used_path);
return true;
return false;
}
+ if(fsync(fileno(f))) {
+ logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", path, strerror(errno));
+ return false;
+ }
+
if(fclose(f)) {
logger(mesh, MESHLINK_ERROR, "Failed to close `%s': %s", path, strerror(errno));
return false;