1 /* BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp */
3 * Copyright (c) 1983, 1988, 1993
4 * The Regents of the University of California. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed by the University of
17 * California, Berkeley and its contributors.
18 * 4. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 static char sccsid[] = "@(#)inet6.c 8.4 (Berkeley) 4/20/94";
41 #include <sys/cdefs.h>
42 __FBSDID("$FreeBSD$");
45 #include <sys/param.h>
46 #include <sys/socket.h>
47 #include <sys/socketvar.h>
48 #include <sys/ioctl.h>
50 #include <sys/protosw.h>
51 #include <sys/sysctl.h>
53 #include <net/route.h>
55 #include <net/if_var.h>
56 #include <netinet/in.h>
57 #include <netinet/ip6.h>
58 #include <netinet/icmp6.h>
59 #include <netinet/in_systm.h>
60 #include <netinet6/in6_pcb.h>
61 #include <netinet6/in6_var.h>
62 #include <netinet6/ip6_var.h>
63 #include <netinet6/pim6_var.h>
64 #include <netinet6/raw_ip6.h>
66 #include <arpa/inet.h>
79 char *inet6name(struct in6_addr *);
81 static char ntop_buf[INET6_ADDRSTRLEN];
83 static const char *ip6nh[] = {
144 "destination option",
342 static char *srcrule_str[] = {
346 "deprecated address",
348 "outgoing interface",
350 "public/temporary address",
352 "preferred interface",
362 * Dump IP6 statistics structure.
365 ip6_stats(u_long off __unused, const char *name, int af1 __unused)
367 struct ip6stat ip6stat;
374 mib[2] = IPPROTO_IPV6;
375 mib[3] = IPV6CTL_STATS;
377 len = sizeof ip6stat;
378 memset(&ip6stat, 0, len);
379 if (sysctl(mib, 4, &ip6stat, &len, (void *)0, 0) < 0)
381 printf("%s:\n", name);
383 #define p(f, m) if (ip6stat.f || sflag <= 1) \
384 printf(m, (uintmax_t)ip6stat.f, plural(ip6stat.f))
385 #define p1a(f, m) if (ip6stat.f || sflag <= 1) \
386 printf(m, (uintmax_t)ip6stat.f)
388 p(ip6s_total, "\t%ju total packet%s received\n");
389 p1a(ip6s_toosmall, "\t%ju with size smaller than minimum\n");
390 p1a(ip6s_tooshort, "\t%ju with data size < data length\n");
391 p1a(ip6s_badoptions, "\t%ju with bad options\n");
392 p1a(ip6s_badvers, "\t%ju with incorrect version number\n");
393 p(ip6s_fragments, "\t%ju fragment%s received\n");
394 p(ip6s_fragdropped, "\t%ju fragment%s dropped (dup or out of space)\n");
395 p(ip6s_fragtimeout, "\t%ju fragment%s dropped after timeout\n");
396 p(ip6s_fragoverflow, "\t%ju fragment%s that exceeded limit\n");
397 p(ip6s_reassembled, "\t%ju packet%s reassembled ok\n");
398 p(ip6s_delivered, "\t%ju packet%s for this host\n");
399 p(ip6s_forward, "\t%ju packet%s forwarded\n");
400 p(ip6s_cantforward, "\t%ju packet%s not forwardable\n");
401 p(ip6s_redirectsent, "\t%ju redirect%s sent\n");
402 p(ip6s_localout, "\t%ju packet%s sent from this host\n");
403 p(ip6s_rawout, "\t%ju packet%s sent with fabricated ip header\n");
404 p(ip6s_odropped, "\t%ju output packet%s dropped due to no bufs, etc.\n");
405 p(ip6s_noroute, "\t%ju output packet%s discarded due to no route\n");
406 p(ip6s_fragmented, "\t%ju output datagram%s fragmented\n");
407 p(ip6s_ofragments, "\t%ju fragment%s created\n");
408 p(ip6s_cantfrag, "\t%ju datagram%s that can't be fragmented\n");
409 p(ip6s_badscope, "\t%ju packet%s that violated scope rules\n");
410 p(ip6s_notmember, "\t%ju multicast packet%s which we don't join\n");
411 for (first = 1, i = 0; i < 256; i++)
412 if (ip6stat.ip6s_nxthist[i] != 0) {
414 printf("\tInput histogram:\n");
417 printf("\t\t%s: %ju\n", ip6nh[i],
418 (uintmax_t)ip6stat.ip6s_nxthist[i]);
420 printf("\tMbuf statistics:\n");
421 printf("\t\t%ju one mbuf\n", (uintmax_t)ip6stat.ip6s_m1);
422 for (first = 1, i = 0; i < 32; i++) {
423 char ifbuf[IFNAMSIZ];
424 if (ip6stat.ip6s_m2m[i] != 0) {
426 printf("\t\ttwo or more mbuf:\n");
429 printf("\t\t\t%s= %ju\n",
430 if_indextoname(i, ifbuf),
431 (uintmax_t)ip6stat.ip6s_m2m[i]);
434 printf("\t\t%ju one ext mbuf\n",
435 (uintmax_t)ip6stat.ip6s_mext1);
436 printf("\t\t%ju two or more ext mbuf\n",
437 (uintmax_t)ip6stat.ip6s_mext2m);
438 p(ip6s_exthdrtoolong,
439 "\t%ju packet%s whose headers are not continuous\n");
440 p(ip6s_nogif, "\t%ju tunneling packet%s that can't find gif\n");
442 "\t%ju packet%s discarded because of too many headers\n");
444 /* for debugging source address selection */
445 #define PRINT_SCOPESTAT(s,i) do {\
446 switch(i) { /* XXX hardcoding in each case */\
448 p(s, "\t\t%ju node-local%s\n");\
451 p(s,"\t\t%ju link-local%s\n");\
454 p(s,"\t\t%ju site-local%s\n");\
457 p(s,"\t\t%ju global%s\n");\
460 printf("\t\t%ju addresses scope=%x\n",\
461 (uintmax_t)ip6stat.s, i);\
466 "\t%ju failure%s of source address selection\n");
467 for (first = 1, i = 0; i < 16; i++) {
468 if (ip6stat.ip6s_sources_sameif[i]) {
470 printf("\tsource addresses on an outgoing I/F\n");
473 PRINT_SCOPESTAT(ip6s_sources_sameif[i], i);
476 for (first = 1, i = 0; i < 16; i++) {
477 if (ip6stat.ip6s_sources_otherif[i]) {
479 printf("\tsource addresses on a non-outgoing I/F\n");
482 PRINT_SCOPESTAT(ip6s_sources_otherif[i], i);
485 for (first = 1, i = 0; i < 16; i++) {
486 if (ip6stat.ip6s_sources_samescope[i]) {
488 printf("\tsource addresses of same scope\n");
491 PRINT_SCOPESTAT(ip6s_sources_samescope[i], i);
494 for (first = 1, i = 0; i < 16; i++) {
495 if (ip6stat.ip6s_sources_otherscope[i]) {
497 printf("\tsource addresses of a different scope\n");
500 PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i);
503 for (first = 1, i = 0; i < 16; i++) {
504 if (ip6stat.ip6s_sources_deprecated[i]) {
506 printf("\tdeprecated source addresses\n");
509 PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i);
513 p1a(ip6s_forward_cachehit, "\t%ju forward cache hit\n");
514 p1a(ip6s_forward_cachemiss, "\t%ju forward cache miss\n");
515 printf("\tSource addresses selection rule applied:\n");
516 for (i = 0; i < 16; i++) {
517 if (ip6stat.ip6s_sources_rule[i])
518 printf("\t\t%ju %s\n",
519 (uintmax_t)ip6stat.ip6s_sources_rule[i],
527 * Dump IPv6 per-interface statistics based on RFC 2465.
530 ip6_ifstats(char *ifname)
532 struct in6_ifreq ifr;
534 #define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
535 printf(m, (uintmax_t)ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f))
536 #define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
537 printf(m, (uintmax_t)ip6stat.f)
539 if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
540 perror("Warning: socket(AF_INET6)");
544 strcpy(ifr.ifr_name, ifname);
545 printf("ip6 on %s:\n", ifr.ifr_name);
547 if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
548 perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
552 p(ifs6_in_receive, "\t%ju total input datagram%s\n");
553 p(ifs6_in_hdrerr, "\t%ju datagram%s with invalid header received\n");
554 p(ifs6_in_toobig, "\t%ju datagram%s exceeded MTU received\n");
555 p(ifs6_in_noroute, "\t%ju datagram%s with no route received\n");
556 p(ifs6_in_addrerr, "\t%ju datagram%s with invalid dst received\n");
557 p(ifs6_in_protounknown, "\t%ju datagram%s with unknown proto received\n");
558 p(ifs6_in_truncated, "\t%ju truncated datagram%s received\n");
559 p(ifs6_in_discard, "\t%ju input datagram%s discarded\n");
561 "\t%ju datagram%s delivered to an upper layer protocol\n");
562 p(ifs6_out_forward, "\t%ju datagram%s forwarded to this interface\n");
564 "\t%ju datagram%s sent from an upper layer protocol\n");
565 p(ifs6_out_discard, "\t%ju total discarded output datagram%s\n");
566 p(ifs6_out_fragok, "\t%ju output datagram%s fragmented\n");
567 p(ifs6_out_fragfail, "\t%ju output datagram%s failed on fragment\n");
568 p(ifs6_out_fragcreat, "\t%ju output datagram%s succeeded on fragment\n");
569 p(ifs6_reass_reqd, "\t%ju incoming datagram%s fragmented\n");
570 p(ifs6_reass_ok, "\t%ju datagram%s reassembled\n");
571 p(ifs6_reass_fail, "\t%ju datagram%s failed on reassembly\n");
572 p(ifs6_in_mcast, "\t%ju multicast datagram%s received\n");
573 p(ifs6_out_mcast, "\t%ju multicast datagram%s sent\n");
582 static const char *icmp6names[] = {
713 "multicast listener query",
714 "multicast listener report",
715 "multicast listener done",
716 "router solicitation",
717 "router advertisement",
718 "neighbor solicitation",
719 "neighbor advertisement",
721 "router renumbering",
722 "node information request",
723 "node information reply",
724 "inverse neighbor solicitation",
725 "inverse neighbor advertisement",
842 * Dump ICMP6 statistics.
845 icmp6_stats(u_long off __unused, const char *name, int af1 __unused)
847 struct icmp6stat icmp6stat;
854 mib[2] = IPPROTO_ICMPV6;
855 mib[3] = ICMPV6CTL_STATS;
857 len = sizeof icmp6stat;
858 memset(&icmp6stat, 0, len);
859 if (sysctl(mib, 4, &icmp6stat, &len, (void *)0, 0) < 0)
861 printf("%s:\n", name);
863 #define p(f, m) if (icmp6stat.f || sflag <= 1) \
864 printf(m, (uintmax_t)icmp6stat.f, plural(icmp6stat.f))
865 #define p_5(f, m) printf(m, (uintmax_t)icmp6stat.f)
867 p(icp6s_error, "\t%ju call%s to icmp6_error\n");
869 "\t%ju error%s not generated in response to an icmp6 message\n");
871 "\t%ju error%s not generated because of rate limitation\n");
872 #define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0]))
873 for (first = 1, i = 0; i < NELEM; i++)
874 if (icmp6stat.icp6s_outhist[i] != 0) {
876 printf("\tOutput histogram:\n");
879 printf("\t\t%s: %ju\n", icmp6names[i],
880 (uintmax_t)icmp6stat.icp6s_outhist[i]);
883 p(icp6s_badcode, "\t%ju message%s with bad code fields\n");
884 p(icp6s_tooshort, "\t%ju message%s < minimum length\n");
885 p(icp6s_checksum, "\t%ju bad checksum%s\n");
886 p(icp6s_badlen, "\t%ju message%s with bad length\n");
887 #define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0]))
888 for (first = 1, i = 0; i < NELEM; i++)
889 if (icmp6stat.icp6s_inhist[i] != 0) {
891 printf("\tInput histogram:\n");
894 printf("\t\t%s: %ju\n", icmp6names[i],
895 (uintmax_t)icmp6stat.icp6s_inhist[i]);
898 printf("\tHistogram of error messages to be generated:\n");
899 p_5(icp6s_odst_unreach_noroute, "\t\t%ju no route\n");
900 p_5(icp6s_odst_unreach_admin, "\t\t%ju administratively prohibited\n");
901 p_5(icp6s_odst_unreach_beyondscope, "\t\t%ju beyond scope\n");
902 p_5(icp6s_odst_unreach_addr, "\t\t%ju address unreachable\n");
903 p_5(icp6s_odst_unreach_noport, "\t\t%ju port unreachable\n");
904 p_5(icp6s_opacket_too_big, "\t\t%ju packet too big\n");
905 p_5(icp6s_otime_exceed_transit, "\t\t%ju time exceed transit\n");
906 p_5(icp6s_otime_exceed_reassembly, "\t\t%ju time exceed reassembly\n");
907 p_5(icp6s_oparamprob_header, "\t\t%ju erroneous header field\n");
908 p_5(icp6s_oparamprob_nextheader, "\t\t%ju unrecognized next header\n");
909 p_5(icp6s_oparamprob_option, "\t\t%ju unrecognized option\n");
910 p_5(icp6s_oredirect, "\t\t%ju redirect\n");
911 p_5(icp6s_ounknown, "\t\t%ju unknown\n");
913 p(icp6s_reflect, "\t%ju message response%s generated\n");
914 p(icp6s_nd_toomanyopt, "\t%ju message%s with too many ND options\n");
915 p(icp6s_nd_badopt, "\t%ju message%s with bad ND options\n");
916 p(icp6s_badns, "\t%ju bad neighbor solicitation message%s\n");
917 p(icp6s_badna, "\t%ju bad neighbor advertisement message%s\n");
918 p(icp6s_badrs, "\t%ju bad router solicitation message%s\n");
919 p(icp6s_badra, "\t%ju bad router advertisement message%s\n");
920 p(icp6s_badredirect, "\t%ju bad redirect message%s\n");
921 p(icp6s_pmtuchg, "\t%ju path MTU change%s\n");
927 * Dump ICMPv6 per-interface statistics based on RFC 2466.
930 icmp6_ifstats(char *ifname)
932 struct in6_ifreq ifr;
934 #define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
935 printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f))
936 #define p2(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
937 printf(m, (uintmax_t)ifr.ifr_ifru.ifru_icmp6stat.f, pluralies(ifr.ifr_ifru.ifru_icmp6stat.f))
939 if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
940 perror("Warning: socket(AF_INET6)");
944 strcpy(ifr.ifr_name, ifname);
945 printf("icmp6 on %s:\n", ifr.ifr_name);
947 if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
948 perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
952 p(ifs6_in_msg, "\t%ju total input message%s\n");
953 p(ifs6_in_error, "\t%ju total input error message%s\n");
954 p(ifs6_in_dstunreach, "\t%ju input destination unreachable error%s\n");
955 p(ifs6_in_adminprohib, "\t%ju input administratively prohibited error%s\n");
956 p(ifs6_in_timeexceed, "\t%ju input time exceeded error%s\n");
957 p(ifs6_in_paramprob, "\t%ju input parameter problem error%s\n");
958 p(ifs6_in_pkttoobig, "\t%ju input packet too big error%s\n");
959 p(ifs6_in_echo, "\t%ju input echo request%s\n");
960 p2(ifs6_in_echoreply, "\t%ju input echo repl%s\n");
961 p(ifs6_in_routersolicit, "\t%ju input router solicitation%s\n");
962 p(ifs6_in_routeradvert, "\t%ju input router advertisement%s\n");
963 p(ifs6_in_neighborsolicit, "\t%ju input neighbor solicitation%s\n");
964 p(ifs6_in_neighboradvert, "\t%ju input neighbor advertisement%s\n");
965 p(ifs6_in_redirect, "\t%ju input redirect%s\n");
966 p2(ifs6_in_mldquery, "\t%ju input MLD quer%s\n");
967 p(ifs6_in_mldreport, "\t%ju input MLD report%s\n");
968 p(ifs6_in_mlddone, "\t%ju input MLD done%s\n");
970 p(ifs6_out_msg, "\t%ju total output message%s\n");
971 p(ifs6_out_error, "\t%ju total output error message%s\n");
972 p(ifs6_out_dstunreach, "\t%ju output destination unreachable error%s\n");
973 p(ifs6_out_adminprohib, "\t%ju output administratively prohibited error%s\n");
974 p(ifs6_out_timeexceed, "\t%ju output time exceeded error%s\n");
975 p(ifs6_out_paramprob, "\t%ju output parameter problem error%s\n");
976 p(ifs6_out_pkttoobig, "\t%ju output packet too big error%s\n");
977 p(ifs6_out_echo, "\t%ju output echo request%s\n");
978 p2(ifs6_out_echoreply, "\t%ju output echo repl%s\n");
979 p(ifs6_out_routersolicit, "\t%ju output router solicitation%s\n");
980 p(ifs6_out_routeradvert, "\t%ju output router advertisement%s\n");
981 p(ifs6_out_neighborsolicit, "\t%ju output neighbor solicitation%s\n");
982 p(ifs6_out_neighboradvert, "\t%ju output neighbor advertisement%s\n");
983 p(ifs6_out_redirect, "\t%ju output redirect%s\n");
984 p2(ifs6_out_mldquery, "\t%ju output MLD quer%s\n");
985 p(ifs6_out_mldreport, "\t%ju output MLD report%s\n");
986 p(ifs6_out_mlddone, "\t%ju output MLD done%s\n");
994 * Dump PIM statistics structure.
997 pim6_stats(u_long off __unused, const char *name, int af1 __unused)
999 struct pim6stat pim6stat, zerostat;
1000 size_t len = sizeof pim6stat;
1002 /* TODO put back the KVM functionality for -M switch ie coredumps. */
1004 memset(&zerostat, 0, len);
1005 if (sysctlbyname("net.inet6.pim.stats", &pim6stat, &len,
1006 zflag ? &zerostat : NULL, zflag ? len : 0) < 0) {
1007 if (errno != ENOENT)
1008 warn("sysctl: net.inet6.pim.stats");
1011 printf("%s:\n", name);
1013 #define p(f, m) if (pim6stat.f || sflag <= 1) \
1014 printf(m, (uintmax_t)pim6stat.f, plural(pim6stat.f))
1015 p(pim6s_rcv_total, "\t%ju message%s received\n");
1016 p(pim6s_rcv_tooshort, "\t%ju message%s received with too few bytes\n");
1017 p(pim6s_rcv_badsum, "\t%ju message%s received with bad checksum\n");
1018 p(pim6s_rcv_badversion, "\t%ju message%s received with bad version\n");
1019 p(pim6s_rcv_registers, "\t%ju register%s received\n");
1020 p(pim6s_rcv_badregisters, "\t%ju bad register%s received\n");
1021 p(pim6s_snd_registers, "\t%ju register%s sent\n");
1026 * Dump raw ip6 statistics structure.
1029 rip6_stats(u_long off __unused, const char *name, int af1 __unused)
1031 struct rip6stat rip6stat;
1038 mib[2] = IPPROTO_IPV6;
1039 mib[3] = IPV6CTL_RIP6STATS;
1040 l = sizeof(rip6stat);
1041 if (sysctl(mib, 4, &rip6stat, &l, NULL, 0) < 0) {
1042 /* Just shut up if the kernel doesn't have ipv6. */
1043 if (errno != ENOENT)
1044 perror("Warning: sysctl(net.inet6.ip6.rip6stats)");
1048 printf("%s:\n", name);
1050 #define p(f, m) if (rip6stat.f || sflag <= 1) \
1051 printf(m, (uintmax_t)rip6stat.f, plural(rip6stat.f))
1052 p(rip6s_ipackets, "\t%ju message%s received\n");
1053 p(rip6s_isum, "\t%ju checksum calcuration%s on inbound\n");
1054 p(rip6s_badsum, "\t%ju message%s with bad checksum\n");
1055 p(rip6s_nosock, "\t%ju message%s dropped due to no socket\n");
1056 p(rip6s_nosockmcast,
1057 "\t%ju multicast message%s dropped due to no socket\n");
1059 "\t%ju message%s dropped due to full socket buffers\n");
1060 delivered = rip6stat.rip6s_ipackets -
1061 rip6stat.rip6s_badsum -
1062 rip6stat.rip6s_nosock -
1063 rip6stat.rip6s_nosockmcast -
1064 rip6stat.rip6s_fullsock;
1065 if (delivered || sflag <= 1)
1066 printf("\t%ju delivered\n", (uintmax_t)delivered);
1067 p(rip6s_opackets, "\t%ju datagram%s output\n");
1072 * Pretty print an Internet address (net address + port).
1073 * Take numeric_addr and numeric_port into consideration.
1075 #define GETSERVBYPORT6(port, proto, ret)\
1077 if (strcmp((proto), "tcp6") == 0)\
1078 (ret) = getservbyport((int)(port), "tcp");\
1079 else if (strcmp((proto), "udp6") == 0)\
1080 (ret) = getservbyport((int)(port), "udp");\
1082 (ret) = getservbyport((int)(port), (proto));\
1086 inet6print(struct in6_addr *in6, int port, const char *proto, int numeric)
1088 struct servent *sp = 0;
1092 sprintf(line, "%.*s.", Wflag ? 39 :
1093 (Aflag && !numeric) ? 12 : 16, inet6name(in6));
1094 cp = index(line, '\0');
1095 if (!numeric && port)
1096 GETSERVBYPORT6(port, proto, sp);
1097 if (sp || port == 0)
1098 sprintf(cp, "%.8s", sp ? sp->s_name : "*");
1100 sprintf(cp, "%d", ntohs((u_short)port));
1101 width = Wflag ? 45 : Aflag ? 18 : 22;
1102 printf("%-*.*s ", width, width, line);
1106 * Construct an Internet address representation.
1107 * If the numeric_addr has been supplied, give
1108 * numeric value, otherwise try for symbolic name.
1112 inet6name(struct in6_addr *in6p)
1115 static char line[50];
1117 static char domain[MAXHOSTNAMELEN];
1118 static int first = 1;
1120 if (first && !numeric_addr) {
1122 if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
1123 (cp = index(domain, '.')))
1124 (void) strcpy(domain, cp + 1);
1129 if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
1130 hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
1132 if ((cp = index(hp->h_name, '.')) &&
1133 !strcmp(cp + 1, domain))
1138 if (IN6_IS_ADDR_UNSPECIFIED(in6p))
1144 inet_ntop(AF_INET6, (void *)in6p, ntop_buf,