aboutsummaryrefslogtreecommitdiff
path: root/portable/strlcpy.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/strlcpy.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/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;
+}