Hi, based on Theo's recent comment I thought I could take a shot at it, but it seems that my tree is currently broken as I can't compile it:
/usr/src/sbin/ping6/ping6.c:745: error: implicit declaration of function 'pledge' But I thought it might still be worthwhile to share the diff. Basically I did the following: - renamed ping6 option -m to -D - renamed ping6 option -t to -o (as I would otherwise have a naming conflict) - renamed ping6 option -h to -t - renamed ping6 option -w to -O (-w is used by ping for a different matter) I also wanted to change hoplimit to be ttl so it matches ping's code but ttl is already in use within ping6. If this would be ok I will gladly to the ping.8 diff. Frank. Index: sbin/ping6/ping6.c =================================================================== RCS file: /cvs/src/sbin/ping6/ping6.c,v retrieving revision 1.121 diff -u -p -u -r1.121 ping6.c --- sbin/ping6/ping6.c 12 Oct 2015 18:32:18 -0000 1.121 +++ sbin/ping6/ping6.c 13 Oct 2015 11:19:41 -0000 @@ -177,7 +177,7 @@ char DOT = '.'; char *hostname; int ident; /* process id to identify our packets */ u_int8_t nonce[8]; /* nonce field for node information */ -int hoplimit = -1; /* hoplimit */ +int maxttl = -1; /* maxttl */ /* counters */ long npackets; /* max packets to transmit */ @@ -255,7 +255,7 @@ main(int argc, char *argv[]) int usepktinfo = 0; struct in6_pktinfo *pktinfo = NULL; double intval; - int mflag = 0; + int Dflag = 0; uid_t uid; u_int rtableid = 0; @@ -270,7 +270,7 @@ main(int argc, char *argv[]) preload = 0; datap = &outpack[ICMP6ECHOLEN + ICMP6ECHOTMLEN]; while ((ch = getopt(argc, argv, - "a:b:c:dEefHg:h:I:i:l:mnNp:qS:s:tvV:w")) != -1) { + "a:b:c:DdEefg:H:I:i:l:NnOp:qS:s:tV:v")) != -1) { switch (ch) { case 'a': { @@ -325,6 +325,9 @@ main(int argc, char *argv[]) "number of packets to transmit is %s: %s", errstr, optarg); break; + case 'D': + Dflag++; + break; case 'd': options |= F_SO_DEBUG; break; @@ -348,11 +351,6 @@ main(int argc, char *argv[]) case 'H': options |= F_HOSTNAME; break; - case 'h': /* hoplimit */ - hoplimit = strtonum(optarg, 0, IPV6_MAXHLIM, &errstr); - if (errstr) - errx(1, "hoplimit is %s: %s", errstr, optarg); - break; case 'I': ifname = optarg; options |= F_INTERFACE; @@ -388,15 +386,20 @@ main(int argc, char *argv[]) errx(1, "preload value is %s: %s", errstr, optarg); break; - case 'm': - mflag++; - break; case 'n': options &= ~F_HOSTNAME; break; case 'N': options |= F_NIGROUP; break; + case 'O': + options &= ~F_NOUSERDATA; + options |= F_FQDN; + break; + case 'o': + options &= ~F_NOUSERDATA; + options |= F_SUPTYPES; + break; case 'p': /* fill buffer with user pattern */ options |= F_PINGFILLED; fill((char *)datap, optarg); @@ -429,9 +432,10 @@ main(int argc, char *argv[]) errx(1, "datalen value is %s: %s", errstr, optarg); break; - case 't': - options &= ~F_NOUSERDATA; - options |= F_SUPTYPES; + case 't': /* maxttl */ + maxttl = strtonum(optarg, 0, IPV6_MAXHLIM, &errstr); + if (errstr) + errx(1, "maxttl is %s: %s", errstr, optarg); break; case 'v': options |= F_VERBOSE; @@ -446,10 +450,6 @@ main(int argc, char *argv[]) sizeof(rtableid)) == -1) err(1, "setsockopt SO_RTABLE"); break; - case 'w': - options &= ~F_NOUSERDATA; - options |= F_FQDN; - break; default: usage(); /*NOTREACHED*/ @@ -585,8 +585,8 @@ main(int argc, char *argv[]) if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &optval, (socklen_t)sizeof(optval)) == -1) err(1, "IPV6_MULTICAST_HOPS"); - if (mflag != 1) { - optval = mflag > 1 ? 0 : 1; + if (Dflag != 1) { + optval = Dflag > 1 ? 0 : 1; if (setsockopt(s, IPPROTO_IPV6, IPV6_USE_MIN_MTU, &optval, (socklen_t)sizeof(optval)) == -1) @@ -629,7 +629,7 @@ main(int argc, char *argv[]) if (usepktinfo) ip6optlen += CMSG_SPACE(sizeof(struct in6_pktinfo)); - if (hoplimit != -1) + if (maxttl != -1) ip6optlen += CMSG_SPACE(sizeof(int)); @@ -656,11 +656,11 @@ main(int argc, char *argv[]) if ((pktinfo->ipi6_ifindex = if_nametoindex(ifname)) == 0) errx(1, "%s: invalid interface name", ifname); } - if (hoplimit != -1) { + if (maxttl != -1) { scmsgp->cmsg_len = CMSG_LEN(sizeof(int)); scmsgp->cmsg_level = IPPROTO_IPV6; scmsgp->cmsg_type = IPV6_HOPLIMIT; - *(int *)(CMSG_DATA(scmsgp)) = hoplimit; + *(int *)(CMSG_DATA(scmsgp)) = maxttl; scmsgp = CMSG_NXTHDR(&smsghdr, scmsgp); } @@ -686,14 +686,14 @@ main(int argc, char *argv[]) (void *)pktinfo, sizeof(*pktinfo))) err(1, "UDP setsockopt(IPV6_PKTINFO)"); - if (hoplimit != -1 && + if (maxttl != -1 && setsockopt(dummy, IPPROTO_IPV6, IPV6_UNICAST_HOPS, - (void *)&hoplimit, sizeof(hoplimit))) + (void *)&maxttl, sizeof(maxttl))) err(1, "UDP setsockopt(IPV6_UNICAST_HOPS)"); - if (hoplimit != -1 && + if (maxttl != -1 && setsockopt(dummy, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, - (void *)&hoplimit, sizeof(hoplimit))) + (void *)&maxttl, sizeof(maxttl))) err(1, "UDP setsockopt(IPV6_MULTICAST_HOPS)"); if (rtableid > 0 && @@ -2352,11 +2352,10 @@ void usage(void) { (void)fprintf(stderr, - "usage: ping6 [-dEefH" - "m" - "Nnqtvw" + "usage: ping6 [-DdEefH" + "NnOoqv" "] [-a addrtype] [-b bufsiz] [-c count] [-g gateway]\n\t" - "[-h hoplimit] [-I interface] [-i wait] [-l preload] [-p pattern]" - "\n\t[-S sourceaddr] [-s packetsize] [-V rtable] host\n"); + "[-I interface] [-i wait] [-l preload] [-p pattern]" + "\n\t[-S sourceaddr] [-s packetsize] [-t maxttl] [-V rtable] host\n"); exit(1); }