Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Jul 1997 21:35:53 PDT
From:      Craig Leres <leres@ee.lbl.gov>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/4182: netstat should always print the interface name
Message-ID:  <199707280435.VAA00894@hot.ee.lbl.gov>
Resent-Message-ID: <199707280440.VAA09406@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         4182
>Category:       bin
>Synopsis:       netstat should always print the interface name
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jul 27 21:40:00 PDT 1997
>Last-Modified:
>Originator:     Craig Leres
>Organization:
Lawrence Berkeley National Laboratory
>Release:        FreeBSD 2.2.2-RELEASE i386
>Environment:

	Hosts with multiple network interfaces.

>Description:

	The current version of netstat does not print the interface
	name for AF_LINK routing entries. This makes debugging
	network problems more difficult.

	(BTW, I sent this in a day or two ago but send-pr apparently
	ate it. Requiring a particular format for bug reports is ok but
	forcing us to use a badly designed, broken and unsafe interface
	is going a bit far...)

>How-To-Repeat:

	% netstat -rn | grep link
	131.243.1/24       link#1             UC          0        0 
	131.243.1.100/30   link#2             UC          0        0 
	224/4              link#1             UCS         0        0 

>Fix:

	The appended context diff causes netstat to always print the
	network interface name:

	% netstat -rn | grep link
	131.243.1/24       link#1             UC          0        0      ed0
	131.243.1.100/30   link#2             UC          0        0      wl0
	224/4              link#1             UCS         0        0      ed0

	It also cleans up some formatting and whitespace foobars.
	
RCS file: RCS/route.c,v
retrieving revision 1.1
diff -c -r1.1 route.c
*** /tmp/,RCSt1025609	Sun Jul 27 21:31:33 1997
--- route.c	Sat Jul 26 21:04:33 1997
***************
*** 114,125 ****
  
  static struct sockaddr *kgetsa __P((struct sockaddr *));
  static void p_tree __P((struct radix_node *));
! static void p_rtnode __P(());
! static void ntreestuff __P(());
  static void np_rtentry __P((struct rt_msghdr *));
  static void p_sockaddr __P((struct sockaddr *, struct sockaddr *, int, int));
  static void p_flags __P((int, char *));
  static void p_rtentry __P((struct rtentry *));
  
  /*
   * Print routing tables.
--- 114,127 ----
  
  static struct sockaddr *kgetsa __P((struct sockaddr *));
  static void p_tree __P((struct radix_node *));
! static void p_rtnode __P((void));
! static void ntreestuff __P((void));
  static void np_rtentry __P((struct rt_msghdr *));
  static void p_sockaddr __P((struct sockaddr *, struct sockaddr *, int, int));
  static void p_flags __P((int, char *));
  static void p_rtentry __P((struct rtentry *));
+ static u_long forgemask __P((u_long));
+ static void domask __P((char *, u_long, u_long));
  
  /*
   * Print routing tables.
***************
*** 314,333 ****
  	char *buf, *next, *lim;
  	register struct rt_msghdr *rtm;
  
!         mib[0] = CTL_NET;
!         mib[1] = PF_ROUTE;
!         mib[2] = 0;
!         mib[3] = 0;
!         mib[4] = NET_RT_DUMP;
!         mib[5] = 0;
!         if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {
  		err(1, "sysctl: net.route.0.0.dump estimate");
  	}
  
  	if ((buf = malloc(needed)) == 0) {
  		err(2, "malloc(%lu)", (unsigned long)needed);
  	}
!         if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
  		err(1, "sysctl: net.route.0.0.dump");
  	}
  	lim  = buf + needed;
--- 316,335 ----
  	char *buf, *next, *lim;
  	register struct rt_msghdr *rtm;
  
! 	mib[0] = CTL_NET;
! 	mib[1] = PF_ROUTE;
! 	mib[2] = 0;
! 	mib[3] = 0;
! 	mib[4] = NET_RT_DUMP;
! 	mib[5] = 0;
! 	if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {
  		err(1, "sysctl: net.route.0.0.dump estimate");
  	}
  
  	if ((buf = malloc(needed)) == 0) {
  		err(2, "malloc(%lu)", (unsigned long)needed);
  	}
! 	if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
  		err(1, "sysctl: net.route.0.0.dump");
  	}
  	lim  = buf + needed;
***************
*** 435,459 ****
  		if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 &&
  		    sdl->sdl_slen == 0)
  			(void) sprintf(workbuf, "link#%d", sdl->sdl_index);
! 		else switch (sdl->sdl_type) {
! 		case IFT_ETHER:
! 		    {
! 			register int i;
! 			register u_char *lla = (u_char *)sdl->sdl_data +
! 			    sdl->sdl_nlen;
! 
! 			cplim = "";
! 			for (i = 0; i < sdl->sdl_alen; i++, lla++) {
! 				cp += sprintf(cp, "%s%x", cplim, *lla);
! 				cplim = ":";
  			}
- 			cp = workbuf;
- 			break;
- 		    }
- 		default:
- 			cp = link_ntoa(sdl);
- 			break;
- 		}
  		break;
  	    }
  
--- 437,464 ----
  		if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 &&
  		    sdl->sdl_slen == 0)
  			(void) sprintf(workbuf, "link#%d", sdl->sdl_index);
! 		else
! 			switch (sdl->sdl_type) {
! 
! 			case IFT_ETHER:
! 			    {
! 				register int i;
! 				register u_char *lla = (u_char *)sdl->sdl_data +
! 				    sdl->sdl_nlen;
! 
! 				cplim = "";
! 				for (i = 0; i < sdl->sdl_alen; i++, lla++) {
! 					cp += sprintf(cp, "%s%x", cplim, *lla);
! 					cplim = ":";
! 				}
! 				cp = workbuf;
! 				break;
! 			    }
! 
! 			default:
! 				cp = link_ntoa(sdl);
! 				break;
  			}
  		break;
  	    }
  
***************
*** 510,516 ****
  	/*
  	 * Don't print protocol-cloned routes unless -a.
  	 */
! 	if(rt->rt_parent && !aflag)
  		return;
  
  	if (!(sa = kgetsa(rt_key(rt))))
--- 515,521 ----
  	/*
  	 * Don't print protocol-cloned routes unless -a.
  	 */
! 	if (rt->rt_parent && !aflag)
  		return;
  
  	if (!(sa = kgetsa(rt_key(rt))))
***************
*** 533,549 ****
  			snprintf(prettyname, sizeof prettyname,
  				 "%.6s%d", name, ifnet.if_unit);
  		}
! 		if(rt->rt_rmx.rmx_expire) {
  			time_t expire_time;
  
! 		        if ((expire_time
! 			       =rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0)
! 			    printf(" %8.8s %6d%s", prettyname,
! 				   (int)expire_time,
! 				   rt->rt_nodes[0].rn_dupedkey ? " =>" : "");
! 		} else {
! 			printf(" %8.8s%s", prettyname,
! 			       rt->rt_nodes[0].rn_dupedkey ? " =>" : "");
  		}
  
  	}
--- 538,553 ----
  			snprintf(prettyname, sizeof prettyname,
  				 "%.6s%d", name, ifnet.if_unit);
  		}
! 		printf("%8.8s", prettyname);
! 		if (rt->rt_rmx.rmx_expire) {
  			time_t expire_time;
  
! 			if ((expire_time =
! 			    rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0)
! 				printf(" %6d%s", (int)expire_time,
! 				    rt->rt_nodes[0].rn_dupedkey ? " =>" : "");
! 		} else if (rt->rt_nodes[0].rn_dupedkey) {
! 			printf(" =>");
  		}
  
  	}
***************
*** 723,744 ****
  	u_short port;
  	struct netent *np = 0;
  	struct hostent *hp = 0;
! 	struct servent *sp = 0;	
  	char *net = "", *host = "";
! 	register char *p; register u_char *q;
  	struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
! static	char mybuf[50];
  	char cport[10], chost[15], cnet[15];
  
! 	if(!nflag)
  		sp = getservbyport(work.x_port, "ipx");
  	port = ntohs(work.x_port);
  
  	if (ipx_nullnet(work) && ipx_nullhost(work)) {
  
  		if (port) {
! 			if (sp)	sprintf(mybuf, "*.%s", sp->s_name);
! 			else	sprintf(mybuf, "*.%x", port);
  		} else
  			sprintf(mybuf, "*.*");
  
--- 727,751 ----
  	u_short port;
  	struct netent *np = 0;
  	struct hostent *hp = 0;
! 	struct servent *sp = 0;
  	char *net = "", *host = "";
! 	register char *p;
! 	register u_char *q;
  	struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
! 	static char mybuf[50];
  	char cport[10], chost[15], cnet[15];
  
! 	if (!nflag)
  		sp = getservbyport(work.x_port, "ipx");
  	port = ntohs(work.x_port);
  
  	if (ipx_nullnet(work) && ipx_nullhost(work)) {
  
  		if (port) {
! 			if (sp)
! 				sprintf(mybuf, "*.%s", sp->s_name);
! 			else
! 				sprintf(mybuf, "*.%x", port);
  		} else
  			sprintf(mybuf, "*.*");
  
***************
*** 776,784 ****
  	}
  
  	if (port) {
! 		if (strcmp(host, "*") == 0) host = "";
! 		if (sp)	sprintf(cport, "%s%s", *host ? "." : "", sp->s_name);
! 		else	sprintf(cport, "%s%x", *host ? "." : "", port);
  	} else
  		*cport = 0;
  
--- 783,794 ----
  	}
  
  	if (port) {
! 		if (strcmp(host, "*") == 0)
! 			host = "";
! 		if (sp)
! 			sprintf(cport, "%s%s", *host ? "." : "", sp->s_name);
! 		else
! 			sprintf(cport, "%s%x", *host ? "." : "", port);
  	} else
  		*cport = 0;
  
***************
*** 792,798 ****
  {
  	register struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)sa;
  	struct sockaddr_ipx work;
! static	union ipx_net ipx_zeronet;
  	char *p;
  	struct ipx_addr in;
  	struct hostent *hp;
--- 802,808 ----
  {
  	register struct sockaddr_ipx *sipx = (struct sockaddr_ipx *)sa;
  	struct sockaddr_ipx work;
! 	static union ipx_net ipx_zeronet;
  	char *p;
  	struct ipx_addr in;
  	struct hostent *hp;
***************
*** 801,812 ****
  	in = work.sipx_addr;
  
  	hp = gethostbyaddr((char *)&in, sizeof(struct ipx_addr), AF_IPX);
! 	if (hp)	return (hp->h_name);
  
  	work.sipx_addr.x_port = 0;
  	work.sipx_addr.x_net = ipx_zeronet;
  	p = ipx_print((struct sockaddr *)&work);
! 	if (strncmp("*.", p, 2) == 0) p += 2;
  
  	return(p);
  }
--- 811,824 ----
  	in = work.sipx_addr;
  
  	hp = gethostbyaddr((char *)&in, sizeof(struct ipx_addr), AF_IPX);
! 	if (hp)
! 		return (hp->h_name);
  
  	work.sipx_addr.x_port = 0;
  	work.sipx_addr.x_net = ipx_zeronet;
  	p = ipx_print((struct sockaddr *)&work);
! 	if (strncmp("*.", p, 2) == 0)
! 		p += 2;
  
  	return(p);
  }
***************
*** 876,882 ****
  	work.sns_addr.x_net = ns_zeronet;
  
  	p = ns_print((struct sockaddr *)&work);
! 	if (strncmp("0H.", p, 3) == 0) p += 3;
  	return(p);
  }
  #endif
--- 888,895 ----
  	work.sns_addr.x_net = ns_zeronet;
  
  	p = ns_print((struct sockaddr *)&work);
! 	if (strncmp("0H.", p, 3) == 0)
! 		p += 3;
  	return(p);
  }
  #endif
***************
*** 886,894 ****
  	char *p0;
  {
  	register char *p = p0;
- 	for (; *p; p++) switch (*p) {
  
! 	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
! 		*p += ('A' - 'a');
! 	}
  }
--- 899,915 ----
  	char *p0;
  {
  	register char *p = p0;
  
! 	for (; *p; p++)
! 		switch (*p) {
! 
! 		case 'a':
! 		case 'b':
! 		case 'c':
! 		case 'd':
! 		case 'e':
! 		case 'f':
! 			*p += ('A' - 'a');
! 			break;
! 		}
  }
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199707280435.VAA00894>