diff options
Diffstat (limited to 'marsond.c')
-rw-r--r-- | marsond.c | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -93,6 +93,17 @@ void version(void) { puts(VERSION); } +int parse_num(const char *num, char opt, int min) { + char *end; + int result; + + result = (int)strtol(num, &end, 10); + if(*end || (result < min)) { + die("%c option expects an integer >= %d, not '%s'", opt, min, num); + } + return result; +} + void parse_args(int argc, char **argv) { int opt; @@ -110,11 +121,11 @@ void parse_args(int argc, char **argv) { while( (opt = getopt(argc, argv, ":d:hfk:p:vV")) != -1) { switch(opt) { - case 'd': delay_ms = atoi(optarg); break; + case 'd': delay_ms = parse_num(optarg, 'd', 1); break; case 'f': foreground++; break; case 'h': print_help(); exit(0); break; case 'k': keyboard_dev = optarg; break; - case 'p': pause_ms = atoi(optarg); break; + case 'p': pause_ms = parse_num(optarg, 'p', 0); break; case 'v': debugging++; break; case 'V': version(); exit(0); break; case ':': die("option -%c requires an argument (try --help)", optopt); break; @@ -122,8 +133,9 @@ void parse_args(int argc, char **argv) { } } - if(delay_ms < 1) die("invalid -d argument"); - if(pause_ms < 0) die("invalid -p argument"); + if(optind < argc) { + die("unknown argument: %s", argv[optind]); + } } /* cleanup() gets called by die() and sighandler() */ |