Blob Blame History Raw
--- 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)