Make tip compile on OpenBSD.
authorL. Aaron Kaplan <aaron@lo-res.org>
Wed, 28 Jan 2009 12:09:13 +0000 (13:09 +0100)
committerL. Aaron Kaplan <aaron@lo-res.org>
Wed, 28 Jan 2009 12:09:13 +0000 (13:09 +0100)
Some of the changes are a big ugly.
Like double calculations for str lengths for strncat and strncpy and so.
But on the other hand, the olsr_cfg.c code needs beautifying anyway.
(but it does work brilliantly and it is great that it was done!)
This patch is tested against openBSD 4.1 and it works together with Mac OS X (tip)
and freifunk fw 1.36

lib/lq_rfc/src/lq_plugin_rfc.c
src/bsd/kernel_routes.c
src/common/autobuf.c
src/kernel_routes.h
src/lq_plugin_etx_ff.c
src/olsr.c
src/olsr_cfg.c
src/olsr_logging.c
src/unix/ifnet.c

index d965344..489a5f0 100644 (file)
@@ -207,13 +207,13 @@ static void lq_rfc_deserialize_tc_lq(uint8_t const __attribute__((unused)) ** cu
 
 static char *lq_rfc_print_link_entry_lq(struct link_entry __attribute__((unused)) *link, char __attribute__((unused)) separator,
     struct lqtextbuffer *buffer) {
-    strcpy(buffer->buf, "");
+    strncpy(buffer->buf, "", 0);
     return buffer->buf;
 }
 
 static char *lq_rfc_print_tc_edge_entry_lq(struct tc_edge_entry __attribute__((unused)) *edge,
     char __attribute__((unused)) separator, struct lqtextbuffer * buffer) {
-    strcpy(buffer->buf, "");
+    strncpy(buffer->buf, "", 0);
     return buffer->buf;
 }
 
index fdaad34..629f536 100644 (file)
@@ -393,7 +393,7 @@ olsr_kernel_add_route(const struct rt_entry *rt, int ip_version)
 }
 
 int
-olsr_kernel_del_route6(const struct rt_entry *rt, int ip_version)
+olsr_kernel_del_route(const struct rt_entry *rt, int ip_version)
 {
   return AF_INET == ip_version ? add_del_route(rt, 0) : add_del_route6(rt, 0);
 }
index 1023939..5cc206f 100644 (file)
@@ -39,6 +39,7 @@
  */
 
 #include "common/autobuf.h"
+#include "common/string.h"
 #include "defs.h"
 
 #include <stdio.h>
@@ -134,7 +135,7 @@ int abuf_puts(struct autobuf *autobuf, const char *s)
     if (autobuf_enlarge(autobuf, autobuf->len + len + 1) < 0) {
         return -1;
     }
-    strcpy(autobuf->buf+autobuf->len, s);
+    strscpy(autobuf->buf+autobuf->len, s, len /* make openbsd shut up */);
     autobuf->len += len;
     return len;
 }
index a2d7197..f16be33 100644 (file)
@@ -50,6 +50,7 @@ olsr_kernel_add_route(const struct rt_entry *, int);
 int
 olsr_kernel_del_route(const struct rt_entry *, int);
 
+
 #endif
 
 /*
index ce7df1d..5e19150 100644 (file)
@@ -396,21 +396,22 @@ static void lq_etxff_deserialize_tc_lq(uint8_t const ** curr,
 static char *lq_etxff_print_lq(struct lq_etxff_linkquality *lq, char separator,
     struct lqtextbuffer *buffer) {
   int i = 0;
+  char str[] = "1.000";
 
   if (lq->valueLq == 255) {
-       strcpy(buffer->buf, "1.000");
+       strncpy(buffer->buf, str, sizeof(str));
        i += 5;
   }
   else {
-    i = sprintf(buffer->buf, "0.%03d", (lq->valueLq * 1000)/255);
+    i = snprintf(buffer->buf, 6, "0.%03d", (lq->valueLq * 1000)/255);
   }
   buffer->buf[i++] = separator;
 
   if (lq->valueNlq == 255) {
-    strcpy(&buffer->buf[i], "1.000");
+    strncpy(&buffer->buf[i], str, sizeof(str));
   }
   else {
-    sprintf(&buffer->buf[i], "0.%03d", (lq->valueNlq * 1000) / 255);
+    snprintf(&buffer->buf[i], 6, "0.%03d", (lq->valueNlq * 1000) / 255);
   }
   return buffer->buf;
 }
@@ -434,7 +435,7 @@ static char *lq_etxff_print_cost(olsr_linkcost cost, struct lqtextbuffer * buffe
   uint32_t roundDown = cost >> 16;
   uint32_t fraction = ((cost & 0xffff) * 1000) >> 16;
 
-  sprintf(buffer->buf, "%u.%03u", roundDown, fraction);
+  snprintf(buffer->buf, 6, "%u.%03u", roundDown, fraction);
   return buffer->buf;
 }
 
index 8dc006a..f41044c 100644 (file)
@@ -662,7 +662,7 @@ char *
 olsr_strdup(const char *s)
 {
   char *ret = olsr_malloc(1 + strlen(s), "olsr_strdup");
-  strcpy(ret, s);
+  strncpy(ret, s, strlen(s)+1);
   return ret;
 }
 
index c2f7b84..64be63c 100644 (file)
@@ -72,13 +72,17 @@ static void
 read_cfg_cat(char **pdest, const char *src)
 {
   char *tmp = *pdest;
+  int len;
+
   if (*src) {
-    *pdest = olsr_malloc(1 + (tmp ? strlen(tmp) : 0) + strlen(src), "read_cfg_cat");
+    len= ( tmp ? strlen(tmp) : 0) + strlen(src);
+
+    *pdest = olsr_malloc(1 + len, "read_cfg_cat");
     if (tmp) {
-      strcpy(*pdest, tmp);
+      strncpy(*pdest, tmp, strlen(tmp));
       free(tmp);
     }
-    strcat(*pdest, src);
+    strncat(*pdest, src, strlen(src));
   }
 }
 
@@ -139,7 +143,7 @@ read_cfg(const char *filename, int *pargc, char ***pargv, int **pline)
             while (' ' < *p)
               p++;
             n = olsr_malloc(p - q + 3, "config arg0");
-            strcpy(n, "--");
+            strncpy(n, "--", sizeof("--"));
             strncat(n, q, p - q);
             while (*q && ' ' >= *p)
               p++;
@@ -330,13 +334,14 @@ parse_cfg_hna(char *argstr, const int ip_version, struct olsr_config *rcfg, char
   struct ipaddr_str buf;
 #endif
   if ('{' != *argstr) {
-    sprintf(rmsg, "No {}\n");
+    char str[] = "No {}\n";
+    snprintf(rmsg, sizeof(str), str);
     return CFG_ERROR;
   }
   if (NULL != (tok = parse_tok(argstr + 1, NULL))) {
     char **p = tok;
     if (ip_version != rcfg->ip_version) {
-      sprintf(rmsg, "IPv%d addresses can only be used if \"IpVersion\" == %d\n",
+      snprintf(rmsg, FILENAME_MAX+256,"IPv%d addresses can only be used if \"IpVersion\" == %d\n",
               AF_INET == ip_version ? 4 : 6, AF_INET == ip_version ? 4 : 6);
       parse_tok_free(tok);
       return CFG_ERROR;
@@ -344,24 +349,24 @@ parse_cfg_hna(char *argstr, const int ip_version, struct olsr_config *rcfg, char
     while (p[0]) {
       union olsr_ip_addr ipaddr;
       if (!p[1]) {
-        sprintf(rmsg, "Odd args in %s\n", argstr);
+        snprintf(rmsg, FILENAME_MAX+256, "Odd args in %s\n", argstr);
         parse_tok_free(tok);
         return CFG_ERROR;
       }
       if (inet_pton(ip_version, p[0], &ipaddr) <= 0) {
-        sprintf(rmsg, "Failed converting IP address %s\n", p[0]);
+        snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p[0]);
         parse_tok_free(tok);
         return CFG_ERROR;
       }
       if (AF_INET == ip_version) {
         union olsr_ip_addr netmask;
         if (inet_pton(AF_INET, p[1], &netmask) <= 0) {
-          sprintf(rmsg, "Failed converting IP address %s\n", p[1]);
+          snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p[1]);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
         if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) {
-          sprintf(rmsg, "The IP address %s/%s is not a network address!\n", p[0], p[1]);
+          snprintf(rmsg, FILENAME_MAX + 256, "The IP address %s/%s is not a network address!\n", p[0], p[1]);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
@@ -372,7 +377,7 @@ parse_cfg_hna(char *argstr, const int ip_version, struct olsr_config *rcfg, char
         int prefix = -1;
         sscanf('/' == *p[1] ? p[1] + 1 : p[1], "%d", &prefix);
         if (0 > prefix || 128 < prefix) {
-          sprintf(rmsg, "Illegal IPv6 prefix %s\n", p[1]);
+          snprintf(rmsg, FILENAME_MAX + 256, "Illegal IPv6 prefix %s\n", p[1]);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
@@ -403,7 +408,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
 #endif
   if (NULL != (tok = parse_tok(argstr, &nxt))) {
     if ('{' != *nxt) {
-      sprintf(rmsg, "No {}\n");
+      snprintf(rmsg, FILENAME_MAX + 256, "No {}\n");
       parse_tok_free(tok);
       return CFG_ERROR;
     } else {
@@ -415,7 +420,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
         PARSER_DEBUG_PRINTF("Interface %s\n", p[0]);
         while (new_if && p_next[0]) {
           if (!p_next[1]) {
-            sprintf(rmsg, "Odd args in %s\n", nxt);
+            snprintf(rmsg, FILENAME_MAX + 256,"Odd args in %s\n", nxt);
             parse_tok_free(tok_next);
             parse_tok_free(tok);
             return CFG_ERROR;
@@ -435,7 +440,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
           } else if (0 == strcmp("Ip4Broadcast", p_next[0])) {
             union olsr_ip_addr ipaddr;
             if (inet_pton(AF_INET, p_next[1], &ipaddr) <= 0) {
-              sprintf(rmsg, "Failed converting IP address %s\n", p_next[1]);
+              snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p_next[1]);
               parse_tok_free(tok_next);
               parse_tok_free(tok);
               return CFG_ERROR;
@@ -456,7 +461,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
           } else if (0 == strcmp("Ip6MulticastSite", p_next[0])) {
             union olsr_ip_addr ipaddr;
             if (inet_pton(AF_INET6, p_next[1], &ipaddr) <= 0) {
-              sprintf(rmsg, "Failed converting IP address %s\n", p_next[1]);
+              snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p_next[1]);
               parse_tok_free(tok_next);
               parse_tok_free(tok);
               return CFG_ERROR;
@@ -466,7 +471,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
           } else if (0 == strcmp("Ip6MulticastGlobal", p_next[0])) {
             union olsr_ip_addr ipaddr;
             if (inet_pton(AF_INET6, p_next[1], &ipaddr) <= 0) {
-              sprintf(rmsg, "Failed converting IP address %s\n", p_next[1]);
+              snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p_next[1]);
               parse_tok_free(tok_next);
               parse_tok_free(tok);
               return CFG_ERROR;
@@ -512,7 +517,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
             float f;
             struct olsr_lq_mult *mult = olsr_malloc(sizeof(*mult), "lqmult");
             if (!p_next[2]) {
-              sprintf(rmsg, "Odd args in %s\n", nxt);
+              snprintf(rmsg, FILENAME_MAX + 256, "Odd args in %s\n", nxt);
               parse_tok_free(tok_next);
               parse_tok_free(tok);
               return CFG_ERROR;
@@ -520,7 +525,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
             memset(&mult->addr, 0, sizeof(mult->addr));
             if (0 != strcmp("default", p_next[1])) {
               if (inet_pton(rcfg->ip_version, p_next[1], &mult->addr) <= 0) {
-                sprintf(rmsg, "Failed converting IP address %s\n", p_next[1]);
+                snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p_next[1]);
                 parse_tok_free(tok_next);
                 parse_tok_free(tok);
                 return CFG_ERROR;
@@ -535,7 +540,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
                                 (float)mult->value / LINK_LOSS_MULTIPLIER);
             p_next++;
           } else {
-            sprintf(rmsg, "Unknown arg: %s %s\n", p_next[0], p_next[1]);
+            snprintf(rmsg, FILENAME_MAX + 256, "Unknown arg: %s %s\n", p_next[0], p_next[1]);
             parse_tok_free(tok_next);
             parse_tok_free(tok);
             return CFG_ERROR;
@@ -548,7 +553,7 @@ parse_cfg_interface(char *argstr, struct olsr_config *rcfg, char *rmsg)
     }
     parse_tok_free(tok);
   } else {
-    sprintf(rmsg, "Error in %s\n", argstr);
+    snprintf(rmsg, FILENAME_MAX + 256, "Error in %s\n", argstr);
     return CFG_ERROR;
   }
   return CFG_OK;
@@ -570,14 +575,14 @@ parse_cfg_ipc(char *argstr, struct olsr_config *rcfg, char *rmsg)
   struct ipaddr_str buf;
 #endif
   if ('{' != *argstr) {
-    sprintf(rmsg, "No {}\n");
+    snprintf(rmsg, FILENAME_MAX + 256, "No {}\n");
     return CFG_ERROR;
   }
   if (NULL != (tok = parse_tok(argstr + 1, &nxt))) {
     char **p = tok;
     while (p[0]) {
       if (!p[1]) {
-        sprintf(rmsg, "Odd args in %s\n", argstr);
+        snprintf(rmsg, FILENAME_MAX + 256, "Odd args in %s\n", argstr);
         parse_tok_free(tok);
         return CFG_ERROR;
       }
@@ -590,7 +595,7 @@ parse_cfg_ipc(char *argstr, struct olsr_config *rcfg, char *rmsg)
       } else if (0 == strcmp("Host", p[0])) {
         union olsr_ip_addr ipaddr;
         if (inet_pton(rcfg->ip_version, p[1], &ipaddr) <= 0) {
-          sprintf(rmsg, "Failed converting IP address %s\n", p[0]);
+          snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p[0]);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
@@ -600,24 +605,24 @@ parse_cfg_ipc(char *argstr, struct olsr_config *rcfg, char *rmsg)
       } else if (0 == strcmp("Net", p[0])) {
         union olsr_ip_addr ipaddr;
         if (!p[2]) {
-          sprintf(rmsg, "Odd args in %s\n", nxt);
+          snprintf(rmsg, FILENAME_MAX + 256, "Odd args in %s\n", nxt);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
         if (inet_pton(rcfg->ip_version, p[1], &ipaddr) <= 0) {
-          sprintf(rmsg, "Failed converting IP address %s\n", p[0]);
+          snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p[0]);
           parse_tok_free(tok);
           return CFG_ERROR;
         }
         if (AF_INET == rcfg->ip_version) {
           union olsr_ip_addr netmask;
           if (inet_pton(AF_INET, p[2], &netmask) <= 0) {
-            sprintf(rmsg, "Failed converting IP address %s\n", p[2]);
+            snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s\n", p[2]);
             parse_tok_free(tok);
             return CFG_ERROR;
           }
           if ((ipaddr.v4.s_addr & ~netmask.v4.s_addr) != 0) {
-            sprintf(rmsg, "The IP address %s/%s is not a network address!\n", p[1], p[2]);
+            snprintf(rmsg, FILENAME_MAX + 256, "The IP address %s/%s is not a network address!\n", p[1], p[2]);
             parse_tok_free(tok);
             return CFG_ERROR;
           }
@@ -627,7 +632,7 @@ parse_cfg_ipc(char *argstr, struct olsr_config *rcfg, char *rmsg)
           int prefix = -1;
           sscanf('/' == *p[2] ? p[2] + 1 : p[2], "%d", &prefix);
           if (0 > prefix || 128 < prefix) {
-            sprintf(rmsg, "Illegal IPv6 prefix %s\n", p[2]);
+            snprintf(rmsg, FILENAME_MAX + 256, "Illegal IPv6 prefix %s\n", p[2]);
             parse_tok_free(tok);
             return CFG_ERROR;
           }
@@ -636,7 +641,7 @@ parse_cfg_ipc(char *argstr, struct olsr_config *rcfg, char *rmsg)
         }
         p++;
       } else {
-        sprintf(rmsg, "Unknown arg: %s %s\n", p[0], p[1]);
+        snprintf(rmsg, FILENAME_MAX + 256, "Unknown arg: %s %s\n", p[0], p[1]);
         parse_tok_free(tok);
         return CFG_ERROR;
       }
@@ -661,7 +666,7 @@ parse_cfg_loadplugin(char *argstr, struct olsr_config *rcfg, char *rmsg)
   const char *nxt;
   if (NULL != (tok = parse_tok(argstr, &nxt))) {
     if ('{' != *nxt) {
-      sprintf(rmsg, "No {}\n");
+      snprintf(rmsg, FILENAME_MAX + 256, "No {}\n");
       parse_tok_free(tok);
       return CFG_ERROR;
     } else {
@@ -677,7 +682,7 @@ parse_cfg_loadplugin(char *argstr, struct olsr_config *rcfg, char *rmsg)
         while (p_next[0]) {
           struct plugin_param *pp = olsr_malloc(sizeof(*pp), "plparam");
           if (0 != strcmp("PlParam", p_next[0]) || !p_next[1] || !p_next[2]) {
-            sprintf(rmsg, "Odd args in %s\n", nxt);
+            snprintf(rmsg, FILENAME_MAX + 256, "Odd args in %s\n", nxt);
             parse_tok_free(tok_next);
             parse_tok_free(tok);
             return CFG_ERROR;
@@ -694,7 +699,7 @@ parse_cfg_loadplugin(char *argstr, struct olsr_config *rcfg, char *rmsg)
     }
     parse_tok_free(tok);
   } else {
-    sprintf(rmsg, "Error in %s\n", argstr);
+    snprintf(rmsg, FILENAME_MAX + 256, "Error in %s\n", argstr);
     return CFG_ERROR;
   }
   return CFG_OK;
@@ -768,7 +773,7 @@ parse_cfg_log(char *argstr, struct olsr_config *rcfg, char *rmsg)
       rcfg->log_target_file = olsr_strdup(nextEquals);
     }
     else {
-      sprintf(rmsg, "Unknown keyword %s for log parameter\n", p);
+      snprintf(rmsg, FILENAME_MAX + 256, "Unknown keyword %s for log parameter\n", p);
       return CFG_ERROR;
     }
     p = nextColon;
@@ -869,12 +874,12 @@ parse_cfg_option(const int optint, char *argstr, const int line, struct olsr_con
         } else if (strcmp(*tok, CFG_FIBM_APPROX) == 0) {
           rcfg->fib_metric = FIBM_APPROX;
         } else {
-          sprintf(rmsg, "FIBMetric must be \"%s\", \"%s\", or \"%s\"!\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX);
+          snprintf(rmsg, FILENAME_MAX + 256, "FIBMetric must be \"%s\", \"%s\", or \"%s\"!\n", CFG_FIBM_FLAT, CFG_FIBM_CORRECT, CFG_FIBM_APPROX);
           return CFG_ERROR;
         }
         parse_tok_free(tok);
       } else {
-        sprintf(rmsg, "Error in %s\n", argstr);
+        snprintf(rmsg, FILENAME_MAX + 256, "Error in %s\n", argstr);
         return CFG_ERROR;
       }
       PARSER_DEBUG_PRINTF("FIBMetric: %d=%s\n", rcfg->fib_metric, argstr);
@@ -903,7 +908,7 @@ parse_cfg_option(const int optint, char *argstr, const int line, struct olsr_con
         rcfg->ip_version = AF_INET6;
         rcfg->ipsize = sizeof(struct in6_addr);
       } else {
-        sprintf(rmsg, "IpVersion must be 4 or 6!\n");
+        snprintf(rmsg, FILENAME_MAX + 256, "IpVersion must be 4 or 6!\n");
         return CFG_ERROR;
       }
     }
@@ -1016,13 +1021,13 @@ parse_cfg_option(const int optint, char *argstr, const int line, struct olsr_con
     break;
   case 'o':                    /* Originator Address (ip) */
     if (inet_pton(AF_INET, argstr, &rcfg->router_id) <= 0) {
-      sprintf(rmsg, "Failed converting IP address %s for originator address\n", argstr);
+      snprintf(rmsg, FILENAME_MAX + 256, "Failed converting IP address %s for originator address\n", argstr);
       return CFG_ERROR;
     }
     rcfg->fixed_origaddr = true;
     break;
   default:
-    sprintf(rmsg, "Unknown arg in line %d.\n", line);
+    snprintf(rmsg, FILENAME_MAX + 256, "Unknown arg in line %d.\n", line);
     return CFG_ERROR;
   }                             /* switch */
   return CFG_OK;
@@ -1191,13 +1196,13 @@ olsr_parse_cfg(int argc, char *argv[], const char *file, char *rmsg, struct olsr
   while (0 <= (opt = getopt_long(opt_argc, opt_argv, opt_str, long_options, &opt_idx))) {
     switch (opt) {
     case 0:
-      sprintf(rmsg, "Ignored deprecated %s\n", long_options[opt_idx].name);
+      snprintf(rmsg, FILENAME_MAX + 256, "Ignored deprecated %s\n", long_options[opt_idx].name);
       rslt = CFG_WARN;
       break;
     case 'f':                  /* config (filename) */
       PARSER_DEBUG_PRINTF("Read config from %s\n", optarg);
       if (0 > read_cfg(optarg, &opt_argc, &opt_argv, &opt_line)) {
-        sprintf(rmsg, "Could not read specified config file %s!\n%s", optarg, strerror(errno));
+        snprintf(rmsg, FILENAME_MAX + 256, "Could not read specified config file %s!\n%s", optarg, strerror(errno));
         return CFG_ERROR;
       }
       break;
index 28a879a..a8d3963 100644 (file)
@@ -214,7 +214,7 @@ void olsr_log (enum log_severity severity, enum log_source source, const char *f
 
   /* calculate local time */
   gettimeofday(&timeval, NULL);
-  localtime_r ( &timeval.tv_sec, &now );
+  localtime_r ( (time_t*) &timeval.tv_sec, &now );
 
   /* generate log string (insert file/line in DEBUG mode) */
 #if DEBUG
index ab6c01a..8537115 100644 (file)
@@ -673,7 +673,7 @@ chk_if_up(struct olsr_if_config *iface, int debuglvl __attribute__((unused)))
    * Clone interface name.
    */
   ifp->int_name = olsr_malloc(strlen(ifr_basename) + 1, "Interface update 3");
-  strcpy(ifp->int_name, ifr_basename);
+  strncpy(ifp->int_name, ifr_basename, strlen(ifr_basename));
 
   ifp->immediate_send_tc = iface->cnf->tc_params.emission_interval < iface->cnf->hello_params.emission_interval;
 #if 0