Apply ports/net/sup/patches/patch-aa...

This commit is contained in:
Peter Wemm 1995-12-26 05:03:11 +00:00
parent d14071a4b3
commit 4e28088593
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13025
19 changed files with 701 additions and 162 deletions

View File

@ -42,13 +42,14 @@
#
SITE = NETBSD
#SITE = CMUCS
RENAMELOG = \"/usr/local/etc/sup.moved\"
NETBSD_DEFINES = -UMACH -DVAR_TMP -DHAS_DAEMON
AFS_DEFINES = -DAFS -I/usr/afsws/include
OSF_DEFINES = -UMACH -DOSF -D_BSD -noshrlib -g -DNEED_VSNPRINTF -DVAR_TMP
CMUCS_DEFINES = -DMACH -DDOPRINT_VA -DNEED_VPRINTF
NON_MACH_DEFINES = -UMACH
#DEFS = -UCMUCS -UCMU ${${SITE}_DEFINES}
DEFS = -UCMUCS -UCMU ${NETBSD_DEFINES}
DEFS = -UCMUCS -UCMU ${NETBSD_DEFINES} -DRENAMELOG=${RENAMELOG}
#INSTALLATION PARAMETERS
NETBSD_BINDIR = /usr/local/bin
@ -60,8 +61,9 @@ CFLAGS = ${DEFS} -O -I.
SUPCL = supcmain.o supcvers.o supcparse.o supcname.o \
supcmisc.o supcmeat.o
SUPS = scm.o scmio.o stree.o log.o supmsg.o netcrypt.o
EXTRA = atoo.o errmsg.o expand.o ffilecopy.o filecopy.o nxtarg.o \
path.o quit.o run.o salloc.o skipto.o vprintf.o
EXTRA = atoo.o errmsg.o expand.o ffilecopy.o filecopy.o \
nxtarg.o path.o quit.o run.o salloc.o skipto.o \
vprintf.o
PROGRAMS = sup supscan supfilesrv
@ -76,9 +78,9 @@ USE_CRYPT = yes
.endif
.if defined(USE_CRYPT)
NETBSD_LIBS = -lcrypt -lutil
NETBSD_LIBS = -lcipher -lcrypt -lutil
.else
NETBSD_LIBS = -lutil
NETBSD_LIBS = -lcrypt -lutil
.endif
CMUCS_LIBS = -lsys
OSF_LIBS = -lbsd

View File

@ -58,7 +58,7 @@ FILE *here, *there;
if (fflush (there) == EOF) /* flush pending output */
return (EOF);
#ifdef __386BSD__
#ifdef __FreeBSD__
if ((here->_r) > 0) { /* flush buffered input */
i = write (therefile, here->_p, here->_r);
if (i != here->_r) return (EOF);
@ -76,7 +76,7 @@ FILE *here, *there;
i = filecopy (herefile, therefile); /* fast file copy */
if (i < 0) return (EOF);
#ifdef __386BSD__
#ifdef __FreeBSD__
(here->_flags) |= __SEOF; /* indicate EOF */
#else
(here->_flag) |= _IOEOF; /* indicate EOF */

View File

@ -26,6 +26,11 @@
**********************************************************************
* HISTORY
* $Log: libc.h,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:33 jkh
* Current sup with compression support.
*
@ -81,6 +86,10 @@
#ifndef _LIBC_H_
#define _LIBC_H_ 1
#if defined(__hpux)
#define __P(x) x
#endif
#ifndef _TYPES_
#include <sys/types.h>
#endif /* _TYPES_ */
@ -195,6 +204,26 @@ typedef int (*PFI)();
#if defined(c_plusplus)
typedef int (*PFI2)(...);
#endif /* c_plusplus */
#if defined(__hpux)
extern int utimes(char *, struct timeval *);
#ifndef LOCK_SH
#define LOCK_SH 1
#endif
#ifndef LOCK_EX
#define LOCK_EX 2
#endif
#ifndef LOCK_NB
#define LOCK_NB 4
#endif
#ifndef LOCK_UN
#define LOCK_UN 8
#endif
extern int flock(int, int);
#endif /* __hpux */
#if 0
extern void abort(void);
extern int abs(int);

View File

@ -27,6 +27,11 @@
**********************************************************************
* HISTORY
* $Log: log.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:33 jkh
* Current sup with compression support.
*
@ -52,8 +57,13 @@
*/
#include <stdio.h>
#ifdef __hpux
#include <syslog.h>
#include <stdlib.h>
#else
#include <sys/syslog.h>
#include <c.h>
#endif
#if __STDC__
#include <stdarg.h>
#else
@ -72,7 +82,7 @@ logopen(program)
char *program;
{
if (opened) return;
openlog(program,LOG_PID,LOG_DAEMON);
openlog(program,LOG_PID,LOG_LOCAL1);
opened++;
}

View File

@ -47,6 +47,11 @@
**********************************************************************
* HISTORY
* $Log: run.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:33 jkh
* Current sup with compression support.
*
@ -95,6 +100,7 @@
#include <signal.h>
#include <sys/wait.h>
#include <varargs.h>
#define MAXARGS 100
static int dorun();
@ -123,10 +129,14 @@ va_dcl
{
int val;
va_list ap;
char *args[MAXARGS];
int argno=0;
va_start(ap);
val = runvp (name,ap);
while (argno < MAXARGS
&& (args[argno++] = va_arg(ap, char *)) != (char *)0);
va_end(ap);
val = runvp (name,args);
return (val);
}

View File

@ -28,6 +28,11 @@
**********************************************************************
* HISTORY
* $Log: scan.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:33 jkh
* Current sup with compression support.
*
@ -122,13 +127,13 @@ static char *options[] = {
typedef enum { /* <collection>/list file lines */
LUPGRADE, LOMIT, LBACKUP, LEXECUTE,
LINCLUDE, LNOACCT, LOMITANY, LALWAYS,
LSYMLINK, LRSYMLINK
LSYMLINK, LRSYMLINK, LRENAME
} LISTTYPE;
static char *ltname[] = {
"upgrade", "omit", "backup", "execute",
"include", "noaccount", "omitany", "always",
"symlink", "rsymlink",
"symlink", "rsymlink", "rename",
0
};
@ -365,9 +370,11 @@ register TREE *t;
if (newonly && (t->Tflags&FNEW) == 0)
return (SCMOK);
newt = Tinsert (&listT,t->Tname,FALSE);
newt = Tinsert (&listT,t->Tname,t->Tflags&FRENAME ? TRUE : FALSE);
if (newt == NULL)
return (SCMOK);
if(t->Tnewname)
newt->Tnewname = salloc(t->Tnewname);
newt->Tmode = t->Tmode;
newt->Tflags = t->Tflags;
newt->Tmtime = t->Tmtime;
@ -473,6 +480,10 @@ char *fname;
case LUPGRADE:
t = &upgT;
break;
case LRENAME:
t = &flagsT;
flags = FRENAME;
break;
case LBACKUP:
t = &flagsT;
flags = FBACKUP;
@ -522,7 +533,7 @@ char *fname;
if (*q == 0)
_argbreak = ')';
else
expTinsert (q,&execT,0,r);
expTinsert (q,&execT,0,r,NULL);
} while (_argbreak != ')');
continue;
}
@ -533,22 +544,37 @@ char *fname;
while (*(q=nxtarg(&p," \t"))) {
if (lt == LOMITANY)
(void) Tinsert (t,q,FALSE);
else if( lt == LRENAME )
if(*(r=nxtarg(&p," \t")))
{
expTinsert (q,t,flags,(char *)NULL,r);
/*
* Omit the file it is being
* renamed to, to avoid confusion
*/
expTinsert (r,&omitT,0,
(char *)NULL, (char *)NULL);
}
else
printf("Rename %s without destination "
"file. Skipping...\n", q);
else
expTinsert (q,t,flags,(char *)NULL);
expTinsert (q,t,flags,(char *)NULL,(char *)NULL);
}
}
(void) fclose (f);
}
static
expTinsert (p,t,flags,exec)
expTinsert (p,t,flags,exec, q)
char *p;
char *q;
TREE **t;
int flags;
char *exec;
{
register int n, i;
register TREE *newt;
register TREE *newt, *ts;
char *speclist[SPECNUMBER];
char buf[STRINGLENGTH];
@ -557,18 +583,25 @@ char *exec;
newt = Tinsert (t,speclist[i],TRUE);
newt->Tflags |= flags;
if (exec) {
(void) sprintf (buf,exec,speclist[i]);
if((ts = Tsearch(flagsT, speclist[i]))
&& ts->Tflags&FRENAME)
(void) sprintf (buf,exec,ts->Tnewname);
else
(void) sprintf (buf,exec,speclist[i]);
(void) Tinsert (&newt->Texec,buf,FALSE);
}
if (q)
newt->Tnewname = salloc(q);
free (speclist[i]);
}
}
static
listone (t) /* expand and add one name from upgrade list */
listone(t) /* expand and add one name from upgrade list */
TREE *t;
{
listentry(t->Tname,t->Tname,(char *)NULL,(t->Tflags&FALWAYS) != 0);
listentry(t->Tname,t->Tname,(char *)NULL,
(t->Tflags&FALWAYS) != 0);
return (SCMOK);
}
@ -644,8 +677,11 @@ register struct stat *st;
t->Tctime = st->st_ctime;
t->Tmtime = st->st_mtime;
if (new) t->Tflags |= FNEW;
if (ts = Tsearch (flagsT,name))
if (ts = Tsearch (flagsT,name)){
t->Tflags |= ts->Tflags;
if(t->Tflags&FRENAME)
t->Tnewname = salloc(ts->Tnewname);
}
if (ts = Tsearch (execT,name)) {
t->Texec = ts->Texec;
ts->Texec = NULL;
@ -831,6 +867,10 @@ char *scanfile;
p++;
ts.Tflags |= FNOACCT;
}
if (*p == 'R') {
p++;
ts.Tflags |= FRENAME;
}
if ((q = index (p,' ')) == NULL)
goaway ("scanfile format inconsistant");
*q++ = '\0';
@ -845,6 +885,15 @@ char *scanfile;
goaway ("scanfile format inconsistant");
*q++ = 0;
ts.Tmtime = atoi (p);
p = q;
ts.Tnewname = NULL;
if (ts.Tflags & FRENAME){
if ((q = index (p,' ')) == NULL)
goaway ("scanfile format inconsistant");
*q++ = '\0';
ts.Tnewname = salloc(q);
q = p;
}
if (ts.Tctime > lasttime)
ts.Tflags |= FNEW;
else if (newonly) {
@ -863,6 +912,7 @@ char *scanfile;
t->Tflags = ts.Tflags;
t->Tctime = ts.Tctime;
t->Tmtime = ts.Tmtime;
t->Tnewname = ts.Tnewname;
}
(void) fclose (f);
return (TRUE);
@ -925,8 +975,14 @@ FILE **scanF;
if (t->Tflags&FBACKUP) fprintf (*scanF,"B");
if (t->Tflags&FNOACCT) fprintf (*scanF,"N");
fprintf (*scanF,"%o %d %d %s\n",
if (t->Tflags&FRENAME) fprintf (*scanF,"R");
fprintf (*scanF,"%o %d %d",
t->Tmode,t->Tctime,t->Tmtime,t->Tname);
if ( t->Tflags&FRENAME)
fprintf (*scanF," %s %s\n",t->Tname, t->Tnewname);
else
fprintf (*scanF," %s\n", t->Tname);
(void) Tprocess (t->Texec,recordexec,*scanF);
return (SCMOK);
}

View File

@ -69,6 +69,11 @@
* since Tahoe version of <netinet/in.h> does not define them.
*
* $Log: scm.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.2 1994/06/20 06:04:04 rgrimes
* Humm.. they did a lot of #if __STDC__ but failed to properly prototype
* the code. Also fixed one bad argument to a wait3 call.
@ -208,7 +213,7 @@ char scmversion[] = "4.3 BSD";
* PROTOTYPES
*/
#if __STDC__
int scmerr __P((int, char *,...));
int scmerr __P((int, FILE *, char *,...));
#endif
/*************************
*** M A C R O S ***
@ -245,31 +250,31 @@ char *server;
int one = 1;
if (myhost () == NULL)
return (scmerr (-1,"Local hostname not known"));
return (scmerr (-1, stderr, "Local hostname not known"));
if ((sp = getservbyname(server,"tcp")) == 0) {
if (strcmp(server, FILEPORT) == 0)
port = htons((u_short)FILEPORTNUM);
else if (strcmp(server, DEBUGFPORT) == 0)
port = htons((u_short)DEBUGFPORTNUM);
else
return (scmerr (-1,"Can't find %s server description",server));
(void) scmerr (-1,"%s/tcp: unknown service: using port %d",
return (scmerr (-1, stderr, "Can't find %s server description",server));
(void) scmerr (-1, stderr, "%s/tcp: unknown service: using port %d",
server,port);
} else
port = sp->s_port;
endservent ();
sock = socket (AF_INET,SOCK_STREAM,0);
if (sock < 0)
return (scmerr (errno,"Can't create socket for connections"));
return (scmerr (errno, stderr, "Can't create socket for connections"));
if (setsockopt (sock,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(int)) < 0)
(void) scmerr (errno,"Can't set SO_REUSEADDR socket option");
(void) scmerr (errno, stderr, "Can't set SO_REUSEADDR socket option");
(void) bzero ((char *)&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = port;
if (bind (sock,(struct sockaddr *)&sin,sizeof(sin)) < 0)
return (scmerr (errno,"Can't bind socket for connections"));
return (scmerr (errno, stderr, "Can't bind socket for connections"));
if (listen (sock,NCONNECTS) < 0)
return (scmerr (errno,"Can't listen on socket"));
return (scmerr (errno, stderr, "Can't listen on socket"));
return (SCMOK);
}
@ -284,16 +289,16 @@ service ()
netfile = accept (sock,(struct sockaddr *)&from,&len);
} while (netfile < 0 && errno == EINTR);
if (netfile < 0)
return (scmerr (errno,"Can't accept connections"));
return (scmerr (errno, stderr, "Can't accept connections"));
remoteaddr = from.sin_addr;
if (read(netfile,(char *)&x,sizeof(int)) != sizeof(int))
return (scmerr (errno,"Can't transmit data on connection"));
return (scmerr (errno, stderr, "Can't transmit data on connection"));
if (x == 0x01020304)
swapmode = 0;
else if (x == 0x04030201)
swapmode = 1;
else
return (scmerr (-1,"Unexpected byteswap mode %x",x));
return (scmerr (-1, stderr, "Unexpected byteswap mode %x",x));
return (SCMOK);
}
@ -354,7 +359,7 @@ int *t,*b;
s = *t;
*t -= s;
}
(void) scmerr (-1,"Will retry in %d seconds",s);
(void) scmerr (-1, stdout, "Will retry in %d seconds",s);
sleep (s);
return (1);
}
@ -376,9 +381,9 @@ int *retry;
else if (strcmp(server, DEBUGFPORT) == 0)
port = htons((u_short)DEBUGFPORTNUM);
else
return (scmerr (-1,"Can't find %s server description",
return (scmerr (-1, stderr, "Can't find %s server description",
server));
(void) scmerr (-1,"%s/tcp: unknown service: using port %d",
(void) scmerr (-1, stderr, "%s/tcp: unknown service: using port %d",
server,port);
} else
port = sp->s_port;
@ -387,7 +392,7 @@ int *retry;
sin.sin_addr.s_addr = inet_addr (hostname);
if (sin.sin_addr.s_addr == (u_long) INADDR_NONE) {
if ((h = gethostbyname (hostname)) == NULL)
return (scmerr (-1,"Can't find host entry for %s",
return (scmerr (-1, stderr, "Can't find host entry for %s",
hostname));
hostname = h->h_name;
(void) bcopy (h->h_addr,(char *)&sin.sin_addr,h->h_length);
@ -397,11 +402,11 @@ int *retry;
for (;;) {
netfile = socket (AF_INET,SOCK_STREAM,0);
if (netfile < 0)
return (scmerr (errno,"Can't create socket"));
return (scmerr (errno, stderr, "Can't create socket"));
tin = sin;
if (connect(netfile,(struct sockaddr *)&tin,sizeof(tin)) >= 0)
break;
(void) scmerr (errno,"Can't connect to server for %s",server);
(void) scmerr (errno, stderr, "Can't connect to server for %s",server);
(void) close(netfile);
if (!dobackoff (retry,&backoff))
return (SCMERR);
@ -522,6 +527,8 @@ char *name;
struct hostent *h;
struct in_addr addr;
char **ap;
if(!strcmp(name,"*"))
return (1);
if ((addr.s_addr = inet_addr(name)) != (u_long) INADDR_NONE)
return (addr.s_addr == remoteaddr.s_addr);
if ((h = gethostbyname (name)) == 0)
@ -535,7 +542,7 @@ char *name;
}
#if __STDC__
int scmerr (int errno,char *fmt,...)
int scmerr (int errno,FILE *filedes,char *fmt,...)
#else
/*VARARGS*//*ARGSUSED*/
int scmerr (va_alist)
@ -544,15 +551,16 @@ va_dcl
{
#if !__STDC__
int errno;
FILE *filedes;
char *fmt;
#endif
va_list ap;
(void) fflush (stdout);
(void) fflush (filedes);
if (progpid > 0)
fprintf (stderr,"%s %d: ",program,progpid);
fprintf (filedes,"%s %d: ",program,progpid);
else
fprintf (stderr,"%s: ",program);
fprintf (filedes,"%s: ",program);
#if __STDC__
va_start(ap,fmt);
#else
@ -560,13 +568,13 @@ va_dcl
errno = va_arg(ap,int);
fmt = va_arg(ap,char *);
#endif
vfprintf(stderr, fmt, ap);
vfprintf(filedes, fmt, ap);
va_end(ap);
if (errno >= 0)
fprintf (stderr,": %s\n",errmsg(errno));
fprintf (filedes,": %s\n",errmsg(errno));
else
fprintf (stderr,"\n");
(void) fflush (stderr);
fprintf (filedes,"\n");
(void) fflush (filedes);
return (SCMERR);
}

View File

@ -109,6 +109,11 @@
**********************************************************************
* HISTORY
* $Log: scmio.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:33 jkh
* Current sup with compression support.
*
@ -249,13 +254,13 @@ char *data;
}
if (x <= 0) {
if (errno == EPIPE)
return (scmerr (-1,"Network write timed out"));
return (scmerr (-1,stderr,"Network write timed out"));
if (errno)
return (scmerr (errno,"Write error on network"));
return (scmerr (-1,"Write retries failed"));
return (scmerr (errno,stderr,"Write error on network"));
return (scmerr (-1,stderr,"Write retries failed"));
}
if (x != count)
return (scmerr (-1,"Write error on network returned %d on write of %d",x,count));
return (scmerr (-1,stderr,"Write error on network returned %d on write of %d",x,count));
return (SCMOK);
}
@ -280,7 +285,7 @@ int msg;
if (scmdebug > 1)
loginfo ("SCM Writing message %d",msg);
if (bufptr)
return (scmerr (-1,"Buffering already enabled"));
return (scmerr (-1,stderr,"Buffering already enabled"));
bufptr = buffers;
bufptr->b_ptr = bufptr->b_data;
bufptr->b_cnt = 0;
@ -298,7 +303,7 @@ writemend () /* write end of message */
x = writedata (sizeof(int),(char *)&x);
if (x != SCMOK) return (x);
if (bufptr == NULL)
return (scmerr (-1,"Buffering already disabled"));
return (scmerr (-1,stderr,"Buffering already disabled"));
if (bufptr->b_cnt == 0) {
bufptr = NULL;
return (SCMOK);
@ -351,7 +356,7 @@ int f;
struct stat statbuf;
if (fstat(f,&statbuf) < 0)
return (scmerr (errno,"Can't access open file for message"));
return (scmerr (errno,stderr,"Can't access open file for message"));
filesize = statbuf.st_size;
y = byteswap(filesize);
x = writedata (sizeof(int),(char *)&y);
@ -375,9 +380,9 @@ int f;
} while (x == SCMOK && number > 0);
}
if (sum != filesize)
return (scmerr (-1,"File size error on output message"));
return (scmerr (-1,stderr,"File size error on output message"));
if (number < 0)
return (scmerr (errno,"Read error on file output message"));
return (scmerr (errno,stderr,"Read error on file output message"));
return (x);
}
@ -431,7 +436,7 @@ char *data;
if (count < 0) {
if (bufptr + count < buffer)
return (scmerr (-1,"No space in buffer %d",count));
return (scmerr (-1,stderr,"No space in buffer %d",count));
bufptr += count;
bufcnt -= count;
bcopy (data,bufptr,-count);
@ -463,16 +468,21 @@ char *data;
tries = 0;
for (;;) {
imask = 1 << netfile;
#if defined(__hpux)
if (select(32,&imask,(int *)0,(int *)0,&timout) < 0)
#else
if (select(32,(fd_set *)&imask,(fd_set *)0,(fd_set *)0,&timout) < 0)
#endif
imask = 1;
errno = 0;
if (imask)
x = read (netfile,p,n);
else
return (scmerr (-1,"Timeout on network input"));
return (scmerr (-1,stderr,"Timeout on network input"));
if (x > 0) break;
if (x == 0)
return (scmerr (-1,"Premature EOF on network input"));
return (scmerr (-1,stderr,"Premature EOF on network "
"input"));
if (errno) break;
if (++tries > RETRIES) break;
if (scmdebug > 0)
@ -480,8 +490,8 @@ char *data;
}
if (x < 0) {
if (errno)
return (scmerr (errno,"Read error on network"));
return (scmerr (-1,"Read retries failed"));
return (scmerr (errno,stderr,"Read error on network"));
return (scmerr (-1,stderr,"Read retries failed"));
}
p += x;
n -= x;
@ -538,7 +548,7 @@ int msg; /* if message is unexpected, send back SCMHUH */
/* check for MSGGOAWAY in case he noticed problems first */
if (m != MSGGOAWAY)
return (scmerr (-1,"Received unexpected message %d",m));
return (scmerr (-1,stderr,"Received unexpected message %d",m));
(void) netcrypt ((char *)NULL);
(void) readstring (&goawayreason);
(void) readmend ();
@ -555,7 +565,7 @@ readmend ()
x = readdata (sizeof(int),(char *)&y);
y = byteswap(y);
if (x == SCMOK && y != ENDCOUNT)
return (scmerr (-1,"Error reading end of message"));
return (scmerr (-1,stderr,"Error reading end of message"));
return (x);
}
@ -567,7 +577,7 @@ readskip () /* skip over one input block */
x = readcount (&n);
if (x != SCMOK) return (x);
if (n < 0)
return (scmerr (-1,"Invalid message count %d",n));
return (scmerr (-1,stderr,"Invalid message count %d",n));
while (x == SCMOK && n > 0) {
x = readdata (XFERSIZE(n),buf);
n -= XFERSIZE(n);
@ -583,9 +593,9 @@ int *buf;
x = readcount (&y);
if (x != SCMOK) return (x);
if (y < 0)
return (scmerr (-1,"Invalid message count %d",y));
return (scmerr (-1,stderr,"Invalid message count %d",y));
if (y != sizeof(int))
return (scmerr (-1,"Size error for int message is %d",y));
return (scmerr (-1,stderr,"Size error for int message is %d",y));
x = readdata (sizeof(int),(char *)&y);
(*buf) = byteswap(y);
if (scmdebug > 2)
@ -609,11 +619,11 @@ register char **buf;
return (SCMOK);
}
if (count < 0)
return (scmerr (-1,"Invalid message count %d",count));
return (scmerr (-1,stderr,"Invalid message count %d",count));
if (scmdebug > 3)
loginfo ("SCM Reading string count %d",count);
if ((p = (char *)malloc ((unsigned)count+1)) == NULL)
return (scmerr (-1,"Can't malloc %d bytes for string",count));
return (scmerr (-1,stderr,"Can't malloc %d bytes for string",count));
if (cryptflag) {
x = getcryptbuf (count+1);
if (x == SCMOK) x = readdata (count,cryptbuf);
@ -647,7 +657,7 @@ int f;
x = readcount (&count);
if (x != SCMOK) return (x);
if (count < 0)
return (scmerr (-1,"Invalid message count %d",count));
return (scmerr (-1,stderr,"Invalid message count %d",count));
while (x == SCMOK && count > 0) {
if (cryptflag) {
x = readdata (XFERSIZE(count),cryptbuf);
@ -709,7 +719,11 @@ crosspatch ()
FD_ZERO (&xbits);
FD_SET (0,&ibits);
FD_SET (netfile,&ibits);
#if defined(__hpux)
if ((c = select(16, (int *)&ibits, (int *)&obits, (int *)&xbits,
#else
if ((c = select(16, &ibits, &obits, &xbits,
#endif
(struct timeval *)NULL)) < 1) {
if (c == -1) {
if (errno == EINTR) {

View File

@ -28,6 +28,11 @@
**********************************************************************
* HISTORY
* $Log: stree.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:34 jkh
* Current sup with compression support.
*
@ -77,6 +82,7 @@ register TREE **t;
Tfree (&((*t)->Tlo));
Tfree (&((*t)->Thi));
if ((*t)->Tname) free ((*t)->Tname);
if ((*t)->Tnewname) free ((*t)->Tnewname);
if ((*t)->Tuser) free ((*t)->Tuser);
if ((*t)->Tgroup) free ((*t)->Tgroup);
free (*(char **)t);
@ -90,6 +96,7 @@ char *p;
register TREE *t;
t = (TREE *) malloc (sizeof (TREE));
t->Tname = (p == NULL) ? NULL : salloc (p);
t->Tnewname = NULL;
t->Tflags = 0;
t->Tuid = 0;
t->Tgid = 0;

View File

@ -39,6 +39,11 @@
* across the network to save BandWidth
*
* $Log: sup.h,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:34 jkh
* Current sup with compression support.
*
@ -101,8 +106,8 @@
/* PGMVERSION is defined separately in each program */
extern char scmversion[]; /* string version of scm */
#define PROTOVERSION 8 /* version of network protocol */
#define SCANVERSION 2 /* version of scan file format */
#define PROTOVERSION 9 /* version of network protocol */
#define SCANVERSION 3 /* version of scan file format */
/* TCP servers for name server and file server */
#define FILEPORT "supfilesrv"
@ -182,6 +187,7 @@ extern char scmversion[]; /* string version of scm */
struct treestruct {
/* fields for file information */
char *Tname; /* path component name */
char *Tnewname; /* Used for renameing files */
int Tflags; /* flags of file */
int Tmode; /* st_mode of file */
char *Tuser; /* owner of file */
@ -220,6 +226,7 @@ typedef struct tliststruct TREELIST;
#define FBACKUP 02 /* backup of file is allowed */
#define FNOACCT 04 /* don't set file information */
#define FUPDATE 010 /* only set file information */
#define FRENAME 020 /* Rename this file while updating */
#define FNEEDED 0100000 /* file needed for upgrade */
/* version 3 compatability */

View File

@ -31,6 +31,11 @@
* across the network to save BandWidth
*
* $Log: supmsg.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:35 jkh
* Current sup with compression support.
*
@ -299,6 +304,7 @@ int msgrefuse ()
* list files message
*/
extern TREE *listT; /* tree of files to list */
extern TREE *renameT; /* tree of rename target files */
extern long scantime; /* time that collection was scanned */
static int listone (t)
@ -307,6 +313,8 @@ register TREE *t;
register int x;
x = writestring (t->Tname);
if ( protver > 8 )
if (x == SCMOK) x = writestring (t->Tnewname);
if (x == SCMOK) x = writeint ((int)t->Tmode);
if (x == SCMOK) x = writeint ((int)t->Tflags);
if (x == SCMOK) x = writeint (t->Tmtime);
@ -323,19 +331,25 @@ int msglist ()
if (x == SCMOK) x = writeint ((int)scantime);
if (x == SCMOK) x = writemend ();
} else {
char *name;
char *name, *newname = NULL;
int mode,flags,mtime;
register TREE *t;
x = readmsg (MSGLIST);
if (x == SCMOK) x = readstring (&name);
while (x == SCMOK) {
if (name == NULL) break;
x = readint (&mode);
if (protver > 8){
x = readstring (&newname);
if (x == SCMOK) x = readint (&mode);
}
else
x = readint (&mode);
if (x == SCMOK) x = readint (&flags);
if (x == SCMOK) x = readint (&mtime);
if (x != SCMOK) break;
t = Tinsert (&listT,name,TRUE);
free (name);
t->Tnewname = newname;
t->Tmode = mode;
t->Tflags = flags;
t->Tmtime = mtime;
@ -474,6 +488,8 @@ va_dcl
return (x);
}
if (x == SCMOK) x = writestring (t->Tname);
if (protver > 8)
if (x == SCMOK) x = writestring (t->Tnewname);
if (x == SCMOK) x = writeint (t->Tmode);
if (t->Tmode == 0) {
if (x == SCMOK) x = writemend ();
@ -499,6 +515,8 @@ va_dcl
if (x == SCMOK) x = (*xferfile) (NULL,args);
return (x);
}
if (protver > 8)
if (x == SCMOK) x = readstring (&t->Tnewname);
if (x == SCMOK) x = readint (&t->Tmode);
if (t->Tmode == 0) {
x = readmend ();

View File

@ -33,6 +33,11 @@
* across the network to save BandWidth
*
* $Log: supmsg.h,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:35 jkh
* Current sup with compression support.
*
@ -170,6 +175,7 @@ EXTERN TREE *refuseT; /* tree of files to refuse */
/* msglist */
EXTERN TREE *listT; /* tree of files to list */
EXTERN TREE *renameT; /* tree of file rename targets */
EXTERN long scantime; /* time that collection was scanned */
/* msgneed */

View File

@ -28,6 +28,11 @@
**********************************************************************
* HISTORY
* $Log: vprintf.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:47 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.1.1.1 1993/08/21 00:46:35 jkh
* Current sup with compression support.
*
@ -118,9 +123,16 @@ vsnprintf(s, n, fmt, args)
{
FILE fakebuf;
#ifdef __hpux
fakebuf._flag = _IODUMMY+_IOWRT;/* no _IOWRT: avoid stdio bug */
fakebuf._base = fakebuf._ptr = s;
fakebuf._cnt = n-1;
fakebuf.__fileL = fakebuf.__fileH = 0xff;
#else
fakebuf._flag = _IOSTRG+_IOWRT; /* no _IOWRT: avoid stdio bug */
fakebuf._ptr = s;
fakebuf._cnt = n-1;
#endif
_doprnt(fmt, args, &fakebuf);
fakebuf._cnt++;
putc('\0', &fakebuf);

View File

@ -23,6 +23,11 @@
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
.\" HISTORY
.\" $Log: sup.1,v $
.\" Revision 1.1.1.1 1995/12/26 04:54:46 peter
.\" Import the unmodified version of the sup that we are using.
.\" The heritage of this version is not clear. It appears to be NetBSD
.\" derived from some time ago.
.\"
.\" Revision 1.2 1994/08/11 02:46:19 rich
.\" Added extensions written by David Dawes. From the man page:
.\"
@ -59,7 +64,7 @@
.\" 04-Apr-85 Steven Shafer (sas) at Carnegie-Mellon University
.\" Created.
.\"
.TH SUP 1 02/08/92
.TH SUP 1 03/15/95
.CM 4
.SH "NAME"
sup \- software upgrade protocol
@ -247,6 +252,41 @@ upgrade will be performed. Messages
will be printed that indicate what would happen if
an actual upgrade were done.
.TP
.B -i
Normally,
.I sup
will fail to upgrade any files that are \fBETXTBSY\fR.
The
.B -i
flag, or the
.B unlinkbusy
supfile option, will cause
.I sup
to try to upgrade a busy file by unlinking it before the
replacement file is installed. The option is intended for
environments where upgrades to possibly running binaries or
libraries will take place. Some operating systems \fB(HPUX)\fR
do not allow the unlink system call to succeed on ETXTBSY files.
If the unlink does not succeed, an attempt is made to rename the
file to filename.sup#sup-pid.moved. The new name is logged in either
the system default rename log file, \fB/usr/local/etc/sup.moved\fR,
or in a logfile as set by the \fBrenamelog\fR supfile option. The
logfile allows for easy deletion of ETXTBSY files once they are no
longer in use. A typical time to perform the deletions is at system
boot time with something similar to:
.TP
.ce 1
cat /usr/local/etc/sup.moved | xargs rm -rf
.TP
.B -I
The
.B -I
flag overrides and disables the
.B -i
flag and the
.B unlinkbusy
supfile option.
.TP
.B -k
.I Sup
will check the modification times of
@ -537,6 +577,19 @@ project's file collection from all users running
.I sup
to upgrade that collection.
.TP
.BI renamelog= filename
When the
.B
unlinkbusy
or
.B
-i
option is enabled, but the system cannot unlink a busy file, it
will rename it instead and log the new filename. Logging will
occur to the system default rename log file or to the specified
.IR filename
in the renamelog entry of a supfile.
.TP
.B backup
As described above under the
.B -b
@ -562,6 +615,11 @@ As described above under the
.B -o
flag.
.TP
.B unlinkbusy
As described above under the
.B -i
flag.
.TP
.B noupdate
As described above under the
.B -u
@ -729,6 +787,12 @@ The always command is identical to upgrade, except that omit and
omitany commands do not affect filenames specified with the always
command.
.TP
\fBrename\fR \fIfilename\fR \fIdest-filename\fR...
The rename command allows for a file on the server to be placed on the
client under a different name. To prevent confusion and ease its use,
the rename option implicitly omits any files on the server that have
the same name as \fIdest-filename\fR.
.TP
\fBomit\fR \fIfilename\fR ...
The specified file(s) (or directories) will be excluded from the
list of files to be upgraded.
@ -796,7 +860,9 @@ As described above, the client must invoke
.I sup
with the
.B -e
flag to allow the automatic execution of command files.
flag to allow the automatic execution of command files. The timestamp
of the upgraded file is maintained even if the executed command might
change it so as to prevent an upgrade with every \fIsup\fR.
.TP
\fBinclude\fR \fIlistfile\fR ...
The specified
@ -862,6 +928,9 @@ lock file for a collection
<\fIbase-directory\fR>\fB/sup/\fR<\fIcollection\fR>\fB/logfile
log file for a collection
.TP
\fB/usr/local/etc/sup.moved\fR
log file for files renamed by the \fBunlinkbusy\fR option
.TP
<\fIbase-directory\fR>\fB/sup/\fR<\fIcollection\fR>\fB/prefix
file containing the name of the prefix directory
for a collection

View File

@ -33,6 +33,11 @@
* across the network to save BandWidth
*
* $Log: supcdefs.h,v $
* Revision 1.1.1.1 1995/12/26 04:54:46 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.3 1994/08/11 02:46:21 rich
* Added extensions written by David Dawes. From the man page:
*
@ -118,6 +123,7 @@ struct collstruct { /* one per collection to be upgraded */
char *Clogin; /* remote login name */
char *Cpswd; /* remote password */
char *Ccrypt; /* data encryption key */
char *Crenamelog; /* Where to log files moved when busy */
int Ctimeout; /* timeout for backoff */
int Cflags; /* collection flags */
int Cnogood; /* upgrade no good, "when" unchanged */
@ -126,19 +132,20 @@ struct collstruct { /* one per collection to be upgraded */
};
typedef struct collstruct COLLECTION;
#define CFALL 00001
#define CFBACKUP 00002
#define CFDELETE 00004
#define CFEXECUTE 00010
#define CFLIST 00020
#define CFLOCAL 00040
#define CFMAIL 00100
#define CFOLD 00200
#define CFVERBOSE 00400
#define CFKEEP 01000
#define CFURELSUF 02000
#define CFCOMPRESS 04000
#define CFNOUPDATE 010000
#define CFALL 0x0001
#define CFBACKUP 0x0002
#define CFDELETE 0x0004
#define CFEXECUTE 0x0008
#define CFLIST 0x0010
#define CFLOCAL 0x0020
#define CFMAIL 0x0040
#define CFOLD 0x0080
#define CFVERBOSE 0x0100
#define CFKEEP 0x0200
#define CFURELSUF 0x0400
#define CFCOMPRESS 0x0800
#define CFNOUPDATE 0x1000
#define CFUNLINKBUSY 0x2000
/*************************
*** M A C R O S ***
@ -149,7 +156,7 @@ typedef struct collstruct COLLECTION;
* C prototypes
*/
#if __STDC__
void done __P((int value,char *fmt,...));
void goaway __P((char *fmt,...));
void notify __P((char *fmt,...));
void done __P((int value,char *fmt,...));
void goaway __P((char *fmt,...));
void notify __P((char *fmt,...));
#endif

View File

@ -174,6 +174,11 @@
* across the network to save BandWidth
*
* $Log: supcmain.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:46 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.2 1994/08/11 02:46:22 rich
* Added extensions written by David Dawes. From the man page:
*
@ -418,7 +423,11 @@ char **argv;
int fd;
loginfo ("SUP Restarting %s with new supfile %s",
progname,supfname);
#ifdef __hpux
for (fd = 256; fd > 3; fd--)
#else
for (fd = getdtablesize (); fd > 3; fd--)
#endif
(void) close (fd);
execv (progname,argv);
logquit (1,"Restart failed");
@ -551,6 +560,14 @@ int *oflagsp,*aflagsp;
case 'm':
oflags |= CFMAIL;
break;
case 'i':
oflags |= CFUNLINKBUSY;
aflags &= ~CFUNLINKBUSY;
break;
case 'I':
oflags &= ~CFUNLINKBUSY;
aflags |= CFUNLINKBUSY;
break;
case 'o':
oflags |= CFOLD;
aflags &= ~CFOLD;

View File

@ -32,6 +32,11 @@
* across the network to save BandWidth
*
* $Log: supcmeat.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:46 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.4 1994/08/11 02:46:23 rich
* Added extensions written by David Dawes. From the man page:
*
@ -156,6 +161,8 @@ jmp_buf sjbuf; /* jump location for network errors */
int dontjump; /* flag to void sjbuf */
int cancompress=FALSE; /* Can we do compression? */
int docompress=FALSE; /* Do we do compression? */
int dounlinkbusy=FALSE; /* Should we try to unlink busy files?*/
FILE *renamelog=NULL; /* Where we log renamed files */
extern COLLECTION *thisC; /* collection list pointer */
extern int rpauseflag; /* don't disable resource pausing */
@ -492,7 +499,8 @@ int listfiles ()
int needone(), denyone(), deleteone();
char buf[STRINGLENGTH];
char relsufix[STRINGLENGTH];
register char *p,*q;
TREE *t;
register char *p,*q,*r;
register FILE *f;
register int x;
@ -506,8 +514,14 @@ int listfiles ()
if (f) {
while (p = fgets (buf,STRINGLENGTH,f)) {
if (q = index (p,'\n')) *q = '\0';
if (r = index (p,' ')) *r++ = '\0';
if (index ("#;:",*p)) continue;
(void) Tinsert (&lastT,p,FALSE);
t = Tinsert (&lastT,p,FALSE);
if(t && r)
{
t->Tnewname = salloc(r);
t->Tflags = FRENAME;
}
}
(void) fclose (f);
}
@ -532,6 +546,7 @@ int listfiles ()
goaway ("Error reading file list from file server");
if (thisC->Cprefix) (void) chdir (thisC->Cprefix);
needT = NULL;
renameT = NULL;
(void) Tprocess (listT,needone);
Tfree (&listT);
x = msgneed ();
@ -548,6 +563,8 @@ int listfiles ()
if (thisC->Cflags&(CFALL|CFDELETE|CFOLD))
(void) Trprocess (lastT,deleteone);
Tfree (&refuseT);
Tfree (&renameT);
renameT = NULL;
}
needone (t)
@ -556,17 +573,26 @@ register TREE *t;
register TREE *newt;
register int exists, fetch;
struct stat sbuf;
char *name;
newt = Tinsert (&lastT,t->Tname,TRUE);
newt->Tflags |= FUPDATE;
if(t->Tflags&FRENAME) {
newt->Tflags |= FRENAME;
newt->Tnewname = salloc(t->Tnewname);
name = t->Tnewname;
Tinsert(&renameT,t->Tnewname);
}
else
name = t->Tname;
fetch = TRUE;
if ((thisC->Cflags&CFALL) == 0) {
if ((t->Tflags&FNEW) == 0 && (thisC->Cflags&CFOLD) == 0)
return (SCMOK);
if ((t->Tmode&S_IFMT) == S_IFLNK)
exists = (lstat (t->Tname,&sbuf) == 0);
exists = (lstat (name,&sbuf) == 0);
else
exists = (stat (t->Tname,&sbuf) == 0);
exists = (stat (name,&sbuf) == 0);
/* This is moderately complicated:
If the file is the wrong type or doesn't exist, we need to
fetch the whole file. If the file is a special file, we
@ -592,12 +618,12 @@ register TREE *t;
else return (SCMOK);
}
/* If we get this far, we're either doing an update or a full fetch. */
newt = Tinsert (&needT,t->Tname,TRUE);
if (!fetch && t->Tmode == sbuf.st_mode &&
(t->Tmode&S_IFMT) == S_IFREG && (thisC->Cflags&CFNOUPDATE)) {
vnotify ("SUP update avoided for %s\n", t->Tname);
return (SCMOK);
return (SCMOK);
}
newt = Tinsert (&needT,t->Tname,TRUE);
if (!fetch && (t->Tmode&S_IFMT) == S_IFREG)
newt->Tflags |= FUPDATE;
return (SCMOK);
@ -615,12 +641,15 @@ TREE *t;
{
struct stat sbuf;
register int x;
register char *name = t->Tname;
register char *name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
if (t->Tflags&FUPDATE) /* in current upgrade list */
return (SCMOK);
if (lstat(name,&sbuf) < 0) /* doesn't exist */
return (SCMOK);
if (Tlookup (renameT, name)) /* it is a file we're going to replace
return (SCMOK); * by renaming another target.
*/
/* is it a symbolic link ? */
if ((sbuf.st_mode & S_IFMT) == S_IFLNK) {
if (Tlookup (refuseT,name)) {
@ -723,6 +752,10 @@ recvfiles ()
if (docompress)
vnotify("SUP Using compressed file transfer\n");
}
/* Should we attempt to unlink files that are busy? */
dounlinkbusy = (thisC->Cflags & CFUNLINKBUSY);
if(dounlinkbusy)
vnotify("SUP Will attempt to unlink busy files\n");
recvmore = TRUE;
upgradeT = NULL;
do {
@ -735,6 +768,8 @@ recvfiles ()
goaway ("Error receiving file from file server");
Tfree (&upgradeT);
} while (recvmore);
if( renamelog )
fclose( renamelog );
}
/* prepare the target, if necessary */
@ -779,7 +814,7 @@ struct stat *statp;
}
if ((statp->st_mode&S_IFMT) == S_IFDIR) {
if (rmdir (name) < 0)
runp ("rm","rm","-rf",name,0);
runp ("rm","rm","-rf",name,(char *)0);
} else
(void) unlink (name);
if (stat (name,statp) < 0) {
@ -799,7 +834,7 @@ va_list ap;
struct stat sbuf;
int linkone (),execone ();
int *recvmore = va_arg(ap,int *);
char *name;
/* check for end of file list */
if (t == NULL) {
*recvmore = FALSE;
@ -812,8 +847,9 @@ va_list ap;
thisC->Cnogood = TRUE;
return (SCMOK);
}
if (prepare (t->Tname,t->Tmode&S_IFMT,&new,&sbuf)) {
notify ("SUP: Can't prepare path for %s\n",t->Tname);
name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
if (prepare (name,t->Tmode&S_IFMT,&new,&sbuf)) {
notify ("SUP: Can't prepare path for %s\n",name);
if ((t->Tmode&S_IFMT) == S_IFREG) {
x = readskip (); /* skip over file */
if (x != SCMOK)
@ -841,8 +877,8 @@ va_list ap;
return (SCMOK);
}
if ((t->Tmode&S_IFMT) == S_IFREG)
(void) Tprocess (t->Tlink,linkone,t->Tname);
(void) Tprocess (t->Texec,execone);
(void) Tprocess (t->Tlink,linkone,name);
(void) Tprocess (t->Texec,execone,name);
return (SCMOK);
}
@ -852,15 +888,16 @@ register int new;
register struct stat *statp;
{
struct timeval tbuf[2];
char *name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
if (new) {
if (thisC->Cflags&CFLIST) {
vnotify ("SUP Would create directory %s\n",t->Tname);
vnotify ("SUP Would create directory %s\n",name);
return (FALSE);
}
(void) mkdir (t->Tname,0755);
if (stat (t->Tname,statp) < 0) {
notify ("SUP: Can't create directory %s\n",t->Tname);
(void) mkdir (name,0755);
if (stat (name,statp) < 0) {
notify ("SUP: Can't create directory %s\n",name);
return (TRUE);
}
}
@ -875,17 +912,17 @@ register struct stat *statp;
return (FALSE);
}
if (thisC->Cflags&CFLIST) {
vnotify ("SUP Would update directory %s\n",t->Tname);
vnotify ("SUP Would update directory %s\n",name);
return (FALSE);
}
if ((t->Tflags&FNOACCT) == 0) {
(void) chown (t->Tname,t->Tuid,t->Tgid);
(void) chmod (t->Tname,t->Tmode&S_IMODE);
(void) chown (name,t->Tuid,t->Tgid);
(void) chmod (name,t->Tmode&S_IMODE);
}
tbuf[0].tv_sec = time((long *)NULL); tbuf[0].tv_usec = 0;
tbuf[1].tv_sec = t->Tmtime; tbuf[1].tv_usec = 0;
(void) utimes (t->Tname,tbuf);
vnotify ("SUP %s directory %s\n",new?"Created":"Updated",t->Tname);
(void) utimes (name,tbuf);
vnotify ("SUP %s directory %s\n",new?"Created":"Updated",name);
return (FALSE);
}
@ -897,29 +934,30 @@ register struct stat *statp;
char buf[STRINGLENGTH];
int n;
register char *linkname;
char *name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
if (t->Tlink == NULL || t->Tlink->Tname == NULL) {
if (t->Tlink == NULL || name == NULL) {
notify ("SUP: Missing linkname for symbolic link %s\n",
t->Tname);
return (TRUE);
}
linkname = t->Tlink->Tname;
if (!new && (t->Tflags&FNEW) == 0 &&
(n = readlink (t->Tname,buf,sizeof(buf))) >= 0 &&
(n = readlink (name,buf,sizeof(buf))) >= 0 &&
(n == strlen (linkname)) && (strncmp (linkname,buf,n) == 0))
return (FALSE);
if (thisC->Cflags&CFLIST) {
vnotify ("SUP Would %s symbolic link %s to %s\n",
new?"create":"update",t->Tname,linkname);
new?"create":"update",name,linkname);
return (FALSE);
}
if (!new)
(void) unlink (t->Tname);
if (symlink (linkname,t->Tname) < 0 || lstat(t->Tname,statp) < 0) {
notify ("SUP: Unable to create symbolic link %s\n",t->Tname);
(void) unlink (name);
if (symlink (linkname,name) < 0 || lstat(name,statp) < 0) {
notify ("SUP: Unable to create symbolic link %s\n",name);
return (TRUE);
}
vnotify ("SUP Created symbolic link %s to %s\n",t->Tname,linkname);
vnotify ("SUP Created symbolic link %s to %s\n",name,linkname);
return (FALSE);
}
@ -934,6 +972,7 @@ register struct stat *statp;
struct timeval tbuf[2];
register int x;
register char *p;
char *name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
if (t->Tflags&FUPDATE) {
if ((t->Tflags&FNOACCT) == 0) {
@ -950,17 +989,17 @@ register struct stat *statp;
return (FALSE);
}
if (thisC->Cflags&CFLIST) {
vnotify ("SUP Would update file %s\n",t->Tname);
vnotify ("SUP Would update file %s\n",name);
return (FALSE);
}
vnotify ("SUP Updating file %s\n",t->Tname);
vnotify ("SUP Updating file %s\n",name);
if ((t->Tflags&FNOACCT) == 0) {
(void) chown (t->Tname,t->Tuid,t->Tgid);
(void) chmod (t->Tname,t->Tmode&S_IMODE);
(void) chown (name,t->Tuid,t->Tgid);
(void) chmod (name,t->Tmode&S_IMODE);
}
tbuf[0].tv_sec = time((long *)NULL); tbuf[0].tv_usec = 0;
tbuf[1].tv_sec = t->Tmtime; tbuf[1].tv_usec = 0;
(void) utimes (t->Tname,tbuf);
(void) utimes (name,tbuf);
return (FALSE);
}
if (thisC->Cflags&CFLIST) {
@ -972,22 +1011,22 @@ register struct stat *statp;
p = "receive old";
else
p = "receive";
vnotify ("SUP Would %s file %s\n",p,t->Tname);
vnotify ("SUP Would %s file %s\n",p,name);
return (FALSE);
}
vnotify ("SUP Receiving file %s\n",t->Tname);
vnotify ("SUP Receiving file %s\n",name);
if (!new && (t->Tmode&S_IFMT) == S_IFREG &&
(t->Tflags&FBACKUP) && (thisC->Cflags&CFBACKUP)) {
fin = fopen (t->Tname,"r"); /* create backup */
fin = fopen (name,"r"); /* create backup */
if (fin == NULL) {
x = readskip (); /* skip over file */
if (x != SCMOK)
goaway ("Can't skip file transfer");
notify ("SUP: Can't open %s to create backup\n",
t->Tname);
name);
return (TRUE); /* mark upgrade as nogood */
}
path (t->Tname,dirpart,filepart);
path (name,dirpart,filepart);
(void) sprintf (filename,FILEBACKUP,dirpart,filepart);
fout = fopen (filename,"w");
if (fout == NULL) {
@ -1006,20 +1045,20 @@ register struct stat *statp;
ffilecopy (fin,fout);
(void) fclose (fin);
(void) fclose (fout);
vnotify ("SUP Backup of %s created\n", t->Tname);
vnotify ("SUP Backup of %s created\n", name);
}
x = copyfile (t->Tname,(char *)NULL);
x = copyfile (name,(char *)NULL);
if (x)
return (TRUE);
if ((t->Tflags&FNOACCT) == 0) {
/* convert user and group names to local ids */
ugconvert (t->Tuser,t->Tgroup,&t->Tuid,&t->Tgid,&t->Tmode);
(void) chown (t->Tname,t->Tuid,t->Tgid);
(void) chmod (t->Tname,t->Tmode&S_IMODE);
(void) chown (name,t->Tuid,t->Tgid);
(void) chmod (name,t->Tmode&S_IMODE);
}
tbuf[0].tv_sec = time((long *)NULL); tbuf[0].tv_usec = 0;
tbuf[1].tv_sec = t->Tmtime; tbuf[1].tv_usec = 0;
(void) utimes (t->Tname,tbuf);
(void) utimes (name,tbuf);
return (FALSE);
}
@ -1067,9 +1106,12 @@ register char **fname;
return (SCMOK);
}
execone (t) /* execute command for file */
execone (t,name) /* execute command for file */
register TREE *t;
register char **name;
{
struct stat sbuf;
struct timeval tbuf[2];
union wait w;
if (thisC->Cflags&CFLIST) {
@ -1082,6 +1124,10 @@ register TREE *t;
}
vnotify ("SUP Executing %s\n",t->Tname);
if (lstat(*name,&sbuf)){
notify ("SUP Unable to stat file %s\n", *name);
sbuf.st_ino = 0;
}
w.w_status = system (t->Tname);
if (WIFEXITED(w) && w.w_retcode != 0) {
notify ("SUP: Execute command returned failure status %#o\n",
@ -1096,6 +1142,14 @@ register TREE *t;
w.w_stopsig);
thisC->Cnogood = TRUE;
}
if ((sbuf.st_ino != 0) && (sbuf.st_mode&S_IFMT) != S_IFLNK){
(void) chown (*name,sbuf.st_uid,sbuf.st_gid);
(void) chmod (*name,(sbuf.st_mode)&0x1ff);
tbuf[0].tv_sec = time((long *)NULL); tbuf[0].tv_usec = 0;
tbuf[1].tv_sec = sbuf.st_mtime; tbuf[1].tv_usec = 0;
(void) utimes (*name,tbuf);
}
return (SCMOK);
}
@ -1108,6 +1162,7 @@ char *from; /* 0 if reading from network */
char tname[STRINGLENGTH];
char sys_com[STRINGLENGTH];
struct stat sbuf;
int retried = 0;
static int thispid = 0; /* process id # */
@ -1241,6 +1296,7 @@ char *from; /* 0 if reading from network */
return (FALSE);
}
/* uncompress it first */
retry:
if (docompress) {
/* make sure file permissions don't cause a problem */
(void) unlink (to);
@ -1274,6 +1330,48 @@ char *from; /* 0 if reading from network */
tof = open (to,(O_WRONLY|O_CREAT|O_TRUNC),0600);
if (tof < 0) {
(void) close (fromf);
/* Here we can tell if it is ETXTBSY and try this loop
again */
if( dounlinkbusy && errno == ETXTBSY && !retried ) {
/* Try to unlink the destination */
if( unlink(to) == 0 ){
vnotify ("SUP: Removed busy file %s\n", to);
retried = 1;
goto retry;
}
/*
* Some OSs (ie. HP-UX), return ETXTBUSY on unlinking
* a busy file. We try to rename it instead and log
* the filename so it can be removed later.
*/
else if( errno == ETXTBSY ) {
char mname[STRINGLENGTH];
sprintf(mname, "%s.sup.#%d.moved", to, thispid);
if( rename(to, mname) == 0) {
vnotify ("SUP: Moved busy file %s to %s\n", to,
mname);
if(renamelog == NULL) {
renamelog = fopen(thisC->Crenamelog, "a");
if( renamelog == NULL ) {
notify ("SUP: Cannot open rename log file %s: "
"%s\n",thisC->Crenamelog,errmsg (-1));
}
else {
fprintf(renamelog, "%s\n", mname);
fflush(renamelog);
}
}
else {
fprintf(renamelog, "%s\n", mname);
fflush(renamelog);
}
retried = 1;
goto retry;
}
}
}
notify ("SUP: Can't create %s from temp file: %s\n",
to,errmsg (-1));
(void) unlink (tname);
@ -1399,7 +1497,10 @@ TREE *t;
FILE **finishfile;
{
if ((thisC->Cflags&CFDELETE) == 0 || (t->Tflags&FUPDATE))
fprintf (*finishfile,"%s\n",t->Tname);
if(t->Tflags&FRENAME)
fprintf(*finishfile,"%s %s\n",t->Tname,t->Tnewname);
else
fprintf (*finishfile,"%s\n",t->Tname);
return (SCMOK);
}

View File

@ -32,6 +32,11 @@
* across the network to save BandWidth
*
* $Log: supcparse.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:46 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.2 1994/08/11 02:46:25 rich
* Added extensions written by David Dawes. From the man page:
*
@ -82,11 +87,13 @@ static char _argbreak;
extern char _argbreak; /* break character from nxtarg */
#endif
char default_renamelog[] = RENAMELOG;
typedef enum { /* supfile options */
OHOST, OBASE, OHOSTBASE, OPREFIX, ORELEASE,
ONOTIFY, OLOGIN, OPASSWORD, OCRYPT,
ONOTIFY, OLOGIN, OPASSWORD, OCRYPT, ORENAMELOG,
OBACKUP, ODELETE, OEXECUTE, OOLD, OTIMEOUT, OKEEP, OURELSUF,
OCOMPRESS, ONOUPDATE
OCOMPRESS, ONOUPDATE, OUNLINKBUSY
} OPTION;
struct option {
@ -102,6 +109,7 @@ struct option {
"login", OLOGIN,
"password", OPASSWORD,
"crypt", OCRYPT,
"renamelog", ORENAMELOG,
"backup", OBACKUP,
"delete", ODELETE,
"execute", OEXECUTE,
@ -110,7 +118,8 @@ struct option {
"keep", OKEEP,
"use-rel-suffix", OURELSUF,
"compress", OCOMPRESS,
"noupdate", ONOUPDATE
"noupdate", ONOUPDATE,
"unlinkbusy", OUNLINKBUSY,
};
passdelim (ptr,delim) /* skip over delimiter */
@ -143,6 +152,7 @@ char *collname,*args;
c->Clogin = NULL;
c->Cpswd = NULL;
c->Ccrypt = NULL;
c->Crenamelog = default_renamelog;
c->Ctimeout = 3*60*60; /* default to 3 hours instead of no timeout */
c->Cflags = 0;
c->Cnogood = FALSE;
@ -209,6 +219,11 @@ char *collname,*args;
arg = nxtarg (&args," \t");
c->Ccrypt = salloc (arg);
break;
case ORENAMELOG:
passdelim (&args,'=');
arg = nxtarg (&args," \t");
c->Crenamelog= salloc (arg);
break;
case OBACKUP:
c->Cflags |= CFBACKUP;
break;
@ -233,6 +248,9 @@ char *collname,*args;
case ONOUPDATE:
c->Cflags |= CFNOUPDATE;
break;
case OUNLINKBUSY:
c->Cflags |= CFUNLINKBUSY;
break;
case OTIMEOUT:
passdelim (&args,'=');
arg = nxtarg (&args," \t");

View File

@ -25,10 +25,11 @@
/*
* supfilesrv -- SUP File Server
*
* Usage: supfilesrv [-l] [-P] [-N]
* Usage: supfilesrv [-l] [-P] [-N] [-R]
* -l "live" -- don't fork daemon
* -P "debug ports" -- use debugging network ports
* -N "debug network" -- print debugging messages for network i/o
* -R "RCS mode" -- if file is an rcs file, use co to get contents
*
**********************************************************************
* HISTORY
@ -41,6 +42,11 @@
* across the network to save BandWidth
*
* $Log: supfilesrv.c,v $
* Revision 1.1.1.1 1995/12/26 04:54:48 peter
* Import the unmodified version of the sup that we are using.
* The heritage of this version is not clear. It appears to be NetBSD
* derived from some time ago.
*
* Revision 1.4 1994/08/11 02:46:26 rich
* Added extensions written by David Dawes. From the man page:
*
@ -280,6 +286,7 @@ long time ();
uid_t getuid ();
int maxchildren;
int maxfriends = -1;
/*
* These are used to save the stat information from the crosspatch crypt
@ -327,18 +334,27 @@ int live; /* -l flag */
int dbgportsq; /* -P flag */
extern int scmdebug; /* -N flag */
extern int netfile;
#ifdef RCS
int candorcs; /* -R flag */
int dorcs = FALSE;
#endif
char *clienthost; /* host name of client */
int friend; /* The client is a friend of us */
int nchildren; /* number of children that exist */
char *prefix; /* collection pathname prefix */
char *release; /* collection release name */
char *cryptkey; /* encryption key if non-null */
#ifdef CVS
char *cvs_root; /* RCS root */
#endif
char *rcs_branch; /* RCS branch name */
int lockfd; /* descriptor of lock file */
/* global variables for scan functions */
int trace = FALSE; /* directory scan trace */
int cancompress=FALSE; /* Can we compress files */
int docompress=FALSE; /* Do we compress files */
int cancompress = FALSE; /* Can we compress files */
int docompress = FALSE; /* Do we compress files */
HASH *uidH[HASHSIZE]; /* for uid and gid lookup */
HASH *gidH[HASHSIZE];
@ -350,7 +366,7 @@ char *fmttime (); /* time format routine */
* PROTOTYPES
*/
#if __STDC__
void goaway __P((char *,...));
void goaway __P((char *,...));
#endif
#ifdef LOG_PID_PATHNAME
@ -442,13 +458,20 @@ char **argv;
/*
* Child status signal handler
*/
void
chldsig()
{
#if defined(__hpux) || defined(__FreeBSD__)
int w;
#else
union wait w;
#endif
#ifdef __hpux
while (wait3(&w, WNOHANG, (int *)0) > 0) {
#else
while (wait3(&w, WNOHANG, (struct rusage *)0) > 0) {
#endif
if (nchildren) nchildren--;
}
}
@ -474,6 +497,9 @@ char **argv;
int maxsleep;
register FILE *f;
#ifdef RCS
candorcs = FALSE;
#endif
live = FALSE;
dbgportsq = FALSE;
scmdebug = 0;
@ -500,6 +526,12 @@ char **argv;
argv++;
maxchildren = atoi(argv[0]);
break;
case 'F':
if (--argc < 1)
quit (1,"Missing arg to -F\n");
argv++;
maxfriends = atoi(argv[0]);
break;
case 'H':
if (--argc < 3)
quit (1,"Missing args to -H\n");
@ -510,6 +542,11 @@ char **argv;
argc -= 2;
argv += 2;
break;
#ifdef RCS
case 'R':
candorcs = TRUE;
break;
#endif
default:
fprintf (stderr,"Unknown flag %s ignored\n",argv[0]);
break;
@ -517,6 +554,11 @@ char **argv;
--argc;
argv++;
}
if (maxfriends == -1)
maxfriends = 2*maxchildren;
else
maxfriends += maxchildren; /* due to the way we check */
if (clienthost == NULL) {
if (argc != 0)
usage ();
@ -621,6 +663,10 @@ answer ()
basedir = NULL;
prefix = NULL;
release = NULL;
rcs_branch = NULL;
#ifdef CVS
cvs_root = NULL;
#endif
goawayreason = NULL;
donereason = NULL;
lockfd = -1;
@ -642,7 +688,11 @@ answer ()
(void) dup2 (netfile,0);
(void) dup2 (netfile,1);
(void) dup2 (netfile,2);
#ifdef __hpux
fd = 256;
#else
fd = getdtablesize ();
#endif
while (--fd > 2)
(void) close (fd);
execv (xargv[0],xargv);
@ -656,6 +706,10 @@ answer ()
if (basedir) free (basedir);
if (prefix) free (prefix);
if (release) free (release);
if (rcs_branch) free (rcs_branch);
#ifdef CVS
if (cvs_root) free (cvs_root);
#endif
if (goawayreason) {
if (donereason == goawayreason)
donereason = NULL;
@ -778,6 +832,15 @@ setup ()
goaway ("Error sending setup reply to client");
return;
}
#ifdef RCS
if (candorcs && release != NULL &&
(strncmp(release, "RCS.", 4) == 0)) {
rcs_branch = salloc(&release[4]);
free(release);
release = salloc("RCS");
dorcs = TRUE;
}
#endif
if (release == NULL)
release = salloc (DEFRELEASE);
if (basedir == NULL || *basedir == '\0') {
@ -824,7 +887,7 @@ setup ()
if (prefix) (void) chdir (basedir);
if (x < 0)
goaway ("Can't stat base/prefix directory");
if (nchildren >= maxchildren) {
if (nchildren >= maxfriends) {
setupack = FSETUPBUSY;
(void) msgsetupack ();
if (protver >= 6) longjmp (sjbuf,TRUE);
@ -861,7 +924,16 @@ setup ()
q = nxtarg (&p," \t");
if ((not = (*q == '!')) && *++q == '\0')
q = nxtarg (&p," \t");
hostok = (not == (matchhost(q) == 0));
if ((friend = (*q == '+')) && *++q == '\0')
q = nxtarg (&p," \t");
hostok = matchhost(q);
if (hostok && not) {
setupack = FSETUPHOST;
(void) msgsetupack ();
if (protver >= 6) longjmp (sjbuf,TRUE);
goaway ("Host blacklisted for %s",
collname);
}
if (hostok) {
while ((*p == ' ') || (*p == '\t')) p++;
if (*p) cryptkey = salloc (p);
@ -878,6 +950,12 @@ setup ()
}
}
}
if (!friend && nchildren >= maxchildren) {
setupack = FSETUPBUSY;
(void) msgsetupack ();
if (protver >= 6) longjmp (sjbuf,TRUE);
goaway ("Sup client told to try again later");
}
/* try to lock collection */
(void) sprintf (buf,FILELOCK,collname);
x = open (buf,O_RDONLY,0);
@ -1111,6 +1189,17 @@ sendfiles ()
/* send all files */
for (tl = listTL; tl != NULL; tl = tl->TLnext) {
cdprefix (tl->TLprefix);
#ifdef CVS
if (candorcs) {
cvs_root = getcwd(NULL, 256);
if (access("CVSROOT", F_OK) < 0)
dorcs = FALSE;
else {
loginfo("is a CVSROOT \"%s\"\n", cvs_root);
dorcs = TRUE;
}
}
#endif
(void) Tprocess (tl->TLtree,sendone);
}
/* send directories in reverse order */
@ -1132,7 +1221,8 @@ TREE *t;
{
register int x,fd;
register int fdtmp;
char sys_com[STRINGLENGTH], temp_file[STRINGLENGTH];
char sys_com[STRINGLENGTH], temp_file[STRINGLENGTH], rcs_file[STRINGLENGTH];
union wait status;
char *uconvert(),*gconvert();
int sendfile ();
@ -1146,20 +1236,74 @@ TREE *t;
fd = -1; /* no open file */
if ((t->Tmode&S_IFMT) == S_IFREG) {
if (!listonly && (t->Tflags&FUPDATE) == 0) {
if (docompress) {
tmpnam(temp_file);
sprintf(sys_com, "gzip -c < %s > %s\n", t->Tname, temp_file);
if (system(sys_com) < 0) {
/* Just in case */
unlink(temp_file);
goaway ("We died trying to compress");
t->Tmode = 0;
}
fd = open (temp_file,O_RDONLY,0);
}
else
fd = open (t->Tname,O_RDONLY,0);
if (fd < 0) t->Tmode = 0;
#ifdef RCS
if (dorcs) {
char rcs_release[STRINGLENGTH];
tmpnam(rcs_file);
if (strcmp(&t->Tname[strlen(t->Tname)-2], ",v") == 0) {
t->Tname[strlen(t->Tname)-2] = '\0';
if (rcs_branch != NULL)
#ifdef CVS
sprintf(rcs_release, "-r %s", rcs_branch);
#else
sprintf(rcs_release, "-r%s", rcs_branch);
#endif
else
rcs_release[0] = '\0';
#ifdef CVS
sprintf(sys_com, "cvs -d %s -r -l -Q co -p %s %s > %s\n", cvs_root, rcs_release, t->Tname, rcs_file);
#else
sprintf(sys_com, "co -q -p %s %s > %s 2> /dev/null\n", rcs_release, t->Tname, rcs_file);
#endif
/*loginfo("using rcs mode \"%s\"\n", sys_com);*/
status.w_status = system(sys_com);
if (status.w_status < 0 || status.w_retcode) {
/* Just in case */
unlink(rcs_file);
if (status.w_status < 0) {
goaway ("We died trying to \"%s\"", sys_com);
t->Tmode = 0;
}
else {
/*logerr("rcs command failed \"%s\" = %d\n",
sys_com, status.w_retcode);*/
t->Tflags |= FUPDATE;
}
}
else if (docompress) {
tmpnam(temp_file);
sprintf(sys_com, "/usr/local/bin/gzip -c < %s > %s\n", rcs_file, temp_file);
if (system(sys_com) < 0) {
/* Just in case */
unlink(temp_file);
unlink(rcs_file);
goaway ("We died trying to \"%s\"", sys_com);
t->Tmode = 0;
}
fd = open (temp_file,O_RDONLY,0);
}
else
fd = open (rcs_file,O_RDONLY,0);
}
}
#endif
if (fd == -1) {
if (docompress) {
tmpnam(temp_file);
sprintf(sys_com, "gzip -c < %s > %s\n", t->Tname, temp_file);
if (system(sys_com) != 0) {
/* Just in case */
unlink(temp_file);
goaway ("We died trying to \"%s\"", sys_com);
t->Tmode = 0;
}
fd = open (temp_file,O_RDONLY,0);
}
else
fd = open (t->Tname,O_RDONLY,0);
}
if (fd < 0 && (t->Tflags&FUPDATE) == 0) t->Tmode = 0;
}
if (t->Tmode) {
t->Tuser = salloc (uconvert (t->Tuid));
@ -1169,6 +1313,10 @@ TREE *t;
x = msgrecv (sendfile,fd);
if (docompress)
unlink(temp_file);
#ifdef RCS
if (dorcs)
unlink(rcs_file);
#endif
if (x != SCMOK) goaway ("Error sending file to client");
return (SCMOK);
}