Convert atoi -> strtonum. Plus more detailed error messages. OK ?
-- Alexandr Shadchin Index: wsmoused.c =================================================================== RCS file: /cvs/src/usr.sbin/wsmoused/wsmoused.c,v retrieving revision 1.34 diff -u -p -r1.34 wsmoused.c --- wsmoused.c 22 Dec 2014 11:21:49 -0000 1.34 +++ wsmoused.c 22 Dec 2014 11:29:36 -0000 @@ -175,14 +175,6 @@ static int p2l[MOUSE_MAXBUTTON] = { MOUSE_BUTTON5, MOUSE_BUTTON6, MOUSE_BUTTON7, MOUSE_BUTTON8, }; -static char * -skipspace(char *s) -{ - while (isspace((unsigned char)*s)) - ++s; - return s; -} - /* mouse_installmap : install a map between physical and logical buttons */ static int mouse_installmap(char *arg) @@ -190,29 +182,38 @@ mouse_installmap(char *arg) int pbutton; int lbutton; char *s; + const char *errstr; while (*arg) { - arg = skipspace(arg); s = arg; while (isdigit((unsigned char)*arg)) ++arg; - arg = skipspace(arg); - if ((arg <= s) || (*arg != '=')) + if ((arg == s) || (*arg != '=')) return FALSE; - lbutton = atoi(s); + *arg = '\0'; + lbutton = strtonum(s, 1, MOUSE_MAXBUTTON, &errstr); + if (errstr != NULL) { + warnx("logical button value `%s' is %s, " + "acceptable range is 1-%d", + s, errstr, MOUSE_MAXBUTTON); + *arg = '='; + return FALSE; + } + *arg = '='; - arg = skipspace(++arg); - s = arg; + s = ++arg; while (isdigit((unsigned char)*arg)) ++arg; - if (arg <= s || (!isspace((unsigned char)*arg) && *arg != '\0')) - return FALSE; - pbutton = atoi(s); - - if (lbutton <= 0 || lbutton > MOUSE_MAXBUTTON) + if ((arg == s) || (*arg != '\0')) return FALSE; - if (pbutton <= 0 || pbutton > MOUSE_MAXBUTTON) + pbutton = strtonum(s, 1, MOUSE_MAXBUTTON, &errstr); + if (errstr != NULL) { + warnx("physical button value `%s' is %s, " + "acceptable range is 1-%d", + s, errstr, MOUSE_MAXBUTTON); return FALSE; + } + p2l[pbutton - 1] = lbutton - 1; } return TRUE; @@ -454,6 +455,7 @@ main(int argc, char **argv) unsigned int type; int opt; int i; + const char *errstr; #define GETOPT_STRING "2dfhip:t:C:D:I:M:" while ((opt = (getopt(argc, argv, GETOPT_STRING))) != -1) { @@ -498,11 +500,12 @@ main(int argc, char **argv) break; case 'C': #define MAX_CLICKTHRESHOLD 2000 /* max delay for double click */ - mouse.clickthreshold = atoi(optarg); - if (mouse.clickthreshold < 0 || - mouse.clickthreshold > MAX_CLICKTHRESHOLD) { - warnx("invalid threshold `%s': max value is %d", - optarg, MAX_CLICKTHRESHOLD); + mouse.clickthreshold = strtonum(optarg, 0, + MAX_CLICKTHRESHOLD, &errstr); + if (errstr != NULL) { + warnx("threshold value `%s' is %s, " + "acceptable range is 0-%d", + optarg, errstr, MAX_CLICKTHRESHOLD); usage(); } break;