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 archiveoz@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