Public feed #601485

Zeug

public text v1 · immutable
Raw Edit
·published 2007-07-03 15:17 UTC
rendered paste body
diff --git a/src/iniparser.c b/src/iniparser.c
index 65c9dd6..d8719c6 100644
--- a/src/iniparser.c
+++ b/src/iniparser.c
@@ -43,6 +43,18 @@
 extern "C" {
 #endif
 
+/* lock INI file access against concurrent access */
+void ini_file_set_lock (int fd, unsigned int set_lock)
+{
+	int fd;
+	struct flock lockinfo;
+
+	memset (&lockinfo, 0, sizeof (struct flock));
+	lockinfo.l_type = set_lock ? F_WRLCK : F_UNLCK;
+	lockinfo.l_pid = getpid();
+	fcntl (fd, F_SETLKW, &lockinfo);
+}
+
 /* strlib.c following */
 
 #define ASCIILINESZ 1024
@@ -533,11 +545,12 @@ void iniparser_dump_ini(dictionary * d, const char * file_name)
 
 	if (d==NULL) return;
 
-	fd = open (file_name, O_WRONLY | O_CREAT);
+	fd = open (file_name, O_RDONLY | O_CREAT);
 	if (fd < 0)
 		return;
+	ini_file_set_lock (fd, 1);
 
-	f = fdopen (fd, "w");
+	f = fopen (file_name, "w");
 	if (f == NULL)
 		return;
 
@@ -570,6 +583,9 @@ void iniparser_dump_ini(dictionary * d, const char * file_name)
     }
 
 	fclose(f);
+	
+	ini_file_set_lock (fd, 0);
+	close (fd);
 }
 
 /*-------------------------------------------------------------------------*/
@@ -694,8 +710,9 @@ dictionary * iniparser_new(char *ininame)
 	fd = open (ininame, O_RDONLY);
 	if (fd < 0)
 		return NULL;
+	ini_file_set_lock (fd, 1);
 
-	ini = fdopen (fd, "r");
+	ini = fopen (ininame, "r");
 	if (ini == NULL)
 		return NULL;
 
@@ -735,6 +752,10 @@ dictionary * iniparser_new(char *ininame)
         }
     }
 	fclose(ini);
+	
+	ini_file_set_lock (fd, 0);
+	close (fd);
+
     return d ;
 }