[comp.bugs.4bsd.ucb-fixes] ARTICLE 3

bostic@OKEEFFE.BERKELEY.EDU.UUCP (03/20/87)

Subject: gethostbyname fails when using virtual circuits
Index: lib/libc/net/res_send.c 4.3BSD

Description:
	Programs that use virtual circuits to connect to the name
	daemon (that is they call `sethostent(1)'), do not properly
	fall back to using /etc/hosts when the name server is not
	running.
Repeat-By:
	This affects only `netstat' and `systat' on the standard
	distribution. Kill the name server and run netstat. Instead
	of printing symbolic names it will print net addresses.
	After installing this fix, it will properly resolve any
	addresses that are listed in /etc/hosts when the name
	server is not running.
Fix:
*** res_send.c.6.13	Wed Mar  4 14:19:56 1987
--- res_send.c.6.14	Wed Mar  4 14:19:35 1987
***************
*** 8,10 ****
  #if defined(LIBC_SCCS) && !defined(lint)
! static char sccsid[] = "@(#)res_send.c	6.13 (Berkeley) 5/7/86";
  #endif LIBC_SCCS and not lint
--- 8,10 ----
  #if defined(LIBC_SCCS) && !defined(lint)
! static char sccsid[] = "@(#)res_send.c	6.14 (Berkeley) 7/2/86";
  #endif LIBC_SCCS and not lint
***************
*** 47,48 ****
--- 47,49 ----
	struct iovec iov[2];
+ 	int terrno = ETIMEDOUT;
  
***************
*** 77,78 ****
--- 78,80 ----
				if (s < 0) {
+ 					terrno = errno;
  #ifdef DEBUG
***************
*** 85,86 ****
--- 87,89 ----
				   sizeof(struct sockaddr)) < 0) {
+ 					terrno = errno;
  #ifdef DEBUG
***************
*** 103,104 ****
--- 106,108 ----
			if (writev(s, iov, 2) != sizeof(len) + buflen) {
+ 				terrno = errno;
  #ifdef DEBUG

***************
*** 122,123 ****
--- 126,128 ----
			if (n <= 0) {
+ 				terrno = errno;
  #ifdef DEBUG
***************
*** 138,139 ****
--- 143,145 ----
			if (n <= 0) {
+ 				terrno = errno;
  #ifdef DEBUG
***************
*** 262,269 ****
	}
! 	(void) close(s);
! 	s = -1;
! 	if (v_circuit == 0 && gotsomewhere == 0)
! 		errno = ECONNREFUSED;
	else
! 		errno = ETIMEDOUT;
	return (-1);
--- 268,280 ----
	}
! 	if (s >= 0) {
! 		(void) close(s);
! 		s = -1;
! 	}
! 	if (v_circuit == 0)
! 		if (gotsomewhere == 0)
! 			errno = ECONNREFUSED;
! 		else
! 			errno = ETIMEDOUT;
	else
! 		errno = terrno;
	return (-1);