aboutsummaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
Diffstat (limited to 'system')
-rw-r--r--system/lib/libc/musl/src/string/strdup.c13
-rw-r--r--system/lib/libc/musl/src/string/strndup.c12
-rw-r--r--system/lib/libcextra.symbols2
3 files changed, 27 insertions, 0 deletions
diff --git a/system/lib/libc/musl/src/string/strdup.c b/system/lib/libc/musl/src/string/strdup.c
new file mode 100644
index 00000000..dd5f80c1
--- /dev/null
+++ b/system/lib/libc/musl/src/string/strdup.c
@@ -0,0 +1,13 @@
+#include <stdlib.h>
+#include <string.h>
+#include "libc.h"
+
+char *__strdup(const char *s)
+{
+ size_t l = strlen(s);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ return memcpy(d, s, l+1);
+}
+
+weak_alias(__strdup, strdup);
diff --git a/system/lib/libc/musl/src/string/strndup.c b/system/lib/libc/musl/src/string/strndup.c
new file mode 100644
index 00000000..617d27ba
--- /dev/null
+++ b/system/lib/libc/musl/src/string/strndup.c
@@ -0,0 +1,12 @@
+#include <stdlib.h>
+#include <string.h>
+
+char *strndup(const char *s, size_t n)
+{
+ size_t l = strnlen(s, n);
+ char *d = malloc(l+1);
+ if (!d) return NULL;
+ memcpy(d, s, l);
+ d[l] = 0;
+ return d;
+}
diff --git a/system/lib/libcextra.symbols b/system/lib/libcextra.symbols
index dedfcedd..06e68c92 100644
--- a/system/lib/libcextra.symbols
+++ b/system/lib/libcextra.symbols
@@ -117,12 +117,14 @@
W strchrnul
T strchr
T strcspn
+ T strdup
T strfmon
T strfmon_l
T strlcat
T strlcpy
T strncasecmp_l
T strncat
+ T strndup
T strnlen
T strrchr
T strsep