on top of previous mail ("ping(8) -n flag")
OK?
diff --git sbin/ping/ping.8 sbin/ping/ping.8
index e3d3d0b..07318e4 100644
--- sbin/ping/ping.8
+++ sbin/ping/ping.8
@@ -39,7 +39,7 @@
.Sh SYNOPSIS
.Nm ping
.Bk -words
-.Op Fl DdEefLqRv
+.Op Fl DdEefHLnqRv
.Op Fl c Ar count
.Op Fl I Ar ifaddr
.Op Fl i Ar wait
@@ -116,6 +116,11 @@ Only the superuser may use this option.
.Bf -emphasis
This can be very hard on a network and should be used with caution.
.Ef
+.It Fl H
+Specifies to try reverse-lookup of addresses.
+The
+.Nm
+command does not try reverse-lookup unless the option is specified.
.It Fl I Ar ifaddr
Specify the interface address to transmit from
on machines with multiple interfaces.
@@ -142,6 +147,9 @@ is specified,
sends that many packets as fast as possible before falling into its normal
mode of behavior.
Only root may set a preload value.
+.It Fl n
+Numeric output only.
+No attempt will be made to look up symbolic names from addresses in the reply.
.It Fl p Ar pattern
You may specify up to 16
.Dq pad
diff --git sbin/ping/ping.c sbin/ping/ping.c
index ac7d947..fe55493 100644
--- sbin/ping/ping.c
+++ sbin/ping/ping.c
@@ -103,7 +103,7 @@ struct payload {
int options;
#define F_FLOOD 0x0001
#define F_INTERVAL 0x0002
-/* 0x0004 */
+#define F_HOSTNAME 0x0004
#define F_PINGFILLED 0x0008
#define F_QUIET 0x0010
#define F_RROUTE 0x0020
@@ -173,7 +173,7 @@ void onsignal(int);
void retransmit(void);
void onint(int);
int pinger(void);
-char *pr_addr(in_addr_t);
+const char *pr_addr(struct sockaddr *, socklen_t);
int check_icmph(struct ip *);
void pr_icmph(struct icmp *);
void pr_pack(char *, int, struct msghdr *);
@@ -214,7 +214,7 @@ main(int argc, char *argv[])
preload = 0;
datap = &outpack[8 + sizeof(struct payload)];
while ((ch = getopt(argc, argv,
- "DEI:LRS:c:defi:l:np:qs:T:t:V:vw:")) != -1)
+ "DEI:LRS:c:defHi:l:np:qs:T:t:V:vw:")) != -1)
switch(ch) {
case 'c':
npackets = strtonum(optarg, 0, INT_MAX, &errstr);
@@ -242,6 +242,9 @@ main(int argc, char *argv[])
options |= F_FLOOD;
setvbuf(stdout, NULL, _IONBF, 0);
break;
+ case 'H':
+ options |= F_HOSTNAME;
+ break;
case 'I':
case 'S': /* deprecated */
source = optarg;
@@ -279,7 +282,7 @@ main(int argc, char *argv[])
optarg);
break;
case 'n':
- /* ignore for backward compatibility */
+ options &= ~F_HOSTNAME;
break;
case 'p': /* fill buffer with user pattern */
options |= F_PINGFILLED;
@@ -498,13 +501,18 @@ main(int argc, char *argv[])
if (to->sin_family == AF_INET)
(void)printf("PING %s (%s): %d data bytes\n", hostname,
- inet_ntoa(*(struct in_addr *)&to->sin_addr.s_addr),
+ pr_addr((struct sockaddr *)to, sizeof(*to)),
datalen);
else
(void)printf("PING %s: %d data bytes\n", hostname, datalen);
- if (pledge("stdio inet", NULL) == -1)
- err(1, "pledge");
+ if (options & F_HOSTNAME) {
+ if (pledge("stdio inet dns", NULL) == -1)
+ err(1, "pledge");
+ } else {
+ if (pledge("stdio inet", NULL) == -1)
+ err(1, "pledge");
+ }
while (preload--) /* fire off them quickies */
pinger();
@@ -736,7 +744,7 @@ pinger(void)
void
pr_pack(char *buf, int cc, struct msghdr *mhdr)
{
- struct sockaddr_in *from;
+ struct sockaddr_in *from, s_in;
socklen_t fromlen;
struct icmp *icp;
in_addr_t l;
@@ -751,6 +759,9 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
int hlen, hlen2, dupflag;
struct payload payload;
+ s_in.sin_len = sizeof(s_in);
+ s_in.sin_family = AF_INET;
+
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
err(1, "clock_gettime(CLOCK_MONOTONIC)");
@@ -770,7 +781,7 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
if (cc < hlen + ICMP_MINLEN) {
if (options & F_VERBOSE)
warnx("packet too short (%d bytes) from %s", cc,
- inet_ntoa(*(struct in_addr
*)&from->sin_addr.s_addr));
+ pr_addr((struct sockaddr*)from, fromlen));
return;
}
@@ -837,7 +848,7 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
(void)write(STDOUT_FILENO, &BSPACE, 1);
else {
(void)printf("%d bytes from %s: icmp_seq=%u", cc,
- inet_ntoa(*(struct in_addr
*)&from->sin_addr.s_addr),
+ pr_addr((struct sockaddr*)from, fromlen),
ntohs(icp->icmp_seq));
(void)printf(" ttl=%d", ip->ip_ttl);
if (cc >= 8 + sizeof(struct payload))
@@ -876,7 +887,7 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
if (cc >= hlen2 + 8 && check_icmph(ip2) != 1)
return;
(void)printf("%d bytes from %s: ", cc,
- pr_addr(from->sin_addr.s_addr));
+ pr_addr((struct sockaddr*)from, fromlen));
pr_icmph(icp);
}
@@ -902,9 +913,12 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
l = (l<<8) + *++cp;
if (l == 0)
(void)printf("\t0.0.0.0");
- else
+ else {
+ s_in.sin_addr.s_addr = ntohl(l);
(void)printf("\t%s",
- pr_addr(ntohl(l)));
+ pr_addr((struct sockaddr*)
+ &s_in, sizeof(s_in)));
+ }
hlen -= 4;
j -= 4;
i += 4;
@@ -952,8 +966,12 @@ pr_pack(char *buf, int cc, struct msghdr *mhdr)
l = (l<<8) + *++cp;
if (l == 0)
(void)printf("\t0.0.0.0");
- else
- (void)printf("\t%s", pr_addr(ntohl(l)));
+ else {
+ s_in.sin_addr.s_addr = ntohl(l);
+ (void)printf("\t%s",
+ pr_addr((struct sockaddr*)&s_in,
+ sizeof(s_in)));
+ }
hlen -= 4;
i -= 4;
j += 4;
@@ -1285,17 +1303,21 @@ pr_iph(struct ip *ip)
/*
* pr_addr --
- * Return an ascii host address as a dotted quad.
+ * Return address in numeric form or a host name
*/
-char *
-pr_addr(in_addr_t a)
+const char *
+pr_addr(struct sockaddr *addr, socklen_t addrlen)
{
- struct in_addr in;
- static char buf[16];
+ static char buf[NI_MAXHOST];
+ int flag = 0;
- in.s_addr = a;
- (void)snprintf(buf, sizeof buf, "%s", inet_ntoa(in));
- return(buf);
+ if ((options & F_HOSTNAME) == 0)
+ flag |= NI_NUMERICHOST;
+
+ if (getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0, flag) == 0)
+ return (buf);
+ else
+ return "?";
}
/*
@@ -1435,7 +1457,7 @@ void
usage(void)
{
(void)fprintf(stderr,
- "usage: ping [-DdEefLqRv] [-c count] [-I ifaddr] [-i wait]\n"
+ "usage: ping [-DdEefHLnqRv] [-c count] [-I ifaddr] [-i wait]\n"
"\t[-l preload] [-p pattern] [-s packetsize]"
#ifndef SMALL
" [-T toskeyword]"
--
I'm not entirely sure you are real.