logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/
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:

MMakefile3++-
Alibutils/lib_string.h7+++++++
Alibutils/lib_strlcpy.c20++++++++++++++++++++
Atest-libutils/t_strlcpy.c38++++++++++++++++++++++++++++++++++++++
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; +}