summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2011-05-02 21:33:49 +0000
committerWolfgang Denk <wd@denx.de>2011-05-12 21:07:06 +0200
commita7fd0d9ffd32d99255d18aadc88a5ccfb1b09986 (patch)
tree8c580f588e2c88fa22e6115f316603c1d30627ce /lib
parentf0c0b3a9e6f28a34d6da5edabba1e874fdf8e675 (diff)
downloadu-boot-a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986.tar.gz
u-boot-a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986.tar.bz2
u-boot-a7fd0d9ffd32d99255d18aadc88a5ccfb1b09986.zip
lib, vsprintf: introduce strict_strtoul
as checkpatch proposes to use strict_strtoul instead of simple_strtoul, introduce it. Ported this function from Linux 2.6.38 commit ID: 521cb40b0c44418a4fd36dc633f575813d59a43d Signed-off-by: Heiko Schocher <hs@denx.de> cc: Wolfgang Denk <wd@denx.de> cc: Detlev Zundel <dzu@denx.de> cc: Valentin Longchamp <valentin.longchamp@keymile.com> cc: Holger Brunck <holger.brunck@keymile.com> Signed-off-by: Valentin Longchamp <valentin.longchamp@keymile.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/vsprintf.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 61e6f0d2b3..3b924ec5e0 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -13,6 +13,7 @@
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
+#include <errno.h>
#include <common.h>
#if !defined (CONFIG_PANIC_HANG)
@@ -61,6 +62,56 @@ unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
return result;
}
+/**
+ * strict_strtoul - convert a string to an unsigned long strictly
+ * @cp: The string to be converted
+ * @base: The number base to use
+ * @res: The converted result value
+ *
+ * strict_strtoul converts a string to an unsigned long only if the
+ * string is really an unsigned long string, any string containing
+ * any invalid char at the tail will be rejected and -EINVAL is returned,
+ * only a newline char at the tail is acceptible because people generally
+ * change a module parameter in the following way:
+ *
+ * echo 1024 > /sys/module/e1000/parameters/copybreak
+ *
+ * echo will append a newline to the tail.
+ *
+ * It returns 0 if conversion is successful and *res is set to the converted
+ * value, otherwise it returns -EINVAL and *res is set to 0.
+ *
+ * simple_strtoul just ignores the successive invalid characters and
+ * return the converted value of prefix part of the string.
+ *
+ * Copied this function from Linux 2.6.38 commit ID:
+ * 521cb40b0c44418a4fd36dc633f575813d59a43d
+ *
+ */
+int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)
+{
+ char *tail;
+ unsigned long val;
+ size_t len;
+
+ *res = 0;
+ len = strlen(cp);
+ if (len == 0)
+ return -EINVAL;
+
+ val = simple_strtoul(cp, &tail, base);
+ if (tail == cp)
+ return -EINVAL;
+
+ if ((*tail == '\0') ||
+ ((len == (size_t)(tail - cp) + 1) && (*tail == '\n'))) {
+ *res = val;
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
long simple_strtol(const char *cp,char **endp,unsigned int base)
{
if(*cp=='-')