[news.software.nntp] nntpd on Sun4 running SunOS 4.0.1 drops core in getifconf

karl@triceratops.cis.ohio-state.edu (Karl Kleinpaste) (02/17/89)

For the first time for myself, I had to install news with NNTP on a
Sun4 running SunOS 4.0.1.  I installed news with NNTP on a Sun3/280
running 4.0.1 about a month ago, and it installed and is running just
fine.  However, apparent hardware peculiarities (byte alignment
restrictions, or perhaps a compiler bug) bit me on the Sun4.  It was
necessary to apply this diff to nntp-1.5/server/subnet.c in order to
keep the beastie from dropping a core (8.5Mbytes?!?) when executed.

Surely I'm not the first one ever to install nntpd on a Sun4 - did I
miss a patch somewhere along the way?

--Karl

*** subnet.c~	Thu Feb 16 15:41:10 1989
--- subnet.c	Thu Feb 16 16:15:00 1989
***************
*** 90,95 ****
--- 90,96 ----
  	register struct ifreq	*ifr;
  	u_long		inet_netof();
  	u_long		addr;
+ 	struct in_addr duh;
  
  	/*
  	 * Find out how many interfaces we have, and malloc
***************
*** 134,140 ****
  		if (ifr->ifr_addr.sa_family != AF_INET)
  			continue;
  		addr = (*(struct sockaddr_in *)&ifr->ifr_addr).sin_addr.s_addr;
! 		in_ifsni[j].i_net = inet_netof(addr);
  		if (ioctl(s, SIOCGIFNETMASK, ifr) < 0)
  			continue;
  		in_ifsni[j].i_subnetmask =
--- 135,142 ----
  		if (ifr->ifr_addr.sa_family != AF_INET)
  			continue;
  		addr = (*(struct sockaddr_in *)&ifr->ifr_addr).sin_addr.s_addr;
! 		duh.s_addr = addr;
! 		in_ifsni[j].i_net = inet_netof(duh);
  		if (ioctl(s, SIOCGIFNETMASK, ifr) < 0)
  			continue;
  		in_ifsni[j].i_subnetmask =
***************
*** 198,205 ****
  	register u_long	i = ntohl(in);
  	register u_long	net;
  	u_long		inet_netof(), inet_lnaof();
  
! 	net = inet_netof(in);
  
  	/*
  	 * Check whether network is a subnet;
--- 200,209 ----
  	register u_long	i = ntohl(in);
  	register u_long	net;
  	u_long		inet_netof(), inet_lnaof();
+ 	struct in_addr duh;
  
! 	duh.s_addr = in;
! 	net = inet_netof(duh);
  
  	/*
  	 * Check whether network is a subnet;
***************
*** 212,218 ****
  		if (net == in_ifsni[j].i_net) {
  #endif
  			net = i & in_ifsni[j].i_subnetmask;
! 			if (inet_lnaof(htonl(net)) == 0)
  				return (0);
  			else
  				return (net >> in_ifsni[j].i_bitshift);
--- 216,223 ----
  		if (net == in_ifsni[j].i_net) {
  #endif
  			net = i & in_ifsni[j].i_subnetmask;
! 			duh.s_addr = htonl(net);
! 			if (inet_lnaof(duh) == 0)
  				return (0);
  			else
  				return (net >> in_ifsni[j].i_bitshift);

jdiaz@hqsun1.oracle.com (Jean Marie Diaz) (02/17/89)

I am extremely grateful to Karl for pointing out what was going on with my
nntpd lo these many moons, and to show my gratitude, I'm going to post a
patch to his patch -- this to fix similar problems in inet_snetof().

				   AMBAR
ambar@oracle.com				 {uunet,pyramid}!oracle!ambar



*** subnet.c~	Thu Feb 16 16:49:24 1989
--- subnet.c	Thu Feb 16 16:45:23 1989
***************
*** 198,206 ****
  	register u_long	i = ntohl(in);
  	register u_long	net;
  	u_long		inet_netof(), inet_lnaof();
  
- 	net = inet_netof(in);
- 
  	/*
  	 * Check whether network is a subnet;
  	 * if so, return subnet number.
--- 198,208 ----
  	register u_long	i = ntohl(in);
  	register u_long	net;
  	u_long		inet_netof(), inet_lnaof();
+ 	struct in_addr duh;
+ 	
+ 	duh.s_addr = in;
+ 	net = inet_netof(duh);
  
  	/*
  	 * Check whether network is a subnet;
  	 * if so, return subnet number.
***************
*** 212,218 ****
  		if (net == in_ifsni[j].i_net) {
  #endif
  			net = i & in_ifsni[j].i_subnetmask;
! 			if (inet_lnaof(htonl(net)) == 0)
  				return (0);
  			else
  				return (net >> in_ifsni[j].i_bitshift);
--- 214,221 ----
  		if (net == in_ifsni[j].i_net) {
  #endif
  			net = i & in_ifsni[j].i_subnetmask;
! 			duh.s_addr = htonl(net);
! 			if (inet_lnaof(duh) == 0)
  				return (0);
  			else
  				return (net >> in_ifsni[j].i_bitshift);