|
|
@@ -151,6 +151,36 @@ static int match_number(substring_t *s, int *result, int base)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * match_u64int: scan a number in the given base from a substring_t
|
|
|
+ * @s: substring to be scanned
|
|
|
+ * @result: resulting u64 on success
|
|
|
+ * @base: base to use when converting string
|
|
|
+ *
|
|
|
+ * Description: Given a &substring_t and a base, attempts to parse the substring
|
|
|
+ * as a number in that base. On success, sets @result to the integer represented
|
|
|
+ * by the string and returns 0. Returns -ENOMEM, -EINVAL, or -ERANGE on failure.
|
|
|
+ */
|
|
|
+static int match_u64int(substring_t *s, u64 *result, int base)
|
|
|
+{
|
|
|
+ char *buf;
|
|
|
+ int ret;
|
|
|
+ u64 val;
|
|
|
+ size_t len = s->to - s->from;
|
|
|
+
|
|
|
+ buf = kmalloc(len + 1, GFP_KERNEL);
|
|
|
+ if (!buf)
|
|
|
+ return -ENOMEM;
|
|
|
+ memcpy(buf, s->from, len);
|
|
|
+ buf[len] = '\0';
|
|
|
+
|
|
|
+ ret = kstrtoull(buf, base, &val);
|
|
|
+ if (!ret)
|
|
|
+ *result = val;
|
|
|
+ kfree(buf);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* match_int: - scan a decimal representation of an integer from a substring_t
|
|
|
* @s: substring_t to be scanned
|
|
|
@@ -166,6 +196,23 @@ int match_int(substring_t *s, int *result)
|
|
|
}
|
|
|
EXPORT_SYMBOL(match_int);
|
|
|
|
|
|
+/**
|
|
|
+ * match_u64: - scan a decimal representation of a u64 from
|
|
|
+ * a substring_t
|
|
|
+ * @s: substring_t to be scanned
|
|
|
+ * @result: resulting unsigned long long on success
|
|
|
+ *
|
|
|
+ * Description: Attempts to parse the &substring_t @s as a long decimal
|
|
|
+ * integer. On success, sets @result to the integer represented by the
|
|
|
+ * string and returns 0.
|
|
|
+ * Returns -ENOMEM, -EINVAL, or -ERANGE on failure.
|
|
|
+ */
|
|
|
+int match_u64(substring_t *s, u64 *result)
|
|
|
+{
|
|
|
+ return match_u64int(s, result, 0);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(match_u64);
|
|
|
+
|
|
|
/**
|
|
|
* match_octal: - scan an octal representation of an integer from a substring_t
|
|
|
* @s: substring_t to be scanned
|