aboutsummaryrefslogtreecommitdiff
path: root/portable/strlcpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'portable/strlcpy.c')
-rw-r--r--portable/strlcpy.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/portable/strlcpy.c b/portable/strlcpy.c
new file mode 100644
index 0000000..1dd49a3
--- /dev/null
+++ b/portable/strlcpy.c
@@ -0,0 +1,40 @@
+/* $Id$
+ *
+ * Replacement for a missing strlcpy.
+ *
+ * Provides the same functionality as the *BSD function strlcpy, originally
+ * developed by Todd Miller and Theo de Raadt. strlcpy works similarly to
+ * strncpy, except saner and simpler. The result is always nul-terminated
+ * even if the source string is longer than the destination string, and the
+ * total space required is returned. The destination string is not nul-filled
+ * like strncpy does, just nul-terminated.
+ *
+ * Written by Russ Allbery <rra@stanford.edu>
+ * This work is hereby placed in the public domain by its author.
+ */
+
+#include <config.h>
+#include <system.h>
+
+/*
+ * If we're running the test suite, rename strlcpy to avoid conflicts with
+ * the system version.
+ */
+#if TESTING
+# define strlcpy test_strlcpy
+size_t test_strlcpy(char *, const char *, size_t);
+#endif
+
+size_t
+strlcpy(char *dst, const char *src, size_t size)
+{
+ size_t length, copy;
+
+ length = strlen(src);
+ if (size > 0) {
+ copy = (length >= size) ? size - 1 : length;
+ memcpy(dst, src, copy);
+ dst[copy] = '\0';
+ }
+ return length;
+}