SF.net SVN: geany:[4976] branches/sm

statc at users.sourceforge.net statc at xxxxx
Mon May 31 09:26:31 UTC 2010


Revision: 4976
          http://geany.svn.sourceforge.net/geany/?rev=4976&view=rev
Author:   statc
Date:     2010-05-31 09:26:31 +0000 (Mon, 31 May 2010)

Log Message:
-----------
Lock configuration file before writing, using open(O_EXCL) on temporary file. Original patch by Lex Trotman, thanks.

Modified Paths:
--------------
    branches/sm/ChangeLog.sm
    branches/sm/src/keyfile.c
    branches/sm/src/project.c
    branches/sm/src/utils.c
    branches/sm/src/utils.h

Modified: branches/sm/ChangeLog.sm
===================================================================
--- branches/sm/ChangeLog.sm	2010-05-31 09:26:07 UTC (rev 4975)
+++ branches/sm/ChangeLog.sm	2010-05-31 09:26:31 UTC (rev 4976)
@@ -7,6 +7,9 @@
  * src/document.c, src/keybindings.c, src/main.c, src/ui_utils.c,
    src/ui_utils.h:
    Use a separate queue to store recently closed files
+ * src/keyfile.c, src/project.c, src/utils.c, src/utils.h:
+   Lock configuration file before writing, using open(O_EXCL) on
+   temporary file. Original patch by Lex Trotman, thanks.
 
 
 2010-05-30  Eugene Arshinov  <earshinov(at)gmail(dot)com>

Modified: branches/sm/src/keyfile.c
===================================================================
--- branches/sm/src/keyfile.c	2010-05-31 09:26:07 UTC (rev 4975)
+++ branches/sm/src/keyfile.c	2010-05-31 09:26:31 UTC (rev 4976)
@@ -237,7 +237,11 @@
 static void write_config(GKeyFile * config, gchar * configfile)
 {
 	gchar *data = g_key_file_to_data(config, NULL, NULL);
-	utils_write_file(configfile, data);
+	if (utils_lock(configfile) >= 0)
+	{
+		utils_write_file(configfile, data);
+		utils_unlock(configfile);
+	}
 	g_free(data);
 }
 

Modified: branches/sm/src/project.c
===================================================================
--- branches/sm/src/project.c	2010-05-31 09:26:07 UTC (rev 4975)
+++ branches/sm/src/project.c	2010-05-31 09:26:31 UTC (rev 4976)
@@ -1077,7 +1077,11 @@
 	}
 	/* write the file */
 	data = g_key_file_to_data(config, NULL, NULL);
-	ret = (utils_write_file(filename, data) == 0);
+	if (utils_lock(filename) >= 0)
+	{
+		ret = (utils_write_file(filename, data) == 0);
+		utils_unlock(filename);
+	}
 
 	g_free(data);
 	g_free(filename);

Modified: branches/sm/src/utils.c
===================================================================
--- branches/sm/src/utils.c	2010-05-31 09:26:07 UTC (rev 4975)
+++ branches/sm/src/utils.c	2010-05-31 09:26:31 UTC (rev 4976)
@@ -35,6 +35,9 @@
 #include <errno.h>
 #include <stdarg.h>
 
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
 #ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #endif
@@ -2103,3 +2106,22 @@
 		return ret;
 	}
 }
+
+
+/* NB int not gint see g_open */
+int utils_lock(const gchar *file)
+{
+	gchar *lock = g_strconcat(file, "_lock", NULL);
+	int ret = g_open(lock, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+	if (ret >= 0) close(ret);
+	g_free(lock);
+	return ret;
+};
+
+
+void utils_unlock(const gchar *file)
+{
+	gchar *lock = g_strconcat(file, "_lock", NULL);
+	g_unlink(lock);
+	g_free(lock);
+};

Modified: branches/sm/src/utils.h
===================================================================
--- branches/sm/src/utils.h	2010-05-31 09:26:07 UTC (rev 4975)
+++ branches/sm/src/utils.h	2010-05-31 09:26:31 UTC (rev 4976)
@@ -107,7 +107,11 @@
 #define foreach_str(char_ptr, string) \
 	for (char_ptr = string; *char_ptr; char_ptr++)
 
+/* NB int not gint see g_open */
+int utils_lock(const gchar *file);
 
+void utils_unlock(const gchar *file);
+
 void utils_open_browser(const gchar *uri);
 
 gint utils_get_line_endings(const gchar* buffer, glong size);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list