worms(6) does this more concisely: errx(1, "length (2-1024) is %s: %s", errstr,
Index: ping.c =================================================================== RCS file: /cvs/src/sbin/ping/ping.c,v retrieving revision 1.142 diff -u -p -r1.142 ping.c --- ping.c 30 Aug 2016 14:28:31 -0000 1.142 +++ ping.c 2 Sep 2016 16:01:53 -0000 @@ -295,8 +295,9 @@ main(int argc, char *argv[]) case 's': /* size of packet to send */ datalen = strtonum(optarg, 0, MAXPAYLOAD, &errstr); if (errstr) - errx(1, "packet size is %s: %s", errstr, - optarg); + errx(1, "packet size is %s: %s; provide a " + "value between 0 and %d inclusive", errstr, + optarg, MAXPAYLOAD); break; #ifndef SMALL case 'T': @@ -311,20 +312,25 @@ main(int argc, char *argv[]) else tos = strtonum(optarg, 0, 255, &errstr); if (tos < 0 || tos > 255 || errstr || errno) - errx(1, "illegal tos value %s", optarg); + errx(1, "illegal tos value %s; provide a " + "value between 0 and 255 inclusive", + optarg); break; #endif /* SMALL */ case 't': options |= F_TTL; ttl = strtonum(optarg, 0, MAXTTL, &errstr); if (errstr) - errx(1, "ttl value is %s: %s", errstr, optarg); + errx(1, "ttl value is %s: %s; provide a " + "value between 0 and %d inclusive", + errstr, optarg, MAXTTL); break; case 'V': rtableid = strtonum(optarg, 0, RT_TABLEID_MAX, &errstr); if (errstr) - errx(1, "rtable value is %s: %s", errstr, - optarg); + errx(1, "rtable value is %s: %s; provide a " + "value between 0 and %d inclusive", errstr, + optarg, RT_TABLEID_MAX); if (setsockopt(s, SOL_SOCKET, SO_RTABLE, &rtableid, sizeof(rtableid)) == -1) err(1, "setsockopt SO_RTABLE"); -- Michal Mazurek