if(fd < 0) {
logger(NULL, MESHLINK_ERROR, "Failed to open %s: %s\n", pathname, strerror(errno));
+ meshlink_errno = MESHLINK_ESTORAGE;
return false;
}
if(fsync(fd)) {
logger(NULL, MESHLINK_ERROR, "Failed to sync %s: %s\n", pathname, strerror(errno));
close(fd);
+ meshlink_errno = MESHLINK_ESTORAGE;
return false;
}
if(close(fd)) {
logger(NULL, MESHLINK_ERROR, "Failed to close %s: %s\n", pathname, strerror(errno));
close(fd);
+ meshlink_errno = MESHLINK_ESTORAGE;
return false;
}
return rename(old_path, new_path) == 0;
}
+bool config_sync(meshlink_handle_t *mesh, const char *conf_subdir) {
+ if(!mesh->confbase) {
+ return true;
+ }
+
+ if(!conf_subdir) {
+ return false;
+ }
+
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "%s" SLASH "%s" SLASH "hosts", mesh->confbase, conf_subdir);
+
+ if(!sync_path(path)) {
+ return false;
+ }
+
+ snprintf(path, sizeof(path), "%s" SLASH "%s", mesh->confbase, conf_subdir);
+
+ if(!sync_path(path)) {
+ return false;
+ }
+
+ return true;
+}
+
bool meshlink_confbase_exists(meshlink_handle_t *mesh) {
if(!mesh->confbase) {
return false;
if(fseek(f, 0, SEEK_END) || !(len = ftell(f)) || fseek(f, 0, SEEK_SET)) {
logger(mesh, MESHLINK_ERROR, "Cannot get config file size: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
- fclose(f);
return false;
}
if(fread(buf, len, 1, f) != 1) {
logger(mesh, MESHLINK_ERROR, "Cannot read config file: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
- 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));
+ fclose(f);
return false;
}
if(fsync(fileno(f))) {
logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", path, strerror(errno));
+ fclose(f);
return false;
}