aboutsummaryrefslogtreecommitdiff
path: root/portable/strlcat.c
diff options
context:
space:
mode:
authorRuss Allbery <rra@stanford.edu>2008-04-07 19:43:02 +0000
committerRuss Allbery <rra@stanford.edu>2008-04-07 19:43:02 +0000
commit307ba7704617f8473644e571a6d63aba8de53dec (patch)
treef370092c6b91bb325ec3eb67471f1149b46051f5 /portable/strlcat.c
parent5c7f925d454d16cf6427f3d3e9e2a5f0299ca085 (diff)
Add support for enabling and disabling principals (clearing or setting
the NOTGS flag) and examining principals to kasetkey. This functionality isn't used by wallet (and probably won't be) but is convenient for other users of kasetkey such as kadmin-remctl.
Diffstat (limited to 'portable/strlcat.c')
-rw-r--r--portable/strlcat.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/portable/strlcat.c b/portable/strlcat.c
new file mode 100644
index 0000000..971a348
--- /dev/null
+++ b/portable/strlcat.c
@@ -0,0 +1,42 @@
+/* $Id$
+ *
+ * Replacement for a missing strlcat.
+ *
+ * Provides the same functionality as the *BSD function strlcat, originally
+ * developed by Todd Miller and Theo de Raadt. strlcat works similarly to
+ * strncat, except simpler. The result is always nul-terminated even if the
+ * source string is longer than the space remaining in the destination string,
+ * and the total space required is returned. The third argument is the total
+ * space available in the destination buffer, not just the amount of space
+ * remaining.
+ *
+ * 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 strlcat to avoid conflicts with
+ * the system version.
+ */
+#if TESTING
+# define strlcat test_strlcat
+size_t test_strlcat(char *, const char *, size_t);
+#endif
+
+size_t
+strlcat(char *dst, const char *src, size_t size)
+{
+ size_t used, length, copy;
+
+ used = strlen(dst);
+ length = strlen(src);
+ if (size > 0 && used < size - 1) {
+ copy = (length >= size - used) ? size - used - 1 : length;
+ memcpy(dst + used, src, copy);
+ dst[used + copy] = '\0';
+ }
+ return used + length;
+}