From 79868890041f70b0c41e229b9417d05ad362d1d9 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 9 Jul 2012 17:14:17 +1000 Subject: [PATCH] Create parse_num() function. Instead of open-coding this several times, just do it once. The frees up the name 'c' which I'm about to use. Signed-off-by: NeilBrown --- mdadm.c | 22 ++++++++++------------ mdadm.h | 1 + util.c | 11 +++++++++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/mdadm.c b/mdadm.c index 5aa0823f..476756e5 100644 --- a/mdadm.c +++ b/mdadm.c @@ -51,7 +51,6 @@ int main(int argc, char *argv[]) int mode = 0; int opt; int option_index; - char *c; int rv; int i; @@ -65,7 +64,6 @@ int main(int argc, char *argv[]) int sparedisks = 0; struct mddev_ident ident; char *configfile = NULL; - char *cp; char *update = NULL; int scan = 0; int devmode = 0; @@ -590,8 +588,8 @@ int main(int argc, char *argv[]) raiddisks, optarg); exit(2); } - raiddisks = strtol(optarg, &c, 10); - if (!optarg[0] || *c || raiddisks<=0) { + raiddisks = parse_num(optarg); + if (raiddisks <= 0) { pr_err("invalid number of raid devices: %s\n", optarg); exit(2); @@ -610,8 +608,8 @@ int main(int argc, char *argv[]) level); exit(2); } - sparedisks = strtol(optarg, &c, 10); - if (!optarg[0] || *c || sparedisks < 0) { + sparedisks = parse_num(optarg); + if (sparedisks < 0) { pr_err("invalid number of spare-devices: %s\n", optarg); exit(2); @@ -699,8 +697,8 @@ int main(int argc, char *argv[]) if (strcmp(optarg, "dev")==0) ident.super_minor = -2; else { - ident.super_minor = strtoul(optarg, &cp, 10); - if (!optarg[0] || *cp) { + ident.super_minor = parse_num(optarg); + if (ident.super_minor < 0) { pr_err("Bad super-minor number: %s.\n", optarg); exit(2); } @@ -865,8 +863,8 @@ int main(int argc, char *argv[]) pr_err("only specify delay once. %s ignored.\n", optarg); else { - delay = strtol(optarg, &c, 10); - if (!optarg[0] || *c || delay<1) { + delay = parse_num(optarg); + if (delay<1) { pr_err("invalid delay: %s\n", optarg); exit(2); @@ -1095,8 +1093,8 @@ int main(int argc, char *argv[]) case O(CREATE, WriteBehind): /* write-behind mode */ write_behind = DEFAULT_MAX_WRITE_BEHIND; if (optarg) { - write_behind = strtol(optarg, &c, 10); - if (write_behind < 0 || *c || + write_behind = parse_num(optarg); + if (write_behind < 0 || write_behind > 16383) { pr_err("Invalid value for maximum outstanding write-behind writes: %s.\n\tMust be between 0 and 16383.\n", optarg); exit(2); diff --git a/mdadm.h b/mdadm.h index 564b5105..056b87fc 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1133,6 +1133,7 @@ extern long long parse_size(char *size); extern int parse_uuid(char *str, int uuid[4]); extern int parse_layout_10(char *layout); extern int parse_layout_faulty(char *layout); +extern long parse_num(char *num); extern int check_ext2(int fd, char *name); extern int check_reiser(int fd, char *name); extern int check_raid(int fd, char *name); diff --git a/util.c b/util.c index d0765a6d..ad3c1502 100644 --- a/util.c +++ b/util.c @@ -253,6 +253,17 @@ int parse_layout_faulty(char *layout) return mode | (atoi(layout+ln)<< ModeShift); } + +long parse_num(char *num) +{ + /* Either return a valid number, or -1 */ + char *c; + long rv = strtol(num, &c, 10); + if (rv < 0 || *c || !num[0]) + return -1; + else + return rv; +} #endif void remove_partitions(int fd) -- 2.39.2