summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2019-04-15 12:32:14 +0300
committerTom Warren <twarren@nvidia.com>2019-06-05 19:16:32 +0300
commit0c4e2658e8e8489956e48a6c9842c5d21b9593fe (patch)
treec4f1dfe07c5ef92c12f9dd5c6463bd2b33653612
parentebf30e8451f457aebc8232a674fa75823dd10d49 (diff)
downloadu-boot-0c4e2658e8e8489956e48a6c9842c5d21b9593fe.tar.xz
lib: Implement strndup()
Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Tom Warren <twarren@nvidia.com>
-rw-r--r--include/linux/string.h1
-rw-r--r--lib/string.c23
2 files changed, 24 insertions, 0 deletions
diff --git a/include/linux/string.h b/include/linux/string.h
index 3606620739..5d63be4ce5 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -94,6 +94,7 @@ size_t strcspn(const char *s, const char *reject);
#ifndef __HAVE_ARCH_STRDUP
extern char * strdup(const char *);
#endif
+extern char * strndup(const char *, size_t);
#ifndef __HAVE_ARCH_STRSWAB
extern char * strswab(const char *);
#endif
diff --git a/lib/string.c b/lib/string.c
index af17c16f61..9b779ddc3b 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -326,6 +326,29 @@ char * strdup(const char *s)
}
#endif
+char * strndup(const char *s, size_t n)
+{
+ size_t len;
+ char *new;
+
+ if (s == NULL)
+ return NULL;
+
+ len = strlen(s);
+
+ if (n < len)
+ len = n;
+
+ new = malloc(len + 1);
+ if (new == NULL)
+ return NULL;
+
+ strncpy(new, s, len);
+ new[len] = '\0';
+
+ return new;
+}
+
#ifndef __HAVE_ARCH_STRSPN
/**
* strspn - Calculate the length of the initial substring of @s which only