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>
76 char *inet6name(struct in6_addr *);
77 const char *pluralies(int);
79 static char ntop_buf[INET6_ADDRSTRLEN];
81 static const char *ip6nh[] = {
142 "destination option",
340 static char *srcrule_str[] = {
344 "deprecated address",
346 "outgoing interface",
348 "public/temporary address",
350 "preferred interface",
360 * Dump IP6 statistics structure.
363 ip6_stats(u_long off __unused, const char *name, int af1 __unused)
365 struct ip6stat ip6stat;
372 mib[2] = IPPROTO_IPV6;
373 mib[3] = IPV6CTL_STATS;
375 len = sizeof ip6stat;
376 memset(&ip6stat, 0, len);
377 if (sysctl(mib, 4, &ip6stat, &len, (void *)0, 0) < 0)
379 printf("%s:\n", name);
381 #define p(f, m) if (ip6stat.f || sflag <= 1) \
382 printf(m, (unsigned long long)ip6stat.f, plural(ip6stat.f))
383 #define p1a(f, m) if (ip6stat.f || sflag <= 1) \
384 printf(m, (unsigned long long)ip6stat.f)
386 p(ip6s_total, "\t%llu total packet%s received\n");
387 p1a(ip6s_toosmall, "\t%llu with size smaller than minimum\n");
388 p1a(ip6s_tooshort, "\t%llu with data size < data length\n");
389 p1a(ip6s_badoptions, "\t%llu with bad options\n");
390 p1a(ip6s_badvers, "\t%llu with incorrect version number\n");
391 p(ip6s_fragments, "\t%llu fragment%s received\n");
392 p(ip6s_fragdropped, "\t%llu fragment%s dropped (dup or out of space)\n");
393 p(ip6s_fragtimeout, "\t%llu fragment%s dropped after timeout\n");
394 p(ip6s_fragoverflow, "\t%llu fragment%s that exceeded limit\n");
395 p(ip6s_reassembled, "\t%llu packet%s reassembled ok\n");
396 p(ip6s_delivered, "\t%llu packet%s for this host\n");
397 p(ip6s_forward, "\t%llu packet%s forwarded\n");
398 p(ip6s_cantforward, "\t%llu packet%s not forwardable\n");
399 p(ip6s_redirectsent, "\t%llu redirect%s sent\n");
400 p(ip6s_localout, "\t%llu packet%s sent from this host\n");
401 p(ip6s_rawout, "\t%llu packet%s sent with fabricated ip header\n");
402 p(ip6s_odropped, "\t%llu output packet%s dropped due to no bufs, etc.\n");
403 p(ip6s_noroute, "\t%llu output packet%s discarded due to no route\n");
404 p(ip6s_fragmented, "\t%llu output datagram%s fragmented\n");
405 p(ip6s_ofragments, "\t%llu fragment%s created\n");
406 p(ip6s_cantfrag, "\t%llu datagram%s that can't be fragmented\n");
407 p(ip6s_badscope, "\t%llu packet%s that violated scope rules\n");
408 p(ip6s_notmember, "\t%llu multicast packet%s which we don't join\n");
409 for (first = 1, i = 0; i < 256; i++)
410 if (ip6stat.ip6s_nxthist[i] != 0) {
412 printf("\tInput histogram:\n");
415 printf("\t\t%s: %llu\n", ip6nh[i],
416 (unsigned long long)ip6stat.ip6s_nxthist[i]);
418 printf("\tMbuf statistics:\n");
419 printf("\t\t%llu one mbuf\n", (unsigned long long)ip6stat.ip6s_m1);
420 for (first = 1, i = 0; i < 32; i++) {
421 char ifbuf[IFNAMSIZ];
422 if (ip6stat.ip6s_m2m[i] != 0) {
424 printf("\t\ttwo or more mbuf:\n");
427 printf("\t\t\t%s= %llu\n",
428 if_indextoname(i, ifbuf),
429 (unsigned long long)ip6stat.ip6s_m2m[i]);
432 printf("\t\t%llu one ext mbuf\n",
433 (unsigned long long)ip6stat.ip6s_mext1);
434 printf("\t\t%llu two or more ext mbuf\n",
435 (unsigned long long)ip6stat.ip6s_mext2m);
436 p(ip6s_exthdrtoolong,
437 "\t%llu packet%s whose headers are not continuous\n");
438 p(ip6s_nogif, "\t%llu tunneling packet%s that can't find gif\n");
440 "\t%llu packet%s discarded because of too many headers\n");
442 /* for debugging source address selection */
443 #define PRINT_SCOPESTAT(s,i) do {\
444 switch(i) { /* XXX hardcoding in each case */\
446 p(s, "\t\t%llu node-local%s\n");\
449 p(s,"\t\t%llu link-local%s\n");\
452 p(s,"\t\t%llu site-local%s\n");\
455 p(s,"\t\t%llu global%s\n");\
458 printf("\t\t%llu addresses scope=%x\n",\
459 (unsigned long long)ip6stat.s, i);\
464 "\t%llu failure%s of source address selection\n");
465 for (first = 1, i = 0; i < 16; i++) {
466 if (ip6stat.ip6s_sources_sameif[i]) {
468 printf("\tsource addresses on an outgoing I/F\n");
471 PRINT_SCOPESTAT(ip6s_sources_sameif[i], i);
474 for (first = 1, i = 0; i < 16; i++) {
475 if (ip6stat.ip6s_sources_otherif[i]) {
477 printf("\tsource addresses on a non-outgoing I/F\n");
480 PRINT_SCOPESTAT(ip6s_sources_otherif[i], i);
483 for (first = 1, i = 0; i < 16; i++) {
484 if (ip6stat.ip6s_sources_samescope[i]) {
486 printf("\tsource addresses of same scope\n");
489 PRINT_SCOPESTAT(ip6s_sources_samescope[i], i);
492 for (first = 1, i = 0; i < 16; i++) {
493 if (ip6stat.ip6s_sources_otherscope[i]) {
495 printf("\tsource addresses of a different scope\n");
498 PRINT_SCOPESTAT(ip6s_sources_otherscope[i], i);
501 for (first = 1, i = 0; i < 16; i++) {
502 if (ip6stat.ip6s_sources_deprecated[i]) {
504 printf("\tdeprecated source addresses\n");
507 PRINT_SCOPESTAT(ip6s_sources_deprecated[i], i);
511 p1a(ip6s_forward_cachehit, "\t%llu forward cache hit\n");
512 p1a(ip6s_forward_cachemiss, "\t%llu forward cache miss\n");
513 printf("\tSource addresses selection rule applied:\n");
514 for (i = 0; i < 16; i++) {
515 if (ip6stat.ip6s_sources_rule[i])
516 printf("\t\t%llu %s\n", ip6stat.ip6s_sources_rule[i],
524 * Dump IPv6 per-interface statistics based on RFC 2465.
527 ip6_ifstats(char *ifname)
529 struct in6_ifreq ifr;
531 #define p(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
532 printf(m, (unsigned long long)ifr.ifr_ifru.ifru_stat.f, plural(ifr.ifr_ifru.ifru_stat.f))
533 #define p_5(f, m) if (ifr.ifr_ifru.ifru_stat.f || sflag <= 1) \
534 printf(m, (unsigned long long)ip6stat.f)
536 if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
537 perror("Warning: socket(AF_INET6)");
541 strcpy(ifr.ifr_name, ifname);
542 printf("ip6 on %s:\n", ifr.ifr_name);
544 if (ioctl(s, SIOCGIFSTAT_IN6, (char *)&ifr) < 0) {
545 perror("Warning: ioctl(SIOCGIFSTAT_IN6)");
549 p(ifs6_in_receive, "\t%llu total input datagram%s\n");
550 p(ifs6_in_hdrerr, "\t%llu datagram%s with invalid header received\n");
551 p(ifs6_in_toobig, "\t%llu datagram%s exceeded MTU received\n");
552 p(ifs6_in_noroute, "\t%llu datagram%s with no route received\n");
553 p(ifs6_in_addrerr, "\t%llu datagram%s with invalid dst received\n");
554 p(ifs6_in_protounknown, "\t%llu datagram%s with unknown proto received\n");
555 p(ifs6_in_truncated, "\t%llu truncated datagram%s received\n");
556 p(ifs6_in_discard, "\t%llu input datagram%s discarded\n");
558 "\t%llu datagram%s delivered to an upper layer protocol\n");
559 p(ifs6_out_forward, "\t%llu datagram%s forwarded to this interface\n");
561 "\t%llu datagram%s sent from an upper layer protocol\n");
562 p(ifs6_out_discard, "\t%llu total discarded output datagram%s\n");
563 p(ifs6_out_fragok, "\t%llu output datagram%s fragmented\n");
564 p(ifs6_out_fragfail, "\t%llu output datagram%s failed on fragment\n");
565 p(ifs6_out_fragcreat, "\t%llu output datagram%s succeeded on fragment\n");
566 p(ifs6_reass_reqd, "\t%llu incoming datagram%s fragmented\n");
567 p(ifs6_reass_ok, "\t%llu datagram%s reassembled\n");
568 p(ifs6_reass_fail, "\t%llu datagram%s failed on reassembly\n");
569 p(ifs6_in_mcast, "\t%llu multicast datagram%s received\n");
570 p(ifs6_out_mcast, "\t%llu multicast datagram%s sent\n");
579 static const char *icmp6names[] = {
710 "multicast listener query",
711 "multicast listener report",
712 "multicast listener done",
713 "router solicitation",
714 "router advertisement",
715 "neighbor solicitation",
716 "neighbor advertisement",
718 "router renumbering",
719 "node information request",
720 "node information reply",
721 "inverse neighbor solicitation",
722 "inverse neighbor advertisement",
839 * Dump ICMP6 statistics.
842 icmp6_stats(u_long off __unused, const char *name, int af1 __unused)
844 struct icmp6stat icmp6stat;
851 mib[2] = IPPROTO_ICMPV6;
852 mib[3] = ICMPV6CTL_STATS;
854 len = sizeof icmp6stat;
855 memset(&icmp6stat, 0, len);
856 if (sysctl(mib, 4, &icmp6stat, &len, (void *)0, 0) < 0)
858 printf("%s:\n", name);
860 #define p(f, m) if (icmp6stat.f || sflag <= 1) \
861 printf(m, (unsigned long long)icmp6stat.f, plural(icmp6stat.f))
862 #define p_5(f, m) printf(m, (unsigned long long)icmp6stat.f)
864 p(icp6s_error, "\t%llu call%s to icmp6_error\n");
866 "\t%llu error%s not generated in response to an icmp6 message\n");
868 "\t%llu error%s not generated because of rate limitation\n");
869 #define NELEM (int)(sizeof(icmp6stat.icp6s_outhist)/sizeof(icmp6stat.icp6s_outhist[0]))
870 for (first = 1, i = 0; i < NELEM; i++)
871 if (icmp6stat.icp6s_outhist[i] != 0) {
873 printf("\tOutput histogram:\n");
876 printf("\t\t%s: %llu\n", icmp6names[i],
877 (unsigned long long)icmp6stat.icp6s_outhist[i]);
880 p(icp6s_badcode, "\t%llu message%s with bad code fields\n");
881 p(icp6s_tooshort, "\t%llu message%s < minimum length\n");
882 p(icp6s_checksum, "\t%llu bad checksum%s\n");
883 p(icp6s_badlen, "\t%llu message%s with bad length\n");
884 #define NELEM (int)(sizeof(icmp6stat.icp6s_inhist)/sizeof(icmp6stat.icp6s_inhist[0]))
885 for (first = 1, i = 0; i < NELEM; i++)
886 if (icmp6stat.icp6s_inhist[i] != 0) {
888 printf("\tInput histogram:\n");
891 printf("\t\t%s: %llu\n", icmp6names[i],
892 (unsigned long long)icmp6stat.icp6s_inhist[i]);
895 printf("\tHistogram of error messages to be generated:\n");
896 p_5(icp6s_odst_unreach_noroute, "\t\t%llu no route\n");
897 p_5(icp6s_odst_unreach_admin, "\t\t%llu administratively prohibited\n");
898 p_5(icp6s_odst_unreach_beyondscope, "\t\t%llu beyond scope\n");
899 p_5(icp6s_odst_unreach_addr, "\t\t%llu address unreachable\n");
900 p_5(icp6s_odst_unreach_noport, "\t\t%llu port unreachable\n");
901 p_5(icp6s_opacket_too_big, "\t\t%llu packet too big\n");
902 p_5(icp6s_otime_exceed_transit, "\t\t%llu time exceed transit\n");
903 p_5(icp6s_otime_exceed_reassembly, "\t\t%llu time exceed reassembly\n");
904 p_5(icp6s_oparamprob_header, "\t\t%llu erroneous header field\n");
905 p_5(icp6s_oparamprob_nextheader, "\t\t%llu unrecognized next header\n");
906 p_5(icp6s_oparamprob_option, "\t\t%llu unrecognized option\n");
907 p_5(icp6s_oredirect, "\t\t%llu redirect\n");
908 p_5(icp6s_ounknown, "\t\t%llu unknown\n");
910 p(icp6s_reflect, "\t%llu message response%s generated\n");
911 p(icp6s_nd_toomanyopt, "\t%llu message%s with too many ND options\n");
912 p(icp6s_nd_badopt, "\t%llu message%s with bad ND options\n");
913 p(icp6s_badns, "\t%llu bad neighbor solicitation message%s\n");
914 p(icp6s_badna, "\t%llu bad neighbor advertisement message%s\n");
915 p(icp6s_badrs, "\t%llu bad router solicitation message%s\n");
916 p(icp6s_badra, "\t%llu bad router advertisement message%s\n");
917 p(icp6s_badredirect, "\t%llu bad redirect message%s\n");
918 p(icp6s_pmtuchg, "\t%llu path MTU change%s\n");
924 * Dump ICMPv6 per-interface statistics based on RFC 2466.
927 icmp6_ifstats(char *ifname)
929 struct in6_ifreq ifr;
931 #define p(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
932 printf(m, (unsigned long long)ifr.ifr_ifru.ifru_icmp6stat.f, plural(ifr.ifr_ifru.ifru_icmp6stat.f))
933 #define p2(f, m) if (ifr.ifr_ifru.ifru_icmp6stat.f || sflag <= 1) \
934 printf(m, (unsigned long long)ifr.ifr_ifru.ifru_icmp6stat.f, pluralies(ifr.ifr_ifru.ifru_icmp6stat.f))
936 if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
937 perror("Warning: socket(AF_INET6)");
941 strcpy(ifr.ifr_name, ifname);
942 printf("icmp6 on %s:\n", ifr.ifr_name);
944 if (ioctl(s, SIOCGIFSTAT_ICMP6, (char *)&ifr) < 0) {
945 perror("Warning: ioctl(SIOCGIFSTAT_ICMP6)");
949 p(ifs6_in_msg, "\t%llu total input message%s\n");
950 p(ifs6_in_error, "\t%llu total input error message%s\n");
951 p(ifs6_in_dstunreach, "\t%llu input destination unreachable error%s\n");
952 p(ifs6_in_adminprohib, "\t%llu input administratively prohibited error%s\n");
953 p(ifs6_in_timeexceed, "\t%llu input time exceeded error%s\n");
954 p(ifs6_in_paramprob, "\t%llu input parameter problem error%s\n");
955 p(ifs6_in_pkttoobig, "\t%llu input packet too big error%s\n");
956 p(ifs6_in_echo, "\t%llu input echo request%s\n");
957 p2(ifs6_in_echoreply, "\t%llu input echo repl%s\n");
958 p(ifs6_in_routersolicit, "\t%llu input router solicitation%s\n");
959 p(ifs6_in_routeradvert, "\t%llu input router advertisement%s\n");
960 p(ifs6_in_neighborsolicit, "\t%llu input neighbor solicitation%s\n");
961 p(ifs6_in_neighboradvert, "\t%llu input neighbor advertisement%s\n");
962 p(ifs6_in_redirect, "\t%llu input redirect%s\n");
963 p2(ifs6_in_mldquery, "\t%llu input MLD quer%s\n");
964 p(ifs6_in_mldreport, "\t%llu input MLD report%s\n");
965 p(ifs6_in_mlddone, "\t%llu input MLD done%s\n");
967 p(ifs6_out_msg, "\t%llu total output message%s\n");
968 p(ifs6_out_error, "\t%llu total output error message%s\n");
969 p(ifs6_out_dstunreach, "\t%llu output destination unreachable error%s\n");
970 p(ifs6_out_adminprohib, "\t%llu output administratively prohibited error%s\n");
971 p(ifs6_out_timeexceed, "\t%llu output time exceeded error%s\n");
972 p(ifs6_out_paramprob, "\t%llu output parameter problem error%s\n");
973 p(ifs6_out_pkttoobig, "\t%llu output packet too big error%s\n");
974 p(ifs6_out_echo, "\t%llu output echo request%s\n");
975 p2(ifs6_out_echoreply, "\t%llu output echo repl%s\n");
976 p(ifs6_out_routersolicit, "\t%llu output router solicitation%s\n");
977 p(ifs6_out_routeradvert, "\t%llu output router advertisement%s\n");
978 p(ifs6_out_neighborsolicit, "\t%llu output neighbor solicitation%s\n");
979 p(ifs6_out_neighboradvert, "\t%llu output neighbor advertisement%s\n");
980 p(ifs6_out_redirect, "\t%llu output redirect%s\n");
981 p2(ifs6_out_mldquery, "\t%llu output MLD quer%s\n");
982 p(ifs6_out_mldreport, "\t%llu output MLD report%s\n");
983 p(ifs6_out_mlddone, "\t%llu output MLD done%s\n");
991 * Dump PIM statistics structure.
994 pim6_stats(u_long off __unused, const char *name, int af1 __unused)
996 struct pim6stat pim6stat;
1000 if (kread(off, (char *)&pim6stat, sizeof(pim6stat)))
1002 printf("%s:\n", name);
1004 #define p(f, m) if (pim6stat.f || sflag <= 1) \
1005 printf(m, (unsigned long long)pim6stat.f, plural(pim6stat.f))
1006 p(pim6s_rcv_total, "\t%llu message%s received\n");
1007 p(pim6s_rcv_tooshort, "\t%llu message%s received with too few bytes\n");
1008 p(pim6s_rcv_badsum, "\t%llu message%s received with bad checksum\n");
1009 p(pim6s_rcv_badversion, "\t%llu message%s received with bad version\n");
1010 p(pim6s_rcv_registers, "\t%llu register%s received\n");
1011 p(pim6s_rcv_badregisters, "\t%llu bad register%s received\n");
1012 p(pim6s_snd_registers, "\t%llu register%s sent\n");
1017 * Dump raw ip6 statistics structure.
1020 rip6_stats(u_long off __unused, const char *name, int af1 __unused)
1022 struct rip6stat rip6stat;
1029 mib[2] = IPPROTO_IPV6;
1030 mib[3] = IPV6CTL_RIP6STATS;
1031 l = sizeof(rip6stat);
1032 if (sysctl(mib, 4, &rip6stat, &l, NULL, 0) < 0) {
1033 perror("Warning: sysctl(net.inet6.ip6.rip6stats)");
1037 printf("%s:\n", name);
1039 #define p(f, m) if (rip6stat.f || sflag <= 1) \
1040 printf(m, (unsigned long long)rip6stat.f, plural(rip6stat.f))
1041 p(rip6s_ipackets, "\t%llu message%s received\n");
1042 p(rip6s_isum, "\t%llu checksum calcuration%s on inbound\n");
1043 p(rip6s_badsum, "\t%llu message%s with bad checksum\n");
1044 p(rip6s_nosock, "\t%llu message%s dropped due to no socket\n");
1045 p(rip6s_nosockmcast,
1046 "\t%llu multicast message%s dropped due to no socket\n");
1048 "\t%llu message%s dropped due to full socket buffers\n");
1049 delivered = rip6stat.rip6s_ipackets -
1050 rip6stat.rip6s_badsum -
1051 rip6stat.rip6s_nosock -
1052 rip6stat.rip6s_nosockmcast -
1053 rip6stat.rip6s_fullsock;
1054 if (delivered || sflag <= 1)
1055 printf("\t%llu delivered\n", (unsigned long long)delivered);
1056 p(rip6s_opackets, "\t%llu datagram%s output\n");
1061 * Pretty print an Internet address (net address + port).
1062 * Take numeric_addr and numeric_port into consideration.
1064 #define GETSERVBYPORT6(port, proto, ret)\
1066 if (strcmp((proto), "tcp6") == 0)\
1067 (ret) = getservbyport((int)(port), "tcp");\
1068 else if (strcmp((proto), "udp6") == 0)\
1069 (ret) = getservbyport((int)(port), "udp");\
1071 (ret) = getservbyport((int)(port), (proto));\
1075 inet6print(struct in6_addr *in6, int port, const char *proto, int numeric)
1077 struct servent *sp = 0;
1081 sprintf(line, "%.*s.", Wflag ? 39 :
1082 (Aflag && !numeric) ? 12 : 16, inet6name(in6));
1083 cp = index(line, '\0');
1084 if (!numeric && port)
1085 GETSERVBYPORT6(port, proto, sp);
1086 if (sp || port == 0)
1087 sprintf(cp, "%.8s", sp ? sp->s_name : "*");
1089 sprintf(cp, "%d", ntohs((u_short)port));
1090 width = Wflag ? 45 : Aflag ? 18 : 22;
1091 printf("%-*.*s ", width, width, line);
1095 * Construct an Internet address representation.
1096 * If the numeric_addr has been supplied, give
1097 * numeric value, otherwise try for symbolic name.
1101 inet6name(struct in6_addr *in6p)
1104 static char line[50];
1106 static char domain[MAXHOSTNAMELEN];
1107 static int first = 1;
1109 if (first && !numeric_addr) {
1111 if (gethostname(domain, MAXHOSTNAMELEN) == 0 &&
1112 (cp = index(domain, '.')))
1113 (void) strcpy(domain, cp + 1);
1118 if (!numeric_addr && !IN6_IS_ADDR_UNSPECIFIED(in6p)) {
1119 hp = gethostbyaddr((char *)in6p, sizeof(*in6p), AF_INET6);
1121 if ((cp = index(hp->h_name, '.')) &&
1122 !strcmp(cp + 1, domain))
1127 if (IN6_IS_ADDR_UNSPECIFIED(in6p))
1133 inet_ntop(AF_INET6, (void *)in6p, ntop_buf,