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.

Reply via email to