This is a version of rdist for Linux which fixes two things against
the orignal 6.1.0 version:

- partial read and write problem, which caused rdidst to hang for Linux,
  fixed by Mark Eichin, eichin@cygnus.com

- Changes to make rdist work with the secure remote shell, ssh, by
  Tatu Ylonen, available from ftp://ftp.cs.hut.fi/pub/ssh.

To see what I've changed against the original sources, the patch follows.
If you want to reverse it, do a "patch -p1 < REAME.Linux" in the rdist
source directory.

diff -u --recursive rdist-6.1.0/include/defs.h rdist-6.1.0-linuxpl2/include/defs.h
--- rdist-6.1.0/include/defs.h	Tue Apr 12 01:19:22 1994
+++ rdist-6.1.0-linuxpl2/include/defs.h	Mon Oct 16 19:43:18 1995
@@ -325,7 +325,8 @@
 extern opt_t 		options;	/* Global options */
 extern int 		proto_version;	/* Protocol version number */
 extern int 		realargc;	/* Real argc */
-extern int 		rem;		/* Remote file descriptor */
+extern int		rem_r;		/* Remote file descriptor, reading */
+extern int 		rem_w;		/* Remote file descriptor, writing */
 extern int 		rtimeout;	/* Response time out in seconds */
 extern UID_T 		userid;		/* User ID of rdist user */
 extern jmp_buf 		finish_jmpbuf;	/* Setjmp buffer for finish() */
diff -u --recursive rdist-6.1.0/mf/Makefile.var rdist-6.1.0-linuxpl2/mf/Makefile.var
--- rdist-6.1.0/mf/Makefile.var	Tue Apr 12 01:20:17 1994
+++ rdist-6.1.0-linuxpl2/mf/Makefile.var	Mon Jun  5 16:57:30 1995
@@ -95,7 +95,7 @@
 #
 #YACC 		= bison -y
 
-OPT		= -g
+OPT		= -O2 -fomit-frame-pointer
 RM		= rm
 AR		= ar
 RANLIB		= ranlib
diff -u --recursive rdist-6.1.0/src/child.c rdist-6.1.0-linuxpl2/src/child.c
--- rdist-6.1.0/src/child.c	Thu Mar 31 04:56:26 1994
+++ rdist-6.1.0-linuxpl2/src/child.c	Mon Jun  5 16:49:38 1995
@@ -203,8 +203,16 @@
 		debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %d bytes]", 
 			 child->c_name, child->c_pid, child->c_readfd, amt);
 
-		write(fileno(stdout), rbuf, amt);
-
+		{
+			int wamt=amt, ramt, woff=0;
+			while ((ramt = write(fileno(stdout), rbuf+woff, wamt)) > 0) {
+				woff += ramt; wamt -= ramt;
+				debugmsg(DM_MISC,
+					 "[readchild(%s, %d, %d) only wrote %d/%d bytes]",
+					 child->c_name, child->c_pid, child->c_readfd, 
+					 ramt, wamt);
+			}
+		}
 		debugmsg(DM_MISC, "[readchild(%s, %d, %d) write done]",
 			 child->c_name, child->c_pid, child->c_readfd);
 	}
diff -u --recursive rdist-6.1.0/src/client.c rdist-6.1.0-linuxpl2/src/client.c
--- rdist-6.1.0/src/client.c	Fri Apr 22 19:24:01 1994
+++ rdist-6.1.0-linuxpl2/src/client.c	Mon Oct 16 19:44:27 1995
@@ -429,12 +429,18 @@
 			 * this situation gracefully.
 			 */
 		}
-		if (write(rem, buf, amt) == -1) {
-			error("%s: Error writing to client: %s", 
-			      target, SYSERR);
-			err();
-			++goterr;
-			break;
+		{
+			int ramt, wamt=amt, woff=0;
+			while((ramt=write(rem_w,buf+woff,wamt)) > 0) {
+				woff += ramt; wamt -= ramt;
+			}
+			if (ramt < 0) {
+				error("%s: Error writing to client: %s", 
+				      target, SYSERR);
+				err();
+				++goterr;
+				break;
+			}
 		}
 		(void) alarm(0);
 	}
diff -u --recursive rdist-6.1.0/src/common.c rdist-6.1.0-linuxpl2/src/common.c
--- rdist-6.1.0/src/common.c	Wed Apr 20 20:11:03 1994
+++ rdist-6.1.0-linuxpl2/src/common.c	Mon Oct 16 19:53:09 1995
@@ -64,7 +64,8 @@
 int			do_fork = 1;		/* Fork child process */
 char		       *currenthost = NULL;	/* Current client hostname */
 char		       *progname = NULL;	/* Name of this program */
-int			rem = -1;		/* Client file descriptor */
+int			rem_r = -1;		/* Client file descriptor */
+int			rem_w = -1;		/* Client file descriptor */
 struct passwd	       *pw = NULL;		/* Local user's pwd entry */
 int 			contimedout = FALSE;	/* Connection timed out */
 int			proto_version = -1;	/* Protocol version */
@@ -176,7 +177,7 @@
 	/* Prevent looping */
 	(void) signal(SIGPIPE, SIG_IGN);
 
-	rem = -1;		/* Ensure we don't try to send to server */
+	rem_r = rem_w = -1;	/* Ensure we don't try to send to server */
 	checkhostname();
 	error("Lost connection to %s", 
 	      (currenthost) ? currenthost : "(unknown)");
@@ -247,7 +248,7 @@
 {
 	int len;
 
-	if (rem < 0)
+	if (rem_w < 0)
 		return(-1);
 
 	/*
@@ -268,7 +269,13 @@
 		 (cmd == C_NONE) ? len-1 : len-2,
 		 (cmd == C_NONE) ? msg : msg + 1);
 
-	return(!(write(rem, msg, len) == len));
+	{
+		int ramt, wamt=len, woff=0;
+		while((ramt = write(rem_w,msg+woff,wamt)) > 0) {
+			woff += ramt; wamt -= ramt;
+		}
+		return ramt<0;
+	}
 }
 
 /*
@@ -368,7 +375,7 @@
 	(void) signal(SIGALRM, sighandler);
 	(void) alarm(rtimeout);
 
-	remleft = remread(rem, rembuf, sizeof(rembuf));
+	remleft = remread(rem_r, rembuf, sizeof(rembuf));
 
 	(void) alarm(0);
 
@@ -396,7 +403,7 @@
 	register int c, left = space;
 	register u_char *p = buffer;
 
-	if (rem < 0) {
+	if (rem_r < 0) {
 		error("Cannot read remote input: Remote descriptor not open.");
 		return(-1);
 	}
@@ -460,7 +467,7 @@
 		(void) signal(SIGALRM, sighandler);
 		(void) alarm(rtimeout);
 
-		remleft = remread(rem, rembuf, sizeof(rembuf));
+		remleft = remread(rem_r, rembuf, sizeof(rembuf));
 
 		(void) alarm(0);
 		remptr = rembuf;
@@ -808,7 +815,7 @@
 				continue;
 			}
 			if (isserver)
-				(void) write(rem, sbuf, s - sbuf);
+				(void) write(rem_w, sbuf, s - sbuf);
 			else {
 				*s = CNULL;
 				message(MT_INFO, "%s", sbuf+1);
@@ -819,7 +826,7 @@
 	if (s > (char *) &sbuf[1]) {
 		*s++ = '\n';
 		if (isserver)
-			(void) write(rem, sbuf, s - sbuf);
+			(void) write(rem_w, sbuf, s - sbuf);
 		else {
 			*s = CNULL;
 			message(MT_INFO, "%s", sbuf+1);
@@ -885,7 +892,7 @@
 }
 
 extern char *basename(path)
-	char *path;
+	const char *path;
 {
 	register char *cp;
  
diff -u --recursive rdist-6.1.0/src/docmd.c rdist-6.1.0-linuxpl2/src/docmd.c
--- rdist-6.1.0/src/docmd.c	Tue Apr 26 19:10:09 1994
+++ rdist-6.1.0-linuxpl2/src/docmd.c	Mon Oct 16 19:47:20 1995
@@ -72,13 +72,15 @@
 {
 	debugmsg(DM_CALL, "closeconn() called\n");
 
-	if (rem >= 0) {
+	if (rem_w >= 0) {
 		/* We don't care if the connection is still good or not */
 		signal(SIGPIPE, SIG_IGN);	
 
 		(void) sendcmd(C_FERRMSG, NULL);
-		(void) close(rem);
-		rem = -1;
+		(void) close(rem_w);
+		(void) close(rem_r); /* This can't hurt */
+		rem_w = -1;
+		rem_r = -1;
 	}
 }
 
@@ -313,7 +315,7 @@
 	/*
 	 * See if we're already connected to this host
 	 */
-	if (cur_host != NULL && rem >= 0) {
+	if (cur_host != NULL && rem_w >= 0) {
 		if (strcmp(cur_host, rhost) == 0)
 			return(1);
 		closeconn();
@@ -345,7 +347,7 @@
 
 	(void) sprintf(buf, "%.*s -S", sizeof(buf)-5, path_rdistd);
 		
-	if ((rem = remotecmd(rhost, locuser, ruser, buf)) < 0)
+	if ((rem_r = rem_w = remotecmd(rhost, locuser, ruser, buf)) < 0)
 		return(0);
 
 	/*
diff -u --recursive rdist-6.1.0/src/message.c rdist-6.1.0-linuxpl2/src/message.c
--- rdist-6.1.0/src/message.c	Wed Apr 20 19:53:29 1994
+++ rdist-6.1.0-linuxpl2/src/message.c	Mon Oct 16 19:48:25 1995
@@ -325,7 +325,7 @@
 	char cmd;
 
 	if (isserver) {
-		if (rem < 0 || IS_ON(flags, MT_NOREMOTE))
+		if (rem_w < 0 || IS_ON(flags, MT_NOREMOTE))
 			return;
 
 		cmd = CNULL;
diff -u --recursive rdist-6.1.0/src/rdistd.c rdist-6.1.0-linuxpl2/src/rdistd.c
--- rdist-6.1.0/src/rdistd.c	Sat Feb 26 00:53:38 1994
+++ rdist-6.1.0-linuxpl2/src/rdistd.c	Mon Oct 16 19:53:52 1995
@@ -95,8 +95,9 @@
 		exit(1);
 	}
 
-	/* Use stdin for remote descriptor */
-	rem = fileno(stdin);
+	/* Use stdin and stdout for remote descriptors */
+	rem_r = fileno(stdin);
+	rem_w = fileno(stdout);
 
 	/* Set logging */
 	if (cp = msgparseopts(localmsglist, TRUE))
diff -u --recursive rdist-6.1.0/src/server.c rdist-6.1.0-linuxpl2/src/server.c
--- rdist-6.1.0/src/server.c	Tue Apr 26 18:58:56 1994
+++ rdist-6.1.0-linuxpl2/src/server.c	Mon Jun  5 17:03:51 1995
@@ -230,7 +230,7 @@
 	} else
 		gid = gr->gr_gid;
 
-	if (userid && gid >= 0 && gid != primegid) {
+	if (userid && gid >= 0x7fff && gid != primegid) {
 		if (gr)
 			for (i = 0; gr->gr_mem[i] != NULL; i++)
 				if (strcmp(locuser, gr->gr_mem[i]) == 0)
