Base 10 suffices, negative numbers should be invalid (not converted) and zero not treated specially:
# apmd -dt -1 apmd: kevent loop: Invalid argument # apmd -dt 0 usage: apmd [-AadHLs] [-f devname] [-S sockname] [-t seconds] [-Z percent] [-z percent] # apmd -dt 1 ^C # ./obj/apmd -dt -1 apmd: too small seconds: -1 # ./obj/apmd -dt 0 apmd: too small seconds: 0 # ./obj/apmd -dt 1 ^C errstr is precise enough, so drop the "Invalid argument" by using just err() while here. Feedback? OK? Index: apmd.c =================================================================== RCS file: /cvs/src/usr.sbin/apmd/apmd.c,v retrieving revision 1.82 diff -u -p -r1.82 apmd.c --- apmd.c 30 Nov 2018 18:05:31 -0000 1.82 +++ apmd.c 1 Dec 2018 00:33:24 -0000 @@ -392,9 +392,9 @@ main(int argc, char *argv[]) sockname = optarg; break; case 't': - ts.tv_sec = strtoul(optarg, NULL, 0); - if (ts.tv_sec == 0) - usage(); + ts.tv_sec = strtonum(optarg, 1, LLONG_MAX, &errstr); + if (errstr != NULL) + err(1, "%s seconds: %s", errstr, optarg); break; case 's': /* status only */ statonly = 1; @@ -422,15 +422,13 @@ main(int argc, char *argv[]) autoaction = AUTO_HIBERNATE; autolimit = strtonum(optarg, 1, 100, &errstr); if (errstr != NULL) - errc(1, EINVAL, "%s percentage: %s", errstr, - optarg); + err(1, "%s percentage: %s", errstr, optarg); break; case 'z': autoaction = AUTO_SUSPEND; autolimit = strtonum(optarg, 1, 100, &errstr); if (errstr != NULL) - errc(1, EINVAL, "%s percentage: %s", errstr, - optarg); + err(1, "%s percentage: %s", errstr, optarg); break; case '?': default: