main: fix pidfile compilation on windows
[olsrd.git] / src / main.c
index 2fda19a..d1feb9a 100644 (file)
 #include "gateway.h"
 #include "olsr_niit.h"
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
 #include <linux/types.h>
 #include <linux/rtnetlink.h>
 #include "kernel_routes.h"
 
-#endif
+#endif /* __linux__ */
 
-#ifdef WIN32
+#ifdef _WIN32
+#include <process.h>
 #include <winbase.h>
+#define olsr_shutdown(x) SignalHandler(x)
 #define close(x) closesocket(x)
 int __stdcall SignalHandler(unsigned long signo) __attribute__ ((noreturn));
 void ListInterfaces(void);
 void DisableIcmpRedirects(void);
 bool olsr_win32_end_request = false;
 bool olsr_win32_end_flag = false;
-#else
+#else /* _WIN32 */
 static void olsr_shutdown(int) __attribute__ ((noreturn));
-#endif
+#endif /* _WIN32 */
 
-#if defined android
+#if defined __ANDROID__
 #define DEFAULT_LOCKFILE_PREFIX "/data/local/olsrd"
-#elif defined linux || __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
+#elif defined linux || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
 #define DEFAULT_LOCKFILE_PREFIX "/var/run/olsrd"
-#elif defined WIN32
+#elif defined _WIN32
 #define DEFAULT_LOCKFILE_PREFIX "C:\\olsrd"
-#else
+#else /* defined _WIN32 */
 #define DEFAULT_LOCKFILE_PREFIX "olsrd"
-#endif
+#endif /* defined _WIN32 */
 
 /*
  * Local function prototypes
  */
-void olsr_reconfigure(int) __attribute__ ((noreturn));
+void olsr_reconfigure(int signo) __attribute__ ((noreturn));
 
 static void print_usage(bool error);
 
@@ -102,18 +104,18 @@ static int set_default_ifcnfs(struct olsr_if *, struct if_config_options *);
 static int olsr_process_arguments(int, char *[], struct olsrd_config *,
     struct if_config_options *);
 
-#ifndef WIN32
+#ifndef _WIN32
 static char **olsr_argv;
-#endif
+#endif /* _WIN32 */
 
 static char
     copyright_string[] __attribute__ ((unused)) =
         "The olsr.org Optimized Link-State Routing daemon(olsrd) Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org) All rights reserved.";
 
 /* Data for OLSR locking */
-#ifndef WIN32
+#ifndef _WIN32
 static int lock_fd = 0;
-#endif
+#endif /* _WIN32 */
 static char lock_file_name[FILENAME_MAX];
 struct olsr_cookie_info *def_timer_ci = NULL;
 
@@ -126,10 +128,24 @@ struct olsr_cookie_info *def_timer_ci = NULL;
  * Additionally the lock can be killed by removing the
  * locking file.
  */
-static void olsr_create_lock_file(void) {
-#ifdef WIN32
-  HANDLE lck = CreateEvent(NULL, TRUE, FALSE, lock_file_name);
-  if (NULL == lck || ERROR_ALREADY_EXISTS == GetLastError()) {
+static int olsr_create_lock_file(bool noExitOnFail) {
+#ifdef _WIN32
+    bool success;
+    HANDLE lck;
+
+    lck = CreateFile(lock_file_name,
+            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, lock_file_name);
+  if (INVALID_HANDLE_VALUE == lck || ERROR_ALREADY_EXISTS == GetLastError()) {
+    if (noExitOnFail) {
+      return -1;
+    }
     if (NULL == lck) {
       fprintf(stderr,
           "Error, cannot create OLSR lock '%s'.\n",
@@ -143,13 +159,30 @@ static void olsr_create_lock_file(void) {
     }
     olsr_exit("", EXIT_FAILURE);
   }
-#else
+
+  success = LockFile( lck, 0, 0, 0, 0);
+
+  if (!success) {
+      CloseHandle(lck);
+      if (noExitOnFail) {
+          return -1;
+      }
+      fprintf(stderr,
+          "Error, cannot aquire OLSR lock '%s'.\n"
+          "Another OLSR instance might be running.\n",
+          lock_file_name);
+    olsr_exit("", EXIT_FAILURE);
+  }
+      
+#else /* _WIN32 */
   struct flock lck;
 
   /* create file for lock */
   lock_fd = open(lock_file_name, O_WRONLY | O_CREAT, S_IRWXU);
   if (lock_fd == 0) {
-    close(lock_fd);
+    if (noExitOnFail) {
+      return -1;
+    }
     fprintf(stderr,
         "Error, cannot create OLSR lock '%s'.\n",
         lock_file_name);
@@ -165,14 +198,66 @@ static void olsr_create_lock_file(void) {
 
   if (fcntl(lock_fd, F_SETLK, &lck) == -1) {
     close(lock_fd);
+    if (noExitOnFail) {
+      return -1;
+    }
     fprintf(stderr,
         "Error, cannot aquire OLSR lock '%s'.\n"
         "Another OLSR instance might be running.\n",
         lock_file_name);
     olsr_exit("", EXIT_FAILURE);
   }
+#endif /* _WIN32 */
+  return 0;
+}
+
+/**
+ * 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
-  return;
+    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", 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", 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);
+    }
+  }
 }
 
 /**
@@ -196,6 +281,28 @@ olsrmain_load_config(char *file) {
   return 0;
 }
 
+static void initRandom(void) {
+  unsigned int seed = (unsigned int)time(NULL);
+
+#ifndef _WIN32
+  int randomFile;
+
+  randomFile = open("/dev/random", O_RDONLY);
+  if (randomFile == -1) {
+    randomFile = open("/dev/urandom", O_RDONLY);
+  }
+
+  if (randomFile != -1) {
+    if (read(randomFile, &seed, sizeof(seed)) != sizeof(seed)) {
+      ; /* to fix an 'unused result' compiler warning */
+    }
+    close(randomFile);
+  }
+#endif /* _WIN32 */
+
+  srandom(seed);
+}
+
 /**
  * Main entrypoint
  */
@@ -207,14 +314,14 @@ int main(int argc, char *argv[]) {
   bool loadedConfig = false;
   int i;
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
   struct interface *ifn;
-#endif
+#endif /* __linux__ */
 
-#ifdef WIN32
+#ifdef _WIN32
   WSADATA WsaData;
   size_t len;
-#endif
+#endif /* __linux__ */
 
   /* paranoia checks */
   assert(sizeof(uint8_t) == 1);
@@ -238,32 +345,32 @@ int main(int argc, char *argv[]) {
   }
 
   debug_handle = stdout;
-#ifndef WIN32
+#ifndef _WIN32
   olsr_argv = argv;
-#endif
+#endif /* _WIN32 */
   setbuf(stdout, NULL);
   setbuf(stderr, NULL);
 
-#ifndef WIN32
+#ifndef _WIN32
   /* Check if user is root */
   if (geteuid()) {
     fprintf(stderr, "You must be root(uid = 0) to run olsrd!\nExiting\n\n");
     exit(EXIT_FAILURE);
   }
-#else
+#else /* _WIN32 */
   DisableIcmpRedirects();
 
   if (WSAStartup(0x0202, &WsaData)) {
     fprintf(stderr, "Could not initialize WinSock.\n");
     olsr_exit(__func__, EXIT_FAILURE);
   }
-#endif
+#endif /* _WIN32 */
 
   /* Open syslog */
   olsr_openlog("olsrd");
 
-  /* Using PID as random seed */
-  srandom(getpid());
+  /* setup random seed */
+  initRandom();
 
   /* Init widely used statics */
   memset(&all_zero, 0, sizeof(union olsr_ip_addr));
@@ -272,12 +379,12 @@ int main(int argc, char *argv[]) {
    * Set configfile name and
    * check if a configfile name was given as parameter
    */
-#ifdef WIN32
+#ifdef _WIN32
 #ifndef WINCE
   GetWindowsDirectory(conf_file_name, FILENAME_MAX - 11);
-#else
+#else /* WINCE */
   conf_file_name[0] = 0;
-#endif
+#endif /* WINCE */
 
   len = strlen(conf_file_name);
 
@@ -285,9 +392,9 @@ int main(int argc, char *argv[]) {
   conf_file_name[len++] = '\\';
 
   strscpy(conf_file_name + len, "olsrd.conf", sizeof(conf_file_name) - len);
-#else
+#else /* _WIN32 */
   strscpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, sizeof(conf_file_name));
-#endif
+#endif /* _WIN32 */
 
   olsr_cnf = olsrd_get_default_cnf();
   for (i=1; i < argc-1;) {
@@ -360,9 +467,9 @@ int main(int argc, char *argv[]) {
     size_t l;
 #ifdef DEFAULT_LOCKFILE_PREFIX
     strscpy(lock_file_name, DEFAULT_LOCKFILE_PREFIX, sizeof(lock_file_name));
-#else
+#else /* DEFAULT_LOCKFILE_PREFIX */
     strscpy(lock_file_name, conf_file_name, sizeof(lock_file_name));
-#endif
+#endif /* DEFAULT_LOCKFILE_PREFIX */
     l = strlen(lock_file_name);
     snprintf(&lock_file_name[l], sizeof(lock_file_name) - l, "-ipv%d.lock",
         olsr_cnf->ip_version == AF_INET ? 4 : 6);
@@ -382,37 +489,40 @@ int main(int argc, char *argv[]) {
    */
   olsr_cnf->ioctl_s = socket(olsr_cnf->ip_version, SOCK_DGRAM, 0);
   if (olsr_cnf->ioctl_s < 0) {
-#ifndef WIN32
+#ifndef _WIN32
     olsr_syslog(OLSR_LOG_ERR, "ioctl socket: %m");
-#endif
+#endif /* _WIN32 */
     olsr_exit(__func__, 0);
   }
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
   olsr_cnf->rtnl_s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
   if (olsr_cnf->rtnl_s < 0) {
     olsr_syslog(OLSR_LOG_ERR, "rtnetlink socket: %m");
     olsr_exit(__func__, 0);
   }
-  fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK);
+
+  if (fcntl(olsr_cnf->rtnl_s, F_SETFL, O_NONBLOCK)) {
+    olsr_syslog(OLSR_LOG_INFO, "rtnetlink could not be set to nonblocking");
+  }
 
   if ((olsr_cnf->rt_monitor_socket = rtnetlink_register_socket(RTMGRP_LINK)) < 0) {
     olsr_syslog(OLSR_LOG_ERR, "rtmonitor socket: %m");
     olsr_exit(__func__, 0);
   }
-#endif
+#endif /* __linux__ */
 
   /*
    * create routing socket
    */
-#if defined __FreeBSD__ || __FreeBSD_kernel__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
+#if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
   olsr_cnf->rts = socket(PF_ROUTE, SOCK_RAW, 0);
   if (olsr_cnf->rts < 0) {
     olsr_syslog(OLSR_LOG_ERR, "routing socket: %m");
     olsr_exit(__func__, 0);
   }
-#endif
+#endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
   /* initialize gateway system */
   if (olsr_cnf->smart_gw_active) {
     if (olsr_init_gateways()) {
@@ -424,16 +534,14 @@ int main(int argc, char *argv[]) {
   if (olsr_cnf->use_niit) {
     olsr_init_niit();
   }
-#endif
+#endif /* __linux__ */
 
   /* Init empty TC timer */
   set_empty_tc_timer(GET_TIMESTAMP(0));
 
   /* enable ip forwarding on host */
-  /* Disable redirects globally */
-#ifndef WIN32
+  /* Disable redirects globally (not for WIN32) */
   net_os_set_global_ifoptions();
-#endif
 
   /* Initialize parser */
   olsr_init_parser();
@@ -463,7 +571,7 @@ int main(int argc, char *argv[]) {
     } else {
       olsr_cnf->willingness = olsr_calculate_willingness();
 
-      OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, olsr_cnf->will_int);
+      OLSR_PRINTF(1, "Willingness set to %d - next update in %.1f secs\n", olsr_cnf->willingness, (double)olsr_cnf->will_int);
     }
   }
 
@@ -483,6 +591,15 @@ int main(int argc, char *argv[]) {
     }
   }
 
+#ifdef __linux__
+  /* startup gateway system */
+  if (olsr_cnf->smart_gw_active) {
+    if (olsr_startup_gateways()) {
+      olsr_exit("Cannot startup gateway tunnels", 1);
+    }
+  }
+#endif /* __linux__ */
+
   olsr_do_startup_sleep();
 
   /* Print heartbeat to stdout */
@@ -492,18 +609,20 @@ int main(int argc, char *argv[]) {
     olsr_start_timer(STDOUT_PULSE_INT, 0, OLSR_TIMER_PERIODIC,
         &generate_stdout_pulse, NULL, 0);
   }
-#endif
+#endif /* !defined WINCE */
 
   /* Initialize the IPC socket */
 
   if (olsr_cnf->ipc_connections > 0) {
-    ipc_init();
+    if (ipc_init()) {
+      olsr_exit("ipc_init failure", 1);
+    }
   }
   /* Initialisation of different tables to be used. */
   olsr_init_tables();
 
   /* daemon mode */
-#ifndef WIN32
+#ifndef _WIN32
   if (olsr_cnf->debug_level == 0 && !olsr_cnf->no_fork) {
     printf("%s detaching from the current process...\n", olsrd_version);
     if (daemon(0, 0) < 0) {
@@ -511,20 +630,29 @@ int main(int argc, char *argv[]) {
       exit(EXIT_FAILURE);
     }
   }
-#endif
+#endif /* _WIN32 */
+
+  writePidFile();
 
   /*
    * Create locking file for olsrd, will be cleared after olsrd exits
    */
-  olsr_create_lock_file();
+  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;
+    }
+    sleep (1);
+  }
 
   /* Load plugins */
   olsr_load_plugins();
 
   OLSR_PRINTF(1, "Main address: %s\n\n", olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
 
-#ifdef LINUX_NETLINK_ROUTING
-  /* create policy routing priorities if necessary */
+#ifdef __linux__
+  /* create policy routing rules with priorities if necessary */
   if (DEF_RT_NONE != olsr_cnf->rt_table_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, true);
@@ -538,11 +666,11 @@ int main(int argc, char *argv[]) {
         olsr_cnf->rt_table_default, olsr_cnf->rt_table_default_pri, NULL, true);
   }
 
-  /* OLSR sockets */
+  /* rule to default table on all olsrd interfaces */
   if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) {
     for (ifn = ifnet; ifn; ifn = ifn->int_next) {
-      olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
-          olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true);
+      olsr_os_policy_rule(olsr_cnf->ip_version,
+          olsr_cnf->rt_table_default, olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, true);
     }
   }
 
@@ -560,7 +688,7 @@ int main(int argc, char *argv[]) {
   if (olsr_cnf->use_src_ip_routes) {
     olsr_os_localhost_if(&olsr_cnf->main_addr, true);
   }
-#endif
+#endif /* __linux__ */
 
   /* Start syslog entry */
   olsr_syslog(OLSR_LOG_INFO, "%s successfully started", olsrd_version);
@@ -570,11 +698,11 @@ int main(int argc, char *argv[]) {
    */
 
   /* ctrl-C and friends */
-#ifdef WIN32
+#ifdef _WIN32
 #ifndef WINCE
   SetConsoleCtrlHandler(SignalHandler, true);
-#endif
-#else
+#endif /* WINCE */
+#else /* _WIN32 */
   signal(SIGHUP, olsr_reconfigure);
   signal(SIGINT, olsr_shutdown);
   signal(SIGQUIT, olsr_shutdown);
@@ -586,7 +714,7 @@ int main(int argc, char *argv[]) {
   // Ignoring SIGUSR1 and SIGUSR1 by default to be able to use them in plugins
   signal(SIGUSR1, SIG_IGN);
   signal(SIGUSR2, SIG_IGN);
-#endif
+#endif /* _WIN32 */
 
   link_changes = false;
 
@@ -597,14 +725,14 @@ int main(int argc, char *argv[]) {
   return 1;
 } /* main */
 
+#ifndef _WIN32
 /**
  * Reconfigure olsrd. Currently kind of a hack...
  *
- *@param signal the signal that triggered this callback
+ *@param signo the signal that triggered this callback
  */
-#ifndef WIN32
 void olsr_reconfigure(int signo __attribute__ ((unused))) {
-  /* if we are started with -nofork, we do not weant to go into the
+  /* if we are started with -nofork, we do not want to go into the
    * background here. So we can simply stop on -HUP
    */
   olsr_syslog(OLSR_LOG_INFO, "sot: olsr_reconfigure()\n");
@@ -631,7 +759,7 @@ void olsr_reconfigure(int signo __attribute__ ((unused))) {
   }
   olsr_shutdown(0);
 }
-#endif
+#endif /* _WIN32 */
 
 static void olsr_shutdown_messages(void) {
   struct interface *ifn;
@@ -657,30 +785,30 @@ static void olsr_shutdown_messages(void) {
 /**
  *Function called at shutdown. Signal handler
  *
- * @param signal the signal that triggered this call
+ * @param signo the signal that triggered this call
  */
-#ifdef WIN32
+#ifdef _WIN32
 int __stdcall
 SignalHandler(unsigned long signo)
-#else
+#else /* _WIN32 */
 static void olsr_shutdown(int signo __attribute__ ((unused)))
-#endif
+#endif /* _WIN32 */
 {
   struct interface *ifn;
   int exit_value;
 
   OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo);
 
-#ifdef WIN32
+#ifdef _WIN32
   OLSR_PRINTF(1, "Waiting for the scheduler to stop.\n");
 
   olsr_win32_end_request = TRUE;
 
   while (!olsr_win32_end_flag)
-  Sleep(100);
+  sleep(1);
 
   OLSR_PRINTF(1, "Scheduler stopped.\n");
-#endif
+#endif /* _WIN32 */
 
   /* clear all links and send empty hellos/tcs */
   olsr_reset_all_links();
@@ -706,9 +834,10 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 
   olsr_delete_all_mid_entries();
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
   /* trigger gateway selection */
   if (olsr_cnf->smart_gw_active) {
+    olsr_shutdown_gateways();
     olsr_cleanup_gateways();
   }
 
@@ -721,7 +850,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   if (olsr_cnf->use_src_ip_routes) {
     olsr_os_localhost_if(&olsr_cnf->main_addr, false);
   }
-#endif
+#endif /* __linux__ */
 
   olsr_destroy_parser();
 
@@ -737,12 +866,12 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
     close(ifn->olsr_socket);
     close(ifn->send_socket);
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
     if (DEF_RT_NONE != olsr_cnf->rt_table_defaultolsr_pri) {
       olsr_os_policy_rule(olsr_cnf->ip_version, olsr_cnf->rt_table_default,
           olsr_cnf->rt_table_defaultolsr_pri, ifn->int_name, false);
     }
-#endif
+#endif /* __linux__ */
   }
 
   /* Closing plug-ins */
@@ -754,7 +883,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   /* ioctl socket */
   close(olsr_cnf->ioctl_s);
 
-#ifdef LINUX_NETLINK_ROUTING
+#ifdef __linux__
   if (DEF_RT_NONE != olsr_cnf->rt_table_pri) {
     olsr_os_policy_rule(olsr_cnf->ip_version,
         olsr_cnf->rt_table, olsr_cnf->rt_table_pri, NULL, false);
@@ -769,12 +898,12 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   }
   close(olsr_cnf->rtnl_s);
   close (olsr_cnf->rt_monitor_socket);
-#endif
+#endif /* __linux__ */
 
-#if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __MacOSX__ || defined __NetBSD__ || defined __OpenBSD__
+#if defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__
   /* routing socket */
   close(olsr_cnf->rts);
-#endif
+#endif /* defined __FreeBSD__ || defined __FreeBSD_kernel__ || defined __APPLE__ || defined __NetBSD__ || defined __OpenBSD__ */
 
   /* Free cookies and memory pools attached. */
   OLSR_PRINTF(0, "Free all memory...\n");
@@ -800,12 +929,13 @@ static void print_usage(bool error) {
         "usage: olsrd [-f <configfile>] [ -i interface1 interface2 ... ]\n"
         "  [-d <debug_level>] [-ipv6] [-multi <IPv6 multicast address>]\n"
         "  [-lql <LQ level>] [-lqw <LQ winsize>] [-lqnt <nat threshold>]\n"
-        "  [-bcast <broadcastaddr>] [-ipc] [-dispin] [-dispout] [-delgw]\n"
+        "  [-bcast <broadcastaddr>] [-ipc] [-delgw]\n"
         "  [-hint <hello interval (secs)>] [-tcint <tc interval (secs)>]\n"
         "  [-midint <mid interval (secs)>] [-hnaint <hna interval (secs)>]\n"
         "  [-T <Polling Rate (secs)>] [-nofork] [-hemu <ip_address>]\n"
-        "  [-lql <LQ level>] [-lqa <LQ aging factor>]\n",
-        error ? "An error occured somwhere between your keyboard and your chair!\n" : "");
+        "  [-lql <LQ level>] [-lqa <LQ aging factor>]\n"
+        "  [-pidfile <pid file>]\n",
+        error ? "Error in command line parameters!\n" : "");
 }
 
 /**
@@ -832,12 +962,8 @@ int set_default_ifcnfs(struct olsr_if *ifs, struct if_config_options *cnf) {
 
 #define NEXT_ARG do { argv++;argc--; } while (0)
 #define CHECK_ARGC do { if(!argc) { \
-      if((argc - 1) == 1){ \
-      fprintf(stderr, "Error parsing command line options!\n"); \
-      } else { \
-      argv--; \
-      fprintf(stderr, "You must provide a parameter when using the %s switch!\n", *argv); \
-     } \
+     argv--; \
+     fprintf(stderr, "You must provide a parameter when using the %s switch!\n", *argv); \
      olsr_exit(__func__, EXIT_FAILURE); \
      } } while (0)
 
@@ -849,7 +975,7 @@ static int olsr_process_arguments(int argc, char *argv[],
     struct olsrd_config *cnf, struct if_config_options *ifcnf) {
   while (argc > 1) {
     NEXT_ARG;
-#ifdef WIN32
+#ifdef _WIN32
     /*
      *Interface list
      */
@@ -857,7 +983,7 @@ static int olsr_process_arguments(int argc, char *argv[],
       ListInterfaces();
       exit(0);
     }
-#endif
+#endif /* _WIN32 */
 
     /*
      *Configfilename
@@ -915,9 +1041,9 @@ static int olsr_process_arguments(int argc, char *argv[],
 
       sscanf(*argv, "%f", &tmp_lq_aging);
 
-      if (tmp_lq_aging < MIN_LQ_AGING || tmp_lq_aging > MAX_LQ_AGING) {
-        printf("LQ aging factor %f not allowed. Range [%f-%f]\n", tmp_lq_aging,
-            MIN_LQ_AGING, MAX_LQ_AGING);
+      if (tmp_lq_aging < (float)MIN_LQ_AGING || tmp_lq_aging > (float)MAX_LQ_AGING) {
+        printf("LQ aging factor %f not allowed. Range [%f-%f]\n", (double)tmp_lq_aging,
+                       (double)MIN_LQ_AGING, (double)MAX_LQ_AGING);
         olsr_exit(__func__, EXIT_FAILURE);
       }
       olsr_cnf->lq_aging = tmp_lq_aging;
@@ -934,9 +1060,9 @@ static int olsr_process_arguments(int argc, char *argv[],
 
       sscanf(*argv, "%f", &tmp_lq_nat_thresh);
 
-      if (tmp_lq_nat_thresh < 0.1 || tmp_lq_nat_thresh > 1.0) {
+      if (tmp_lq_nat_thresh < 0.1f || tmp_lq_nat_thresh > 1.0f) {
         printf("NAT threshold %f not allowed. Range [%f-%f]\n",
-            tmp_lq_nat_thresh, 0.1, 1.0);
+                       (double)tmp_lq_nat_thresh, (double)0.1, (double)1.0);
         olsr_exit(__func__, EXIT_FAILURE);
       }
       olsr_cnf->lq_nat_thresh = tmp_lq_nat_thresh;
@@ -1036,22 +1162,6 @@ static int olsr_process_arguments(int argc, char *argv[],
     }
 
     /*
-     * Should we display the contents of packages beeing sent?
-     */
-    if (strcmp(*argv, "-dispin") == 0) {
-      parser_set_disp_pack_in(true);
-      continue;
-    }
-
-    /*
-     * Should we display the contents of incoming packages?
-     */
-    if (strcmp(*argv, "-dispout") == 0) {
-      net_set_disp_pack_out(true);
-      continue;
-    }
-
-    /*
      * Should we set up and send on a IPC socket for the front-end?
      */
     if (strcmp(*argv, "-ipc") == 0) {
@@ -1098,7 +1208,8 @@ static int olsr_process_arguments(int argc, char *argv[],
 
       ifa->cnf = get_default_if_config();
       ifa->host_emul = true;
-      memcpy(&ifa->hemu_ip, &in, sizeof(union olsr_ip_addr));
+      memset(&ifa->hemu_ip, 0, sizeof(ifa->hemu_ip));
+      memcpy(&ifa->hemu_ip, &in, sizeof(in));
       cnf->host_emul = true;
 
       continue;
@@ -1117,6 +1228,14 @@ static int olsr_process_arguments(int argc, char *argv[],
       continue;
     }
 
+    if (strcmp(*argv, "-pidfile") == 0) {
+      NEXT_ARG;
+      CHECK_ARGC;
+
+      cnf->pidfile = *argv;
+      continue;
+    }
+
     return -1;
   }
   return 0;