diffs to run rdist on System 5 machines
Greg Couch
gregc at cgl.ucsf.edu
Sat Aug 27 07:26:32 AEST 1988
#! /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 at 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
More information about the Alt.sources
mailing list