Commit fb9c5b0d authored by Andi Kleen's avatar Andi Kleen

Fix netstat -- don't print all v4 addresses as v4-mapped-in-v6.

parent fc474dcd
......@@ -3,7 +3,7 @@
* support functions for the net-tools.
* (most of it copied from lib/inet.c 1.26).
*
* Version: $Id: inet6.c,v 1.10 2000/10/28 11:04:00 pb Exp $
* Version: $Id: inet6.c,v 1.11 2001/08/26 05:25:21 ak Exp $
*
* Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
* Copyright 1993 MicroWalt Corporation
......@@ -44,6 +44,21 @@
extern int h_errno; /* some netdb.h versions don't export this */
char * fix_v4_address(char *buf, struct in6_addr *in6)
{
if (IN6_IS_ADDR_V4MAPPED(in6->s6_addr)) {
char *s =strchr(buf, '.');
if (s) {
while (s > buf && *s != ':')
--s;
if (*s == ':') ++s;
else s = NULL;
}
if (s) return s;
}
return buf;
}
static int INET6_resolve(char *name, struct sockaddr_in6 *sin6)
{
struct addrinfo req, *ai;
......@@ -83,7 +98,7 @@ static int INET6_rresolve(char *name, struct sockaddr_in6 *sin6, int numeric)
return (-1);
}
if (numeric & 0x7FFF) {
inet_ntop(AF_INET6, &sin6->sin6_addr, name, 80);
inet_ntop( AF_INET6, &sin6->sin6_addr, name, 80);
return (0);
}
if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
......@@ -109,13 +124,14 @@ static void INET6_reserror(char *text)
}
/* Display an Internet socket address. */
static char *INET6_print(unsigned char *ptr)
{
static char name[80];
inet_ntop(AF_INET6, (struct in6_addr *) ptr, name, 80);
return name;
return fix_v4_address(name, (struct in6_addr *)ptr);
}
......@@ -129,13 +145,14 @@ static char *INET6_sprint(struct sockaddr *sap, int numeric)
return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff));
if (INET6_rresolve(buff, (struct sockaddr_in6 *) sap, numeric) != 0)
return safe_strncpy(buff, _("[UNKNOWN]"), sizeof(buff));
return (buff);
return (fix_v4_address(buff, &((struct sockaddr_in6 *)sap)->sin6_addr));
}
static int INET6_getsock(char *bufp, struct sockaddr *sap)
{
struct sockaddr_in6 *sin6;
char *p;
sin6 = (struct sockaddr_in6 *) sap;
sin6->sin6_family = AF_INET6;
......@@ -143,7 +160,9 @@ static int INET6_getsock(char *bufp, struct sockaddr *sap)
if (inet_pton(AF_INET6, bufp, sin6->sin6_addr.s6_addr) <= 0)
return (-1);
p = fix_v4_address(bufp, &sin6->sin6_addr);
if (p != bufp)
memcpy(bufp, p, strlen(p)+1);
return 16; /* ?;) */
}
......
......@@ -14,3 +14,6 @@ int nstrcmp(const char *, const char *);
char *safe_strncpy(char *dst, const char *src, size_t size);
#define min(a,b) ((a)<(b) ? (a) : (b))
#define max(a,b) ((a)>(b) ? (a) : (b))
......@@ -6,7 +6,7 @@
* NET-3 Networking Distribution for the LINUX operating
* system.
*
* Version: $Id: netstat.c,v 1.43 2001/04/15 14:41:17 pb Exp $
* Version: $Id: netstat.c,v 1.44 2001/08/26 05:25:21 ak Exp $
*
* Authors: Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
* Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
......@@ -813,8 +813,8 @@ static void tcp_do_one(int lnr, const char *line)
timer_run, (double) time_len / HZ, retr, timeout);
break;
}
printf("tcp %6ld %6ld %-23s %-23s %-12s",
rxq, txq, local_addr, rem_addr, _(tcp_state[state]));
printf("tcp %6ld %6ld %-*s %-*s %-12s",
rxq, txq, max(23,strlen(local_addr)+1), local_addr, max(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
finish_this_one(uid,inode,timers);
}
......@@ -1514,7 +1514,7 @@ int main
(int argc, char *argv[]) {
int i;
int lop;
struct option longopts[] =
static struct option longopts[] =
{
AFTRANS_OPTS,
{"version", 0, 0, 'V'},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment