commit: 66f1350798f6c3b5edce175fc98c9b81e3e345cb
parent 2112d70de07ee9b2f437a3cf5712440d29307de5
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Thu, 23 Oct 2025 01:44:46 +0200
libutils: add lib_strlcpy
Same behavior as POSIX.1-2024 strlcpy(), but implemented as ISO C code
to avoid bumping the requirements to still futuristic POSIX.1-2024.
Diffstat:
4 files changed, 67 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
@@ -32,7 +32,7 @@ selfcheck-cmds: $(EXE) $(TEST_CMDS)
LDSTATIC="$(LDSTATIC)" ./check-cmds.sh
.PHONY: selfcheck-libs
-TEST_LIBS = test-libutils/t_mode test-libutils/t_strtodur test-libutils/t_symbolize_mode test-libutils/t_truncation test-lib/t_sha1 test-lib/t_sha256 test-lib/t_sha512 test-libutils/t_humanize
+TEST_LIBS = test-libutils/t_mode test-libutils/t_strtodur test-libutils/t_symbolize_mode test-libutils/t_truncation test-lib/t_sha1 test-lib/t_sha256 test-lib/t_sha512 test-libutils/t_humanize test-libutils/t_strlcpy
selfcheck-libs: $(TEST_LIBS)
LDSTATIC="$(LDSTATIC)" ./check-libs.sh $(TEST_LIBS)
@@ -175,5 +175,6 @@ test-lib/t_sha512: test-lib/t_sha512.c lib/sha512.c lib/bytes2hex.o
test-libutils/t_humanize: test-libutils/t_humanize.c libutils/humanize.o
test-libutils/t_mode: test-libutils/t_mode.c libutils/mode.o
test-libutils/t_strtodur: test-libutils/t_strtodur.c libutils/strtodur.o
+test-libutils/t_strlcpy: test-libutils/t_strlcpy.c libutils/lib_strlcpy.o
test-libutils/t_symbolize_mode: test-libutils/t_symbolize_mode.c libutils/symbolize_mode.o
test-libutils/t_truncation: test-libutils/t_truncation.c libutils/truncation.o
diff --git a/libutils/lib_string.h b/libutils/lib_string.h
@@ -0,0 +1,7 @@
+// utils-std: Collection of commonly available Unix tools
+// SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
+// SPDX-License-Identifier: MPL-2.0
+
+#include <sys/types.h>
+
+size_t lib_strlcpy(char *restrict d, const char *restrict s, size_t dz);
diff --git a/libutils/lib_strlcpy.c b/libutils/lib_strlcpy.c
@@ -0,0 +1,20 @@
+// utils-std: Collection of commonly available Unix tools
+// SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
+// SPDX-License-Identifier: MPL-2.0
+
+#include "./lib_string.h"
+
+size_t
+lib_strlcpy(char *restrict d, const char *restrict s, size_t dz)
+{
+ if(!dz--) return 0;
+
+ char *d0 = d;
+
+ while(dz > 0 && (*d = *s) != '\0')
+ dz--, s++, d++;
+
+ *d = '\0';
+
+ return d - d0;
+}
diff --git a/test-libutils/t_strlcpy.c b/test-libutils/t_strlcpy.c
@@ -0,0 +1,38 @@
+// utils-std: Collection of commonly available Unix tools
+// SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
+// SPDX-License-Identifier: MPL-2.0
+
+#include "../libutils/lib_string.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MATCH(a, b) \
+ if(a != b) \
+ { \
+ printf(#a "(%d) != " #b "(%d)\n", a, b); \
+ abort(); \
+ }
+
+int
+main(void)
+{
+ const char *test = "this is a test string";
+ static char buf[64];
+ buf[10] = 'A';
+
+ puts("1..1");
+
+ size_t ret = lib_strlcpy(buf, test, 10);
+ MATCH((int)ret, 9);
+
+ MATCH(buf[10], 'A');
+ MATCH(buf[9], '\0');
+
+ MATCH(strncmp(buf, test, 9), 0);
+
+ puts("1 ok - strlcpy");
+
+ return 0;
+}