pid: move pid file handling into its own file
authorFerry Huberts <ferry.huberts@pelagic.nl>
Mon, 9 Nov 2015 22:07:20 +0000 (23:07 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 11 Nov 2015 16:09:27 +0000 (17:09 +0100)
And refactor it to not invoke olsr_shutdown

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/main.c
src/pid_file.c [new file with mode: 0644]
src/pid_file.h [new file with mode: 0644]

index 70d225c..4a46026 100644 (file)
@@ -64,6 +64,7 @@
 #include "gateway.h"
 #include "olsr_niit.h"
 #include "olsr_random.h"
+#include "pid_file.h"
 #include "lock_file.h"
 
 #ifdef __linux__
@@ -90,6 +91,7 @@ static void olsr_shutdown(int) __attribute__ ((noreturn));
 /*
  * Local function prototypes
  */
+
 void olsr_reconfigure(int signo) __attribute__ ((noreturn));
 
 static void print_version(void);
@@ -104,55 +106,6 @@ static char **olsr_argv = NULL;
 
 struct olsr_cookie_info *def_timer_ci = NULL;
 
-/**
- * Write the current PID to the configured PID file (if one is configured)
- */
-static void writePidFile(void) {
-  if (olsr_cnf->pidfile) {
-    char buf[PATH_MAX + 256];
-
-    /* create / open the PID file */
-#ifdef __WIN32
-    mode_t mode = S_IRUSR | S_IWUSR;
-#else
-    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
-#endif
-    int fd = open(olsr_cnf->pidfile, O_CREAT | O_WRONLY, mode);
-    if (fd < 0) {
-      snprintf(buf, sizeof(buf), "Could not open PID file %s", olsr_cnf->pidfile);
-      perror(buf);
-      olsr_shutdown(0);
-    }
-
-    /* write the PID */
-    {
-      pid_t pid = getpid();
-      int chars = snprintf(buf, sizeof(buf), "%d", (int)pid);
-      ssize_t chars_written = write(fd, buf, chars);
-      if (chars_written != chars) {
-        close(fd);
-        snprintf(buf, sizeof(buf), "Could not write the PID %d to the PID file %s", (int)pid, olsr_cnf->pidfile);
-        perror(buf);
-        if (remove(olsr_cnf->pidfile) < 0) {
-          snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile);
-          perror(buf);
-        }
-        olsr_shutdown(0);
-      }
-    }
-
-    if (close(fd) < 0) {
-      snprintf(buf, sizeof(buf), "Could not close PID file %s", olsr_cnf->pidfile);
-      perror(buf);
-      if (remove(olsr_cnf->pidfile) < 0) {
-        snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile);
-        perror(buf);
-      }
-      olsr_shutdown(0);
-    }
-  }
-}
-
 /**
  * Main entrypoint
  */
@@ -430,7 +383,9 @@ int main(int argc, char *argv[]) {
   }
 #endif /* _WIN32 */
 
-  writePidFile();
+  if (!writePidFile()) {
+    olsr_shutdown(0);
+  }
 
   /*
    * Create locking file for olsrd, will be cleared after olsrd exits
diff --git a/src/pid_file.c b/src/pid_file.c
new file mode 100644 (file)
index 0000000..d438721
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "pid_file.h"
+#include "olsr_cfg.h"
+
+#include <unistd.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#ifdef __WIN32
+#include <process.h>
+#endif
+
+/**
+ * Write the current PID to the configured PID file (if one is configured)
+ */
+bool writePidFile(void) {
+  if (olsr_cnf->pidfile) {
+    char buf[PATH_MAX + 256];
+
+    /* create / open the PID file */
+#ifdef __WIN32
+    mode_t mode = S_IRUSR | S_IWUSR;
+#else
+    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+#endif
+    int fd = open(olsr_cnf->pidfile, O_CREAT | O_WRONLY, mode);
+    if (fd < 0) {
+      snprintf(buf, sizeof(buf), "Could not open PID file %s", olsr_cnf->pidfile);
+      perror(buf);
+      return false;
+    }
+
+    /* write the PID */
+    {
+#ifdef __WIN32
+      pid_t pid = _getpid();
+#else
+      pid_t pid = getpid();
+#endif
+      int chars = snprintf(buf, sizeof(buf), "%d", (int) pid);
+      ssize_t chars_written = write(fd, buf, chars);
+      if (chars_written != chars) {
+        close(fd);
+        snprintf(buf, sizeof(buf), "Could not write the PID %d to the PID file %s", (int) pid, olsr_cnf->pidfile);
+        perror(buf);
+        if (remove(olsr_cnf->pidfile) < 0) {
+          snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile);
+          perror(buf);
+        }
+        return false;
+      }
+    }
+
+    if (close(fd) < 0) {
+      snprintf(buf, sizeof(buf), "Could not close PID file %s", olsr_cnf->pidfile);
+      perror(buf);
+      if (remove(olsr_cnf->pidfile) < 0) {
+        snprintf(buf, sizeof(buf), "Could not remove the PID file %s", olsr_cnf->pidfile);
+        perror(buf);
+      }
+      return false;
+    }
+  }
+
+  return true;
+}
diff --git a/src/pid_file.h b/src/pid_file.h
new file mode 100644 (file)
index 0000000..5858550
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef SRC_PID_FILE_H_
+#define SRC_PID_FILE_H_
+
+#include <stdbool.h>
+
+bool writePidFile(void);
+
+#endif /* SRC_PID_FILE_H_ */