Move strscat/cpy to a file of their own and clean them up
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 2 Jun 2016 19:52:11 +0000 (21:52 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 2 Jun 2016 20:05:45 +0000 (22:05 +0200)
v2 (fh): fix the typo on line 69 of string_handling.c:
         change !src[length] into src[length]

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/common/string_handling.c [new file with mode: 0644]
src/common/string_handling.h [new file with mode: 0644]
src/defs.h
src/olsr_switch/Makefile
src/olsr_switch/ohs_cmd.c

diff --git a/src/common/string_handling.c b/src/common/string_handling.c
new file mode 100644 (file)
index 0000000..e2ea8b6
--- /dev/null
@@ -0,0 +1,132 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
+ * IPv4 performance optimization (c) 2006, sven-ola(gmx.de)
+ * 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 <assert.h>
+#include <string.h>
+
+#include "common/string_handling.h"
+
+/**
+ * A somewhat safe version of strncpy.
+ * 1) This function never writes more than dest_size bytes.
+ * 2) This function always terminates the content of the dest buffer with
+ *    a zero byte.
+ * 3) This function does not write more than strlen(src)+1 bytes
+ *
+ * @param dest pointer to the destination buffer
+ * @param src pointer to the source buffer
+ * @param dest_size length of destination buffer in bytes
+ *
+ * @return pointer to destination buffer
+ */
+static
+char *_internal_strscpy(char *dest, const char *src, size_t dest_size)
+{
+  /* number of bytes to be copied without null byte */
+  size_t length = 0;
+
+  /* reserve space for null byte in dest */
+  dest_size--;
+  while ((length < dest_size) && src[length]) {
+    length++;
+  }
+
+  /* force null byte */
+  dest[length] = 0;
+
+  /* copy src content without null byte */
+  return strncpy(dest, src, length);
+}
+
+/**
+ * A somewhat safe version of strncpy.
+ * 1) This function never writes more than dest_size bytes.
+ * 2) This function always terminates the content of the dest buffer with
+ *    a zero byte.
+ * 3) This function does not write more than strlen(src)+1 bytes
+ *
+ * @param dest pointer to the destination buffer
+ * @param src pointer to the source buffer
+ * @param dest_size length of destination buffer in bytes
+ *
+ * @return pointer to destination buffer
+ */
+char *
+strscpy(char *dest, const char *src, size_t dest_size) {
+  assert (src);
+  assert (dest);
+  assert (dest_size);
+
+  return _internal_strscpy(dest, src, dest_size);
+}
+
+/**
+ * A somewhat safe version of strncat, it appends the string
+ * content of src to dest.
+ * 1) This function never writes more than dest_size bytes.
+ * 2) This function always terminates the content of the dest buffer with
+ *    a zero byte.
+ * 3) This function does not write more than strlen(src)+1 bytes
+ *
+ * The function returns an error if dst or src or dst_size is zero.
+ *
+ * @param dest pointer to the destination buffer
+ * @param src pointer to the source buffer
+ * @param dest_size length of destination buffer in bytes
+ *
+ * @return pointer to destination buffer, NULL if an error happened
+ */
+char *
+strscat(char *dest, const char *src, size_t dest_size)
+{
+  size_t dst_content_len;
+
+  assert (dest);
+  assert (src);
+  assert (dest_size);
+
+  dst_content_len = strlen(dest);
+  if (dest_size <= dst_content_len) {
+    return dest;
+  }
+  return _internal_strscpy(dest + dst_content_len, src, dest_size - dst_content_len);
+}
diff --git a/src/common/string_handling.h b/src/common/string_handling.h
new file mode 100644 (file)
index 0000000..aee3029
--- /dev/null
@@ -0,0 +1,51 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
+ * IPv4 performance optimization (c) 2006, sven-ola(gmx.de)
+ * 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 STRING_H_
+#define STRING_H_
+
+#include <stddef.h>
+
+char *strscpy(char *dest, const char *src, size_t dest_size);
+char *strscat(char *dest, const char *src, size_t dest_size);
+
+#endif /* STRING_H_ */
index a132f8f..a390413 100644 (file)
 #define _OLSR_DEFS
 
 /* Common includes */
+#include "common/string_handling.h"
+
 #include <sys/time.h>
 #include <sys/times.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -116,42 +119,6 @@ extern FILE *debug_handle;
 #endif /* MIN */
 
 /*
- * A somewhat safe version of strncpy and strncat. Note, that
- * BSD/Solaris strlcpy()/strlcat() differ in implementation, while
- * the BSD compiler prints out a warning if you use plain strcpy().
- */
-
-static INLINE char *
-strscpy(char *dest, const char *src, size_t size)
-{
-  register size_t l = 0;
-#if !defined(NODEBUG) && defined(DEBUG)
-  if (NULL == dest)
-    fprintf(stderr, "Warning: dest is NULL in strscpy!\n");
-  if (NULL == src)
-    fprintf(stderr, "Warning: src is NULL in strscpy!\n");
-#endif /* !defined(NODEBUG) && defined(DEBUG) */
-  if (!dest || !src) {
-    return NULL;
-  }
-
-  /* src does not need to be null terminated */
-  if (0 < size--)
-    while (l < size && 0 != src[l])
-      l++;
-  dest[l] = 0;
-
-  return strncpy(dest, src, l);
-}
-
-static INLINE char *
-strscat(char *dest, const char *src, size_t size)
-{
-  register size_t l = strlen(dest);
-  return strscpy(dest + l, src, size > l ? size - l : 0);
-}
-
-/*
  * Queueing macros
  */
 
index ef65067..6e3c747 100644 (file)
@@ -51,6 +51,9 @@ else
 BINNAME = olsr_switch
 endif
 
+HDRS += ../common/string_handling.h
+SRCS += ../common/string_handling.c
+
 default_target:        $(TOPDIR)/$(BINNAME)
 
 $(TOPDIR)/$(BINNAME):  $(OBJS)
index 1ef477d..d28716f 100644 (file)
@@ -43,6 +43,7 @@
  *
  */
 
+#include "common/string_handling.h"
 #include "olsr_host_switch.h"
 #include "olsr_types.h"
 #include "commands.h"