cfg: make sure lockfile has a default as specified in the cfg file
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 29 Apr 2015 16:57:32 +0000 (18:57 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 1 May 2015 07:38:56 +0000 (09:38 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/cfgparser/cfgfile_gen.c
src/cfgparser/olsrd_conf.c
src/cfgparser/olsrd_conf.h
src/cfgparser/oparse.y
src/main.c
src/olsr_cfg.h

index 9f9f564..39f9eb6 100644 (file)
@@ -314,11 +314,15 @@ void olsrd_write_cnf_autobuf(struct autobuf *out, struct olsrd_config *cnf) {
     "# The lockfile is used to prevent multiple OLSR instances running at the same\n"
     "# time.\n"
     "# (Linux/BSD default is \"/var/run/olsrd-ipv(4/6).lock\")\n"
-    "# (Win32     default is \"configfile-ipv(4/6).lock\")\n"
+    "# (Win32     default is \"[configfile]-ipv(4/6).lock\")\n"
     "\n");
-  abuf_appendf(out, "%sLockFile \"%s\"\n",
-      cnf->lock_file == NULL ? "# " : "",
-      cnf->lock_file ? cnf->lock_file : "lockfile");
+  {
+    char * lockfile_default = olsrd_get_default_lockfile(cnf);
+    abuf_appendf(out, "%sLockFile \"%s\"\n",
+        !strcmp(cnf->lock_file, lockfile_default) ? "# " : "",
+        cnf->lock_file);
+    free(lockfile_default);
+  }
   abuf_appendf(out,
     "\n"
     "# Polling rate for OLSR sockets in seconds (float). \n"
index 1e9fc6c..30e2829 100644 (file)
@@ -108,12 +108,12 @@ struct olsrd_config *olsr_cnf;         /* The global configuration */
 int
 main(int argc, char *argv[])
 {
-  if (argc == 1) {
-    fprintf(stderr, "Usage: olsrd_cfgparser [filename] -print\n\n");
+  if (argc < 2) {
+    fprintf(stderr, "Usage: olsrd_cfgparser filename [-print]\n\n");
     exit(EXIT_FAILURE);
   }
 
-  olsr_cnf = olsrd_get_default_cnf();
+  olsr_cnf = olsrd_get_default_cnf(strdup(argv[1]));
 
   if (olsrd_parse_cnf(argv[1]) == 0) {
     if ((argc > 2) && (!strcmp(argv[2], "-print"))) {
@@ -900,27 +900,31 @@ olsrd_free_cnf(struct olsrd_config *cnf)
     free(ped);
   }
 
+  free(cnf->configuration_file);
+  free(cnf->lock_file);
+
   return;
 }
 
 struct olsrd_config *
-olsrd_get_default_cnf(void)
+olsrd_get_default_cnf(char * configuration_file)
 {
-  struct olsrd_config *c = malloc(sizeof(struct olsrd_config));
+    struct olsrd_config *c = malloc(sizeof(struct olsrd_config));
   if (c == NULL) {
     fprintf(stderr, "Out of memory %s\n", __func__);
     return NULL;
   }
 
-  set_default_cnf(c);
+  set_default_cnf(c, configuration_file);
   return c;
 }
 
 void
-set_default_cnf(struct olsrd_config *cnf)
+set_default_cnf(struct olsrd_config *cnf, char * configuration_file)
 {
   memset(cnf, 0, sizeof(*cnf));
 
+  cnf->configuration_file = configuration_file;
   cnf->debug_level = DEF_DEBUGLVL;
   cnf->no_fork = false;
   cnf->pidfile = NULL;
@@ -969,6 +973,7 @@ set_default_cnf(struct olsrd_config *cnf)
   cnf->exit_value = EXIT_SUCCESS;
   cnf->max_tc_vtime = 0.0;
   cnf->ioctl_s = 0;
+  cnf->lock_file = olsrd_get_default_lockfile(cnf);
   cnf->use_niit = DEF_USE_NIIT;
   cnf->niit4to6_if_index = 0;
   cnf->niit6to4_if_index = 0;
@@ -1328,6 +1333,23 @@ ip_prefix_list_find(struct ip_prefix_list *list, const union olsr_ip_addr *net,
   return NULL;
 }
 
+/**
+ * @param cnf the olsrd configuration
+ * @param ip_version the ip version
+ * @return a malloc-ed string for the default lock file name
+ */
+char * olsrd_get_default_lockfile(struct olsrd_config *cnf) {
+  char buf[FILENAME_MAX];
+  int ipv = (cnf->ip_version == AF_INET) ? 4 : 6;
+#ifdef _WIN32
+  snprintf(buf, sizeof(buf), "%s-ipv%d.lock", cnf->configuration_file ? cnf->configuration_file : "olsrd" , ipv);
+#else
+  snprintf(buf, sizeof(buf), "/var/run/olsrd-ipv%d.lock", ipv);
+#endif
+
+  return strdup(buf);
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2
index d465a88..9f9c6a0 100644 (file)
@@ -59,7 +59,9 @@ struct conf_token {
 #define DEFAULT_STR(val) \
 (((!defcnf) && ((*((uint8_t *)(&cnfi->val)))==0))?" (d)":"")
 
-void set_default_cnf(struct olsrd_config *);
+void set_default_cnf(struct olsrd_config *, char * configuration_file);
+
+char * olsrd_get_default_lockfile(struct olsrd_config *cnf);
 
 #endif /* _OLSRD_CONF_H */
 
index 6a659dc..5301598 100644 (file)
@@ -1292,6 +1292,7 @@ amin_tc_vtime: TOK_MIN_TC_VTIME TOK_FLOAT
 alock_file: TOK_LOCK_FILE TOK_STRING
 {
   PARSER_DEBUG_PRINTF("Lock file %s\n", $2->string);
+  if (olsr_cnf->lock_file) free(olsr_cnf->lock_file);
   olsr_cnf->lock_file = $2->string;
   free($2);
 }
index 5b93ae1..38bd295 100644 (file)
@@ -377,7 +377,7 @@ int main(int argc, char *argv[]) {
   strscpy(conf_file_name, OLSRD_GLOBAL_CONF_FILE, sizeof(conf_file_name));
 #endif /* _WIN32 */
 
-  olsr_cnf = olsrd_get_default_cnf();
+  olsr_cnf = olsrd_get_default_cnf(strdup(conf_file_name));
   for (i=1; i < argc-1;) {
     if (strcmp(argv[i], "-f") == 0) {
       loadedConfig = true;
@@ -385,6 +385,7 @@ int main(int argc, char *argv[]) {
       if (olsrmain_load_config(argv[i+1]) < 0) {
         exit(EXIT_FAILURE);
       }
+      strscpy(conf_file_name, argv[i+1], sizeof(conf_file_name));
 
       if (i+2 < argc) {
         memmove(&argv[i], &argv[i+2], sizeof(*argv) * (argc-i-1));
@@ -405,7 +406,7 @@ int main(int argc, char *argv[]) {
 
   if (!loadedConfig) {
     olsrd_free_cnf(olsr_cnf);
-    olsr_cnf = olsrd_get_default_cnf();
+    olsr_cnf = olsrd_get_default_cnf(strdup(conf_file_name));
   }
 
   default_ifcnf = get_default_if_config();
index 1ee1a0b..00cda23 100644 (file)
@@ -271,6 +271,7 @@ struct plugin_entry {
  */
 
 struct olsrd_config {
+  char * configuration_file;
   uint16_t olsrport;
   int debug_level;
   bool no_fork;
@@ -418,7 +419,7 @@ extern "C" {
 
   struct if_config_options *get_default_if_config(void);
 
-  struct olsrd_config *olsrd_get_default_cnf(void);
+  struct olsrd_config *olsrd_get_default_cnf(char * configuration_file);
 
 #if defined _WIN32
   void win32_stdio_hack(unsigned int);