--- xmms-1.2.10/libxmms/configfile.c.bak 2003-05-20 00:22:07.000000000 +0300
+++ xmms-1.2.10/libxmms/configfile.c 2006-12-30 15:08:31.045540619 +0200
@@ -123,12 +123,27 @@ gboolean xmms_cfg_write_file(ConfigFile
GList *section_list, *line_list;
ConfigSection *section;
ConfigLine *line;
+ gchar *tmpfn;
+ int tmpfnfd;
g_return_val_if_fail(cfg != NULL, FALSE);
g_return_val_if_fail(filename != NULL, FALSE);
- if (!(file = fopen(filename, "w")))
+ tmpfn = g_strconcat(filename, ".XXXXXX", NULL);
+ if (!tmpfn)
return FALSE;
+ tmpfnfd = mkstemp(tmpfn);
+ if (tmpfnfd == -1) {
+ free (tmpfn);
+ return FALSE;
+ }
+ file = fdopen(tmpfnfd, "w");
+ if (!file) {
+ unlink (tmpfn);
+ g_free (tmpfn);
+ close (tmpfnfd);
+ return FALSE;
+ }
section_list = cfg->sections;
while (section_list)
@@ -136,20 +151,36 @@ gboolean xmms_cfg_write_file(ConfigFile
section = (ConfigSection *) section_list->data;
if (section->lines)
{
- fprintf(file, "[%s]\n", section->name);
+ if (fprintf(file, "[%s]\n", section->name) < 0)
+ goto err;
line_list = section->lines;
while (line_list)
{
line = (ConfigLine *) line_list->data;
- fprintf(file, "%s=%s\n", line->key, line->value);
+ if (fprintf(file, "%s=%s\n", line->key, line->value) < 0)
+ goto err;
line_list = g_list_next(line_list);
}
- fprintf(file, "\n");
+ if (fprintf(file, "\n") < 0)
+ goto err;
}
section_list = g_list_next(section_list);
}
- fclose(file);
+ if (fflush (file) == EOF)
+ goto err;
+ if (fsync (tmpfnfd) == -1) /* dir not synced */
+ goto err;
+ if (fclose(file) == EOF)
+ goto err;
+ if (rename (tmpfn, filename) == -1)
+ goto err;
return TRUE;
+
+err:
+ fclose(file);
+ unlink(tmpfn);
+ g_free (tmpfn);
+ return FALSE;
}
gboolean xmms_cfg_write_default_file(ConfigFile * cfg)