aboutsummaryrefslogtreecommitdiff
path: root/marsond.c
diff options
context:
space:
mode:
Diffstat (limited to 'marsond.c')
-rw-r--r--marsond.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/marsond.c b/marsond.c
index 309d62c..8070d78 100644
--- a/marsond.c
+++ b/marsond.c
@@ -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() */