common.[ch]: Implement "strlcat".
authorFlorian Forster <ff@octo.it>
Wed, 9 Jun 2010 17:02:30 +0000 (19:02 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 9 Jun 2010 17:02:30 +0000 (19:02 +0200)
common.c
common.h

index a2bfd09..ec267af 100644 (file)
--- a/common.c
+++ b/common.c
@@ -6,6 +6,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <dirent.h>
+#include <assert.h>
 
 #include "common.h"
 
@@ -142,4 +143,33 @@ int foreach_host (callback_host_t callback, /* {{{ */
   return (foreach_dir (DATA_DIR, callback, user_data));
 } /* }}} int foreach_host */
 
+size_t c_strlcat (char *dst, const char *src, size_t size) /* {{{ */
+{
+  size_t retval;
+  size_t dst_len;
+  size_t src_len;
+
+  dst_len = strlen (dst);
+  src_len = strlen (src);
+  retval = dst_len + src_len;
+
+  if ((dst_len + 1) >= size)
+    return (retval);
+
+  dst  += dst_len;
+  size -= dst_len;
+  assert (size >= 2);
+
+  /* Result will be truncated. */
+  if (src_len >= size)
+    src_len = size - 1;
+
+  memcpy (dst, src, src_len);
+  dst[src_len] = 0;
+
+  return (retval);
+} /* }}} size_t c_strlcat */
+
+
+
 /* vim: set sw=2 sts=2 et fdm=marker : */
index 01c8710..e211406 100644 (file)
--- a/common.h
+++ b/common.h
@@ -12,5 +12,8 @@ int foreach_type (const char *host, const char *plugin,
 int foreach_plugin (const char *host, callback_plugin_t, void *user_data);
 int foreach_host (callback_host_t, void *user_data);
 
+size_t c_strlcat (char *dst, const char *src, size_t size);
+#define strlcat c_strlcat
+
 #endif /* COMMON_H */
 /* vim: set sw=2 sts=2 et fdm=marker : */