Fix netstat -- don't print all v4 addresses as v4-mapped-in-v6.
authorAndi Kleen <andi@firstfloor.org>
Sun, 26 Aug 2001 05:25:21 +0000 (05:25 +0000)
committerAndi Kleen <andi@firstfloor.org>
Sun, 26 Aug 2001 05:25:21 +0000 (05:25 +0000)
lib/inet6.c
lib/util.h
netstat.c

index 1f936b3..5d1c4f8 100644 (file)
@@ -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
 
 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;                 /* ?;) */
 }
 
index 6acb158..9393fbe 100644 (file)
@@ -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))
index 1ef790e..2de1737 100644 (file)
--- a/netstat.c
+++ b/netstat.c
@@ -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'},