main: move olsr_create_lock_file into its own file
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 9 Nov 2015 14:39:32 +0000 (15:39 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 11 Nov 2015 16:09:26 +0000 (17:09 +0100)
And refactor it to not use olsr_exit.
And close the lock file on error paths.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/lock_file.c
src/lock_file.h
src/main.c

index 5873e63..5ed30dd 100644 (file)
 
 #include <stdio.h>
 #include <string.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
 
 #if defined __ANDROID__
   #define DEFAULT_LOCKFILE_PREFIX "/data/local/olsrd"
   #define DEFAULT_LOCKFILE_PREFIX "olsrd"
 #endif /* defined _WIN32 */
 
+#ifdef _WIN32
+  static HANDLE lck = INVALID_HANDLE_VALUE;
+#else
+  static int lock_fd = -1;
+#endif
+
 /**
  * @param cnf the olsrd configuration
  * @param ip_version the ip version
@@ -70,3 +80,67 @@ char * olsrd_get_default_lockfile(struct olsrd_config *cnf) {
 
   return strdup(buf);
 }
+
+/*
+ * Creates a zero-length locking file and use fcntl to
+ * place an exclusive lock over it. The lock will be
+ * automatically erased when the olsrd process ends,
+ * so it will even work well with a SIGKILL.
+ *
+ * Additionally the lock can be killed by removing the
+ * locking file.
+ */
+bool olsr_create_lock_file(void) {
+#ifdef _WIN32
+  bool success;
+
+  lck = CreateFile(olsr_cnf->lock_file,
+      GENERIC_READ | GENERIC_WRITE,
+      FILE_SHARE_READ | FILE_SHARE_WRITE,
+      NULL,
+      OPEN_ALWAYS,
+      FILE_ATTRIBUTE_NORMAL |
+      FILE_FLAG_DELETE_ON_CLOSE,
+      NULL);
+  CreateEvent(NULL, TRUE, FALSE, olsr_cnf->lock_file);
+  if ((INVALID_HANDLE_VALUE == lck) || (ERROR_ALREADY_EXISTS == GetLastError())) {
+    if (INVALID_HANDLE_VALUE != lck) {
+      CloseHandle(lck);
+      lck = INVALID_HANDLE_VALUE;
+    }
+    return false;
+  }
+
+  success = LockFile( lck, 0, 0, 0, 0);
+
+  if (!success) {
+    CloseHandle(lck);
+    lck = INVALID_HANDLE_VALUE;
+    return false;
+  }
+
+#else /* _WIN32 */
+  struct flock lck;
+
+  /* create file for lock */
+  lock_fd = open(olsr_cnf->lock_file, O_WRONLY | O_CREAT, S_IRWXU);
+  if (lock_fd < 0) {
+    return false;
+  }
+
+  /* create exclusive lock for the whole file */
+  lck.l_type = F_WRLCK;
+  lck.l_whence = SEEK_SET;
+  lck.l_start = 0;
+  lck.l_len = 0;
+  lck.l_pid = 0;
+
+  if (fcntl(lock_fd, F_SETLK, &lck) == -1) {
+    close(lock_fd);
+    lock_fd = -1;
+    return false;
+  }
+#endif /* _WIN32 */
+
+  return true;
+}
index 868d996..a7d31d4 100644 (file)
 
 #include "olsr_cfg.h"
 
+#include <stdbool.h>
+
 char * olsrd_get_default_lockfile(struct olsrd_config *cnf);
 
+bool olsr_create_lock_file(void);
+
 #endif /* SRC_LOCK_FILE_H_ */
index 7e5e761..0103dcd 100644 (file)
@@ -64,6 +64,7 @@
 #include "gateway.h"
 #include "olsr_niit.h"
 #include "olsr_random.h"
+#include "lock_file.h"
 
 #ifdef __linux__
 #include <linux/types.h>
@@ -100,97 +101,8 @@ static int olsr_process_arguments(int, char *[], struct olsrd_config *,
 
 static char **olsr_argv = NULL;
 
-/* Data for OLSR locking */
-#ifndef _WIN32
-static int lock_fd = 0;
-#endif /* _WIN32 */
 struct olsr_cookie_info *def_timer_ci = NULL;
 
-/*
- * Creates a zero-length locking file and use fcntl to
- * place an exclusive lock over it. The lock will be
- * automatically erased when the olsrd process ends,
- * so it will even work well with a SIGKILL.
- *
- * Additionally the lock can be killed by removing the
- * locking file.
- */
-static int olsr_create_lock_file(bool noExitOnFail) {
-#ifdef _WIN32
-    bool success;
-    HANDLE lck;
-
-    lck = CreateFile(olsr_cnf->lock_file,
-            GENERIC_READ | GENERIC_WRITE,
-            FILE_SHARE_READ | FILE_SHARE_WRITE,
-            NULL,
-            OPEN_ALWAYS,
-            FILE_ATTRIBUTE_NORMAL |
-            FILE_FLAG_DELETE_ON_CLOSE,
-            NULL);
-  CreateEvent(NULL, TRUE, FALSE, olsr_cnf->lock_file);
-  if (INVALID_HANDLE_VALUE == lck || ERROR_ALREADY_EXISTS == GetLastError()) {
-    if (noExitOnFail) {
-      return -1;
-    }
-    if (NULL == lck) {
-      char buf[1024];
-      snprintf(buf, sizeof(buf), "Cannot create OLSR lock '%s'", olsr_cnf->lock_file);
-      olsr_exit(buf, EXIT_FAILURE);
-    } else {
-      char buf[1024];
-      CloseHandle(lck);
-      snprintf(buf, sizeof(buf), "Cannot acquire OLSR lock '%s', another OLSR instance might be running", olsr_cnf->lock_file);
-      olsr_exit(buf, EXIT_FAILURE);
-    }
-  }
-
-  success = LockFile( lck, 0, 0, 0, 0);
-
-  if (!success) {
-    char buf[1024];
-    CloseHandle(lck);
-    if (noExitOnFail) {
-      return -1;
-    }
-    snprintf(buf, sizeof(buf), "Cannot acquire OLSR lock '%s', another OLSR instance might be running", olsr_cnf->lock_file);
-    olsr_exit(buf, EXIT_FAILURE);
-  }
-      
-#else /* _WIN32 */
-  struct flock lck;
-
-  /* create file for lock */
-  lock_fd = open(olsr_cnf->lock_file, O_WRONLY | O_CREAT, S_IRWXU);
-  if (lock_fd < 0) {
-    char buf[1024];
-    if (noExitOnFail) {
-      return -1;
-    }
-    snprintf(buf, sizeof(buf), "Error, cannot create OLSR lock '%s'", olsr_cnf->lock_file);
-    olsr_exit(buf, EXIT_FAILURE);
-  }
-
-  /* create exclusive lock for the whole file */
-  lck.l_type = F_WRLCK;
-  lck.l_whence = SEEK_SET;
-  lck.l_start = 0;
-  lck.l_len = 0;
-  lck.l_pid = 0;
-
-  if (fcntl(lock_fd, F_SETLK, &lck) == -1) {
-    char buf[1024];
-    close(lock_fd);
-    if (noExitOnFail) {
-      return -1;
-    }
-    snprintf(buf, sizeof(buf), "Cannot acquire OLSR lock '%s', another OLSR instance might be running", olsr_cnf->lock_file);
-    olsr_exit(buf, EXIT_FAILURE);
-  }
-#endif /* _WIN32 */
-  return 0;
-}
-
 /**
  * Write the current PID to the configured PID file (if one is configured)
  */
@@ -596,13 +508,24 @@ int main(int argc, char *argv[]) {
   /*
    * Create locking file for olsrd, will be cleared after olsrd exits
    */
-  for (i=5; i>=0; i--) {
-    OLSR_PRINTF(3, "Trying to get olsrd lock...\n");
-    if (!olsr_cnf->host_emul && olsr_create_lock_file(i > 0) == 0) {
-      /* lock sucessfully created */
-      break;
+  if (!olsr_cnf->host_emul) {
+    bool created = false;
+    for (i = 5; i >= 0; i--) {
+      OLSR_PRINTF(3, "Trying to get olsrd lock...\n");
+      if (olsr_create_lock_file()) {
+        /* lock successfully created */
+        created = true;
+        break;
+      }
+
+      sleep(1);
+    }
+
+    if (!created) {
+      char buf2[1024];
+      snprintf(buf2, sizeof(buf2), "Error, cannot create OLSR lock file '%s'", olsr_cnf->lock_file);
+      olsr_exit(buf2, EXIT_FAILURE);
     }
-    sleep (1);
   }
 
   /* Load plugins */