154721Ssklower /* 2*62144Sbostic * Copyright (c) 1983, 1988, 1993 3*62144Sbostic * The Regents of the University of California. All rights reserved. 433451Skarels * 542748Sbostic * %sccs.include.redist.c% 621987Sdist */ 721987Sdist 87906Ssam #ifndef lint 9*62144Sbostic static char sccsid[] = "@(#)inet.c 8.1 (Berkeley) 06/06/93"; 1034902Sbostic #endif /* not lint */ 117906Ssam 1224913Skarels #include <sys/param.h> 137906Ssam #include <sys/socket.h> 147906Ssam #include <sys/socketvar.h> 157906Ssam #include <sys/mbuf.h> 167906Ssam #include <sys/protosw.h> 179204Ssam 187906Ssam #include <net/route.h> 199204Ssam #include <netinet/in.h> 209204Ssam #include <netinet/in_systm.h> 2140835Ssklower #include <netinet/ip.h> 229204Ssam #include <netinet/in_pcb.h> 239204Ssam #include <netinet/ip_icmp.h> 2411536Ssam #include <netinet/icmp_var.h> 2558026Sandrew #include <netinet/igmp_var.h> 269204Ssam #include <netinet/ip_var.h> 279204Ssam #include <netinet/tcp.h> 289204Ssam #include <netinet/tcpip.h> 299204Ssam #include <netinet/tcp_seq.h> 307906Ssam #define TCPSTATES 319204Ssam #include <netinet/tcp_fsm.h> 329204Ssam #include <netinet/tcp_timer.h> 339204Ssam #include <netinet/tcp_var.h> 349204Ssam #include <netinet/tcp_debug.h> 359204Ssam #include <netinet/udp.h> 369204Ssam #include <netinet/udp_var.h> 379204Ssam 3853698Ssklower #include <arpa/inet.h> 397906Ssam #include <netdb.h> 4042060Sbostic #include <stdio.h> 4142060Sbostic #include <string.h> 4254721Ssklower #include <unistd.h> 4353698Ssklower #include "netstat.h" 4442060Sbostic 457906Ssam struct inpcb inpcb; 467906Ssam struct tcpcb tcpcb; 4721907Skarels struct socket sockb; 487906Ssam 4954721Ssklower char *inetname __P((struct in_addr *)); 5054721Ssklower void inetprint __P((struct in_addr *, int, char *)); 517906Ssam 527906Ssam /* 537906Ssam * Print a summary of connections related to an Internet 547906Ssam * protocol. For TCP, also give state of connection. 557906Ssam * Listening processes (aflag) are suppressed unless the 567906Ssam * -a (all) flag is specified. 577906Ssam */ 5853698Ssklower void 597906Ssam protopr(off, name) 6054761Ssklower u_long off; 617906Ssam char *name; 627906Ssam { 637906Ssam struct inpcb cb; 647906Ssam register struct inpcb *prev, *next; 657906Ssam int istcp; 6629747Skupfer static int first = 1; 677906Ssam 6824709Skarels if (off == 0) 697906Ssam return; 707906Ssam istcp = strcmp(name, "tcp") == 0; 7153698Ssklower kread(off, (char *)&cb, sizeof (struct inpcb)); 727906Ssam inpcb = cb; 737906Ssam prev = (struct inpcb *)off; 7424709Skarels if (inpcb.inp_next == (struct inpcb *)off) 7524709Skarels return; 767906Ssam while (inpcb.inp_next != (struct inpcb *)off) { 777906Ssam next = inpcb.inp_next; 7854761Ssklower kread((u_long)next, (char *)&inpcb, sizeof (inpcb)); 797906Ssam if (inpcb.inp_prev != prev) { 807906Ssam printf("???\n"); 817906Ssam break; 827906Ssam } 837906Ssam if (!aflag && 8429747Skupfer inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) { 857906Ssam prev = next; 867906Ssam continue; 877906Ssam } 8854761Ssklower kread((u_long)inpcb.inp_socket, (char *)&sockb, sizeof (sockb)); 897906Ssam if (istcp) { 9054761Ssklower kread((u_long)inpcb.inp_ppcb, 9153698Ssklower (char *)&tcpcb, sizeof (tcpcb)); 927906Ssam } 9324709Skarels if (first) { 9424709Skarels printf("Active Internet connections"); 9524709Skarels if (aflag) 9624709Skarels printf(" (including servers)"); 9724709Skarels putchar('\n'); 9824709Skarels if (Aflag) 9924709Skarels printf("%-8.8s ", "PCB"); 10024709Skarels printf(Aflag ? 10124709Skarels "%-5.5s %-6.6s %-6.6s %-18.18s %-18.18s %s\n" : 10224709Skarels "%-5.5s %-6.6s %-6.6s %-22.22s %-22.22s %s\n", 10324709Skarels "Proto", "Recv-Q", "Send-Q", 10424709Skarels "Local Address", "Foreign Address", "(state)"); 10524709Skarels first = 0; 10624709Skarels } 1077906Ssam if (Aflag) 10824709Skarels if (istcp) 10924709Skarels printf("%8x ", inpcb.inp_ppcb); 11024709Skarels else 11124709Skarels printf("%8x ", next); 11221907Skarels printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc, 11321907Skarels sockb.so_snd.sb_cc); 11453698Ssklower inetprint(&inpcb.inp_laddr, (int)inpcb.inp_lport, name); 11553698Ssklower inetprint(&inpcb.inp_faddr, (int)inpcb.inp_fport, name); 1167906Ssam if (istcp) { 1177906Ssam if (tcpcb.t_state < 0 || tcpcb.t_state >= TCP_NSTATES) 1187906Ssam printf(" %d", tcpcb.t_state); 1197906Ssam else 1207906Ssam printf(" %s", tcpstates[tcpcb.t_state]); 1217906Ssam } 1227906Ssam putchar('\n'); 1237906Ssam prev = next; 1247906Ssam } 1257906Ssam } 1267906Ssam 1277906Ssam /* 1289569Ssam * Dump TCP statistics structure. 1299569Ssam */ 13053698Ssklower void 1319569Ssam tcp_stats(off, name) 13254761Ssklower u_long off; 1339569Ssam char *name; 1349569Ssam { 1359569Ssam struct tcpstat tcpstat; 1369569Ssam 13724709Skarels if (off == 0) 1389569Ssam return; 13930450Skarels printf ("%s:\n", name); 14053698Ssklower kread(off, (char *)&tcpstat, sizeof (tcpstat)); 14130450Skarels 14253698Ssklower #define p(f, m) if (tcpstat.f || sflag <= 1) \ 14353698Ssklower printf(m, tcpstat.f, plural(tcpstat.f)) 14453698Ssklower #define p2(f1, f2, m) if (tcpstat.f1 || tcpstat.f2 || sflag <= 1) \ 14553698Ssklower printf(m, tcpstat.f1, plural(tcpstat.f1), tcpstat.f2, plural(tcpstat.f2)) 14653698Ssklower 14733233Sbostic p(tcps_sndtotal, "\t%d packet%s sent\n"); 14833233Sbostic p2(tcps_sndpack,tcps_sndbyte, 14933233Sbostic "\t\t%d data packet%s (%d byte%s)\n"); 15033233Sbostic p2(tcps_sndrexmitpack, tcps_sndrexmitbyte, 15133233Sbostic "\t\t%d data packet%s (%d byte%s) retransmitted\n"); 15233233Sbostic p2(tcps_sndacks, tcps_delack, 15333233Sbostic "\t\t%d ack-only packet%s (%d delayed)\n"); 15433233Sbostic p(tcps_sndurg, "\t\t%d URG only packet%s\n"); 15533233Sbostic p(tcps_sndprobe, "\t\t%d window probe packet%s\n"); 15633233Sbostic p(tcps_sndwinup, "\t\t%d window update packet%s\n"); 15733233Sbostic p(tcps_sndctrl, "\t\t%d control packet%s\n"); 15833233Sbostic p(tcps_rcvtotal, "\t%d packet%s received\n"); 15933233Sbostic p2(tcps_rcvackpack, tcps_rcvackbyte, "\t\t%d ack%s (for %d byte%s)\n"); 16033233Sbostic p(tcps_rcvdupack, "\t\t%d duplicate ack%s\n"); 16133233Sbostic p(tcps_rcvacktoomuch, "\t\t%d ack%s for unsent data\n"); 16233233Sbostic p2(tcps_rcvpack, tcps_rcvbyte, 16333233Sbostic "\t\t%d packet%s (%d byte%s) received in-sequence\n"); 16433233Sbostic p2(tcps_rcvduppack, tcps_rcvdupbyte, 16533233Sbostic "\t\t%d completely duplicate packet%s (%d byte%s)\n"); 16658026Sandrew p(tcps_pawsdrop, "\t\t%d old duplicate packet%s\n"); 16733233Sbostic p2(tcps_rcvpartduppack, tcps_rcvpartdupbyte, 16833233Sbostic "\t\t%d packet%s with some dup. data (%d byte%s duped)\n"); 16933233Sbostic p2(tcps_rcvoopack, tcps_rcvoobyte, 17033233Sbostic "\t\t%d out-of-order packet%s (%d byte%s)\n"); 17133233Sbostic p2(tcps_rcvpackafterwin, tcps_rcvbyteafterwin, 17233233Sbostic "\t\t%d packet%s (%d byte%s) of data after window\n"); 17333233Sbostic p(tcps_rcvwinprobe, "\t\t%d window probe%s\n"); 17433233Sbostic p(tcps_rcvwinupd, "\t\t%d window update packet%s\n"); 17533233Sbostic p(tcps_rcvafterclose, "\t\t%d packet%s received after close\n"); 17633233Sbostic p(tcps_rcvbadsum, "\t\t%d discarded for bad checksum%s\n"); 17733233Sbostic p(tcps_rcvbadoff, "\t\t%d discarded for bad header offset field%s\n"); 17833233Sbostic p(tcps_rcvshort, "\t\t%d discarded because packet too short\n"); 17933233Sbostic p(tcps_connattempt, "\t%d connection request%s\n"); 18033233Sbostic p(tcps_accepts, "\t%d connection accept%s\n"); 18133233Sbostic p(tcps_connects, "\t%d connection%s established (including accepts)\n"); 18233233Sbostic p2(tcps_closed, tcps_drops, 18333233Sbostic "\t%d connection%s closed (including %d drop%s)\n"); 18433233Sbostic p(tcps_conndrops, "\t%d embryonic connection%s dropped\n"); 18533233Sbostic p2(tcps_rttupdated, tcps_segstimed, 18633233Sbostic "\t%d segment%s updated rtt (of %d attempt%s)\n"); 18733233Sbostic p(tcps_rexmttimeo, "\t%d retransmit timeout%s\n"); 18833233Sbostic p(tcps_timeoutdrop, "\t\t%d connection%s dropped by rexmit timeout\n"); 18933233Sbostic p(tcps_persisttimeo, "\t%d persist timeout%s\n"); 19033233Sbostic p(tcps_keeptimeo, "\t%d keepalive timeout%s\n"); 19133233Sbostic p(tcps_keepprobe, "\t\t%d keepalive probe%s sent\n"); 19233233Sbostic p(tcps_keepdrops, "\t\t%d connection%s dropped by keepalive\n"); 19330450Skarels #undef p 19430450Skarels #undef p2 1959569Ssam } 1969569Ssam 1979569Ssam /* 1989569Ssam * Dump UDP statistics structure. 1999569Ssam */ 20053698Ssklower void 2019569Ssam udp_stats(off, name) 20254761Ssklower u_long off; 2039569Ssam char *name; 2049569Ssam { 2059569Ssam struct udpstat udpstat; 20658026Sandrew u_long delivered; 2079569Ssam 20824709Skarels if (off == 0) 2099569Ssam return; 21053698Ssklower kread(off, (char *)&udpstat, sizeof (udpstat)); 21153698Ssklower printf("%s:\n", name); 21253698Ssklower #define p(f, m) if (udpstat.f || sflag <= 1) \ 21353698Ssklower printf(m, udpstat.f, plural(udpstat.f)) 21458026Sandrew p(udps_ipackets, "\t%u datagram%s received\n"); 21558026Sandrew p(udps_hdrops, "\t%u with incomplete header\n"); 21658026Sandrew p(udps_badlen, "\t%u with bad data length field\n"); 21758026Sandrew p(udps_badsum, "\t%u with bad checksum\n"); 21858026Sandrew p(udps_noport, "\t%u dropped due to no socket\n"); 21958026Sandrew p(udps_noportbcast, "\t%u broadcast/multicast datagram%s dropped due to no socket\n"); 22058026Sandrew p(udps_fullsock, "\t%u dropped due to full socket buffers\n"); 22158026Sandrew delivered = udpstat.udps_ipackets - 22258026Sandrew udpstat.udps_hdrops - 22358026Sandrew udpstat.udps_badlen - 22458026Sandrew udpstat.udps_badsum - 22558026Sandrew udpstat.udps_noport - 22658026Sandrew udpstat.udps_noportbcast - 22758026Sandrew udpstat.udps_fullsock; 22858026Sandrew if (delivered || sflag <= 1) 22958026Sandrew printf("\t%u delivered\n", delivered); 23058026Sandrew p(udps_opackets, "\t%u datagram%s output\n"); 23153698Ssklower #undef p 2329569Ssam } 2339569Ssam 2349569Ssam /* 2359569Ssam * Dump IP statistics structure. 2369569Ssam */ 23753698Ssklower void 2389569Ssam ip_stats(off, name) 23954761Ssklower u_long off; 2409569Ssam char *name; 2419569Ssam { 2429569Ssam struct ipstat ipstat; 2439569Ssam 24424709Skarels if (off == 0) 2459569Ssam return; 24653698Ssklower kread(off, (char *)&ipstat, sizeof (ipstat)); 24753698Ssklower printf("%s:\n", name); 24853698Ssklower 24953698Ssklower #define p(f, m) if (ipstat.f || sflag <= 1) \ 25053698Ssklower printf(m, ipstat.f, plural(ipstat.f)) 25153698Ssklower 25253698Ssklower p(ips_total, "\t%u total packet%s received\n"); 25353698Ssklower p(ips_badsum, "\t%u bad header checksum%s\n"); 25453698Ssklower p(ips_tooshort, "\t%u with size smaller than minimum\n"); 25553698Ssklower p(ips_toosmall, "\t%u with data size < data length\n"); 25653698Ssklower p(ips_badhlen, "\t%u with header length < data size\n"); 25753698Ssklower p(ips_badlen, "\t%u with data length < header length\n"); 25858026Sandrew p(ips_badoptions, "\t%u with bad options\n"); 25958026Sandrew p(ips_badvers, "\t%u with incorrect version number\n"); 26053698Ssklower p(ips_fragments, "\t%u fragment%s received\n"); 26153698Ssklower p(ips_fragdropped, "\t%u fragment%s dropped (dup or out of space)\n"); 26253698Ssklower p(ips_fragtimeout, "\t%u fragment%s dropped after timeout\n"); 26358026Sandrew p(ips_reassembled, "\t%u packet%s reassembled ok\n"); 26458026Sandrew p(ips_delivered, "\t%u packet%s for this host\n"); 26558026Sandrew p(ips_noproto, "\t%u packet%s for unknown/unsupported protocol\n"); 26653698Ssklower p(ips_forward, "\t%u packet%s forwarded\n"); 26753698Ssklower p(ips_cantforward, "\t%u packet%s not forwardable\n"); 26853698Ssklower p(ips_redirectsent, "\t%u redirect%s sent\n"); 26958026Sandrew p(ips_localout, "\t%u packet%s sent from this host\n"); 27058026Sandrew p(ips_rawout, "\t%u packet%s sent with fabricated ip header\n"); 27158026Sandrew p(ips_odropped, "\t%u output packet%s dropped due to no bufs, etc.\n"); 27258026Sandrew p(ips_noroute, "\t%u output packet%s discarded due to no route\n"); 27358026Sandrew p(ips_fragmented, "\t%u output datagram%s fragmented\n"); 27458026Sandrew p(ips_ofragments, "\t%u fragment%s created\n"); 27558026Sandrew p(ips_cantfrag, "\t%u datagram%s that can't be fragmented\n"); 27653698Ssklower #undef p 2779569Ssam } 2789569Ssam 27911536Ssam static char *icmpnames[] = { 28011536Ssam "echo reply", 28111536Ssam "#1", 28211536Ssam "#2", 28311536Ssam "destination unreachable", 28411536Ssam "source quench", 28511536Ssam "routing redirect", 28611536Ssam "#6", 28711536Ssam "#7", 28811536Ssam "echo", 28911536Ssam "#9", 29011536Ssam "#10", 29111536Ssam "time exceeded", 29211536Ssam "parameter problem", 29311536Ssam "time stamp", 29411536Ssam "time stamp reply", 29511536Ssam "information request", 29624709Skarels "information request reply", 29724709Skarels "address mask request", 29824709Skarels "address mask reply", 29911536Ssam }; 30011536Ssam 3019569Ssam /* 30211536Ssam * Dump ICMP statistics. 30311536Ssam */ 30453698Ssklower void 30511536Ssam icmp_stats(off, name) 30654761Ssklower u_long off; 30711536Ssam char *name; 30811536Ssam { 30911536Ssam struct icmpstat icmpstat; 31011536Ssam register int i, first; 31111536Ssam 31224709Skarels if (off == 0) 31311536Ssam return; 31453698Ssklower kread(off, (char *)&icmpstat, sizeof (icmpstat)); 31553698Ssklower printf("%s:\n", name); 31653698Ssklower 31753698Ssklower #define p(f, m) if (icmpstat.f || sflag <= 1) \ 31853698Ssklower printf(m, icmpstat.f, plural(icmpstat.f)) 31953698Ssklower 32053698Ssklower p(icps_error, "\t%u call%s to icmp_error\n"); 32153698Ssklower p(icps_oldicmp, 32253698Ssklower "\t%u error%s not generated 'cuz old message was icmp\n"); 32332186Sbostic for (first = 1, i = 0; i < ICMP_MAXTYPE + 1; i++) 32411536Ssam if (icmpstat.icps_outhist[i] != 0) { 32511536Ssam if (first) { 32611536Ssam printf("\tOutput histogram:\n"); 32711536Ssam first = 0; 32811536Ssam } 32930292Ssam printf("\t\t%s: %u\n", icmpnames[i], 33011536Ssam icmpstat.icps_outhist[i]); 33111536Ssam } 33253698Ssklower p(icps_badcode, "\t%u message%s with bad code fields\n"); 33353698Ssklower p(icps_tooshort, "\t%u message%s < minimum length\n"); 33453698Ssklower p(icps_checksum, "\t%u bad checksum%s\n"); 33553698Ssklower p(icps_badlen, "\t%u message%s with bad length\n"); 33632186Sbostic for (first = 1, i = 0; i < ICMP_MAXTYPE + 1; i++) 33711536Ssam if (icmpstat.icps_inhist[i] != 0) { 33811536Ssam if (first) { 33911536Ssam printf("\tInput histogram:\n"); 34011536Ssam first = 0; 34111536Ssam } 34230292Ssam printf("\t\t%s: %u\n", icmpnames[i], 34311536Ssam icmpstat.icps_inhist[i]); 34411536Ssam } 34553698Ssklower p(icps_reflect, "\t%u message response%s generated\n"); 34653698Ssklower #undef p 34711536Ssam } 34811536Ssam 34911536Ssam /* 35058026Sandrew * Dump IGMP statistics structure. 35158026Sandrew */ 35258026Sandrew void 35358026Sandrew igmp_stats(off, name) 35458026Sandrew u_long off; 35558026Sandrew char *name; 35658026Sandrew { 35758026Sandrew struct igmpstat igmpstat; 35858026Sandrew 35958026Sandrew if (off == 0) 36058026Sandrew return; 36158026Sandrew kread(off, (char *)&igmpstat, sizeof (igmpstat)); 36258026Sandrew printf("%s:\n", name); 36358026Sandrew 36458026Sandrew #define p(f, m) if (igmpstat.f || sflag <= 1) \ 36558026Sandrew printf(m, igmpstat.f, plural(igmpstat.f)) 36658026Sandrew #define py(f, m) if (igmpstat.f || sflag <= 1) \ 36758026Sandrew printf(m, igmpstat.f, igmpstat.f != 1 ? "ies" : "y") 36858026Sandrew p(igps_rcv_total, "\t%u message%s received\n"); 36958026Sandrew p(igps_rcv_tooshort, "\t%u message%s received with too few bytes\n"); 37058026Sandrew p(igps_rcv_badsum, "\t%u message%s received with bad checksum\n"); 37158026Sandrew py(igps_rcv_queries, "\t%u membership quer%s received\n"); 37258026Sandrew py(igps_rcv_badqueries, "\t%u membership quer%s received with invalid field(s)\n"); 37358026Sandrew p(igps_rcv_reports, "\t%u membership report%s received\n"); 37458026Sandrew p(igps_rcv_badreports, "\t%u membership report%s received with invalid field(s)\n"); 37558026Sandrew p(igps_rcv_ourreports, "\t%u membership report%s received for groups to which we belong\n"); 37658026Sandrew p(igps_snd_reports, "\t%u membership report%s sent\n"); 37758026Sandrew #undef p 37858026Sandrew #undef py 37958026Sandrew } 38058026Sandrew 38158026Sandrew /* 3827906Ssam * Pretty print an Internet address (net address + port). 3837906Ssam * If the nflag was specified, use numbers instead of names. 3847906Ssam */ 38554038Ssklower void 3867906Ssam inetprint(in, port, proto) 3877906Ssam register struct in_addr *in; 38853698Ssklower int port; 3897906Ssam char *proto; 3907906Ssam { 3917906Ssam struct servent *sp = 0; 39253698Ssklower char line[80], *cp; 39317312Skarels int width; 3947906Ssam 39553698Ssklower sprintf(line, "%.*s.", (Aflag && !nflag) ? 12 : 16, inetname(in)); 3967906Ssam cp = index(line, '\0'); 3977906Ssam if (!nflag && port) 39829747Skupfer sp = getservbyport((int)port, proto); 3997906Ssam if (sp || port == 0) 4007906Ssam sprintf(cp, "%.8s", sp ? sp->s_name : "*"); 4017906Ssam else 4029835Ssam sprintf(cp, "%d", ntohs((u_short)port)); 40317312Skarels width = Aflag ? 18 : 22; 40417312Skarels printf(" %-*.*s", width, width, line); 4057906Ssam } 4067906Ssam 4077906Ssam /* 4087906Ssam * Construct an Internet address representation. 40953698Ssklower * If the nflag has been supplied, give 4107906Ssam * numeric value, otherwise try for symbolic name. 4117906Ssam */ 41254038Ssklower char * 41353698Ssklower inetname(inp) 41453698Ssklower struct in_addr *inp; 4157906Ssam { 41624913Skarels register char *cp; 4177906Ssam static char line[50]; 41816501Skarels struct hostent *hp; 41916501Skarels struct netent *np; 42024913Skarels static char domain[MAXHOSTNAMELEN + 1]; 42124913Skarels static int first = 1; 4227906Ssam 42324913Skarels if (first && !nflag) { 42424913Skarels first = 0; 42524913Skarels if (gethostname(domain, MAXHOSTNAMELEN) == 0 && 42624913Skarels (cp = index(domain, '.'))) 42724913Skarels (void) strcpy(domain, cp + 1); 42824913Skarels else 42924913Skarels domain[0] = 0; 43024913Skarels } 43124913Skarels cp = 0; 43253698Ssklower if (!nflag && inp->s_addr != INADDR_ANY) { 43353698Ssklower int net = inet_netof(*inp); 43453698Ssklower int lna = inet_lnaof(*inp); 43516662Ssam 43616501Skarels if (lna == INADDR_ANY) { 43716462Skarels np = getnetbyaddr(net, AF_INET); 4387906Ssam if (np) 4397906Ssam cp = np->n_name; 44021907Skarels } 44121907Skarels if (cp == 0) { 44253698Ssklower hp = gethostbyaddr((char *)inp, sizeof (*inp), AF_INET); 44324913Skarels if (hp) { 44424913Skarels if ((cp = index(hp->h_name, '.')) && 44524913Skarels !strcmp(cp + 1, domain)) 44624913Skarels *cp = 0; 4477906Ssam cp = hp->h_name; 44824913Skarels } 4497906Ssam } 4507906Ssam } 45153698Ssklower if (inp->s_addr == INADDR_ANY) 4527906Ssam strcpy(line, "*"); 4537906Ssam else if (cp) 4547906Ssam strcpy(line, cp); 4557906Ssam else { 45653698Ssklower inp->s_addr = ntohl(inp->s_addr); 45721907Skarels #define C(x) ((x) & 0xff) 45853698Ssklower sprintf(line, "%u.%u.%u.%u", C(inp->s_addr >> 24), 45953698Ssklower C(inp->s_addr >> 16), C(inp->s_addr >> 8), C(inp->s_addr)); 4607906Ssam } 4617906Ssam return (line); 4627906Ssam } 463