|
@@ -13,6 +13,7 @@
|
|
#include <linux/types.h>
|
|
#include <linux/types.h>
|
|
#include <linux/string.h>
|
|
#include <linux/string.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/ctype.h>
|
|
|
|
+#include <errno.h>
|
|
|
|
|
|
#include <common.h>
|
|
#include <common.h>
|
|
#if !defined (CONFIG_PANIC_HANG)
|
|
#if !defined (CONFIG_PANIC_HANG)
|
|
@@ -61,6 +62,56 @@ unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
|
|
return result;
|
|
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)
|
|
long simple_strtol(const char *cp,char **endp,unsigned int base)
|
|
{
|
|
{
|
|
if(*cp=='-')
|
|
if(*cp=='-')
|