Adam Tkac 354aa5d
diff -up netkit-rsh-0.17/rcp/rcp.c.ipv6 netkit-rsh-0.17/rcp/rcp.c
Adam Tkac 354aa5d
--- netkit-rsh-0.17/rcp/rcp.c.ipv6	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
+++ netkit-rsh-0.17/rcp/rcp.c	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
@@ -262,9 +262,9 @@ toremote(const char *targ, int argc, cha
083fc6d
 					nospace();
083fc6d
 				(void)snprintf(bp, len, "%s -t %s", cmd, targ);
083fc6d
 				host = thost;
083fc6d
-					rem = rcmd(&host, port, pwd->pw_name,
083fc6d
+					rem = rcmd_af(&host, port, pwd->pw_name,
083fc6d
 					    tuser ? tuser : pwd->pw_name,
083fc6d
-					    bp, 0);
083fc6d
+					    bp, 0, AF_UNSPEC);
083fc6d
 				if (rem < 0)
083fc6d
 					exit(1);
083fc6d
 #ifdef IP_TOS
Adam Tkac 354aa5d
@@ -325,7 +325,8 @@ tolocal(int argc, char *argv[])
083fc6d
 		if (!(bp = malloc(len)))
083fc6d
 			nospace();
083fc6d
 		(void)snprintf(bp, len, "%s -f %s", cmd, src);
083fc6d
-			rem = rcmd(&host, port, pwd->pw_name, suser, bp, 0);
083fc6d
+			rem = rcmd_af(&host, port, pwd->pw_name, suser, bp, 0,
083fc6d
+				AF_UNSPEC);
083fc6d
 		(void)free(bp);
083fc6d
 		if (rem < 0) {
083fc6d
 			++errs;
Adam Tkac 354aa5d
diff -up netkit-rsh-0.17/rlogind/network.c.ipv6 netkit-rsh-0.17/rlogind/network.c
Adam Tkac 354aa5d
--- netkit-rsh-0.17/rlogind/network.c.ipv6	1999-12-12 16:15:40.000000000 +0100
Adam Tkac 354aa5d
+++ netkit-rsh-0.17/rlogind/network.c	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
@@ -88,47 +88,78 @@ local_domain(const char *h)
083fc6d
 	return(0);
083fc6d
 }
083fc6d
 
083fc6d
+static int
083fc6d
+soaddr_eq_ip(const struct sockaddr *s1, const struct sockaddr *s2)
083fc6d
+{
083fc6d
+	if (s1->sa_family != s2->sa_family)
083fc6d
+		return 0;
083fc6d
+	if (s2->sa_family == AF_INET6)
083fc6d
+		return (memcmp(
083fc6d
+			(const void*)(
083fc6d
+				&((const struct sockaddr_in6 *)s1)->sin6_addr
083fc6d
+				),
083fc6d
+			(const void*)(
083fc6d
+				&((const struct sockaddr_in6 *)s2)->sin6_addr
083fc6d
+				),
083fc6d
+			sizeof(struct in6_addr))
083fc6d
+				== 0);
083fc6d
+	else
083fc6d
+		return (memcmp(
083fc6d
+			(const void*)(
083fc6d
+				&((const struct sockaddr_in *)s1)->sin_addr
083fc6d
+				),
083fc6d
+			(const void*)(
083fc6d
+				&((const struct sockaddr_in *)s2)->sin_addr
083fc6d
+				),
083fc6d
+			sizeof(struct in_addr))
083fc6d
+				== 0);
083fc6d
+}
083fc6d
 
083fc6d
 static char *
Adam Tkac 5687e31
-find_hostname(const struct sockaddr_in *fromp, int *hostokp)
083fc6d
+find_hostname(struct sockaddr *fromp, socklen_t fromlen,
Adam Tkac 5687e31
+	char *portname, int *hostokp)
083fc6d
 {
083fc6d
-	struct hostent *hop;
083fc6d
+	int error;
083fc6d
 	char *hname;
083fc6d
+	char hname_buf[NI_MAXHOST];
083fc6d
 	int hostok = 0;
083fc6d
 
083fc6d
-	hop = gethostbyaddr((const char *)&fromp->sin_addr, 
083fc6d
-			    sizeof(struct in_addr), fromp->sin_family);
083fc6d
-	if (hop == NULL) {
083fc6d
-		hname = strdup(inet_ntoa(fromp->sin_addr));
083fc6d
-		hostok = 1;
083fc6d
-	} 
Adam Tkac 5687e31
-	else if (check_all || local_domain(hop->h_name)) {
083fc6d
+	error = getnameinfo(fromp, fromlen,
083fc6d
+		hname_buf, sizeof(hname_buf), portname, NI_MAXSERV,
083fc6d
+		NI_NUMERICSERV);
083fc6d
+	assert(error == 0);
083fc6d
+
Adam Tkac 5687e31
+	if (check_all || local_domain(hname_buf)) {
083fc6d
 		/*
083fc6d
-		 * If name returned by gethostbyaddr is in our domain,
083fc6d
+		 * If name returned is in our domain,
083fc6d
 		 * attempt to verify that we haven't been fooled by someone
083fc6d
 		 * in a remote net; look up the name and check that this
083fc6d
 		 * address corresponds to the name.
083fc6d
 		 */
083fc6d
-		hname = strdup(hop->h_name);
083fc6d
-		hop = gethostbyname(hname);
083fc6d
-		if (hop) {
083fc6d
-		    for (; hop->h_addr_list[0]; hop->h_addr_list++) {
083fc6d
-			if (!memcmp(hop->h_addr_list[0], &fromp->sin_addr,
083fc6d
-				    sizeof(fromp->sin_addr))) {
083fc6d
+		struct addrinfo hints;
083fc6d
+		struct addrinfo *res0, *res;
083fc6d
+
083fc6d
+		memset(&hints, 0, sizeof(hints));
083fc6d
+		hints.ai_family = PF_UNSPEC;
083fc6d
+		error = getaddrinfo(hname_buf, NULL, &hints, &res;;
083fc6d
+		assert(error == 0);
083fc6d
+
083fc6d
+		res0 = res;
083fc6d
+		while (res) {
083fc6d
+			if (soaddr_eq_ip(fromp, res->ai_addr)) {
083fc6d
 				hostok = 1;
083fc6d
 				break;
083fc6d
 			}
083fc6d
-		    }
083fc6d
-		    /* not clear if this is worthwhile */
083fc6d
-		    free(hname);
083fc6d
-		    hname = strdup(hop->h_name);
083fc6d
+			res = res->ai_next;
083fc6d
 		}
083fc6d
+		freeaddrinfo(res0);
083fc6d
 	} 
083fc6d
 	else {
083fc6d
-		hname = strdup(hop->h_name);
083fc6d
 		hostok = 1;
083fc6d
 	}
083fc6d
 
083fc6d
+	hname = strdup(hname_buf);
083fc6d
+
083fc6d
 	/* 
083fc6d
 	 * Actually it might be null if we're out of memory, but
083fc6d
 	 * where do we go then? We'd have to bail anyhow.
Adam Tkac 354aa5d
@@ -145,14 +176,14 @@ find_hostname(const struct sockaddr_in *
083fc6d
 char * 
Adam Tkac 5687e31
 network_init(int f, int *hostokp)
083fc6d
 {
083fc6d
-	struct sockaddr_in from, *fromp;
083fc6d
+	struct sockaddr_storage from, *fromp;
083fc6d
 	socklen_t fromlen;
083fc6d
 	int on = 1;
083fc6d
 	char c;
083fc6d
 	char *hname;
083fc6d
+	char portname[NI_MAXSERV];
083fc6d
 	int port;
083fc6d
 
083fc6d
-	from.sin_family = AF_INET;
083fc6d
 	fromlen = sizeof (from);
083fc6d
 	if (getpeername(f, (struct sockaddr *)&from, &fromlen) < 0) {
083fc6d
 		syslog(LOG_ERR,"Can't get peer name of remote host: %m");
Adam Tkac 354aa5d
@@ -177,13 +208,19 @@ network_init(int f, int *hostokp)
083fc6d
 
083fc6d
 	alarm(0);
083fc6d
 
Adam Tkac 5687e31
-	hname = find_hostname(fromp, hostokp);
083fc6d
+	hname = find_hostname((struct sockaddr *)fromp, fromlen,
Adam Tkac 5687e31
+		portname, hostokp);
083fc6d
+	assert(hname != NULL);
083fc6d
 
083fc6d
-	port = ntohs(fromp->sin_port);
083fc6d
-	if (fromp->sin_family != AF_INET ||
083fc6d
+	port = atoi(portname);
083fc6d
+	if (! port) {
083fc6d
+	    syslog(LOG_NOTICE, "Unknown port %s", portname);
083fc6d
+	    fatal(f, "Permission denied", 0);
083fc6d
+	}
083fc6d
+	if ((fromp->ss_family != AF_INET && fromp->ss_family != AF_INET6) ||
083fc6d
 	    port >= IPPORT_RESERVED || port < IPPORT_RESERVED/2) {
083fc6d
 	    syslog(LOG_NOTICE, "Connection from %s on illegal port",
083fc6d
-		   inet_ntoa(fromp->sin_addr));
083fc6d
+	    	portname);
083fc6d
 	    fatal(f, "Permission denied", 0);
083fc6d
 	}
083fc6d
 
Adam Tkac 354aa5d
diff -up netkit-rsh-0.17/rlogin/rlogin.c.ipv6 netkit-rsh-0.17/rlogin/rlogin.c
Adam Tkac 354aa5d
--- netkit-rsh-0.17/rlogin/rlogin.c.ipv6	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
+++ netkit-rsh-0.17/rlogin/rlogin.c	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
@@ -280,7 +280,7 @@ main(int argc, char **argv)
Adam Tkac 354aa5d
 	/* will use SIGUSR1 for window size hack, so hold it off */
Adam Tkac 354aa5d
 	omask = sigblock(sigmask(SIGURG) | sigmask(SIGUSR1));
Adam Tkac 354aa5d
 
Adam Tkac 354aa5d
-	rem = rcmd(&host, sp->s_port, pw->pw_name, user, term, 0);
Adam Tkac 354aa5d
+	rem = rcmd_af(&host, sp->s_port, pw->pw_name, user, term, 0, AF_UNSPEC);
Adam Tkac 354aa5d
 
Adam Tkac 354aa5d
 	if (rem < 0) exit(1);
Adam Tkac 354aa5d
 
Adam Tkac 354aa5d
diff -up netkit-rsh-0.17/rshd/rshd.c.ipv6 netkit-rsh-0.17/rshd/rshd.c
Adam Tkac 354aa5d
--- netkit-rsh-0.17/rshd/rshd.c.ipv6	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
+++ netkit-rsh-0.17/rshd/rshd.c	2008-10-03 12:53:08.000000000 +0200
Adam Tkac 354aa5d
@@ -109,7 +109,7 @@ char	*envinit[] =
083fc6d
 extern	char	**environ;
083fc6d
 
083fc6d
 static void error(const char *fmt, ...);
083fc6d
-static void doit(struct sockaddr_in *fromp);
083fc6d
+static void doit(struct sockaddr_storage *fromp, socklen_t fromlen);
083fc6d
 static void getstr(char *buf, int cnt, const char *err);
083fc6d
 
083fc6d
 extern int _check_rhosts_file;
Adam Tkac 354aa5d
@@ -284,19 +284,37 @@ static struct passwd *doauth(const char 
083fc6d
 #endif
083fc6d
 }
083fc6d
 
083fc6d
-static const char *findhostname(struct sockaddr_in *fromp,
083fc6d
+static const char *findhostname(struct sockaddr *fromp,
083fc6d
+				socklen_t fromlen,
083fc6d
 				const char *remuser, const char *locuser,
083fc6d
 				const char *cmdbuf) 
083fc6d
 {
083fc6d
-	struct hostent *hp;
083fc6d
 	const char *hostname;
083fc6d
+	char remote_address[INET6_ADDRSTRLEN];
083fc6d
+	char remote_hostname[NI_MAXHOST];
083fc6d
+	struct addrinfo hints;
083fc6d
+	struct addrinfo *res0, *res;
083fc6d
+
083fc6d
+	if (! inet_ntop(fromp->sa_family,
083fc6d
+		(( fromp->sa_family == AF_INET6 )
083fc6d
+		? ( &((struct sockaddr_in6 *)fromp)->sin6_addr )
083fc6d
+		: ( &((struct sockaddr_in *)fromp)->sin_addr )),
083fc6d
+		remote_address, sizeof(remote_address))) {
083fc6d
+	    syslog(LOG_NOTICE|LOG_AUTH,
083fc6d
+	    	"Failed to retrieve the socket remote address");
083fc6d
+	    exit(1);
083fc6d
+	}
083fc6d
 
083fc6d
-	hp = gethostbyaddr((char *)&fromp->sin_addr, sizeof (struct in_addr),
083fc6d
-			   fromp->sin_family);
083fc6d
+	if (getnameinfo(fromp, fromlen, remote_hostname, NI_MAXHOST,
083fc6d
+		NULL, 0, 0)) {
083fc6d
+	    syslog(LOG_NOTICE|LOG_AUTH,
083fc6d
+	    	"Failed to retrieve the hostname information for %s",
083fc6d
+	    	remote_address);
083fc6d
+	    exit(1);
083fc6d
+	}
083fc6d
 
083fc6d
 	errno = ENOMEM; /* malloc (thus strdup) may not set it */
083fc6d
-	if (hp) hostname = strdup(hp->h_name);
083fc6d
-	else hostname = strdup(inet_ntoa(fromp->sin_addr));
083fc6d
+	hostname = strdup(remote_hostname);
083fc6d
 
083fc6d
 	if (hostname==NULL) {
083fc6d
 	    /* out of memory? */
Adam Tkac 354aa5d
@@ -307,31 +325,43 @@ static const char *findhostname(struct s
Adam Tkac 354aa5d
 	/*
083fc6d
 	 * Attempt to confirm the DNS. 
083fc6d
 	 */
083fc6d
-#ifdef	RES_DNSRCH
083fc6d
-	_res.options &= ~RES_DNSRCH;
083fc6d
-#endif
083fc6d
-	hp = gethostbyname(hostname);
083fc6d
-	if (hp == NULL) {
083fc6d
-	    syslog(LOG_INFO, "Couldn't look up address for %s", hostname);
083fc6d
+	memset(&hints, 0, sizeof(hints));
083fc6d
+	hints.ai_family = PF_UNSPEC;
083fc6d
+	if (getaddrinfo(hostname, NULL, &hints, &res)) {
083fc6d
+	    syslog(LOG_INFO, "Couldn't look up address for %s/%s",
Adam Tkac 354aa5d
+		   hostname, remote_address);
083fc6d
 	    fail("Couldn't get address for your host (%s)\n", 
083fc6d
-		 remuser, inet_ntoa(fromp->sin_addr), locuser, cmdbuf);
083fc6d
-	} 
083fc6d
-	while (hp->h_addr_list[0] != NULL) {
083fc6d
-	    if (!memcmp(hp->h_addr_list[0], &fromp->sin_addr,
083fc6d
-			sizeof(fromp->sin_addr))) {
083fc6d
-		return hostname;
083fc6d
+		 remuser, hostname, locuser, cmdbuf);
083fc6d
+	}
083fc6d
+
083fc6d
+	res0 = res;
083fc6d
+	while (res) {
083fc6d
+	    struct sockaddr *sa;
083fc6d
+	    char res_address[INET6_ADDRSTRLEN];
083fc6d
+	    sa = res->ai_addr;
083fc6d
+
083fc6d
+	    if (inet_ntop(sa->sa_family,
083fc6d
+		(( sa->sa_family == AF_INET6 )
083fc6d
+		? ( &((struct sockaddr_in6 *)sa)->sin6_addr )
083fc6d
+		: ( &((struct sockaddr_in *)sa)->sin_addr )),
083fc6d
+		res_address, sizeof(res_address))
Adam Tkac 354aa5d
+		&& strcmp(remote_address, res_address) == 0) {
Adam Tkac 354aa5d
+		    freeaddrinfo(res0);
Adam Tkac 354aa5d
+		    return hostname;
083fc6d
 	    }
083fc6d
-	    hp->h_addr_list++;
083fc6d
+	    res = res->ai_next;
083fc6d
 	}
083fc6d
+	freeaddrinfo(res0);
083fc6d
+
083fc6d
 	syslog(LOG_NOTICE, "Host addr %s not listed for host %s",
083fc6d
-	       inet_ntoa(fromp->sin_addr), hp->h_name);
Adam Tkac 354aa5d
+	       remote_address, hostname);
083fc6d
 	fail("Host address mismatch for %s\n", 
083fc6d
-	     remuser, inet_ntoa(fromp->sin_addr), locuser, cmdbuf);
083fc6d
+	     remuser, hostname, locuser, cmdbuf);
083fc6d
 	return NULL; /* not reachable */
083fc6d
 }
083fc6d
 
083fc6d
 static void
083fc6d
-doit(struct sockaddr_in *fromp)
083fc6d
+doit(struct sockaddr_storage *fromp, socklen_t fromlen)
083fc6d
 {
083fc6d
 	char cmdbuf[ARG_MAX+1];
083fc6d
 	const char *theshell, *shellname;
Adam Tkac 354aa5d
@@ -351,8 +381,12 @@ doit(struct sockaddr_in *fromp)
083fc6d
 	alarm(0);
083fc6d
 
083fc6d
 	if (port != 0) {
083fc6d
+		struct sockaddr_storage second_connect;
083fc6d
 		int lport = IPPORT_RESERVED - 1;
083fc6d
-		sock = rresvport(&lport);
083fc6d
+
083fc6d
+		memcpy((void *)&second_connect, (void *)fromp, fromlen);
083fc6d
+		sock = rresvport_af(&lport,
083fc6d
+			((struct sockaddr *)&second_connect)->sa_family);
083fc6d
 		if (sock < 0) {
083fc6d
 		    syslog(LOG_ERR, "can't get stderr port: %m");
083fc6d
 		    exit(1);
Adam Tkac 354aa5d
@@ -361,10 +395,15 @@ doit(struct sockaddr_in *fromp)
083fc6d
 		    syslog(LOG_ERR, "2nd port not reserved\n");
083fc6d
 		    exit(1);
083fc6d
 		}
083fc6d
-		fromp->sin_port = htons(port);
083fc6d
-		if (connect(sock, (struct sockaddr *)fromp,
083fc6d
-			    sizeof(*fromp)) < 0) {
083fc6d
-		    syslog(LOG_INFO, "connect second port: %m");
083fc6d
+		if (((struct sockaddr *)&second_connect)->sa_family == AF_INET6)
083fc6d
+		    ((struct sockaddr_in6 *)&second_connect)->sin6_port
083fc6d
+		    						= htons(port);
083fc6d
+		else
083fc6d
+		    ((struct sockaddr_in *)&second_connect)->sin_port
083fc6d
+		    						= htons(port);
083fc6d
+		if (connect(sock, (struct sockaddr *)&second_connect,
083fc6d
+			fromlen) < 0) {
083fc6d
+		    syslog(LOG_INFO, "connect second port %d: %m", port);
083fc6d
 		    exit(1);
083fc6d
 		}
083fc6d
 	}
Adam Tkac 354aa5d
@@ -381,7 +420,8 @@ doit(struct sockaddr_in *fromp)
083fc6d
 	getstr(cmdbuf, sizeof(cmdbuf), "command");
083fc6d
 	if (!strcmp(locuser, "root")) paranoid = 1;
083fc6d
 
083fc6d
-	hostname = findhostname(fromp, remuser, locuser, cmdbuf);
083fc6d
+	hostname = findhostname((struct sockaddr *)fromp, fromlen,
083fc6d
+		remuser, locuser, cmdbuf);
083fc6d
 
083fc6d
 	setpwent();
083fc6d
 	pwd = doauth(remuser, hostname, locuser);
Adam Tkac 354aa5d
@@ -496,15 +536,19 @@ doit(struct sockaddr_in *fromp)
083fc6d
 	exit(1);
083fc6d
 }
083fc6d
 
083fc6d
-static void network_init(int fd, struct sockaddr_in *fromp)
083fc6d
+static void network_init(int fd,
083fc6d
+	struct sockaddr_storage *fromp, socklen_t *fromlenp)
083fc6d
 {
083fc6d
 	struct linger linger;
083fc6d
-	socklen_t fromlen;
083fc6d
+	char hostname[NI_MAXHOST];
083fc6d
+	char portname[NI_MAXSERV];
083fc6d
+	sa_family_t family;
083fc6d
+
083fc6d
+	int error;
083fc6d
 	int on=1;
083fc6d
 	int port;
083fc6d
 
083fc6d
-	fromlen = sizeof(*fromp);
083fc6d
-	if (getpeername(fd, (struct sockaddr *) fromp, &fromlen) < 0) {
083fc6d
+	if (getpeername(fd, (struct sockaddr *)fromp, fromlenp) < 0) {
083fc6d
 		syslog(LOG_ERR, "getpeername: %m");
083fc6d
 		_exit(1);
083fc6d
 	}
Adam Tkac 354aa5d
@@ -518,9 +562,20 @@ static void network_init(int fd, struct 
083fc6d
 	    sizeof (linger)) < 0)
083fc6d
 		syslog(LOG_WARNING, "setsockopt (SO_LINGER): %m");
083fc6d
 
083fc6d
-	if (fromp->sin_family != AF_INET) {
083fc6d
+	family = ((struct sockaddr *)fromp)->sa_family;
083fc6d
+	if (family != AF_INET && family != AF_INET6) {
083fc6d
 	    syslog(LOG_ERR, "malformed \"from\" address (af %d)\n",
083fc6d
-		   fromp->sin_family);
083fc6d
+	    	family);
083fc6d
+	    exit(1);
083fc6d
+	}
083fc6d
+
083fc6d
+	error = getnameinfo((struct sockaddr *)fromp, *fromlenp,
083fc6d
+		hostname, sizeof(hostname), portname, sizeof(portname),
083fc6d
+		NI_NUMERICSERV);
083fc6d
+	if (error) {
083fc6d
+	    syslog(LOG_NOTICE|LOG_AUTH,
083fc6d
+	    	"Failed to retrieve address and port of the connection: %s",
083fc6d
+		gai_strerror(error));
083fc6d
 	    exit(1);
083fc6d
 	}
083fc6d
 #ifdef IP_OPTIONS
Adam Tkac 354aa5d
@@ -550,7 +605,7 @@ static void network_init(int fd, struct 
083fc6d
 		syslog(LOG_NOTICE,
083fc6d
 		       "Connection received from %s using IP options"
083fc6d
 		       " (ignored): %s",
083fc6d
-		       inet_ntoa(fromp->sin_addr), lbuf);
083fc6d
+		       hostname, lbuf);
083fc6d
 
083fc6d
 		if (setsockopt(0, ipproto, IP_OPTIONS, NULL, optsize) != 0) {
083fc6d
 			syslog(LOG_ERR, "setsockopt IP_OPTIONS NULL: %m");
Adam Tkac 354aa5d
@@ -563,10 +618,15 @@ static void network_init(int fd, struct 
083fc6d
 	/*
083fc6d
 	 * Check originating port for validity.
083fc6d
 	 */
083fc6d
-	port = ntohs(fromp->sin_port);
083fc6d
+	port = atoi(portname);
083fc6d
+	if (! port) {
083fc6d
+	    syslog(LOG_NOTICE|LOG_AUTH, "Unknown port %s", portname);
083fc6d
+	    exit(1);
083fc6d
+	}
083fc6d
 	if (port >= IPPORT_RESERVED || port < IPPORT_RESERVED/2) {
083fc6d
-	    syslog(LOG_NOTICE|LOG_AUTH, "Connection from %s on illegal port",
083fc6d
-		   inet_ntoa(fromp->sin_addr));
083fc6d
+	    syslog(LOG_NOTICE|LOG_AUTH,
083fc6d
+	    	"Connection from %s from illegal port %s",
083fc6d
+		   hostname, portname);
083fc6d
 	    exit(1);
083fc6d
 	}
083fc6d
 }
Adam Tkac 354aa5d
@@ -575,7 +635,8 @@ int
083fc6d
 main(int argc, char *argv[])
083fc6d
 {
083fc6d
 	int ch;
083fc6d
-	struct sockaddr_in from;
083fc6d
+	struct sockaddr_storage from;
083fc6d
+	socklen_t fromlen;
083fc6d
 	_check_rhosts_file=1;
083fc6d
 
083fc6d
 	openlog("rshd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
Adam Tkac 354aa5d
@@ -618,8 +679,9 @@ main(int argc, char *argv[])
083fc6d
                                "pam_rhosts_auth in /etc/pam.conf");
083fc6d
 #endif /* USE_PAM */
083fc6d
 
083fc6d
-	network_init(0, &from;;
083fc6d
-	doit(&from;;
083fc6d
+	fromlen = sizeof(from);
083fc6d
+	network_init(0, &from, &fromlen);
083fc6d
+	doit(&from, fromlen);
083fc6d
 	return 0;
083fc6d
 }
083fc6d
 
Adam Tkac 354aa5d
diff -up netkit-rsh-0.17/rsh/rsh.c.ipv6 netkit-rsh-0.17/rsh/rsh.c
083fc6d
--- netkit-rsh-0.17/rsh/rsh.c.ipv6	2000-07-23 06:16:24.000000000 +0200
Adam Tkac 354aa5d
+++ netkit-rsh-0.17/rsh/rsh.c	2008-10-03 12:44:22.000000000 +0200
Adam Tkac 354aa5d
@@ -163,7 +163,8 @@ main(int argc, char *argv[])
083fc6d
 		exit(1);
083fc6d
 	}
083fc6d
 
083fc6d
-	rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, &rfd2);
083fc6d
+	rem = rcmd_af(&host, sp->s_port, pw->pw_name, user, args, &rfd2,
083fc6d
+		AF_UNSPEC);
083fc6d
 
083fc6d
 	if (rem < 0)
083fc6d
 		exit(1);