aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin T. Gibbs <gibbs@FreeBSD.org>1995-08-14 08:57:27 +0000
committerJustin T. Gibbs <gibbs@FreeBSD.org>1995-08-14 08:57:27 +0000
commit7399ab5ffb163a03be953e302b2a6fa551c87d0f (patch)
tree9714ee4b98871940f3fbdb3ace96b5637c7e52e4
parent37037db2e029ce59bf4e0a35956823ab3ff7f503 (diff)
downloadports-7399ab5ffb163a03be953e302b2a6fa551c87d0f.tar.gz
ports-7399ab5ffb163a03be953e302b2a6fa551c87d0f.zip
Notes
-rw-r--r--net/sup/files/patch-aa3158
1 files changed, 3151 insertions, 7 deletions
diff --git a/net/sup/files/patch-aa b/net/sup/files/patch-aa
index 965dceee78d0..458c795b5ec2 100644
--- a/net/sup/files/patch-aa
+++ b/net/sup/files/patch-aa
@@ -1,9 +1,56 @@
-This patch is required for FreeBSD 2.0 because password crypt vs cipher
-technology has now been split into different libraries. In this case,
-USE_CRYPT really means "use cipher."
-
-*** Makefile Thu Oct 27 14:12:41 1994
---- Makefile Thu Oct 27 14:14:46 1994
+diff -c /var/tmp/sup/Makefile sup/Makefile
+*** Makefile Mon Apr 11 08:02:04 1994
+--- sup/Makefile Sun Aug 13 19:40:26 1995
+***************
+*** 42,54 ****
+ #
+ SITE = NETBSD
+ #SITE = CMUCS
+ 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}
+
+ #INSTALLATION PARAMETERS
+ NETBSD_BINDIR = /usr/local/bin
+--- 42,55 ----
+ #
+ 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} -DRENAMELOG=${RENAMELOG}
+
+ #INSTALLATION PARAMETERS
+ NETBSD_BINDIR = /usr/local/bin
+***************
+*** 60,67 ****
+ 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
+
+
+ PROGRAMS = sup supscan supfilesrv
+--- 61,69 ----
+ 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
+
+
+ PROGRAMS = sup supscan supfilesrv
***************
*** 76,84 ****
.endif
@@ -15,7 +62,7 @@ USE_CRYPT really means "use cipher."
.endif
CMUCS_LIBS = -lsys
OSF_LIBS = -lbsd
---- 76,84 ----
+--- 78,86 ----
.endif
.if defined(USE_CRYPT)
@@ -25,3 +72,3100 @@ USE_CRYPT really means "use cipher."
.endif
CMUCS_LIBS = -lsys
OSF_LIBS = -lbsd
+diff -c /var/tmp/sup/ffilecopy.c sup/ffilecopy.c
+*** ffilecopy.c Fri Aug 20 17:46:33 1993
+--- sup/ffilecopy.c Wed Apr 5 11:46:38 1995
+***************
+*** 58,64 ****
+ if (fflush (there) == EOF) /* flush pending output */
+ return (EOF);
+
+! #ifdef __386BSD__
+ if ((here->_r) > 0) { /* flush buffered input */
+ i = write (therefile, here->_p, here->_r);
+ if (i != here->_r) return (EOF);
+--- 58,64 ----
+ if (fflush (there) == EOF) /* flush pending output */
+ return (EOF);
+
+! #ifdef __FreeBSD__
+ if ((here->_r) > 0) { /* flush buffered input */
+ i = write (therefile, here->_p, here->_r);
+ if (i != here->_r) return (EOF);
+***************
+*** 76,82 ****
+ i = filecopy (herefile, therefile); /* fast file copy */
+ if (i < 0) return (EOF);
+
+! #ifdef __386BSD__
+ (here->_flags) |= __SEOF; /* indicate EOF */
+ #else
+ (here->_flag) |= _IOEOF; /* indicate EOF */
+--- 76,82 ----
+ i = filecopy (herefile, therefile); /* fast file copy */
+ if (i < 0) return (EOF);
+
+! #ifdef __FreeBSD__
+ (here->_flags) |= __SEOF; /* indicate EOF */
+ #else
+ (here->_flag) |= _IOEOF; /* indicate EOF */
+diff -c /var/tmp/sup/libc.h sup/libc.h
+*** libc.h Fri Aug 20 17:46:33 1993
+--- sup/libc.h Sun Aug 13 19:03:32 1995
+***************
+*** 81,86 ****
+--- 81,90 ----
+ #ifndef _LIBC_H_
+ #define _LIBC_H_ 1
+
++ #if defined(__hpux)
++ #define __P(x) x
++ #endif
++
+ #ifndef _TYPES_
+ #include <sys/types.h>
+ #endif /* _TYPES_ */
+***************
+*** 195,200 ****
+--- 199,224 ----
+ #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);
+diff -c /var/tmp/sup/log.c sup/log.c
+*** log.c Fri Aug 20 17:46:33 1993
+--- sup/log.c Sun Aug 13 19:43:12 1995
+***************
+*** 52,59 ****
+--- 52,64 ----
+ */
+
+ #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,78 ****
+ char *program;
+ {
+ if (opened) return;
+! openlog(program,LOG_PID,LOG_DAEMON);
+ opened++;
+ }
+
+--- 77,83 ----
+ char *program;
+ {
+ if (opened) return;
+! openlog(program,LOG_PID,LOG_LOCAL1);
+ opened++;
+ }
+
+diff -c /var/tmp/sup/run.c sup/run.c
+*** run.c Fri Aug 20 17:46:33 1993
+--- sup/run.c Thu Apr 6 13:32:15 1995
+***************
+*** 95,100 ****
+--- 95,101 ----
+ #include <signal.h>
+ #include <sys/wait.h>
+ #include <varargs.h>
++ #define MAXARGS 100
+
+ static int dorun();
+
+***************
+*** 123,132 ****
+ {
+ int val;
+ va_list ap;
+!
+ va_start(ap);
+! val = runvp (name,ap);
+ va_end(ap);
+ return (val);
+ }
+
+--- 124,137 ----
+ {
+ int val;
+ va_list ap;
+! char *args[MAXARGS];
+! int argno=0;
+!
+ va_start(ap);
+! while (argno < MAXARGS
+! && (args[argno++] = va_arg(ap, char *)) != (char *)0);
+ va_end(ap);
++ val = runvp (name,args);
+ return (val);
+ }
+
+diff -c /var/tmp/sup/scan.c sup/scan.c
+*** scan.c Fri Aug 20 17:46:33 1993
+--- sup/scan.c Sun Aug 13 18:44:51 1995
+***************
+*** 122,134 ****
+ typedef enum { /* <collection>/list file lines */
+ LUPGRADE, LOMIT, LBACKUP, LEXECUTE,
+ LINCLUDE, LNOACCT, LOMITANY, LALWAYS,
+! LSYMLINK, LRSYMLINK
+ } LISTTYPE;
+
+ static char *ltname[] = {
+ "upgrade", "omit", "backup", "execute",
+ "include", "noaccount", "omitany", "always",
+! "symlink", "rsymlink",
+ 0
+ };
+
+--- 122,134 ----
+ typedef enum { /* <collection>/list file lines */
+ LUPGRADE, LOMIT, LBACKUP, LEXECUTE,
+ LINCLUDE, LNOACCT, LOMITANY, LALWAYS,
+! LSYMLINK, LRSYMLINK, LRENAME
+ } LISTTYPE;
+
+ static char *ltname[] = {
+ "upgrade", "omit", "backup", "execute",
+ "include", "noaccount", "omitany", "always",
+! "symlink", "rsymlink", "rename",
+ 0
+ };
+
+***************
+*** 365,373 ****
+
+ if (newonly && (t->Tflags&FNEW) == 0)
+ return (SCMOK);
+! newt = Tinsert (&listT,t->Tname,FALSE);
+ if (newt == NULL)
+ return (SCMOK);
+ newt->Tmode = t->Tmode;
+ newt->Tflags = t->Tflags;
+ newt->Tmtime = t->Tmtime;
+--- 365,375 ----
+
+ if (newonly && (t->Tflags&FNEW) == 0)
+ return (SCMOK);
+! 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,478 ****
+--- 475,484 ----
+ case LUPGRADE:
+ t = &upgT;
+ break;
++ case LRENAME:
++ t = &flagsT;
++ flags = FRENAME;
++ break;
+ case LBACKUP:
+ t = &flagsT;
+ flags = FBACKUP;
+***************
+*** 522,528 ****
+ if (*q == 0)
+ _argbreak = ')';
+ else
+! expTinsert (q,&execT,0,r);
+ } while (_argbreak != ')');
+ continue;
+ }
+--- 528,534 ----
+ if (*q == 0)
+ _argbreak = ')';
+ else
+! expTinsert (q,&execT,0,r,NULL);
+ } while (_argbreak != ')');
+ continue;
+ }
+***************
+*** 533,554 ****
+ while (*(q=nxtarg(&p," \t"))) {
+ if (lt == LOMITANY)
+ (void) Tinsert (t,q,FALSE);
+ else
+! expTinsert (q,t,flags,(char *)NULL);
+ }
+ }
+ (void) fclose (f);
+ }
+
+ static
+! expTinsert (p,t,flags,exec)
+ char *p;
+ TREE **t;
+ int flags;
+ char *exec;
+ {
+ register int n, i;
+! register TREE *newt;
+ char *speclist[SPECNUMBER];
+ char buf[STRINGLENGTH];
+
+--- 539,575 ----
+ 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,(char *)NULL);
+ }
+ }
+ (void) fclose (f);
+ }
+
+ static
+! expTinsert (p,t,flags,exec, q)
+ char *p;
++ char *q;
+ TREE **t;
+ int flags;
+ char *exec;
+ {
+ register int n, i;
+! register TREE *newt, *ts;
+ char *speclist[SPECNUMBER];
+ char buf[STRINGLENGTH];
+
+***************
+*** 557,574 ****
+ newt = Tinsert (t,speclist[i],TRUE);
+ newt->Tflags |= flags;
+ if (exec) {
+! (void) sprintf (buf,exec,speclist[i]);
+ (void) Tinsert (&newt->Texec,buf,FALSE);
+ }
+ free (speclist[i]);
+ }
+ }
+
+ static
+! listone (t) /* expand and add one name from upgrade list */
+ TREE *t;
+ {
+! listentry(t->Tname,t->Tname,(char *)NULL,(t->Tflags&FALWAYS) != 0);
+ return (SCMOK);
+ }
+
+--- 578,602 ----
+ newt = Tinsert (t,speclist[i],TRUE);
+ newt->Tflags |= flags;
+ if (exec) {
+! 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 */
+ TREE *t;
+ {
+! listentry(t->Tname,t->Tname,(char *)NULL,
+! (t->Tflags&FALWAYS) != 0);
+ return (SCMOK);
+ }
+
+***************
+*** 644,651 ****
+ t->Tctime = st->st_ctime;
+ t->Tmtime = st->st_mtime;
+ if (new) t->Tflags |= FNEW;
+! if (ts = Tsearch (flagsT,name))
+ t->Tflags |= ts->Tflags;
+ if (ts = Tsearch (execT,name)) {
+ t->Texec = ts->Texec;
+ ts->Texec = NULL;
+--- 672,682 ----
+ t->Tctime = st->st_ctime;
+ t->Tmtime = st->st_mtime;
+ if (new) t->Tflags |= FNEW;
+! 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,836 ****
+--- 862,871 ----
+ p++;
+ ts.Tflags |= FNOACCT;
+ }
++ if (*p == 'R') {
++ p++;
++ ts.Tflags |= FRENAME;
++ }
+ if ((q = index (p,' ')) == NULL)
+ goaway ("scanfile format inconsistant");
+ *q++ = '\0';
+***************
+*** 845,850 ****
+--- 880,894 ----
+ 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,868 ****
+--- 907,913 ----
+ t->Tflags = ts.Tflags;
+ t->Tctime = ts.Tctime;
+ t->Tmtime = ts.Tmtime;
++ t->Tnewname = ts.Tnewname;
+ }
+ (void) fclose (f);
+ return (TRUE);
+***************
+*** 925,932 ****
+
+ if (t->Tflags&FBACKUP) fprintf (*scanF,"B");
+ if (t->Tflags&FNOACCT) fprintf (*scanF,"N");
+! fprintf (*scanF,"%o %d %d %s\n",
+ t->Tmode,t->Tctime,t->Tmtime,t->Tname);
+ (void) Tprocess (t->Texec,recordexec,*scanF);
+ return (SCMOK);
+ }
+--- 970,983 ----
+
+ if (t->Tflags&FBACKUP) fprintf (*scanF,"B");
+ if (t->Tflags&FNOACCT) fprintf (*scanF,"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);
+ }
+diff -c /var/tmp/sup/scm.c sup/scm.c
+*** scm.c Sun Jun 19 23:04:04 1994
+--- sup/scm.c Thu Apr 6 13:53:57 1995
+***************
+*** 208,214 ****
+ * PROTOTYPES
+ */
+ #if __STDC__
+! int scmerr __P((int, char *,...));
+ #endif
+ /*************************
+ *** M A C R O S ***
+--- 208,214 ----
+ * PROTOTYPES
+ */
+ #if __STDC__
+! int scmerr __P((int, FILE *, char *,...));
+ #endif
+ /*************************
+ *** M A C R O S ***
+***************
+*** 245,275 ****
+ int one = 1;
+
+ if (myhost () == NULL)
+! return (scmerr (-1,"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",
+ 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"));
+ if (setsockopt (sock,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(int)) < 0)
+! (void) scmerr (errno,"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"));
+ if (listen (sock,NCONNECTS) < 0)
+! return (scmerr (errno,"Can't listen on socket"));
+ return (SCMOK);
+ }
+
+--- 245,275 ----
+ int one = 1;
+
+ if (myhost () == NULL)
+! 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, 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, stderr, "Can't create socket for connections"));
+ if (setsockopt (sock,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(int)) < 0)
+! (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, stderr, "Can't bind socket for connections"));
+ if (listen (sock,NCONNECTS) < 0)
+! return (scmerr (errno, stderr, "Can't listen on socket"));
+ return (SCMOK);
+ }
+
+***************
+*** 284,299 ****
+ netfile = accept (sock,(struct sockaddr *)&from,&len);
+ } while (netfile < 0 && errno == EINTR);
+ if (netfile < 0)
+! return (scmerr (errno,"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"));
+ if (x == 0x01020304)
+ swapmode = 0;
+ else if (x == 0x04030201)
+ swapmode = 1;
+ else
+! return (scmerr (-1,"Unexpected byteswap mode %x",x));
+ return (SCMOK);
+ }
+
+--- 284,299 ----
+ netfile = accept (sock,(struct sockaddr *)&from,&len);
+ } while (netfile < 0 && errno == EINTR);
+ if (netfile < 0)
+! return (scmerr (errno, stderr, "Can't accept connections"));
+ remoteaddr = from.sin_addr;
+ if (read(netfile,(char *)&x,sizeof(int)) != sizeof(int))
+! 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, stderr, "Unexpected byteswap mode %x",x));
+ return (SCMOK);
+ }
+
+***************
+*** 354,360 ****
+ s = *t;
+ *t -= s;
+ }
+! (void) scmerr (-1,"Will retry in %d seconds",s);
+ sleep (s);
+ return (1);
+ }
+--- 354,360 ----
+ s = *t;
+ *t -= s;
+ }
+! (void) scmerr (-1, stdout, "Will retry in %d seconds",s);
+ sleep (s);
+ return (1);
+ }
+***************
+*** 376,384 ****
+ 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",
+ server,port);
+ } else
+ port = sp->s_port;
+--- 376,384 ----
+ else if (strcmp(server, DEBUGFPORT) == 0)
+ port = htons((u_short)DEBUGFPORTNUM);
+ else
+! 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;
+***************
+*** 387,393 ****
+ 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",
+ hostname));
+ hostname = h->h_name;
+ (void) bcopy (h->h_addr,(char *)&sin.sin_addr,h->h_length);
+--- 387,393 ----
+ 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, 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,407 ****
+ for (;;) {
+ netfile = socket (AF_INET,SOCK_STREAM,0);
+ if (netfile < 0)
+! return (scmerr (errno,"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) close(netfile);
+ if (!dobackoff (retry,&backoff))
+ return (SCMERR);
+--- 397,407 ----
+ for (;;) {
+ netfile = socket (AF_INET,SOCK_STREAM,0);
+ if (netfile < 0)
+! return (scmerr (errno, stderr, "Can't create socket"));
+ tin = sin;
+ if (connect(netfile,(struct sockaddr *)&tin,sizeof(tin)) >= 0)
+ break;
+! (void) scmerr (errno, stderr, "Can't connect to server for %s",server);
+ (void) close(netfile);
+ if (!dobackoff (retry,&backoff))
+ return (SCMERR);
+***************
+*** 522,527 ****
+--- 522,529 ----
+ 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,541 ****
+ }
+
+ #if __STDC__
+! int scmerr (int errno,char *fmt,...)
+ #else
+ /*VARARGS*//*ARGSUSED*/
+ int scmerr (va_alist)
+--- 537,543 ----
+ }
+
+ #if __STDC__
+! int scmerr (int errno,FILE *filedes,char *fmt,...)
+ #else
+ /*VARARGS*//*ARGSUSED*/
+ int scmerr (va_alist)
+***************
+*** 544,558 ****
+ {
+ #if !__STDC__
+ int errno;
+ char *fmt;
+ #endif
+ va_list ap;
+
+! (void) fflush (stdout);
+ if (progpid > 0)
+! fprintf (stderr,"%s %d: ",program,progpid);
+ else
+! fprintf (stderr,"%s: ",program);
+ #if __STDC__
+ va_start(ap,fmt);
+ #else
+--- 546,561 ----
+ {
+ #if !__STDC__
+ int errno;
++ FILE *filedes;
+ char *fmt;
+ #endif
+ va_list ap;
+
+! (void) fflush (filedes);
+ if (progpid > 0)
+! fprintf (filedes,"%s %d: ",program,progpid);
+ else
+! fprintf (filedes,"%s: ",program);
+ #if __STDC__
+ va_start(ap,fmt);
+ #else
+***************
+*** 560,572 ****
+ errno = va_arg(ap,int);
+ fmt = va_arg(ap,char *);
+ #endif
+! vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (errno >= 0)
+! fprintf (stderr,": %s\n",errmsg(errno));
+ else
+! fprintf (stderr,"\n");
+! (void) fflush (stderr);
+ return (SCMERR);
+ }
+
+--- 563,575 ----
+ errno = va_arg(ap,int);
+ fmt = va_arg(ap,char *);
+ #endif
+! vfprintf(filedes, fmt, ap);
+ va_end(ap);
+ if (errno >= 0)
+! fprintf (filedes,": %s\n",errmsg(errno));
+ else
+! fprintf (filedes,"\n");
+! (void) fflush (filedes);
+ return (SCMERR);
+ }
+
+diff -c /var/tmp/sup/scmio.c sup/scmio.c
+*** scmio.c Fri Aug 20 17:46:33 1993
+--- sup/scmio.c Sun Aug 13 19:12:45 1995
+***************
+*** 249,261 ****
+ }
+ if (x <= 0) {
+ if (errno == EPIPE)
+! return (scmerr (-1,"Network write timed out"));
+ if (errno)
+! return (scmerr (errno,"Write error on network"));
+! return (scmerr (-1,"Write retries failed"));
+ }
+ if (x != count)
+! return (scmerr (-1,"Write error on network returned %d on write of %d",x,count));
+ return (SCMOK);
+ }
+
+--- 249,261 ----
+ }
+ if (x <= 0) {
+ if (errno == EPIPE)
+! return (scmerr (-1,stderr,"Network write timed out"));
+ if (errno)
+! return (scmerr (errno,stderr,"Write error on network"));
+! return (scmerr (-1,stderr,"Write retries failed"));
+ }
+ if (x != count)
+! return (scmerr (-1,stderr,"Write error on network returned %d on write of %d",x,count));
+ return (SCMOK);
+ }
+
+***************
+*** 280,286 ****
+ if (scmdebug > 1)
+ loginfo ("SCM Writing message %d",msg);
+ if (bufptr)
+! return (scmerr (-1,"Buffering already enabled"));
+ bufptr = buffers;
+ bufptr->b_ptr = bufptr->b_data;
+ bufptr->b_cnt = 0;
+--- 280,286 ----
+ if (scmdebug > 1)
+ loginfo ("SCM Writing message %d",msg);
+ if (bufptr)
+! return (scmerr (-1,stderr,"Buffering already enabled"));
+ bufptr = buffers;
+ bufptr->b_ptr = bufptr->b_data;
+ bufptr->b_cnt = 0;
+***************
+*** 298,304 ****
+ x = writedata (sizeof(int),(char *)&x);
+ if (x != SCMOK) return (x);
+ if (bufptr == NULL)
+! return (scmerr (-1,"Buffering already disabled"));
+ if (bufptr->b_cnt == 0) {
+ bufptr = NULL;
+ return (SCMOK);
+--- 298,304 ----
+ x = writedata (sizeof(int),(char *)&x);
+ if (x != SCMOK) return (x);
+ if (bufptr == NULL)
+! return (scmerr (-1,stderr,"Buffering already disabled"));
+ if (bufptr->b_cnt == 0) {
+ bufptr = NULL;
+ return (SCMOK);
+***************
+*** 351,357 ****
+ struct stat statbuf;
+
+ if (fstat(f,&statbuf) < 0)
+! return (scmerr (errno,"Can't access open file for message"));
+ filesize = statbuf.st_size;
+ y = byteswap(filesize);
+ x = writedata (sizeof(int),(char *)&y);
+--- 351,357 ----
+ struct stat statbuf;
+
+ if (fstat(f,&statbuf) < 0)
+! 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,383 ****
+ } while (x == SCMOK && number > 0);
+ }
+ if (sum != filesize)
+! return (scmerr (-1,"File size error on output message"));
+ if (number < 0)
+! return (scmerr (errno,"Read error on file output message"));
+ return (x);
+ }
+
+--- 375,383 ----
+ } while (x == SCMOK && number > 0);
+ }
+ if (sum != filesize)
+! return (scmerr (-1,stderr,"File size error on output message"));
+ if (number < 0)
+! return (scmerr (errno,stderr,"Read error on file output message"));
+ return (x);
+ }
+
+***************
+*** 431,437 ****
+
+ if (count < 0) {
+ if (bufptr + count < buffer)
+! return (scmerr (-1,"No space in buffer %d",count));
+ bufptr += count;
+ bufcnt -= count;
+ bcopy (data,bufptr,-count);
+--- 431,437 ----
+
+ if (count < 0) {
+ if (bufptr + count < buffer)
+! return (scmerr (-1,stderr,"No space in buffer %d",count));
+ bufptr += count;
+ bufcnt -= count;
+ bcopy (data,bufptr,-count);
+***************
+*** 463,478 ****
+ tries = 0;
+ for (;;) {
+ imask = 1 << netfile;
+ if (select(32,(fd_set *)&imask,(fd_set *)0,(fd_set *)0,&timout) < 0)
+ imask = 1;
+ errno = 0;
+ if (imask)
+ x = read (netfile,p,n);
+ else
+! return (scmerr (-1,"Timeout on network input"));
+ if (x > 0) break;
+ if (x == 0)
+! return (scmerr (-1,"Premature EOF on network input"));
+ if (errno) break;
+ if (++tries > RETRIES) break;
+ if (scmdebug > 0)
+--- 463,483 ----
+ 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,stderr,"Timeout on network input"));
+ if (x > 0) break;
+ if (x == 0)
+! return (scmerr (-1,stderr,"Premature EOF on network "
+! "input"));
+ if (errno) break;
+ if (++tries > RETRIES) break;
+ if (scmdebug > 0)
+***************
+*** 480,487 ****
+ }
+ if (x < 0) {
+ if (errno)
+! return (scmerr (errno,"Read error on network"));
+! return (scmerr (-1,"Read retries failed"));
+ }
+ p += x;
+ n -= x;
+--- 485,492 ----
+ }
+ if (x < 0) {
+ if (errno)
+! return (scmerr (errno,stderr,"Read error on network"));
+! return (scmerr (-1,stderr,"Read retries failed"));
+ }
+ p += x;
+ n -= x;
+***************
+*** 538,544 ****
+
+ /* check for MSGGOAWAY in case he noticed problems first */
+ if (m != MSGGOAWAY)
+! return (scmerr (-1,"Received unexpected message %d",m));
+ (void) netcrypt ((char *)NULL);
+ (void) readstring (&goawayreason);
+ (void) readmend ();
+--- 543,549 ----
+
+ /* check for MSGGOAWAY in case he noticed problems first */
+ if (m != MSGGOAWAY)
+! return (scmerr (-1,stderr,"Received unexpected message %d",m));
+ (void) netcrypt ((char *)NULL);
+ (void) readstring (&goawayreason);
+ (void) readmend ();
+***************
+*** 555,561 ****
+ x = readdata (sizeof(int),(char *)&y);
+ y = byteswap(y);
+ if (x == SCMOK && y != ENDCOUNT)
+! return (scmerr (-1,"Error reading end of message"));
+ return (x);
+ }
+
+--- 560,566 ----
+ x = readdata (sizeof(int),(char *)&y);
+ y = byteswap(y);
+ if (x == SCMOK && y != ENDCOUNT)
+! return (scmerr (-1,stderr,"Error reading end of message"));
+ return (x);
+ }
+
+***************
+*** 567,573 ****
+ x = readcount (&n);
+ if (x != SCMOK) return (x);
+ if (n < 0)
+! return (scmerr (-1,"Invalid message count %d",n));
+ while (x == SCMOK && n > 0) {
+ x = readdata (XFERSIZE(n),buf);
+ n -= XFERSIZE(n);
+--- 572,578 ----
+ x = readcount (&n);
+ if (x != SCMOK) return (x);
+ if (n < 0)
+! return (scmerr (-1,stderr,"Invalid message count %d",n));
+ while (x == SCMOK && n > 0) {
+ x = readdata (XFERSIZE(n),buf);
+ n -= XFERSIZE(n);
+***************
+*** 583,591 ****
+ x = readcount (&y);
+ if (x != SCMOK) return (x);
+ if (y < 0)
+! return (scmerr (-1,"Invalid message count %d",y));
+ if (y != sizeof(int))
+! return (scmerr (-1,"Size error for int message is %d",y));
+ x = readdata (sizeof(int),(char *)&y);
+ (*buf) = byteswap(y);
+ if (scmdebug > 2)
+--- 588,596 ----
+ x = readcount (&y);
+ if (x != SCMOK) return (x);
+ if (y < 0)
+! return (scmerr (-1,stderr,"Invalid message count %d",y));
+ if (y != sizeof(int))
+! 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,619 ****
+ return (SCMOK);
+ }
+ if (count < 0)
+! return (scmerr (-1,"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));
+ if (cryptflag) {
+ x = getcryptbuf (count+1);
+ if (x == SCMOK) x = readdata (count,cryptbuf);
+--- 614,624 ----
+ return (SCMOK);
+ }
+ if (count < 0)
+! 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,stderr,"Can't malloc %d bytes for string",count));
+ if (cryptflag) {
+ x = getcryptbuf (count+1);
+ if (x == SCMOK) x = readdata (count,cryptbuf);
+***************
+*** 647,653 ****
+ x = readcount (&count);
+ if (x != SCMOK) return (x);
+ if (count < 0)
+! return (scmerr (-1,"Invalid message count %d",count));
+ while (x == SCMOK && count > 0) {
+ if (cryptflag) {
+ x = readdata (XFERSIZE(count),cryptbuf);
+--- 652,658 ----
+ x = readcount (&count);
+ if (x != SCMOK) return (x);
+ if (count < 0)
+! return (scmerr (-1,stderr,"Invalid message count %d",count));
+ while (x == SCMOK && count > 0) {
+ if (cryptflag) {
+ x = readdata (XFERSIZE(count),cryptbuf);
+***************
+*** 709,715 ****
+--- 714,724 ----
+ 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) {
+diff -c /var/tmp/sup/stree.c sup/stree.c
+*** stree.c Fri Aug 20 17:46:34 1993
+--- sup/stree.c Wed Apr 5 12:36:58 1995
+***************
+*** 77,82 ****
+--- 77,83 ----
+ 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,95 ****
+--- 91,97 ----
+ 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;
+diff -c /var/tmp/sup/sup.1 sup/sup.1
+*** sup.1 Thu Aug 11 06:24:44 1994
+--- sup/sup.1 Wed Apr 12 00:22:06 1995
+***************
+*** 59,65 ****
+ .\" 04-Apr-85 Steven Shafer (sas) at Carnegie-Mellon University
+ .\" Created.
+ .\"
+! .TH SUP 1 02/08/92
+ .CM 4
+ .SH "NAME"
+ sup \- software upgrade protocol
+--- 59,65 ----
+ .\" 04-Apr-85 Steven Shafer (sas) at Carnegie-Mellon University
+ .\" Created.
+ .\"
+! .TH SUP 1 03/15/95
+ .CM 4
+ .SH "NAME"
+ sup \- software upgrade protocol
+***************
+*** 247,252 ****
+--- 247,287 ----
+ 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,542 ****
+--- 572,590 ----
+ .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,567 ****
+--- 610,620 ----
+ .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,734 ****
+--- 782,793 ----
+ 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,802 ****
+ .I sup
+ with the
+ .B -e
+! flag to allow the automatic execution of command files.
+ .TP
+ \fBinclude\fR \fIlistfile\fR ...
+ The specified
+--- 855,863 ----
+ .I sup
+ with the
+ .B -e
+! 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
+***************
+*** 861,866 ****
+--- 922,930 ----
+ .TP
+ <\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
+diff -c /var/tmp/sup/sup.h sup/sup.h
+*** sup.h Fri Aug 20 17:46:34 1993
+--- sup/sup.h Thu Apr 6 14:08:06 1995
+***************
+*** 101,108 ****
+
+ /* 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 */
+
+ /* TCP servers for name server and file server */
+ #define FILEPORT "supfilesrv"
+--- 101,108 ----
+
+ /* PGMVERSION is defined separately in each program */
+ extern char scmversion[]; /* string version of scm */
+! #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,187 ****
+--- 182,188 ----
+ 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,225 ****
+--- 221,227 ----
+ #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 */
+diff -c /var/tmp/sup/supcdefs.h sup/supcdefs.h
+*** supcdefs.h Thu Aug 11 06:24:45 1994
+--- sup/supcdefs.h Thu Apr 6 15:32:42 1995
+***************
+*** 118,123 ****
+--- 118,124 ----
+ 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,144 ****
+ };
+ 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
+
+ /*************************
+ *** M A C R O S ***
+--- 127,146 ----
+ };
+ typedef struct collstruct COLLECTION;
+
+! #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,155 ****
+ * C prototypes
+ */
+ #if __STDC__
+! void done __P((int value,char *fmt,...));
+! void goaway __P((char *fmt,...));
+! void notify __P((char *fmt,...));
+ #endif
+--- 151,157 ----
+ * C prototypes
+ */
+ #if __STDC__
+! void done __P((int value,char *fmt,...));
+! void goaway __P((char *fmt,...));
+! void notify __P((char *fmt,...));
+ #endif
+diff -c /var/tmp/sup/supcmain.c sup/supcmain.c
+*** supcmain.c Thu Aug 11 06:24:45 1994
+--- sup/supcmain.c Thu Apr 6 15:43:18 1995
+***************
+*** 418,424 ****
+--- 418,428 ----
+ 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");
+***************
+*** 550,555 ****
+--- 554,567 ----
+ break;
+ case 'm':
+ oflags |= CFMAIL;
++ break;
++ case 'i':
++ oflags |= CFUNLINKBUSY;
++ aflags &= ~CFUNLINKBUSY;
++ break;
++ case 'I':
++ oflags &= ~CFUNLINKBUSY;
++ aflags |= CFUNLINKBUSY;
+ break;
+ case 'o':
+ oflags |= CFOLD;
+diff -c /var/tmp/sup/supcmeat.c sup/supcmeat.c
+*** supcmeat.c Thu Aug 11 06:24:45 1994
+--- sup/supcmeat.c Sun Aug 13 18:44:26 1995
+***************
+*** 156,161 ****
+--- 156,163 ----
+ 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,498 ****
+ int needone(), denyone(), deleteone();
+ char buf[STRINGLENGTH];
+ char relsufix[STRINGLENGTH];
+! register char *p,*q;
+ register FILE *f;
+ register int x;
+
+--- 494,501 ----
+ int needone(), denyone(), deleteone();
+ char buf[STRINGLENGTH];
+ char relsufix[STRINGLENGTH];
+! TREE *t;
+! register char *p,*q,*r;
+ register FILE *f;
+ register int x;
+
+***************
+*** 506,513 ****
+ if (f) {
+ while (p = fgets (buf,STRINGLENGTH,f)) {
+ if (q = index (p,'\n')) *q = '\0';
+ if (index ("#;:",*p)) continue;
+! (void) Tinsert (&lastT,p,FALSE);
+ }
+ (void) fclose (f);
+ }
+--- 509,522 ----
+ 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;
+! t = Tinsert (&lastT,p,FALSE);
+! if(t && r)
+! {
+! t->Tnewname = salloc(r);
+! t->Tflags = FRENAME;
+! }
+ }
+ (void) fclose (f);
+ }
+***************
+*** 532,537 ****
+--- 541,547 ----
+ 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,553 ****
+--- 558,565 ----
+ if (thisC->Cflags&(CFALL|CFDELETE|CFOLD))
+ (void) Trprocess (lastT,deleteone);
+ Tfree (&refuseT);
++ Tfree (&renameT);
++ renameT = NULL;
+ }
+
+ needone (t)
+***************
+*** 556,572 ****
+ register TREE *newt;
+ register int exists, fetch;
+ struct stat sbuf;
+
+ newt = Tinsert (&lastT,t->Tname,TRUE);
+ newt->Tflags |= FUPDATE;
+ 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);
+ else
+! exists = (stat (t->Tname,&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
+--- 568,593 ----
+ 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 (name,&sbuf) == 0);
+ else
+! 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,603 ****
+ else return (SCMOK);
+ }
+ /* If we get this far, we're either doing an update or a full fetch. */
+ 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);
+ }
+- newt = Tinsert (&needT,t->Tname,TRUE);
+ if (!fetch && (t->Tmode&S_IFMT) == S_IFREG)
+ newt->Tflags |= FUPDATE;
+ return (SCMOK);
+--- 613,624 ----
+ 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);
+ }
+ if (!fetch && (t->Tmode&S_IFMT) == S_IFREG)
+ newt->Tflags |= FUPDATE;
+ return (SCMOK);
+***************
+*** 615,626 ****
+ {
+ struct stat sbuf;
+ register int x;
+! register char *name = t->Tname;
+
+ if (t->Tflags&FUPDATE) /* in current upgrade list */
+ return (SCMOK);
+ if (lstat(name,&sbuf) < 0) /* doesn't exist */
+ return (SCMOK);
+ /* is it a symbolic link ? */
+ if ((sbuf.st_mode & S_IFMT) == S_IFLNK) {
+ if (Tlookup (refuseT,name)) {
+--- 636,650 ----
+ {
+ struct stat sbuf;
+ register int x;
+! 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,728 ****
+--- 747,756 ----
+ 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,740 ****
+--- 763,770 ----
+ goaway ("Error receiving file from file server");
+ Tfree (&upgradeT);
+ } while (recvmore);
++ if( renamelog )
++ fclose( renamelog );
+ }
+
+ /* prepare the target, if necessary */
+***************
+*** 779,785 ****
+ }
+ if ((statp->st_mode&S_IFMT) == S_IFDIR) {
+ if (rmdir (name) < 0)
+! runp ("rm","rm","-rf",name,0);
+ } else
+ (void) unlink (name);
+ if (stat (name,statp) < 0) {
+--- 809,815 ----
+ }
+ if ((statp->st_mode&S_IFMT) == S_IFDIR) {
+ if (rmdir (name) < 0)
+! runp ("rm","rm","-rf",name,(char *)0);
+ } else
+ (void) unlink (name);
+ if (stat (name,statp) < 0) {
+***************
+*** 799,805 ****
+ struct stat sbuf;
+ int linkone (),execone ();
+ int *recvmore = va_arg(ap,int *);
+!
+ /* check for end of file list */
+ if (t == NULL) {
+ *recvmore = FALSE;
+--- 829,835 ----
+ 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,819 ****
+ 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);
+ if ((t->Tmode&S_IFMT) == S_IFREG) {
+ x = readskip (); /* skip over file */
+ if (x != SCMOK)
+--- 842,850 ----
+ thisC->Cnogood = TRUE;
+ return (SCMOK);
+ }
+! 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,848 ****
+ return (SCMOK);
+ }
+ if ((t->Tmode&S_IFMT) == S_IFREG)
+! (void) Tprocess (t->Tlink,linkone,t->Tname);
+! (void) Tprocess (t->Texec,execone);
+ return (SCMOK);
+ }
+
+--- 872,879 ----
+ return (SCMOK);
+ }
+ if ((t->Tmode&S_IFMT) == S_IFREG)
+! (void) Tprocess (t->Tlink,linkone,name);
+! (void) Tprocess (t->Texec,execone,name);
+ return (SCMOK);
+ }
+
+***************
+*** 852,866 ****
+ register struct stat *statp;
+ {
+ struct timeval tbuf[2];
+
+ if (new) {
+ if (thisC->Cflags&CFLIST) {
+! vnotify ("SUP Would create directory %s\n",t->Tname);
+ return (FALSE);
+ }
+! (void) mkdir (t->Tname,0755);
+! if (stat (t->Tname,statp) < 0) {
+! notify ("SUP: Can't create directory %s\n",t->Tname);
+ return (TRUE);
+ }
+ }
+--- 883,898 ----
+ 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",name);
+ return (FALSE);
+ }
+! (void) mkdir (name,0755);
+! if (stat (name,statp) < 0) {
+! notify ("SUP: Can't create directory %s\n",name);
+ return (TRUE);
+ }
+ }
+***************
+*** 875,891 ****
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+! vnotify ("SUP Would update directory %s\n",t->Tname);
+ return (FALSE);
+ }
+ if ((t->Tflags&FNOACCT) == 0) {
+! (void) chown (t->Tname,t->Tuid,t->Tgid);
+! (void) chmod (t->Tname,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);
+ return (FALSE);
+ }
+
+--- 907,923 ----
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+! vnotify ("SUP Would update directory %s\n",name);
+ return (FALSE);
+ }
+ if ((t->Tflags&FNOACCT) == 0) {
+! (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 (name,tbuf);
+! vnotify ("SUP %s directory %s\n",new?"Created":"Updated",name);
+ return (FALSE);
+ }
+
+***************
+*** 897,925 ****
+ char buf[STRINGLENGTH];
+ int n;
+ register char *linkname;
+
+! if (t->Tlink == NULL || t->Tlink->Tname == 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 == 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);
+ 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);
+ return (TRUE);
+ }
+! vnotify ("SUP Created symbolic link %s to %s\n",t->Tname,linkname);
+ return (FALSE);
+ }
+
+--- 929,958 ----
+ char buf[STRINGLENGTH];
+ int n;
+ register char *linkname;
++ char *name = t->Tflags & FRENAME ? t->Tnewname : t->Tname;
+
+! 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 (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",name,linkname);
+ return (FALSE);
+ }
+ if (!new)
+! (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",name,linkname);
+ return (FALSE);
+ }
+
+***************
+*** 934,939 ****
+--- 967,973 ----
+ 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,966 ****
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+! vnotify ("SUP Would update file %s\n",t->Tname);
+ return (FALSE);
+ }
+! vnotify ("SUP Updating file %s\n",t->Tname);
+ if ((t->Tflags&FNOACCT) == 0) {
+! (void) chown (t->Tname,t->Tuid,t->Tgid);
+! (void) chmod (t->Tname,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);
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+--- 984,1000 ----
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+! vnotify ("SUP Would update file %s\n",name);
+ return (FALSE);
+ }
+! vnotify ("SUP Updating file %s\n",name);
+ if ((t->Tflags&FNOACCT) == 0) {
+! (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 (name,tbuf);
+ return (FALSE);
+ }
+ if (thisC->Cflags&CFLIST) {
+***************
+*** 972,993 ****
+ p = "receive old";
+ else
+ p = "receive";
+! vnotify ("SUP Would %s file %s\n",p,t->Tname);
+ return (FALSE);
+ }
+! vnotify ("SUP Receiving file %s\n",t->Tname);
+ if (!new && (t->Tmode&S_IFMT) == S_IFREG &&
+ (t->Tflags&FBACKUP) && (thisC->Cflags&CFBACKUP)) {
+! fin = fopen (t->Tname,"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);
+ return (TRUE); /* mark upgrade as nogood */
+ }
+! path (t->Tname,dirpart,filepart);
+ (void) sprintf (filename,FILEBACKUP,dirpart,filepart);
+ fout = fopen (filename,"w");
+ if (fout == NULL) {
+--- 1006,1027 ----
+ p = "receive old";
+ else
+ p = "receive";
+! vnotify ("SUP Would %s file %s\n",p,name);
+ return (FALSE);
+ }
+! vnotify ("SUP Receiving file %s\n",name);
+ if (!new && (t->Tmode&S_IFMT) == S_IFREG &&
+ (t->Tflags&FBACKUP) && (thisC->Cflags&CFBACKUP)) {
+! 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",
+! name);
+ return (TRUE); /* mark upgrade as nogood */
+ }
+! path (name,dirpart,filepart);
+ (void) sprintf (filename,FILEBACKUP,dirpart,filepart);
+ fout = fopen (filename,"w");
+ if (fout == NULL) {
+***************
+*** 1006,1025 ****
+ ffilecopy (fin,fout);
+ (void) fclose (fin);
+ (void) fclose (fout);
+! vnotify ("SUP Backup of %s created\n", t->Tname);
+ }
+! x = copyfile (t->Tname,(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);
+ }
+ 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);
+ return (FALSE);
+ }
+
+--- 1040,1059 ----
+ ffilecopy (fin,fout);
+ (void) fclose (fin);
+ (void) fclose (fout);
+! vnotify ("SUP Backup of %s created\n", name);
+ }
+! 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 (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 (name,tbuf);
+ return (FALSE);
+ }
+
+***************
+*** 1067,1075 ****
+ return (SCMOK);
+ }
+
+! execone (t) /* execute command for file */
+ register TREE *t;
+ {
+ union wait w;
+
+ if (thisC->Cflags&CFLIST) {
+--- 1101,1112 ----
+ return (SCMOK);
+ }
+
+! 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,1087 ****
+--- 1119,1128 ----
+ }
+ 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,1101 ****
+--- 1137,1150 ----
+ 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,1113 ****
+--- 1157,1163 ----
+ char tname[STRINGLENGTH];
+ char sys_com[STRINGLENGTH];
+ struct stat sbuf;
++ int retried = 0;
+
+ static int thispid = 0; /* process id # */
+
+***************
+*** 1241,1246 ****
+--- 1291,1297 ----
+ return (FALSE);
+ }
+ /* uncompress it first */
++ retry:
+ if (docompress) {
+ /* make sure file permissions don't cause a problem */
+ (void) unlink (to);
+***************
+*** 1274,1279 ****
+--- 1325,1372 ----
+ 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,1405 ****
+ FILE **finishfile;
+ {
+ if ((thisC->Cflags&CFDELETE) == 0 || (t->Tflags&FUPDATE))
+! fprintf (*finishfile,"%s\n",t->Tname);
+ return (SCMOK);
+ }
+
+--- 1492,1501 ----
+ FILE **finishfile;
+ {
+ if ((thisC->Cflags&CFDELETE) == 0 || (t->Tflags&FUPDATE))
+! if(t->Tflags&FRENAME)
+! fprintf(*finishfile,"%s %s\n",t->Tname,t->Tnewname);
+! else
+! fprintf (*finishfile,"%s\n",t->Tname);
+ return (SCMOK);
+ }
+
+diff -c /var/tmp/sup/supcparse.c sup/supcparse.c
+*** supcparse.c Thu Aug 11 06:24:46 1994
+--- sup/supcparse.c Tue Apr 11 15:18:57 1995
+***************
+*** 82,92 ****
+ extern char _argbreak; /* break character from nxtarg */
+ #endif
+
+ typedef enum { /* supfile options */
+ OHOST, OBASE, OHOSTBASE, OPREFIX, ORELEASE,
+! ONOTIFY, OLOGIN, OPASSWORD, OCRYPT,
+ OBACKUP, ODELETE, OEXECUTE, OOLD, OTIMEOUT, OKEEP, OURELSUF,
+! OCOMPRESS, ONOUPDATE
+ } OPTION;
+
+ struct option {
+--- 82,94 ----
+ 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, ORENAMELOG,
+ OBACKUP, ODELETE, OEXECUTE, OOLD, OTIMEOUT, OKEEP, OURELSUF,
+! OCOMPRESS, ONOUPDATE, OUNLINKBUSY
+ } OPTION;
+
+ struct option {
+***************
+*** 102,107 ****
+--- 104,110 ----
+ "login", OLOGIN,
+ "password", OPASSWORD,
+ "crypt", OCRYPT,
++ "renamelog", ORENAMELOG,
+ "backup", OBACKUP,
+ "delete", ODELETE,
+ "execute", OEXECUTE,
+***************
+*** 110,116 ****
+ "keep", OKEEP,
+ "use-rel-suffix", OURELSUF,
+ "compress", OCOMPRESS,
+! "noupdate", ONOUPDATE
+ };
+
+ passdelim (ptr,delim) /* skip over delimiter */
+--- 113,120 ----
+ "keep", OKEEP,
+ "use-rel-suffix", OURELSUF,
+ "compress", OCOMPRESS,
+! "noupdate", ONOUPDATE,
+! "unlinkbusy", OUNLINKBUSY,
+ };
+
+ passdelim (ptr,delim) /* skip over delimiter */
+***************
+*** 143,148 ****
+--- 147,153 ----
+ 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,214 ****
+--- 214,224 ----
+ 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;
+***************
+*** 232,237 ****
+--- 242,250 ----
+ break;
+ case ONOUPDATE:
+ c->Cflags |= CFNOUPDATE;
++ break;
++ case OUNLINKBUSY:
++ c->Cflags |= CFUNLINKBUSY;
+ break;
+ case OTIMEOUT:
+ passdelim (&args,'=');
+diff -c /var/tmp/sup/supfilesrv.c sup/supfilesrv.c
+*** supfilesrv.c Thu Aug 11 06:24:46 1994
+--- sup/supfilesrv.c Sun Aug 13 18:44:09 1995
+***************
+*** 25,34 ****
+ /*
+ * supfilesrv -- SUP File Server
+ *
+! * Usage: supfilesrv [-l] [-P] [-N]
+ * -l "live" -- don't fork daemon
+ * -P "debug ports" -- use debugging network ports
+ * -N "debug network" -- print debugging messages for network i/o
+ *
+ **********************************************************************
+ * HISTORY
+--- 25,35 ----
+ /*
+ * supfilesrv -- SUP File Server
+ *
+! * 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
+***************
+*** 280,285 ****
+--- 281,287 ----
+ uid_t getuid ();
+
+ int maxchildren;
++ int maxfriends = -1;
+
+ /*
+ * These are used to save the stat information from the crosspatch crypt
+***************
+*** 327,344 ****
+ int dbgportsq; /* -P flag */
+ extern int scmdebug; /* -N flag */
+ extern int netfile;
+
+ char *clienthost; /* host name of client */
+ int nchildren; /* number of children that exist */
+ char *prefix; /* collection pathname prefix */
+ char *release; /* collection release name */
+ char *cryptkey; /* encryption key if non-null */
+ 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 */
+
+ HASH *uidH[HASHSIZE]; /* for uid and gid lookup */
+ HASH *gidH[HASHSIZE];
+--- 329,355 ----
+ 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 */
+
+ HASH *uidH[HASHSIZE]; /* for uid and gid lookup */
+ HASH *gidH[HASHSIZE];
+***************
+*** 350,356 ****
+ * PROTOTYPES
+ */
+ #if __STDC__
+! void goaway __P((char *,...));
+ #endif
+
+ #ifdef LOG_PID_PATHNAME
+--- 361,367 ----
+ * PROTOTYPES
+ */
+ #if __STDC__
+! void goaway __P((char *,...));
+ #endif
+
+ #ifdef LOG_PID_PATHNAME
+***************
+*** 442,454 ****
+ /*
+ * Child status signal handler
+ */
+-
+ void
+ chldsig()
+ {
+ int w;
+
+ while (wait3(&w, WNOHANG, (struct rusage *)0) > 0) {
+ if (nchildren) nchildren--;
+ }
+ }
+--- 453,472 ----
+ /*
+ * 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,479 ****
+--- 492,500 ----
+ int maxsleep;
+ register FILE *f;
+
++ #ifdef RCS
++ candorcs = FALSE;
++ #endif
+ live = FALSE;
+ dbgportsq = FALSE;
+ scmdebug = 0;
+***************
+*** 500,505 ****
+--- 521,532 ----
+ 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,515 ****
+--- 537,547 ----
+ 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,522 ****
+--- 549,559 ----
+ --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,626 ****
+--- 658,667 ----
+ basedir = NULL;
+ prefix = NULL;
+ release = NULL;
++ rcs_branch = NULL;
++ #ifdef CVS
++ cvs_root = NULL;
++ #endif
+ goawayreason = NULL;
+ donereason = NULL;
+ lockfd = -1;
+***************
+*** 642,648 ****
+--- 683,693 ----
+ (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,661 ****
+--- 701,710 ----
+ 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,783 ****
+--- 827,841 ----
+ 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,830 ****
+ if (prefix) (void) chdir (basedir);
+ if (x < 0)
+ goaway ("Can't stat base/prefix directory");
+! if (nchildren >= maxchildren) {
+ setupack = FSETUPBUSY;
+ (void) msgsetupack ();
+ if (protver >= 6) longjmp (sjbuf,TRUE);
+--- 882,888 ----
+ if (prefix) (void) chdir (basedir);
+ if (x < 0)
+ goaway ("Can't stat base/prefix directory");
+! if (nchildren >= maxfriends) {
+ setupack = FSETUPBUSY;
+ (void) msgsetupack ();
+ if (protver >= 6) longjmp (sjbuf,TRUE);
+***************
+*** 861,867 ****
+ q = nxtarg (&p," \t");
+ if ((not = (*q == '!')) && *++q == '\0')
+ q = nxtarg (&p," \t");
+! hostok = (not == (matchhost(q) == 0));
+ if (hostok) {
+ while ((*p == ' ') || (*p == '\t')) p++;
+ if (*p) cryptkey = salloc (p);
+--- 919,934 ----
+ q = nxtarg (&p," \t");
+ if ((not = (*q == '!')) && *++q == '\0')
+ q = nxtarg (&p," \t");
+! 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,883 ****
+--- 945,956 ----
+ }
+ }
+ }
++ 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,1116 ****
+--- 1184,1200 ----
+ /* 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,1138 ****
+ {
+ register int x,fd;
+ register int fdtmp;
+! char sys_com[STRINGLENGTH], temp_file[STRINGLENGTH];
+ char *uconvert(),*gconvert();
+ int sendfile ();
+
+--- 1216,1223 ----
+ {
+ register int x,fd;
+ register int fdtmp;
+! char sys_com[STRINGLENGTH], temp_file[STRINGLENGTH], rcs_file[STRINGLENGTH];
+! union wait status;
+ char *uconvert(),*gconvert();
+ int sendfile ();
+
+***************
+*** 1146,1165 ****
+ 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;
+ }
+ if (t->Tmode) {
+ t->Tuser = salloc (uconvert (t->Tuid));
+--- 1231,1304 ----
+ fd = -1; /* no open file */
+ if ((t->Tmode&S_IFMT) == S_IFREG) {
+ if (!listonly && (t->Tflags&FUPDATE) == 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,1174 ****
+--- 1308,1317 ----
+ 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);
+ }
+diff -c /var/tmp/sup/supmsg.c sup/supmsg.c
+*** supmsg.c Fri Aug 20 17:46:35 1993
+--- sup/supmsg.c Thu Apr 6 15:17:07 1995
+***************
+*** 299,304 ****
+--- 299,305 ----
+ * 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,312 ****
+--- 308,315 ----
+ 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,341 ****
+ if (x == SCMOK) x = writeint ((int)scantime);
+ if (x == SCMOK) x = writemend ();
+ } else {
+! char *name;
+ 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 (x == SCMOK) x = readint (&flags);
+ if (x == SCMOK) x = readint (&mtime);
+ if (x != SCMOK) break;
+ t = Tinsert (&listT,name,TRUE);
+ free (name);
+ t->Tmode = mode;
+ t->Tflags = flags;
+ t->Tmtime = mtime;
+--- 326,350 ----
+ if (x == SCMOK) x = writeint ((int)scantime);
+ if (x == SCMOK) x = writemend ();
+ } else {
+! 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;
+! 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,479 ****
+--- 483,490 ----
+ 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,504 ****
+--- 510,517 ----
+ 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 ();
+diff -c /var/tmp/sup/supmsg.h sup/supmsg.h
+*** supmsg.h Fri Aug 20 17:46:35 1993
+--- sup/supmsg.h Thu Apr 6 15:18:04 1995
+***************
+*** 170,175 ****
+--- 170,176 ----
+
+ /* 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 */
+diff -c /var/tmp/sup/vprintf.c sup/vprintf.c
+*** vprintf.c Fri Aug 20 17:46:35 1993
+--- sup/vprintf.c Thu Apr 6 15:26:03 1995
+***************
+*** 118,126 ****
+--- 118,133 ----
+ {
+ 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);
+*** /dev/null Sun Aug 13 11:14:38 1995
+--- daemon.c Sun Aug 13 19:59:10 1995
+***************
+*** 0 ****
+--- 1,68 ----
++ /*-
++ * Copyright (c) 1990 The Regents of the University of California.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgement:
++ * This product includes software developed by the University of
++ * California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * from: "@(#)daemon.c 5.3 (Berkeley) 12/28/90
++ * $Id: daemon.c,v 1.3 1994/02/23 09:56:41 rgrimes Exp $
++ */
++
++ #if defined(LIBC_SCCS) && !defined(lint)
++ static char sccsid[] = "@(#)daemon.c 5.3 (Berkeley) 12/28/90";
++ #endif /* LIBC_SCCS and not lint */
++
++ #include <sys/fcntl.h>
++ #include <unistd.h>
++
++ daemon(nochdir, noclose)
++ int nochdir, noclose;
++ {
++ int cpid;
++
++ if ((cpid = fork()) == -1)
++ return (-1);
++ if (cpid)
++ exit(0);
++ (void) setsid();
++ if (!nochdir)
++ (void) chdir("/");
++ if (!noclose) {
++ int devnull = open("/dev/null", O_RDWR, 0);
++
++ if (devnull != -1) {
++ (void) dup2(devnull, STDIN_FILENO);
++ (void) dup2(devnull, STDOUT_FILENO);
++ (void) dup2(devnull, STDERR_FILENO);
++ if (devnull > 2)
++ (void) close(devnull);
++ }
++ }
++ return 0;
++ }
+*** /dev/null Sun Aug 13 11:14:38 1995
+--- flock.c Sun Aug 13 19:58:50 1995
+***************
+*** 0 ****
+--- 1,112 ----
++ /*
++ * Copyright (c) 1991 Carnegie Mellon University
++ * All Rights Reserved.
++ *
++ * Permission to use, copy, modify and distribute this software and its
++ * documentation is hereby granted, provided that both the copyright
++ * notice and this permission notice appear in all copies of the
++ * software, derivative works or modified versions, and any portions
++ * thereof, and that both notices appear in supporting documentation.
++ *
++ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
++ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
++ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
++ *
++ * Carnegie Mellon requests users of this software to return to
++ *
++ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
++ * School of Computer Science
++ * Carnegie Mellon University
++ * Pittsburgh PA 15213-3890
++ *
++ * any improvements or extensions that they make and grant Carnegie the rights
++ * to redistribute these changes.
++ */
++ /*
++ * flock (fd, operation)
++ *
++ * This routine performs some file locking like the BSD 'flock'
++ * on the object described by the int file descriptor 'fd',
++ * which must already be open.
++ *
++ * The operations that are available are:
++ *
++ * LOCK_SH - get a shared lock.
++ * LOCK_EX - get an exclusive lock.
++ * LOCK_NB - don't block (must be ORed with LOCK_SH or LOCK_EX).
++ * LOCK_UN - release a lock.
++ *
++ * Return value: 0 if lock successful, -1 if failed.
++ *
++ * Note that whether the locks are enforced or advisory is
++ * controlled by the presence or absence of the SETGID bit on
++ * the executable.
++ *
++ * Note that there is no difference between shared and exclusive
++ * locks, since the 'lockf' system call in SYSV doesn't make any
++ * distinction.
++ *
++ * The file "<sys/file.h>" should be modified to contain the definitions
++ * of the available operations, which must be added manually (see below
++ * for the values).
++ */
++
++ #include <unistd.h>
++ #include <sys/file.h>
++ #include <errno.h>
++
++ #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 errno;*/
++
++ int
++ flock (fd, operation)
++ int fd, operation;
++ {
++ int i;
++
++ switch (operation) {
++
++ /* LOCK_SH - get a shared lock */
++ case LOCK_SH:
++ /* LOCK_EX - get an exclusive lock */
++ case LOCK_EX:
++ i = lockf (fd, F_LOCK, 0);
++ break;
++
++ /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
++ case LOCK_SH|LOCK_NB:
++ /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
++ case LOCK_EX|LOCK_NB:
++ i = lockf (fd, F_TLOCK, 0);
++ if (i == -1)
++ if ((errno == EAGAIN) || (errno == EACCES))
++ errno = EWOULDBLOCK;
++ break;
++
++ /* LOCK_UN - unlock */
++ case LOCK_UN:
++ i = lockf (fd, F_ULOCK, 0);
++ break;
++
++ /* Default - can't decipher operation */
++ default:
++ i = -1;
++ errno = EINVAL;
++ break;
++ }
++
++ return (i);
++ }
++
+*** /dev/null Sun Aug 13 11:14:38 1995
+--- utimes.c Sun Aug 13 19:58:43 1995
+***************
+*** 0 ****
+--- 1,43 ----
++ /*
++ * Copyright (c) 1991 Carnegie Mellon University
++ * All Rights Reserved.
++ *
++ * Permission to use, copy, modify and distribute this software and its
++ * documentation is hereby granted, provided that both the copyright
++ * notice and this permission notice appear in all copies of the
++ * software, derivative works or modified versions, and any portions
++ * thereof, and that both notices appear in supporting documentation.
++ *
++ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
++ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
++ * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
++ *
++ * Carnegie Mellon requests users of this software to return to
++ *
++ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
++ * School of Computer Science
++ * Carnegie Mellon University
++ * Pittsburgh PA 15213-3890
++ *
++ * any improvements or extensions that they make and grant Carnegie the rights
++ * to redistribute these changes.
++ */
++ #include <sys/types.h>
++ #include <sys/time.h>
++ #include <utime.h>
++
++ int utimes(file,tvp) char *file; struct timeval *tvp;
++ {
++ struct utimbuf ut;
++ time_t now;
++
++ now = time((time_t *)NULL);
++ if (tvp == (struct timeval *)NULL) {
++ ut.actime = now;
++ ut.modtime = now;
++ } else {
++ ut.actime = tvp++->tv_sec;
++ ut.modtime = tvp->tv_sec;
++ }
++ return(utime(file,&ut));
++ }
+*** /dev/null Sun Aug 13 11:14:38 1995
+--- Makefile.HP Sun Aug 13 19:59:02 1995
+***************
+*** 0 ****
+--- 1,127 ----
++ # Copyright (c) 1992,1991 Carnegie Mellon University
++ # All Rights Reserved.
++ #
++ # Permission to use, copy, modify and distribute this software and its
++ # documentation is hereby granted, provided that both the copyright
++ # notice and this permission notice appear in all copies of the
++ # software, derivative works or modified versions, and any portions
++ # thereof, and that both notices appear in supporting documentation.
++ #
++ # CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
++ # CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
++ # ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
++ #
++ # Carnegie Mellon requests users of this software to return to
++ #
++ # Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
++ # School of Computer Science
++ # Carnegie Mellon University
++ # Pittsburgh PA 15213-3890
++ #
++ # any improvements or extensions that they make and grant Carnegie the rights
++ # to redistribute these changes.
++ ######################################################################
++ # Makefile to build sup (the client side), supfilesrv (the repository
++ # side, and supscan (used by the repository. If you only want to sup
++ # files from CMU, just build sup.
++ # The header files: c.h, libc.h and sysent.h are only
++ # necessary if you are compiling on a non-Mach system. Likewise the
++ # files in libextra.a are normally found in libcs.a on a Mach system.
++ # DOPRINT_VA is used by vprintf.c and should be defined if your version
++ # of libc/doprnt.c defines the routine _doprnt_va. If it defines _doprnt
++ # instead, leave DORPINT_VA undefined.
++ ######################################################################
++ #
++ # If you need to build a sup for export outside of North America use
++ # "make EXPORTABLE_SYSTEM=true"
++ # this will remove (not use) any vestiges of crypt code that is present
++ # on the system.
++ #
++ # If you have crypt/crypt.c and /usr/lib/libcrypt.a, you will be building
++ # a system that uses the SUP crypt mechanism by default.
++ #
++ SITE = NETBSD
++ #SITE = CMUCS
++ RENAMELOG = \"/usr/local/etc/sup.moved\"
++ NETBSD_DEFINES = -UMACH -DHAS_DAEMON -DNEED_VSNPRINTF
++ 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} -DRENAMELOG=${RENAMELOG} -D_BSD
++
++ #INSTALLATION PARAMETERS
++ NETBSD_BINDIR = /usr/local/etc
++ NETBSD_MAN1 = /usr/local/man/man1
++ NETBSD_MAN8 = /usr/local/man/man8
++ EXPORTABLE_SYSTEM = true
++ CC = gcc
++ CFLAGS = ${DEFS} -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 flock.o utimes.o
++
++ PROGRAMS = sup supscan supfilesrv
++ MAN1 = sup.1
++ MAN8 = supservers.8
++
++ AFS_LIBPATH = /usr/afs/lib
++ AFS_LIBS = -L${AFS_LIBPATH}/afs -lkauth -lprot -L${AFS_LIBPATH} -lubik -lauth -lrxkad -lsys -ldes -lrx -llwp -lcmd -lcom_err -lc ${AFS_LIBPATH}/afs/util.a
++
++ USE_CRYPT = no
++
++ LIBS = libextra.a
++ sup_OFILES = ${SUPCL} ${SUPS}
++ supfilesrv_OFILES = supfilesrv.o scan.o daemon.o ${SUPS}
++ supfilesrv_LIBS = libextra.a
++ supscan_OFILES = supscan.o stree.o scan.o
++
++
++ all: ${PROGRAMS}
++
++ sup: ${sup_OFILES} ${LIBS}
++ ${CC} ${CFLAGS} -o sup ${sup_OFILES} ${LIBS} ${NETBSD_LIBS} -lBSD
++
++ supfilesrv: ${supfilesrv_OFILES} ${supfilesrv_LIBS}
++ ${CC} ${CFLAGS} -o supfilesrv ${supfilesrv_OFILES} ${supfilesrv_LIBS} ${NETBSD_LIBS} -lBSD
++
++ supscan: ${supscan_OFILES} ${LIBS}
++ ${CC} ${CFLAGS} -o supscan ${supscan_OFILES} ${LIBS} ${NETBSD_LIBS} -lBSD
++
++ libextra.a: ${EXTRA}
++ ar r libextra.a $?
++ ranlib libextra.a
++
++ clean cleandir:
++ rm -f ${PROGRAMS} libextra.a netcrypt.c *.o core a.out
++
++ install: ${PROGRAMS}
++ install -m 500 -u bin -g bin -f ${NETBSD_BINDIR} supscan
++ install -m 500 -u bin -g bin -f ${NETBSD_BINDIR} sup
++ install -m 500 -u bin -g bin -f ${NETBSD_BINDIR} supfilesrv
++ install -m 444 -u bin -g bin -f ${NETBSD_MAN1} ${MAN1}
++ install -m 444 -u bin -g bin -f ${NETBSD_MAN8} ${MAN8}
++
++ #netcrypt.c: crypt.diffs
++ netcrypt.c: netcryptvoid.c
++ cp netcryptvoid.c netcrypt.c
++
++ scan.o: sup.h
++ scm.o: sup.h
++ scmio.o: sup.h supmsg.h
++ stree.o: sup.h
++ supcmain.o: sup.h supmsg.h supcdefs.h
++ supcmeat.o: sup.h supmsg.h supcdefs.h
++ supcmisc.o: sup.h supmsg.h supcdefs.h
++ supcname.o: sup.h supmsg.h supcdefs.h
++ supcparse.o: sup.h supmsg.h supcdefs.h
++ supfilesrv.o: sup.h supmsg.h
++ supmsg.o: sup.h supmsg.h
++ supscan.o: sup.h
++ netcryptvoid.o: sup.h supmsg.h
++ netcrypt.o: sup.h supmsg.h