summaryrefslogtreecommitdiff
path: root/tools-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools-util.c')
-rw-r--r--tools-util.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/tools-util.c b/tools-util.c
index 65835edf..bb650931 100644
--- a/tools-util.c
+++ b/tools-util.c
@@ -605,6 +605,35 @@ int dev_mounted(char *dev)
return 2;
}
+static int kstrtoull_symbolic(const char *s, unsigned int base, unsigned long long *res)
+{
+ if (!strcmp(s, "U64_MAX")) {
+ *res = U64_MAX;
+ return 0;
+ }
+
+ if (!strcmp(s, "U32_MAX")) {
+ *res = U32_MAX;
+ return 0;
+ }
+
+ return kstrtoull(s, base, res);
+}
+
+static int kstrtouint_symbolic(const char *s, unsigned int base, unsigned *res)
+{
+ unsigned long long tmp;
+ int rv;
+
+ rv = kstrtoull_symbolic(s, base, &tmp);
+ if (rv < 0)
+ return rv;
+ if (tmp != (unsigned long long)(unsigned int)tmp)
+ return -ERANGE;
+ *res = tmp;
+ return 0;
+}
+
struct bpos bpos_parse(char *buf)
{
char *orig = strdup(buf);
@@ -620,14 +649,14 @@ struct bpos bpos_parse(char *buf)
u64 inode_v = 0, offset_v = 0;
u32 snapshot_v = 0;
- if (kstrtoull(inode_s, 10, &inode_v))
+ if (kstrtoull_symbolic(inode_s, 10, &inode_v))
die("invalid bpos.inode %s", inode_s);
- if (kstrtoull(offset_s, 10, &offset_v))
+ if (kstrtoull_symbolic(offset_s, 10, &offset_v))
die("invalid bpos.offset %s", offset_s);
if (snapshot_s &&
- kstrtouint(snapshot_s, 10, &snapshot_v))
+ kstrtouint_symbolic(snapshot_s, 10, &snapshot_v))
die("invalid bpos.snapshot %s", snapshot_s);
return (struct bpos) { .inode = inode_v, .offset = offset_v, .snapshot = snapshot_v };