]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mm/util.c: add kstrimdup()
authorSebastian Capella <sebastian.capella@linaro.org>
Thu, 22 May 2014 00:43:40 +0000 (10:43 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 22 May 2014 00:43:40 +0000 (10:43 +1000)
kstrimdup() creates a whitespace-trimmed duplicate of the passed in
null-terminated string.  This is useful for strings coming from sysfs that
often include trailing whitespace due to user input.

Thanks to Joe Perches for this implementation.

Signed-off-by: Sebastian Capella <sebastian.capella@linaro.org>
Cc: Joe Perches <joe@perches.com>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/string.h
mm/util.c

index ac889c5ea11bd68a846b7c84bb788115ba9b2cec..f29f9a0b7265dad09d8c014b61582c79c5662c43 100644 (file)
@@ -114,6 +114,7 @@ void *memchr_inv(const void *s, int c, size_t n);
 
 extern char *kstrdup(const char *s, gfp_t gfp);
 extern char *kstrndup(const char *s, size_t len, gfp_t gfp);
+extern char *kstrimdup(const char *s, gfp_t gfp);
 extern void *kmemdup(const void *src, size_t len, gfp_t gfp);
 
 extern char **argv_split(gfp_t gfp, const char *str, int *argcp);
index d5ea733c508265aaba619248d973ec640a73d04a..8f326edce7527a21eec62522f288e629759d4ba7 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -3,6 +3,7 @@
 #include <linux/string.h>
 #include <linux/compiler.h>
 #include <linux/export.h>
+#include <linux/ctype.h>
 #include <linux/err.h>
 #include <linux/sched.h>
 #include <linux/security.h>
@@ -64,6 +65,35 @@ char *kstrndup(const char *s, size_t max, gfp_t gfp)
 }
 EXPORT_SYMBOL(kstrndup);
 
+/**
+ * kstrimdup - Trim and copy a %NUL terminated string.
+ * @s: the string to trim and duplicate
+ * @gfp: the GFP mask used in the kmalloc() call when allocating memory
+ *
+ * Returns an address, which the caller must kfree, containing
+ * a duplicate of the passed string with leading and/or trailing
+ * whitespace (as defined by isspace) removed.
+ */
+char *kstrimdup(const char *s, gfp_t gfp)
+{
+       char *buf;
+       char *begin = skip_spaces(s);
+       size_t len = strlen(begin);
+
+       while (len && isspace(begin[len - 1]))
+               len--;
+
+       buf = kmalloc_track_caller(len + 1, gfp);
+       if (!buf)
+               return NULL;
+
+       memcpy(buf, begin, len);
+       buf[len] = '\0';
+
+       return buf;
+}
+EXPORT_SYMBOL(kstrimdup);
+
 /**
  * kmemdup - duplicate region of memory
  *