'arp -[d]a' do not require hostname as told in the manual page.
A single fprintf() is both shorter and cleaner. Index: arp.8 =================================================================== RCS file: /cvs/src/usr.sbin/arp/arp.8,v retrieving revision 1.39 diff -u -p -r1.39 arp.8 --- arp.8 5 Apr 2016 18:18:42 -0000 1.39 +++ arp.8 19 Jun 2017 10:15:10 -0000 @@ -40,7 +40,7 @@ .Nm arp .Op Fl adn .Op Fl V Ar rdomain -.Ar hostname +.Op Ar hostname .Nm arp .Op Fl F .Op Fl f Ar file Index: arp.c =================================================================== RCS file: /cvs/src/usr.sbin/arp/arp.c,v retrieving revision 1.79 diff -u -p -r1.79 arp.c --- arp.c 19 Apr 2017 05:36:12 -0000 1.79 +++ arp.c 19 Jun 2017 10:15:10 -0000 @@ -601,11 +601,10 @@ ether_str(struct sockaddr_dl *sdl) void usage(void) { - fprintf(stderr, "usage: arp [-adn] [-V rdomain] hostname\n"); - fprintf(stderr, " arp [-F] [-f file] [-V rdomain] " - "-s hostname ether_addr\n" - " [temp | permanent] [pub]\n"); - fprintf(stderr, " arp -W ether_addr [iface]\n"); + fprintf(stderr, "usage: arp [-adn] [-V rdomain] [hostname]\n" + " arp [-F] [-f file] [-V rdomain] -s hostname ether_addr\n" + " [temp | permanent] [pub]\n" + " arp -W ether_addr [iface]\n"); exit(1); }