libobs/util: Add config_save_safe function
This safely saves a configuration file, optionally with a backup.
This commit is contained in:
parent
3a77ac3516
commit
f29431d8db
@ -348,6 +348,53 @@ int config_save(config_t *config)
|
|||||||
return CONFIG_SUCCESS;
|
return CONFIG_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_save_safe(config_t *config, const char *temp_ext,
|
||||||
|
const char *backup_ext)
|
||||||
|
{
|
||||||
|
struct dstr temp_file = {0};
|
||||||
|
struct dstr backup_file = {0};
|
||||||
|
char *file = config->file;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!temp_ext || !*temp_ext) {
|
||||||
|
blog(LOG_ERROR, "config_save_safe: invalid "
|
||||||
|
"temporary extension specified");
|
||||||
|
return CONFIG_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
dstr_copy(&temp_file, config->file);
|
||||||
|
if (*temp_ext != '.')
|
||||||
|
dstr_cat(&temp_file, ".");
|
||||||
|
dstr_cat(&temp_file, temp_ext);
|
||||||
|
|
||||||
|
config->file = temp_file.array;
|
||||||
|
ret = config_save(config);
|
||||||
|
config->file = file;
|
||||||
|
|
||||||
|
if (ret != CONFIG_SUCCESS) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (backup_ext && *backup_ext) {
|
||||||
|
dstr_copy(&backup_file, config->file);
|
||||||
|
if (*backup_ext != '.')
|
||||||
|
dstr_cat(&backup_file, ".");
|
||||||
|
dstr_cat(&backup_file, backup_ext);
|
||||||
|
|
||||||
|
os_unlink(backup_file.array);
|
||||||
|
os_rename(file, backup_file.array);
|
||||||
|
} else {
|
||||||
|
os_unlink(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
os_rename(temp_file.array, file);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
dstr_free(&temp_file);
|
||||||
|
dstr_free(&backup_file);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void config_close(config_t *config)
|
void config_close(config_t *config)
|
||||||
{
|
{
|
||||||
struct config_section *defaults, *sections;
|
struct config_section *defaults, *sections;
|
||||||
|
@ -46,6 +46,8 @@ EXPORT int config_open(config_t **config, const char *file,
|
|||||||
enum config_open_type open_type);
|
enum config_open_type open_type);
|
||||||
EXPORT int config_open_string(config_t **config, const char *str);
|
EXPORT int config_open_string(config_t **config, const char *str);
|
||||||
EXPORT int config_save(config_t *config);
|
EXPORT int config_save(config_t *config);
|
||||||
|
EXPORT int config_save_safe(config_t *config, const char *temp_ext,
|
||||||
|
const char *backup_ext);
|
||||||
EXPORT void config_close(config_t *config);
|
EXPORT void config_close(config_t *config);
|
||||||
|
|
||||||
EXPORT size_t config_num_sections(config_t *config);
|
EXPORT size_t config_num_sections(config_t *config);
|
||||||
|
@ -90,6 +90,12 @@ public:
|
|||||||
return config_save(config);
|
return config_save(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline int SaveSafe(const char *temp_ext,
|
||||||
|
const char *backup_ext = nullptr)
|
||||||
|
{
|
||||||
|
return config_save_safe(config, temp_ext, backup_ext);
|
||||||
|
}
|
||||||
|
|
||||||
inline void Close()
|
inline void Close()
|
||||||
{
|
{
|
||||||
config_close(config);
|
config_close(config);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user