[alt.sources] diffs to run rdist on System 5 machines

gregc@cgl.ucsf.edu (Greg Couch) (08/27/88)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	README
#	Berklib.c
#	patches
# This archive created: Fri Aug 26 14:05:44 1988
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'README'
then
	echo shar: "will not over-write existing file 'README'"
else
cat << \SHAR_EOF > 'README'
    August 26, 1988

    This distribution of the diffs to get rdist running on a System 5 machine
contains 3 files, README (this file), Berklib.c, and patches.  In addition,
you will need the source for /src/ucb/rdist and /src/lib/libc/gen/regex.c 
from a BSD source distribution.  The patches file contains patches for various
rdist source files -- I believe Larry Wall's patch program can apply the
patches automatically for you.

    You will probably have to modify the Makefile to reflect which Berkeley
extentions your System 5 port has.  Also, change the LIBS= line to reflect
where your system keeps the Berkeley networking library and the CFLAGS=
line for where the Berkeley networking include files are.  The two System 5
machines I use (an SGI Iris 4D and a HP 350 running HP-UX 6.0) both have
symbolic links (lstat) and the rename system call.

    Make sure rdist is installed as /usr/ucb/rdist if you want to be able
to rdist to/from BSD machines on the same network.  If you don't care and
will never care, then change the Makefile RDIST= line as you see fit.

Conversion notes:

    Most of the changes were to allow rdist not to run as a setuid program.
Rdist uses the setreuid() system call -- which can't be mimicked on System 5 --
to become root long enough to make direct calls to rshd on remote hosts.
The workaround is to fork off a rsh to make the remote connection and use
pipes to communicate instead of a socket.

    The changes for machines without symbolic links have not been tested.

    The diffs include the bug fix I posted recently to comp.bugs.4bsd.

					- Greg Couch
					gregc@cgl.ucsf.edu
					ucsfcgl!gregc
SHAR_EOF
fi
if test -f 'Berklib.c'
then
	echo shar: "will not over-write existing file 'Berklib.c'"
else
cat << \SHAR_EOF > 'Berklib.c'
/*
 *	These are routines are needed by rdist, found in BSD, and generally
 *	not found in System V.
 */

# ifdef SYS5

# ifndef HAS_UTIMES
# include	<sys/time.h>
# include	<sys/types.h>
# include	<unistd.h>

utimes(file, tvp)
	char		*file;
	struct timeval	tvp[2];
{
	struct utimbuf utbuf;
	utbuf.actime = tvp[0].tv_sec;
	utbuf.modtime = tvp[1].tv_sec;
	return utime(file, &utbuf);
}
# endif /* HAS_UTIMES */

# ifndef HAS_RENAME
rename(from, to)
	char	*from, *to;
{
	unlink(to);
	if (link(from, to) < 0)
		return(-1);
	if (unlink(from) < 0)
		return(-1);
	return 0;
}
# endif /* HAS_RENAME */

# ifndef HAS_LSTAT
# include	<sys/types.h>
# include	<sys/stat.h>

lstat(path, buf)
	char		*path;
	struct	stat	*buf;
{
	return stat(path, buf);
}
# endif /* HAS_LSTAT */

# endif /* SYS5 */
SHAR_EOF
fi
if test -f 'patches'
then
	echo shar: "will not over-write existing file 'patches'"
else
cat << \SHAR_EOF > 'patches'
RCS file: RCS/Makefile,v
retrieving revision 1.1
diff -c -r1.1 Makefile
*** /tmp/,RCSt1a03695	Thu Aug 25 15:13:37 1988
--- Makefile	Thu Aug 25 14:56:36 1988
***************
*** 5,10
  #
  #	@(#)Makefile	5.1 (Berkeley) 6/6/85
  #
  RDIST = /usr/ucb/rdist
  DESTDIR=
  SRCS =	docmd.c expand.c gram.y lookup.c main.c server.c

--- 5,11 -----
  #
  #	@(#)Makefile	5.1 (Berkeley) 6/6/85
  #
+ # System 5 sites should look at Berklib.c
  RDIST = /usr/ucb/rdist
  # RSH is needed for System 5 machines only
  RSH=	/usr/ucb/rsh
***************
*** 6,11
  #	@(#)Makefile	5.1 (Berkeley) 6/6/85
  #
  RDIST = /usr/ucb/rdist
  DESTDIR=
  SRCS =	docmd.c expand.c gram.y lookup.c main.c server.c
  OBJS =	docmd.o expand.o gram.o lookup.o main.o server.o

--- 7,14 -----
  #
  # System 5 sites should look at Berklib.c
  RDIST = /usr/ucb/rdist
+ # RSH is needed for System 5 machines only
+ RSH=	/usr/ucb/rsh
  DESTDIR=
  SRCS =	docmd.c expand.c gram.y lookup.c main.c server.c Berklib.c regex.c
  OBJS =	docmd.o expand.o gram.o lookup.o main.o server.o Berklib.o regex.o
***************
*** 7,16
  #
  RDIST = /usr/ucb/rdist
  DESTDIR=
! SRCS =	docmd.c expand.c gram.y lookup.c main.c server.c
! OBJS =	docmd.o expand.o gram.o lookup.o main.o server.o
! LINT =	lint -ps
! CFLAGS= -O -DRDIST=\"${RDIST}\"
  
  rdist:	${OBJS}
  	${CC} -o rdist ${OBJS}

--- 10,23 -----
  # RSH is needed for System 5 machines only
  RSH=	/usr/ucb/rsh
  DESTDIR=
! SRCS =	docmd.c expand.c gram.y lookup.c main.c server.c Berklib.c regex.c
! OBJS =	docmd.o expand.o gram.o lookup.o main.o server.o Berklib.o regex.o
! LIBS =	-lbsd
! LINT =	lint
! #CFLAGS= -O -DRDIST=\"${RDIST}\"
! # the following is for System 5 machines
! CFLAGS= -O -DRDIST=\"${RDIST}\" \
! 	-DSYS5 -DHAS_RENAME -DHAS_LSTAT -DRSH=\"${RSH}\" -I/usr/include/bsd
  
  rdist:	${OBJS}
  	${CC} -o rdist ${OBJS} ${LIBS}
***************
*** 13,19
  CFLAGS= -O -DRDIST=\"${RDIST}\"
  
  rdist:	${OBJS}
! 	${CC} -o rdist ${OBJS}
  
  ${OBJS}:  defs.h
  

--- 20,26 -----
  	-DSYS5 -DHAS_RENAME -DHAS_LSTAT -DRSH=\"${RSH}\" -I/usr/include/bsd
  
  rdist:	${OBJS}
! 	${CC} -o rdist ${OBJS} ${LIBS}
  
  ${OBJS}:  defs.h
  
***************
*** 24,30
  	install -s -m 4751 rdist ${DESTDIR}${RDIST}
  
  lint:	docmd.c expand.c gram.c lookup.c main.c server.c
! 	${LINT} docmd.c expand.c gram.c lookup.c main.c server.c
  
  print:	${SRCS}
  	lpr -p ${SRCS} defs.h

--- 31,37 -----
  	install -s -m 4751 rdist ${DESTDIR}${RDIST}
  
  lint:	docmd.c expand.c gram.c lookup.c main.c server.c
! 	${LINT} ${CFLAGS} docmd.c expand.c gram.c lookup.c main.c server.c
  
  print:	${SRCS}
  	lpr -p ${SRCS} defs.h
RCS file: RCS/defs.h,v
retrieving revision 1.1
diff -c -r1.1 defs.h
*** /tmp/,RCSt1a03700	Thu Aug 25 15:13:38 1988
--- defs.h	Thu Aug 25 14:52:04 1988
***************
*** 17,22
  #include <sys/time.h>
  #include <netinet/in.h>
  
  /*
   * The version number should be changed whenever the protocol changes.
   */

--- 17,42 -----
  #include <sys/time.h>
  #include <netinet/in.h>
  
+ # ifdef SYS5
+ 	/* signal.h not included in sys/param.h */
+ # include <signal.h>
+ 	/* avoid conflict of stdio routine named tmpfile */
+ # define	tmpfile		rdtmpfile
+ 	/* get sys5 equivalent string functions */
+ # define	index		strchr
+ # define	rindex		strrchr
+ # include <memory.h>
+ # define	bzero(a,c)	memset(a,c,'\0')
+ # define	bcopy(a,b,c)	memcpy(b,a,c)
+ # define	bcmp		memcmp
+ 
+ extern	struct	passwd	*getpwent(), *getpwnam(), *getpwuid();
+ extern	struct	group	*getgrent(), *getgrnam(), *getgrgid();
+ # if !defined(HAS_LSTAT) && !defined(S_IFLNK)
+ # define	S_IFLNK		0120000
+ # endif
+ # endif
+ 
  /*
   * The version number should be changed whenever the protocol changes.
   */
***************
*** 110,115
  extern int options;		/* global options */
  
  extern int nerrs;		/* number of errors seen */
  extern int rem;			/* remote file descriptor */
  extern int iamremote;		/* acting as remote server */
  extern char tmpfile[];		/* file name for logging changes */

--- 130,138 -----
  extern int options;		/* global options */
  
  extern int nerrs;		/* number of errors seen */
+ # ifdef SYS5
+ extern int irem, orem;		/* remote file descriptor */
+ # else
  extern int rem;			/* remote file descriptor */
  # define	irem		rem
  # define	orem		rem
***************
*** 111,116
  
  extern int nerrs;		/* number of errors seen */
  extern int rem;			/* remote file descriptor */
  extern int iamremote;		/* acting as remote server */
  extern char tmpfile[];		/* file name for logging changes */
  extern struct linkbuf *ihead;	/* list of files with more than one link */

--- 134,142 -----
  extern int irem, orem;		/* remote file descriptor */
  # else
  extern int rem;			/* remote file descriptor */
+ # define	irem		rem
+ # define	orem		rem
+ # endif
  extern int iamremote;		/* acting as remote server */
  extern char tmpfile[];		/* file name for logging changes */
  extern struct linkbuf *ihead;	/* list of files with more than one link */
RCS file: RCS/docmd.c,v
retrieving revision 1.1
diff -c -r1.1 docmd.c
*** /tmp/,RCSt1a03705	Thu Aug 25 15:13:39 1988
--- docmd.c	Tue Aug 16 19:06:24 1988
***************
*** 175,181
  	if (debug)
  		printf("makeconn(%s)\n", rhost);
  
! 	if (cur_host != NULL && rem >= 0) {
  		if (strcmp(cur_host, rhost) == 0)
  			return(1);
  		closeconn();

--- 175,181 -----
  	if (debug)
  		printf("makeconn(%s)\n", rhost);
  
! 	if (cur_host != NULL && irem >= 0) {
  		if (strcmp(cur_host, rhost) == 0)
  			return(1);
  		closeconn();
***************
*** 199,204
  	if (!qflag)
  		printf("updating host %s\n", rhost);
  	(void) sprintf(buf, "%s -Server%s", RDIST, qflag ? " -q" : "");
  	if (port < 0) {
  		struct servent *sp;
  

--- 199,207 -----
  	if (!qflag)
  		printf("updating host %s\n", rhost);
  	(void) sprintf(buf, "%s -Server%s", RDIST, qflag ? " -q" : "");
+ #ifdef SYS5
+ 	dorsh(rhost, ruser, buf);
+ #else
  	if (port < 0) {
  		struct servent *sp;
  
***************
*** 216,222
  	setreuid(userid, 0);
  	rem = rcmd(&rhost, port, user, ruser, buf, 0);
  	setreuid(0, userid);
! 	if (rem < 0)
  		return(0);
  	cp = buf;
  	if (read(rem, cp, 1) != 1)

--- 219,226 -----
  	setreuid(userid, 0);
  	rem = rcmd(&rhost, port, user, ruser, buf, 0);
  	setreuid(0, userid);
! #endif /* !SYS5 */
! 	if (irem < 0)
  		return(0);
  	cp = buf;
  	if (read(irem, cp, 1) != 1)
***************
*** 219,225
  	if (rem < 0)
  		return(0);
  	cp = buf;
! 	if (read(rem, cp, 1) != 1)
  		lostconn();
  	if (*cp == 'V') {
  		do {

--- 223,229 -----
  	if (irem < 0)
  		return(0);
  	cp = buf;
! 	if (read(irem, cp, 1) != 1)
  		lostconn();
  	if (*cp == 'V') {
  		do {
***************
*** 223,229
  		lostconn();
  	if (*cp == 'V') {
  		do {
! 			if (read(rem, cp, 1) != 1)
  				lostconn();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  		*--cp = '\0';

--- 227,233 -----
  		lostconn();
  	if (*cp == 'V') {
  		do {
! 			if (read(irem, cp, 1) != 1)
  				lostconn();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  		*--cp = '\0';
***************
*** 248,257
  	if (debug)
  		printf("closeconn()\n");
  
! 	if (rem >= 0) {
! 		(void) write(rem, "\2\n", 2);
! 		(void) close(rem);
! 		rem = -1;
  	}
  }
  

--- 252,265 -----
  	if (debug)
  		printf("closeconn()\n");
  
! 	if (orem >= 0) {
! 		(void) write(orem, "\2\n", 2);
! 		(void) close(orem);
! 		orem = -1;
! # ifdef SYS5
! 		(void) close(irem);
! 		irem = -1;
! # endif
  	}
  }
  
***************
*** 577,579
  	}
  	return(0);
  }

--- 585,625 -----
  	}
  	return(0);
  }
+ 
+ # ifdef SYS5
+ 
+ dorsh(rhost, ruser, cmd)
+ 	char	*rhost, *ruser, *cmd;
+ {
+ 	int	pid, to_rsh_input[2], from_rsh_output[2];
+ 	char	*argv[5];
+ 
+ 	pipe(to_rsh_input);
+ 	pipe(from_rsh_output);
+ 	if ((pid = fork()) < 0)
+ 		return;
+ 	if (pid == 0) {
+ 		dup2(to_rsh_input[0], 0);
+ 		dup2(from_rsh_output[1], 1);
+ 		(void) close(to_rsh_input[0]);
+ 		(void) close(to_rsh_input[1]);
+ 		(void) close(from_rsh_output[0]);
+ 		(void) close(from_rsh_output[1]);
+ 
+ 		argv[0] = rhost;
+ 		argv[1] = "-l";
+ 		argv[2] = ruser;
+ 		argv[3] = cmd;
+ 		argv[4] = NULL;
+ 
+ 		execv(RSH, argv);
+ 		perror("execvp of rsh");
+ 		abort();
+ 		/* NOTREACHED */
+ 	}
+ 	irem = from_rsh_output[0];
+ 	orem = to_rsh_input[1];
+ 	(void) close(to_rsh_input[0]);
+ 	(void) close(from_rsh_output[1]);
+ }
+ #endif /* SYS5 */
RCS file: RCS/main.c,v
retrieving revision 1.1
diff -c -r1.1 main.c
*** /tmp/,RCSt1a03710	Thu Aug 25 15:13:40 1988
--- main.c	Tue Aug 16 19:06:23 1988
***************
*** 33,38
  int	iamremote;	/* act as remote server for transfering files */
  
  FILE	*fin = NULL;	/* input file pointer */
  int	rem = -1;	/* file descriptor to remote source/sink process */
  char	host[32];	/* host name */
  int	nerrs;		/* number of errors while sending/receiving */

--- 33,42 -----
  int	iamremote;	/* act as remote server for transfering files */
  
  FILE	*fin = NULL;	/* input file pointer */
+ # ifdef SYS5
+ int	irem = -1;	/* file descriptor to remote source/sink process */
+ int	orem = -1;	/* file descriptor to remote source/sink process */
+ # else
  int	rem = -1;	/* file descriptor to remote source/sink process */
  # endif
  char	host[32];	/* host name */
***************
*** 34,39
  
  FILE	*fin = NULL;	/* input file pointer */
  int	rem = -1;	/* file descriptor to remote source/sink process */
  char	host[32];	/* host name */
  int	nerrs;		/* number of errors while sending/receiving */
  char	user[10];	/* user's name */

--- 38,44 -----
  int	orem = -1;	/* file descriptor to remote source/sink process */
  # else
  int	rem = -1;	/* file descriptor to remote source/sink process */
+ # endif
  char	host[32];	/* host name */
  int	nerrs;		/* number of errors while sending/receiving */
  char	user[10];	/* user's name */
***************
*** 151,156
  	}
  	*hp = NULL;
  
  	setreuid(0, userid);
  	mktemp(tmpfile);
  

--- 156,162 -----
  	}
  	*hp = NULL;
  
+ #ifndef SYS5
  	setreuid(0, userid);
  #endif
  	mktemp(tmpfile);
***************
*** 152,157
  	*hp = NULL;
  
  	setreuid(0, userid);
  	mktemp(tmpfile);
  
  	if (iamremote) {

--- 158,164 -----
  
  #ifndef SYS5
  	setreuid(0, userid);
+ #endif
  	mktemp(tmpfile);
  
  	if (iamremote) {
RCS file: RCS/server.c,v
retrieving revision 1.1
diff -c -r1.1 server.c
*** /tmp/,RCSt1a03715	Thu Aug 25 15:13:42 1988
--- server.c	Thu Aug 25 14:52:09 1988
***************
*** 10,17
  
  #include "defs.h"
  
! #define	ack() 	(void) write(rem, "\0\n", 2)
! #define	err() 	(void) write(rem, "\1\n", 2)
  
  struct	linkbuf *ihead;		/* list of files with more than one link */
  char	buf[BUFSIZ];		/* general purpose buffer */

--- 10,17 -----
  
  #include "defs.h"
  
! #define	ack() 	(void) write(orem, "\0\n", 2)
! #define	err() 	(void) write(orem, "\1\n", 2)
  
  struct	linkbuf *ihead;		/* list of files with more than one link */
  char	buf[BUFSIZ];		/* general purpose buffer */
***************
*** 45,51
  	signal(SIGTERM, cleanup);
  	signal(SIGPIPE, cleanup);
  
! 	rem = 0;
  	oumask = umask(0);
  	(void) sprintf(buf, "V%d\n", VERSION);
  	(void) write(rem, buf, strlen(buf));

--- 45,54 -----
  	signal(SIGTERM, cleanup);
  	signal(SIGPIPE, cleanup);
  
! 	irem = 0;
! # ifdef SYS5
! 	orem = 1;
! # endif
  	oumask = umask(0);
  	(void) sprintf(buf, "V%d\n", VERSION);
  	(void) write(orem, buf, strlen(buf));
***************
*** 48,54
  	rem = 0;
  	oumask = umask(0);
  	(void) sprintf(buf, "V%d\n", VERSION);
! 	(void) write(rem, buf, strlen(buf));
  
  	for (;;) {
  		cp = cmdbuf;

--- 51,57 -----
  # endif
  	oumask = umask(0);
  	(void) sprintf(buf, "V%d\n", VERSION);
! 	(void) write(orem, buf, strlen(buf));
  
  	for (;;) {
  		cp = cmdbuf;
***************
*** 52,58
  
  	for (;;) {
  		cp = cmdbuf;
! 		if (read(rem, cp, 1) <= 0)
  			return;
  		if (*cp++ == '\n') {
  			error("server: expected control record\n");

--- 55,61 -----
  
  	for (;;) {
  		cp = cmdbuf;
! 		if (read(irem, cp, 1) <= 0)
  			return;
  		if (*cp++ == '\n') {
  			error("server: expected control record\n");
***************
*** 59,65
  			continue;
  		}
  		do {
! 			if (read(rem, cp, 1) != 1)
  				cleanup();
  		} while (*cp++ != '\n' && cp < &cmdbuf[BUFSIZ]);
  		*--cp = '\0';

--- 62,68 -----
  			continue;
  		}
  		do {
! 			if (read(irem, cp, 1) != 1)
  				cleanup();
  		} while (*cp++ != '\n' && cp < &cmdbuf[BUFSIZ]);
  		*--cp = '\0';
***************
*** 234,240
  	(void) sprintf(buf, "%c%s\n", destdir ? 'T' : 't', dest);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(rem, buf, strlen(buf));
  	if (response() < 0)
  		return;
  

--- 237,243 -----
  	(void) sprintf(buf, "%c%s\n", destdir ? 'T' : 't', dest);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(orem, buf, strlen(buf));
  	if (response() < 0)
  		return;
  
***************
*** 312,318
  			stb.st_mode & 07777, protoname(), protogroup(), rname);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(rem, buf, strlen(buf));
  		if (response() < 0) {
  			closedir(d);
  			return;

--- 315,321 -----
  			stb.st_mode & 07777, protoname(), protogroup(), rname);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(orem, buf, strlen(buf));
  		if (response() < 0) {
  			closedir(d);
  			return;
***************
*** 341,347
  			sendf(dp->d_name, opts);
  		}
  		closedir(d);
! 		(void) write(rem, "E\n", 2);
  		(void) response();
  		tp = otp;
  		*tp = '\0';

--- 344,350 -----
  			sendf(dp->d_name, opts);
  		}
  		closedir(d);
! 		(void) write(orem, "E\n", 2);
  		(void) response();
  		tp = otp;
  		*tp = '\0';
***************
*** 348,353
  		return;
  
  	case S_IFLNK:
  		if (u != 1)
  			opts |= COMPARE;
  		if (stb.st_nlink > 1) {

--- 351,359 -----
  		return;
  
  	case S_IFLNK:
+ # ifndef HAS_LSTAT
+ 		return;		/* should never happen */
+ # else
  		if (u != 1)
  			opts |= COMPARE;
  		if (stb.st_nlink > 1) {
***************
*** 363,369
  					lp->target, lp->pathname, rname);
  				if (debug)
  					printf("buf = %s", buf);
! 				(void) write(rem, buf, strlen(buf));
  				(void) response();
  				return;
  			}

--- 369,375 -----
  					lp->target, lp->pathname, rname);
  				if (debug)
  					printf("buf = %s", buf);
! 				(void) write(orem, buf, strlen(buf));
  				(void) response();
  				return;
  			}
***************
*** 373,379
  			protoname(), protogroup(), rname);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(rem, buf, strlen(buf));
  		if (response() < 0)
  			return;
  		sizerr = (readlink(target, buf, BUFSIZ) != stb.st_size);

--- 379,385 -----
  			protoname(), protogroup(), rname);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(orem, buf, strlen(buf));
  		if (response() < 0)
  			return;
  		sizerr = (readlink(target, buf, BUFSIZ) != stb.st_size);
***************
*** 377,383
  		if (response() < 0)
  			return;
  		sizerr = (readlink(target, buf, BUFSIZ) != stb.st_size);
! 		(void) write(rem, buf, stb.st_size);
  		if (debug)
  			printf("readlink = %.*s\n", stb.st_size, buf);
  		goto done;

--- 383,389 -----
  		if (response() < 0)
  			return;
  		sizerr = (readlink(target, buf, BUFSIZ) != stb.st_size);
! 		(void) write(orem, buf, stb.st_size);
  		if (debug)
  			printf("readlink = %.*s\n", stb.st_size, buf);
  		goto done;
***************
*** 381,386
  		if (debug)
  			printf("readlink = %.*s\n", stb.st_size, buf);
  		goto done;
  
  	case S_IFREG:
  		break;

--- 387,393 -----
  		if (debug)
  			printf("readlink = %.*s\n", stb.st_size, buf);
  		goto done;
+ # endif
  
  	case S_IFREG:
  		break;
***************
*** 411,417
  				lp->target, lp->pathname, rname);
  			if (debug)
  				printf("buf = %s", buf);
! 			(void) write(rem, buf, strlen(buf));
  			(void) response();
  			return;
  		}

--- 418,424 -----
  				lp->target, lp->pathname, rname);
  			if (debug)
  				printf("buf = %s", buf);
! 			(void) write(orem, buf, strlen(buf));
  			(void) response();
  			return;
  		}
***************
*** 426,432
  		protoname(), protogroup(), rname);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(rem, buf, strlen(buf));
  	if (response() < 0) {
  		(void) close(f);
  		return;

--- 433,439 -----
  		protoname(), protogroup(), rname);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(orem, buf, strlen(buf));
  	if (response() < 0) {
  		(void) close(f);
  		return;
***************
*** 438,444
  			amt = stb.st_size - i;
  		if (sizerr == 0 && read(f, buf, amt) != amt)
  			sizerr = 1;
! 		(void) write(rem, buf, amt);
  	}
  	(void) close(f);
  done:

--- 445,451 -----
  			amt = stb.st_size - i;
  		if (sizerr == 0 && read(f, buf, amt) != amt)
  			sizerr = 1;
! 		(void) write(orem, buf, amt);
  	}
  	(void) close(f);
  done:
***************
*** 462,468
  		(void) sprintf(buf, "SFILE=%s;%s\n", target, sc->sc_name);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(rem, buf, strlen(buf));
  		while (response() > 0)
  			;
  	}

--- 469,475 -----
  		(void) sprintf(buf, "SFILE=%s;%s\n", target, sc->sc_name);
  		if (debug)
  			printf("buf = %s", buf);
! 		(void) write(orem, buf, strlen(buf));
  		while (response() > 0)
  			;
  	}
***************
*** 521,527
  	(void) sprintf(buf, "Q%s\n", rname);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(rem, buf, strlen(buf));
  again:
  	cp = s = buf;
  	do {

--- 528,534 -----
  	(void) sprintf(buf, "Q%s\n", rname);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(orem, buf, strlen(buf));
  again:
  	cp = s = buf;
  	do {
***************
*** 525,531
  again:
  	cp = s = buf;
  	do {
! 		if (read(rem, cp, 1) != 1)
  			lostconn();
  	} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  

--- 532,538 -----
  again:
  	cp = s = buf;
  	do {
! 		if (read(irem, cp, 1) != 1)
  			lostconn();
  	} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  
***************
*** 612,618
  
  	if (lstat(target, &stb) < 0) {
  		if (errno == ENOENT)
! 			(void) write(rem, "N\n", 2);
  		else
  			error("%s:%s: %s\n", host, target, sys_errlist[errno]);
  		*tp = '\0';

--- 619,625 -----
  
  	if (lstat(target, &stb) < 0) {
  		if (errno == ENOENT)
! 			(void) write(orem, "N\n", 2);
  		else
  			error("%s:%s: %s\n", host, target, sys_errlist[errno]);
  		*tp = '\0';
***************
*** 622,628
  	switch (stb.st_mode & S_IFMT) {
  	case S_IFREG:
  		(void) sprintf(buf, "Y%ld %ld\n", stb.st_size, stb.st_mtime);
! 		(void) write(rem, buf, strlen(buf));
  		break;
  
  	case S_IFLNK:

--- 629,635 -----
  	switch (stb.st_mode & S_IFMT) {
  	case S_IFREG:
  		(void) sprintf(buf, "Y%ld %ld\n", stb.st_size, stb.st_mtime);
! 		(void) write(orem, buf, strlen(buf));
  		break;
  
  	case S_IFLNK:
***************
*** 627,633
  
  	case S_IFLNK:
  	case S_IFDIR:
! 		(void) write(rem, "Y\n", 2);
  		break;
  
  	default:

--- 634,640 -----
  
  	case S_IFLNK:
  	case S_IFDIR:
! 		(void) write(orem, "Y\n", 2);
  		break;
  
  	default:
***************
*** 724,730
  				(void) sprintf(buf + 1,
  					"%s: Warning: remote mode %o != local mode %o\n",
  					target, stb.st_mode & 07777, mode);
! 				(void) write(rem, buf, strlen(buf + 1) + 1);
  				return;
  			}
  			errno = ENOTDIR;

--- 731,737 -----
  				(void) sprintf(buf + 1,
  					"%s: Warning: remote mode %o != local mode %o\n",
  					target, stb.st_mode & 07777, mode);
! 				(void) write(orem, buf, strlen(buf + 1) + 1);
  				return;
  			}
  			errno = ENOTDIR;
***************
*** 756,761
  	if (type == S_IFLNK) {
  		int j;
  
  		ack();
  		cp = buf;
  		for (i = 0; i < size; i += j) {

--- 763,772 -----
  	if (type == S_IFLNK) {
  		int j;
  
+ # ifndef HAS_LSTAT
+ 		error("symbolic links are not supported");
+ 		return;
+ # else
  		ack();
  		cp = buf;
  		for (i = 0; i < size; i += j) {
***************
*** 759,765
  		ack();
  		cp = buf;
  		for (i = 0; i < size; i += j) {
! 			if ((j = read(rem, cp, size - i)) <= 0)
  				cleanup();
  			cp += j;
  		}

--- 770,776 -----
  		ack();
  		cp = buf;
  		for (i = 0; i < size; i += j) {
! 			if ((j = read(irem, cp, size - i)) <= 0)
  				cleanup();
  			cp += j;
  		}
***************
*** 787,792
  				goto differ;
  		}
  		goto fixup;
  	}
  
  	if ((f = creat(new, mode)) < 0) {

--- 798,804 -----
  				goto differ;
  		}
  		goto fixup;
+ # endif
  	}
  
  	if ((f = creat(new, mode)) < 0) {
***************
*** 804,810
  		if (i + amt > size)
  			amt = size - i;
  		do {
! 			int j = read(rem, cp, amt);
  
  			if (j <= 0) {
  				(void) close(f);

--- 816,822 -----
  		if (i + amt > size)
  			amt = size - i;
  		do {
! 			int j = read(irem, cp, amt);
  
  			if (j <= 0) {
  				(void) close(f);
***************
*** 860,866
  			(void) unlink(new);
  			buf[0] = '\0';
  			(void) sprintf(buf + 1, "need to update: %s\n",target);
! 			(void) write(rem, buf, strlen(buf + 1) + 1);
  			return;
  		}
  	}

--- 872,878 -----
  			(void) unlink(new);
  			buf[0] = '\0';
  			(void) sprintf(buf + 1, "need to update: %s\n",target);
! 			(void) write(orem, buf, strlen(buf + 1) + 1);
  			return;
  		}
  	}
***************
*** 889,895
  	if (opts & COMPARE) {
  		buf[0] = '\0';
  		(void) sprintf(buf + 1, "updated %s\n", target);
! 		(void) write(rem, buf, strlen(buf + 1) + 1);
  	} else
  		ack();
  }

--- 901,907 -----
  	if (opts & COMPARE) {
  		buf[0] = '\0';
  		(void) sprintf(buf + 1, "updated %s\n", target);
! 		(void) write(orem, buf, strlen(buf + 1) + 1);
  	} else
  		ack();
  }
***************
*** 1025,1030
  	} else
  		gid = gr->gr_gid;
  	if (userid && gid >= 0) {
  		if (gr) for (i = 0; gr->gr_mem[i] != NULL; i++)
  			if (!(strcmp(user, gr->gr_mem[i])))
  				goto ok;

--- 1037,1044 -----
  	} else
  		gid = gr->gr_gid;
  	if (userid && gid >= 0) {
+ 		if (pw && gid == pw->pw_gid)
+ 			goto ok;
  		if (gr) for (i = 0; gr->gr_mem[i] != NULL; i++)
  			if (!(strcmp(user, gr->gr_mem[i])))
  				goto ok;
***************
*** 1032,1037
  		gid = -1;
  	}
  ok:
  	if (userid)
  		setreuid(userid, 0);
  	if (chown(file, uid, gid) < 0 ||

--- 1046,1052 -----
  		gid = -1;
  	}
  ok:
+ #ifndef SYS5
  	if (userid)
  		setreuid(userid, 0);
  #endif
***************
*** 1034,1039
  ok:
  	if (userid)
  		setreuid(userid, 0);
  	if (chown(file, uid, gid) < 0 ||
  	    (mode & 06000) && chmod(file, mode) < 0) {
  		note("%s: chown or chmod failed: file %s:  %s",

--- 1049,1055 -----
  #ifndef SYS5
  	if (userid)
  		setreuid(userid, 0);
+ #endif
  	if (chown(file, uid, gid) < 0 ||
  	    (mode & 06000) && chmod(file, mode) < 0) {
  		note("%s: chown or chmod failed: file %s:  %s",
***************
*** 1039,1044
  		note("%s: chown or chmod failed: file %s:  %s",
  			     host, file, sys_errlist[errno]);
  	}
  	if (userid)
  		setreuid(0, userid);
  	return(0);

--- 1055,1061 -----
  		note("%s: chown or chmod failed: file %s:  %s",
  			     host, file, sys_errlist[errno]);
  	}
+ #ifndef SYS5
  	if (userid)
  		setreuid(0, userid);
  #endif
***************
*** 1041,1046
  	}
  	if (userid)
  		setreuid(0, userid);
  	return(0);
  }
  

--- 1058,1064 -----
  #ifndef SYS5
  	if (userid)
  		setreuid(0, userid);
+ #endif
  	return(0);
  }
  
***************
*** 1063,1069
  	(void) sprintf(buf, "C%o\n", opts & VERIFY);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(rem, buf, strlen(buf));
  	if (response() < 0)
  		return;
  	for (;;) {

--- 1081,1087 -----
  	(void) sprintf(buf, "C%o\n", opts & VERIFY);
  	if (debug)
  		printf("buf = %s", buf);
! 	(void) write(orem, buf, strlen(buf));
  	if (response() < 0)
  		return;
  	for (;;) {
***************
*** 1069,1075
  	for (;;) {
  		cp = s = buf;
  		do {
! 			if (read(rem, cp, 1) != 1)
  				lostconn();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  

--- 1087,1093 -----
  	for (;;) {
  		cp = s = buf;
  		do {
! 			if (read(irem, cp, 1) != 1)
  				lostconn();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  
***************
*** 1085,1091
  			if (debug)
  				printf("check %s\n", target);
  			if (except(target))
! 				(void) write(rem, "N\n", 2);
  			else if (lstat(target, &stb) < 0)
  				(void) write(rem, "Y\n", 2);
  			else

--- 1103,1109 -----
  			if (debug)
  				printf("check %s\n", target);
  			if (except(target))
! 				(void) write(orem, "N\n", 2);
  			else if (lstat(target, &stb) < 0)
  				(void) write(orem, "Y\n", 2);
  			else
***************
*** 1087,1093
  			if (except(target))
  				(void) write(rem, "N\n", 2);
  			else if (lstat(target, &stb) < 0)
! 				(void) write(rem, "Y\n", 2);
  			else
  				(void) write(rem, "N\n", 2);
  			break;

--- 1105,1111 -----
  			if (except(target))
  				(void) write(orem, "N\n", 2);
  			else if (lstat(target, &stb) < 0)
! 				(void) write(orem, "Y\n", 2);
  			else
  				(void) write(orem, "N\n", 2);
  			break;
***************
*** 1089,1095
  			else if (lstat(target, &stb) < 0)
  				(void) write(rem, "Y\n", 2);
  			else
! 				(void) write(rem, "N\n", 2);
  			break;
  
  		case '\0':

--- 1107,1113 -----
  			else if (lstat(target, &stb) < 0)
  				(void) write(orem, "Y\n", 2);
  			else
! 				(void) write(orem, "N\n", 2);
  			break;
  
  		case '\0':
***************
*** 1172,1178
  			continue;
  		}
  		(void) sprintf(buf, "Q%s\n", dp->d_name);
! 		(void) write(rem, buf, strlen(buf));
  		cp = buf;
  		do {
  			if (read(rem, cp, 1) != 1)

--- 1190,1196 -----
  			continue;
  		}
  		(void) sprintf(buf, "Q%s\n", dp->d_name);
! 		(void) write(orem, buf, strlen(buf));
  		cp = buf;
  		do {
  			if (read(irem, cp, 1) != 1)
***************
*** 1175,1181
  		(void) write(rem, buf, strlen(buf));
  		cp = buf;
  		do {
! 			if (read(rem, cp, 1) != 1)
  				cleanup();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  		*--cp = '\0';

--- 1193,1199 -----
  		(void) write(orem, buf, strlen(buf));
  		cp = buf;
  		do {
! 			if (read(irem, cp, 1) != 1)
  				cleanup();
  		} while (*cp++ != '\n' && cp < &buf[BUFSIZ]);
  		*--cp = '\0';
***************
*** 1186,1192
  			cp = buf;
  			*cp++ = '\0';
  			(void) sprintf(cp, "need to remove: %s\n", target);
! 			(void) write(rem, buf, strlen(cp) + 1);
  		} else
  			remove(&stb);
  	}

--- 1204,1210 -----
  			cp = buf;
  			*cp++ = '\0';
  			(void) sprintf(cp, "need to remove: %s\n", target);
! 			(void) write(orem, buf, strlen(cp) + 1);
  		} else
  			remove(&stb);
  	}
***************
*** 1191,1197
  			remove(&stb);
  	}
  	closedir(d);
! 	(void) write(rem, "E\n", 2);
  	(void) response();
  	tp = otp;
  	*tp = '\0';

--- 1209,1215 -----
  			remove(&stb);
  	}
  	closedir(d);
! 	(void) write(orem, "E\n", 2);
  	(void) response();
  	tp = otp;
  	*tp = '\0';
***************
*** 1263,1269
  	cp = buf;
  	*cp++ = '\0';
  	(void) sprintf(cp, "removed %s\n", target);
! 	(void) write(rem, buf, strlen(cp) + 1);
  }
  
  /*

--- 1281,1287 -----
  	cp = buf;
  	*cp++ = '\0';
  	(void) sprintf(cp, "removed %s\n", target);
! 	(void) write(orem, buf, strlen(cp) + 1);
  }
  
  /*
***************
*** 1317,1323
  				s--;
  				continue;
  			}
! 			(void) write(rem, sbuf, s - sbuf);
  			s = &sbuf[1];
  		} while (--i);
  	}

--- 1335,1341 -----
  				s--;
  				continue;
  			}
! 			(void) write(orem, sbuf, s - sbuf);
  			s = &sbuf[1];
  		} while (--i);
  	}
***************
*** 1323,1329
  	}
  	if (s > &sbuf[1]) {
  		*s++ = '\n';
! 		(void) write(rem, sbuf, s - sbuf);
  	}
  	while ((i = wait(&status)) != pid && i != -1)
  		;

--- 1341,1347 -----
  	}
  	if (s > &sbuf[1]) {
  		*s++ = '\n';
! 		(void) write(orem, sbuf, s - sbuf);
  	}
  	while ((i = wait(&status)) != pid && i != -1)
  		;
***************
*** 1363,1369
  		fflush(stdout);
  		(void) write(2, buf+1, strlen(buf+1));
  	} else
! 		(void) write(rem, buf, strlen(buf));
  	if (lfp != NULL)
  		(void) fwrite(buf+1, 1, strlen(buf+1), lfp);
  }

--- 1381,1387 -----
  		fflush(stdout);
  		(void) write(2, buf+1, strlen(buf+1));
  	} else
! 		(void) write(orem, buf, strlen(buf));
  	if (lfp != NULL)
  		(void) fwrite(buf+1, 1, strlen(buf+1), lfp);
  }
***************
*** 1380,1386
  		fflush(stdout);
  		(void) write(2, buf+1, strlen(buf+1));
  	} else
! 		(void) write(rem, buf, strlen(buf));
  	if (lfp != NULL)
  		(void) fwrite(buf+1, 1, strlen(buf+1), lfp);
  	cleanup();

--- 1398,1404 -----
  		fflush(stdout);
  		(void) write(2, buf+1, strlen(buf+1));
  	} else
! 		(void) write(orem, buf, strlen(buf));
  	if (lfp != NULL)
  		(void) fwrite(buf+1, 1, strlen(buf+1), lfp);
  	cleanup();
***************
*** 1396,1402
  
  	cp = s = resp;
  	do {
! 		if (read(rem, cp, 1) != 1)
  			lostconn();
  	} while (*cp++ != '\n' && cp < &resp[BUFSIZ]);
  

--- 1414,1420 -----
  
  	cp = s = resp;
  	do {
! 		if (read(irem, cp, 1) != 1)
  			lostconn();
  	} while (*cp++ != '\n' && cp < &resp[BUFSIZ]);
  
***************
*** 1453,1460
  char *s;
  {
  	char c = '\3';
! 	write(rem, &c, 1);
! 	write(rem, s, strlen(s));
  	c = '\n';
  	write(rem, &c, 1);
  }

--- 1471,1478 -----
  char *s;
  {
  	char c = '\3';
! 	write(orem, &c, 1);
! 	write(orem, s, strlen(s));
  	c = '\n';
  	write(orem, &c, 1);
  }
***************
*** 1456,1460
  	write(rem, &c, 1);
  	write(rem, s, strlen(s));
  	c = '\n';
! 	write(rem, &c, 1);
  }

--- 1474,1478 -----
  	write(orem, &c, 1);
  	write(orem, s, strlen(s));
  	c = '\n';
! 	write(orem, &c, 1);
  }
SHAR_EOF
fi
exit 0
#	End of shell archive

oz@yunexus.UUCP (Ozan Yigit) (09/07/88)

Sources for rdist is generally available under new BSD source
policy, but regex lib may not be. Pd version of regex library
has been written and posted many moons ago. If you do not have
it, just ask.

oz
-- 
Crud that is not paged	        | Usenet: ...!utzoo!yunexus!oz
is still crud. 			|   ...uunet!mnetor!yunexus!oz
	andrew@alice		| Bitnet: oz@[yulibra|yuyetti]
				| Phonet: +1 416 736-5257x3976