Index: uspace/lib/libc/generic/string.c
===================================================================
--- uspace/lib/libc/generic/string.c	(revision 531695f6c403efc3d028936cfd0b5d4514838f1e)
+++ uspace/lib/libc/generic/string.c	(revision fc6dd18feebbc66893aec4d86827b7c815dbbfe7)
@@ -896,4 +896,31 @@
 }
 
+char *str_dup(const char *src)
+{
+	size_t size = str_size(src);
+	void *dest = malloc(size + 1);
+	
+	if (dest == NULL)
+		return (char *) NULL;
+	
+	return (char *) memcpy(dest, src, size + 1);
+}
+
+char *str_ndup(const char *src, size_t max_size)
+{
+	size_t size = str_size(src);
+	if (size > max_size)
+		size = max_size;
+	
+	char *dest = (char *) malloc(size + 1);
+	
+	if (dest == NULL)
+		return (char *) NULL;
+	
+	memcpy(dest, src, size);
+	dest[size] = 0;
+	return dest;
+}
+
 
 /** Convert initial part of string to unsigned long according to given base.
@@ -920,15 +947,4 @@
 }
 
-char *str_dup(const char *src)
-{
-	size_t size = str_size(src);
-	void *dest = malloc(size + 1);
-
-	if (dest == NULL)
-		return (char *) NULL;
-
-	return (char *) memcpy(dest, src, size + 1);
-}
-
 char *strtok(char *s, const char *delim)
 {
Index: uspace/lib/libc/include/string.h
===================================================================
--- uspace/lib/libc/include/string.h	(revision 531695f6c403efc3d028936cfd0b5d4514838f1e)
+++ uspace/lib/libc/include/string.h	(revision fc6dd18feebbc66893aec4d86827b7c815dbbfe7)
@@ -84,4 +84,5 @@
 
 extern char *str_dup(const char *);
+extern char *str_ndup(const char *, size_t max_size);
 
 /*
