about summary refs log tree commit diff
path: root/inet/rexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'inet/rexec.c')
-rw-r--r--inet/rexec.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/inet/rexec.c b/inet/rexec.c
index f4772475fd..d91949de3c 100644
--- a/inet/rexec.c
+++ b/inet/rexec.c
@@ -40,6 +40,7 @@ static char sccsid[] = "@(#)rexec.c	8.1 (Berkeley) 6/4/93";
 
 #include <netinet/in.h>
 
+#include <alloca.h>
 #include <stdio.h>
 #include <netdb.h>
 #include <errno.h>
@@ -56,16 +57,30 @@ rexec(ahost, rport, name, pass, cmd, fd2p)
 	int *fd2p;
 {
 	struct sockaddr_in sin, sin2, from;
-	struct hostent *hp;
+	struct hostent hostbuf, *hp;
+	size_t hstbuflen;
+	char *hsttmpbuf;
 	u_short port;
 	int s, timo = 1, s3;
 	char c;
+	int herr;
+
+	hstbuflen = 1024;
+	hsttmpbuf = __alloca (hstbuflen);
+	while (__gethostbyname_r (*ahost, &hostbuf, hsttmpbuf, hstbuflen,
+				  &hp, &herr) < 0)
+	  if (herr != NETDB_INTERNAL || errno != ERANGE)
+	    {
+	      herror(*ahost);
+	      return -1;
+	    }
+	  else
+	    {
+	      /* Enlarge the buffer.  */
+	      hstbuflen *= 2;
+	      hsttmpbuf = __alloca (hstbuflen);
+	    }
 
-	hp = gethostbyname(*ahost);
-	if (hp == 0) {
-		herror(*ahost);
-		return (-1);
-	}
 	*ahost = hp->h_name;
 	ruserpass(hp->h_name, &name, &pass);
 retry: