[rtems-libbsd commit] Add wrapper for strndup()

Sebastian Huber sebh at rtems.org
Wed Sep 11 08:25:26 UTC 2019


Module:    rtems-libbsd
Branch:    5-freebsd-12
Commit:    d1c8a7fbf527efe688097f348c84bd50a2e4efad
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=d1c8a7fbf527efe688097f348c84bd50a2e4efad

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Sep 11 10:18:30 2019 +0200

Add wrapper for strndup()

---

 rtemsbsd/include/machine/rtems-bsd-program.h | 11 ++++++++--
 rtemsbsd/rtems/rtems-kernel-program.c        |  1 +
 rtemsbsd/rtems/rtems-program.c               | 28 +++++++++++++++++++-------
 testsuite/program01/test_main.c              | 30 ++++++++++++++++++++++------
 4 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/rtemsbsd/include/machine/rtems-bsd-program.h b/rtemsbsd/include/machine/rtems-bsd-program.h
index 7003051..f71ac9c 100644
--- a/rtemsbsd/include/machine/rtems-bsd-program.h
+++ b/rtemsbsd/include/machine/rtems-bsd-program.h
@@ -107,7 +107,10 @@ void *
 rtems_bsd_program_reallocf(void *ptr, size_t size);
 
 char *
-rtems_bsd_program_strdup(const char *s1);
+rtems_bsd_program_strdup(const char *s);
+
+char *
+rtems_bsd_program_strndup(const char *s, size_t size);
 
 int
 rtems_bsd_program_vasprintf(char **strp, const char *fmt, va_list ap);
@@ -177,7 +180,11 @@ rtems_bsd_program_free(void *ptr);
 #endif
 
 #ifndef RTEMS_BSD_PROGRAM_NO_STRDUP_WRAP
-  #define strdup(s1) rtems_bsd_program_strdup(s1)
+  #define strdup(s) rtems_bsd_program_strdup(s)
+#endif
+
+#ifndef RTEMS_BSD_PROGRAM_NO_STRNDUP_WRAP
+  #define strndup(s, size) rtems_bsd_program_strndup(s, size)
 #endif
 
 #ifndef RTEMS_BSD_PROGRAM_NO_VASPRINTF_WRAP
diff --git a/rtemsbsd/rtems/rtems-kernel-program.c b/rtemsbsd/rtems/rtems-kernel-program.c
index affbc1a..763878d 100644
--- a/rtemsbsd/rtems/rtems-kernel-program.c
+++ b/rtemsbsd/rtems/rtems-kernel-program.c
@@ -47,6 +47,7 @@
 
 #undef printf
 #define RTEMS_BSD_PROGRAM_NO_STRDUP_WRAP
+#define RTEMS_BSD_PROGRAM_NO_STRNDUP_WRAP
 #include <machine/rtems-bsd-program.h>
 
 struct rtems_bsd_program_control *
diff --git a/rtemsbsd/rtems/rtems-program.c b/rtemsbsd/rtems/rtems-program.c
index ba8d5c5..204ed24 100644
--- a/rtemsbsd/rtems/rtems-program.c
+++ b/rtemsbsd/rtems/rtems-program.c
@@ -546,18 +546,32 @@ rtems_bsd_program_reallocf(void *ptr, size_t size)
 }
 
 char *
-rtems_bsd_program_strdup(const char *s1)
+rtems_bsd_program_strdup(const char *s)
 {
-	size_t size = strlen(s1) + 1; /* add one for null termination */
-	char *item;
+	size_t size;
+	void *s2;
 
-	item = rtems_bsd_program_alloc(size, NULL);
+	size = strlen(s) + 1;
+	s2 = rtems_bsd_program_alloc(size, NULL);
+	if (s2 == NULL) {
+		return (NULL);
+	}
+
+	return (memcpy(s2, s, size));
+}
+
+char *
+rtems_bsd_program_strndup(const char *s, size_t size)
+{
+	void *s2;
 
-	if (item != NULL) {
-		memcpy(item, s1, size);
+	size = strnlen(s, size) + 1;
+	s2 = rtems_bsd_program_alloc(size, NULL);
+	if (s2 == NULL) {
+		return (NULL);
 	}
 
-	return item;
+	return (memcpy(s2, s, size));
 }
 
 int
diff --git a/testsuite/program01/test_main.c b/testsuite/program01/test_main.c
index 3a200e6..7691b21 100644
--- a/testsuite/program01/test_main.c
+++ b/testsuite/program01/test_main.c
@@ -52,12 +52,13 @@
 
 struct alloc_ctx {
 	enum alloc_type {
-		ALLOC_MALLOC = 0,
-		ALLOC_CALLOC = 1,
-		ALLOC_REALLOC = 2,
-		ALLOC_STRDUP = 3,
-		ALLOC_ASPRINTF = 4,
-		ALLOC_LAST = 5,
+		ALLOC_MALLOC,
+		ALLOC_CALLOC,
+		ALLOC_REALLOC,
+		ALLOC_STRDUP,
+		ALLOC_STRNDUP,
+		ALLOC_ASPRINTF,
+		ALLOC_LAST
 	} type;
 	unsigned free;
 #define ALLOC_FREE_NONE		0x0
@@ -511,8 +512,25 @@ call_alloc(void *ctx)
 		break;
 	case ALLOC_STRDUP:
 		first = strdup(teststring);
+		assert(first != NULL);
+		assert(strcmp(first, teststring) == 0);
 		second = strdup(teststring);
+		assert(second != NULL);
+		assert(strcmp(second, teststring) == 0);
 		third = strdup(teststring);
+		assert(third != NULL);
+		assert(strcmp(third, teststring) == 0);
+		break;
+	case ALLOC_STRNDUP:
+		first = strndup(teststring, 1);
+		assert(first != NULL);
+		assert(strncmp(first, "t", 1) == 0);
+		second = strndup(teststring, 2);
+		assert(second != NULL);
+		assert(strncmp(second, "te", 2) == 0);
+		third = strndup(teststring, 4);
+		assert(third != NULL);
+		assert(strcmp(third, teststring) == 0);
 		break;
 	case ALLOC_ASPRINTF:
 		asprintf(&first, "a number %d", 0x123456);




More information about the vc mailing list