tools/nolibc/string: add strncpy() and strlcpy()
authorWilly Tarreau <w@1wt.eu>
Mon, 7 Feb 2022 16:23:42 +0000 (17:23 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 21 Apr 2022 00:05:44 +0000 (17:05 -0700)
These are minimal variants. strncpy() always fills the destination for
<size> chars, while strlcpy() copies no more than <size> including the
zero and returns the source's length. The respective sizes on various
archs are:

  strncpy(): x86:0x1f mips:0x30 arm:0x20
  strlcpy(): x86:0x17 mips:0x34 arm:0x1a

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/include/nolibc/string.h

index b831a02de83fc9bb0284f98be6e930cdc4d28f42..7c274efcdfaefbcfb342d54fb45d836c331d4e6a 100644 (file)
@@ -121,6 +121,34 @@ size_t nolibc_strlen(const char *str)
                nolibc_strlen((str));           \
 })
 
+static __attribute__((unused))
+size_t strlcpy(char *dst, const char *src, size_t size)
+{
+       size_t len;
+       char c;
+
+       for (len = 0;;) {
+               c = src[len];
+               if (len < size)
+                       dst[len] = c;
+               if (!c)
+                       break;
+               len++;
+       }
+       return len;
+}
+
+static __attribute__((unused))
+char *strncpy(char *dst, const char *src, size_t size)
+{
+       size_t len;
+
+       for (len = 0; len < size; len++)
+               if ((dst[len] = *src))
+                       src++;
+       return dst;
+}
+
 static __attribute__((unused))
 char *strrchr(const char *s, int c)
 {