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