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)