- for portability make sure that we never use "" as a pathname, always convert
it to "." - include sockio.h if needed to define SIOCGIFCONF (for svr4) - use POSIX signals and wait macros - add -S silent flag, so that the client does not print messages unless there is something wrong - use flock or lockf as appropriate - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs, don't depend on the major() = 255 hack; it only works on legacy systems. - use gzip -cf to make sure that gzip compresses the file even when the file would expand. - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf... To compile sup on systems other than NetBSD, you'll need a copy of daemon.c, vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
This commit is contained in:
parent
82f0b829e8
commit
b33b1aed5c
|
@ -40,15 +40,22 @@
|
|||
# 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.
|
||||
#
|
||||
# If building on non 4.4BSD systems, you'll need the vis(3) and the daemon(3)
|
||||
# functions from libc and libutil
|
||||
|
||||
#SITE = SUNOS
|
||||
#SITE = SOLARIS
|
||||
SITE = NETBSD
|
||||
#SITE = CMUCS
|
||||
|
||||
NETBSD_DEFINES = -UMACH -DVAR_TMP -DHAS_DAEMON -DHAS_POSIX_DIR
|
||||
SOLARIS_DEFINES = -UMACH -DVAR_TMP -DHAS_POSIX_DIR -DNEED_VSNPRINTF
|
||||
AFS_DEFINES = -DAFS -I/usr/afsws/include
|
||||
OSF_DEFINES = -UMACH -DOSF -D_BSD -noshrlib -g -DNEED_VSNPRINTF -DVAR_TMP
|
||||
SUNOS_DEFINES = -UMACH -D_BSD -DNEED_VSNPRINTF -DVAR_TMP -DHAS_POSIX_DIR -DHAS_DAEMON -DNEED_DAEMON
|
||||
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/sbin
|
||||
|
@ -60,8 +67,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
|
||||
|
@ -78,12 +86,18 @@ USE_CRYPT = yes
|
|||
NETBSD_LIBS = -lcrypt -lutil
|
||||
CMUCS_LIBS = -lsys
|
||||
OSF_LIBS = -lbsd
|
||||
LIBS = libextra.a
|
||||
EXTRALIBS = libextra.a
|
||||
sup_OFILES = ${SUPCL} ${SUPS}
|
||||
supfilesrv_OFILES = supfilesrv.o scan.o ${SUPS}
|
||||
supfilesrv_LIBS = libextra.a
|
||||
supscan_OFILES = supscan.o stree.o scan.o
|
||||
SOLARIS_LIBS = -lsocket -lnsl
|
||||
SUNOS_LIBS =
|
||||
|
||||
.for i in ${SITE}
|
||||
DEFS = -UCMUCS -UCMU ${${i}_DEFINES}
|
||||
LIBS = ${EXTRALIBS} ${${i}_LIBS}
|
||||
.endfor
|
||||
|
||||
all: ${PROGRAMS}
|
||||
.if defined(USE_CRYPT)
|
||||
|
@ -92,13 +106,13 @@ all: ${PROGRAMS}
|
|||
.endif
|
||||
|
||||
sup: ${sup_OFILES} ${LIBS}
|
||||
${CC} ${CFLAGS} -o sup ${sup_OFILES} ${LIBS} ${NETBSD_LIBS}
|
||||
${CC} ${CFLAGS} -o sup ${sup_OFILES} ${LIBS} ${LIBS}
|
||||
|
||||
supfilesrv: ${supfilesrv_OFILES} ${supfilesrv_LIBS}
|
||||
${CC} ${CFLAGS} -o supfilesrv ${supfilesrv_OFILES} ${supfilesrv_LIBS} ${NETBSD_LIBS}
|
||||
${CC} ${CFLAGS} -o supfilesrv ${supfilesrv_OFILES} ${supfilesrv_LIBS} ${LIBS}
|
||||
|
||||
supscan: ${supscan_OFILES} ${LIBS}
|
||||
${CC} ${CFLAGS} -o supscan ${supscan_OFILES} ${LIBS} ${NETBSD_LIBS}
|
||||
${CC} ${CFLAGS} -o supscan ${supscan_OFILES} ${LIBS}
|
||||
|
||||
libextra.a: ${EXTRA}
|
||||
ar r libextra.a $?
|
||||
|
|
|
@ -92,6 +92,8 @@ static void addone();
|
|||
static int addpath();
|
||||
static int gethdir();
|
||||
|
||||
#define fixit(a) (a[0] ? a : ".")
|
||||
|
||||
int expand(spec, buffer, bufsize)
|
||||
register char *spec;
|
||||
char **buffer;
|
||||
|
@ -134,7 +136,7 @@ static void glob(as)
|
|||
}
|
||||
while (*cs == 0 || index(globchars, *cs) == 0) {
|
||||
if (*cs == 0) {
|
||||
if (lstat(path, &stb) >= 0) addone(path, "");
|
||||
if (lstat(fixit(path), &stb) >= 0) addone(path, "");
|
||||
goto endit;
|
||||
}
|
||||
if (addpath(*cs++)) goto endit;
|
||||
|
@ -150,7 +152,7 @@ static void glob(as)
|
|||
return;
|
||||
}
|
||||
/* this should not be an lstat */
|
||||
if (stat(path, &stb) >= 0 && (stb.st_mode&S_IFMT) == S_IFDIR)
|
||||
if (stat(fixit(path), &stb) >= 0 && (stb.st_mode&S_IFMT) == S_IFDIR)
|
||||
matchdir(cs);
|
||||
endit:
|
||||
pathp = spathp;
|
||||
|
@ -168,11 +170,11 @@ static void matchdir(pattern)
|
|||
#endif
|
||||
DIR *dirp;
|
||||
|
||||
dirp = opendir(path);
|
||||
dirp = opendir(fixit(path));
|
||||
if (dirp == NULL)
|
||||
return;
|
||||
while ((dp = readdir(dirp)) != NULL) {
|
||||
#ifdef HAS_POSIX_DIR
|
||||
#if defined(HAS_POSIX_DIR) && !defined(__SVR4)
|
||||
if (dp->d_fileno == 0) continue;
|
||||
#else
|
||||
if (dp->d_ino == 0) continue;
|
||||
|
@ -320,7 +322,7 @@ slash:
|
|||
while (*s)
|
||||
if (addpath(*s++)) goto pathovfl;
|
||||
if (addpath('/')) goto pathovfl;
|
||||
if (stat(path, &stb) >= 0 &&
|
||||
if (stat(fixit(path), &stb) >= 0 &&
|
||||
(stb.st_mode&S_IFMT) == S_IFDIR)
|
||||
if (*p == 0)
|
||||
addone(path, "");
|
||||
|
|
|
@ -48,6 +48,23 @@
|
|||
**********************************************************************
|
||||
* HISTORY
|
||||
* $Log: run.c,v $
|
||||
* Revision 1.3 1996/09/05 16:50:03 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.2 1995/06/24 16:21:33 christos
|
||||
* - Don't use system(3) to fork processes. It is a big security hole.
|
||||
* - Encode the filenames in the scan files using strvis(3), so filenames
|
||||
|
@ -153,8 +170,8 @@ int usepath;
|
|||
{
|
||||
int wpid;
|
||||
register int pid;
|
||||
struct sigvec ignoresig,intsig,quitsig;
|
||||
union wait status;
|
||||
struct sigaction ignoresig,intsig,quitsig;
|
||||
int status;
|
||||
int execvp(), execv();
|
||||
int (*execrtn)() = usepath ? execvp : execv;
|
||||
|
||||
|
@ -169,25 +186,25 @@ int usepath;
|
|||
_exit (0377);
|
||||
}
|
||||
|
||||
ignoresig.sv_handler = SIG_IGN; /* ignore INT and QUIT signals */
|
||||
ignoresig.sv_mask = 0;
|
||||
ignoresig.sv_onstack = 0;
|
||||
sigvec (SIGINT,&ignoresig,&intsig);
|
||||
sigvec (SIGQUIT,&ignoresig,&quitsig);
|
||||
ignoresig.sa_handler = SIG_IGN; /* ignore INT and QUIT signals */
|
||||
sigemptyset(&ignoresig.sa_mask);
|
||||
ignoresig.sa_flags = 0;
|
||||
sigaction (SIGINT,&ignoresig,&intsig);
|
||||
sigaction (SIGQUIT,&ignoresig,&quitsig);
|
||||
do {
|
||||
wpid = wait3 (&status.w_status, WUNTRACED, 0);
|
||||
wpid = wait3 (&status, WUNTRACED, 0);
|
||||
if (WIFSTOPPED (status)) {
|
||||
kill (0,SIGTSTP);
|
||||
wpid = 0;
|
||||
}
|
||||
} while (wpid != pid && wpid != -1);
|
||||
sigvec (SIGINT,&intsig,0); /* restore signals */
|
||||
sigvec (SIGQUIT,&quitsig,0);
|
||||
sigaction (SIGINT,&intsig,0); /* restore signals */
|
||||
sigaction (SIGQUIT,&quitsig,0);
|
||||
|
||||
if (WIFSIGNALED (status) || status.w_retcode == 0377)
|
||||
if (WIFSIGNALED (status) || WEXITSTATUS(status) == 0377)
|
||||
return (-1);
|
||||
|
||||
return (status.w_retcode);
|
||||
return (WEXITSTATUS(status));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -28,6 +28,23 @@
|
|||
**********************************************************************
|
||||
* HISTORY
|
||||
* $Log: scan.c,v $
|
||||
* Revision 1.5 1996/09/05 16:50:04 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.4 1995/10/29 23:54:45 christos
|
||||
* - runio fails when result != 0 not only < 0
|
||||
* - print vis-encoded file in the scanner.
|
||||
|
@ -110,6 +127,7 @@
|
|||
#include <sys/dir.h>
|
||||
#endif
|
||||
#include <sys/file.h>
|
||||
#include <unistd.h>
|
||||
#include "sup.h"
|
||||
|
||||
/*************************
|
||||
|
|
|
@ -69,6 +69,23 @@
|
|||
* since Tahoe version of <netinet/in.h> does not define them.
|
||||
*
|
||||
* $Log: scm.c,v $
|
||||
* Revision 1.3 1996/09/05 16:50:05 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.2 1995/06/03 21:21:51 christos
|
||||
* Changes to write ascii timestamps in the when files.
|
||||
* Looked into making it 64 bit clean, but it is hopeless.
|
||||
|
@ -177,6 +194,9 @@
|
|||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#ifndef SIOCGIFCONF
|
||||
#include <sys/sockio.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
|
@ -199,6 +219,7 @@ extern int errno;
|
|||
static char *myhost ();
|
||||
|
||||
char scmversion[] = "4.3 BSD";
|
||||
extern int silent;
|
||||
|
||||
/*************************
|
||||
*** M A C R O S ***
|
||||
|
@ -348,6 +369,7 @@ int *t,*b;
|
|||
s = *t;
|
||||
*t -= s;
|
||||
}
|
||||
if (!silent)
|
||||
(void) scmerr (-1,"Will retry in %d seconds",s);
|
||||
sleep (s);
|
||||
return (1);
|
||||
|
@ -372,6 +394,7 @@ int *retry;
|
|||
else
|
||||
return (scmerr (-1,"Can't find %s server description",
|
||||
server));
|
||||
if (!silent)
|
||||
(void) scmerr (-1,"%s/tcp: unknown service: using port %d",
|
||||
server,port);
|
||||
} else
|
||||
|
|
|
@ -23,6 +23,23 @@
|
|||
.\"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
.\" HISTORY
|
||||
.\" $Log: sup.1,v $
|
||||
.\" Revision 1.4 1996/09/05 16:50:06 christos
|
||||
.\" - for portability make sure that we never use "" as a pathname, always convert
|
||||
.\" it to "."
|
||||
.\" - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
.\" - use POSIX signals and wait macros
|
||||
.\" - add -S silent flag, so that the client does not print messages unless there
|
||||
.\" is something wrong
|
||||
.\" - use flock or lockf as appropriate
|
||||
.\" - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
.\" don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
.\" - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
.\" would expand.
|
||||
.\" - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
.\"
|
||||
.\" To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
.\" vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
.\"
|
||||
.\" Revision 1.3 1995/06/03 21:21:53 christos
|
||||
.\" Changes to write ascii timestamps in the when files.
|
||||
.\" Looked into making it 64 bit clean, but it is hopeless.
|
||||
|
@ -120,6 +137,9 @@ will print the time
|
|||
that each collection was last upgraded, rather than
|
||||
performing actual upgrades.
|
||||
.TP
|
||||
.B -S
|
||||
Operate silently printing messages only on errors.
|
||||
.TP
|
||||
.B -N
|
||||
.I Sup
|
||||
will trace network messages sent and received that implement the
|
||||
|
|
|
@ -33,6 +33,23 @@
|
|||
* across the network to save BandWidth
|
||||
*
|
||||
* $Log: supcdefs.h,v $
|
||||
* Revision 1.3 1996/09/05 16:50:07 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.2 1993/08/04 17:46:16 brezak
|
||||
* Changes from nate for gzip'ed sup
|
||||
*
|
||||
|
@ -66,6 +83,7 @@
|
|||
#include <setjmp.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
|
@ -122,6 +140,7 @@ typedef struct collstruct COLLECTION;
|
|||
#define CFKEEP 01000
|
||||
#define CFURELSUF 02000
|
||||
#define CFCOMPRESS 04000
|
||||
#define CFSILENT 10000
|
||||
|
||||
/*************************
|
||||
*** M A C R O S ***
|
||||
|
|
|
@ -174,6 +174,23 @@
|
|||
* across the network to save BandWidth
|
||||
*
|
||||
* $Log: supcmain.c,v $
|
||||
* Revision 1.5 1996/09/05 16:50:08 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.4 1995/09/16 19:01:25 glass
|
||||
* if the function returns nothing, declare it void
|
||||
*
|
||||
|
@ -341,6 +358,7 @@ COLLECTION *firstC,*thisC; /* collection list pointer */
|
|||
extern int dontjump; /* disable longjmp */
|
||||
extern int scmdebug; /* SCM debugging flag */
|
||||
|
||||
int silent; /* Silent run, print only errors */
|
||||
int sysflag; /* system upgrade flag */
|
||||
int timeflag; /* print times flag */
|
||||
#if MACH
|
||||
|
@ -361,7 +379,7 @@ char **argv;
|
|||
char *progname,*supfname;
|
||||
int restart,sfdev,sfino,sfmtime;
|
||||
struct stat sbuf;
|
||||
struct sigvec ignvec,oldvec;
|
||||
struct sigaction ign;
|
||||
|
||||
/* initialize global variables */
|
||||
pgmversion = PGMVERSION; /* export version number */
|
||||
|
@ -387,10 +405,10 @@ char **argv;
|
|||
prtime ();
|
||||
} else {
|
||||
/* ignore network pipe signals */
|
||||
ignvec.sv_handler = SIG_IGN;
|
||||
ignvec.sv_onstack = 0;
|
||||
ignvec.sv_mask = 0;
|
||||
(void) sigvec (SIGPIPE,&ignvec,&oldvec);
|
||||
ign.sa_handler = SIG_IGN;
|
||||
ign.sa_flags = 0;
|
||||
sigemptyset(&ign.sa_mask);
|
||||
(void) sigaction (SIGPIPE,&ign,NULL);
|
||||
getnams (); /* find unknown repositories */
|
||||
for (thisC = firstC; thisC; thisC = thisC->Cnext) {
|
||||
getcoll (); /* upgrade each collection */
|
||||
|
@ -410,6 +428,7 @@ char **argv;
|
|||
(void) endgrent (); /* close /etc/group */
|
||||
if (restart == 1) {
|
||||
int fd;
|
||||
if (!silent)
|
||||
loginfo("SUP Restarting %s with new supfile %s",
|
||||
progname,supfname);
|
||||
for (fd = getdtablesize (); fd > 3; fd--)
|
||||
|
@ -495,6 +514,9 @@ int *oflagsp,*aflagsp;
|
|||
case 'X':
|
||||
xpatchflag = TRUE;
|
||||
break;
|
||||
case 'S':
|
||||
silent = TRUE;
|
||||
break;
|
||||
case 's':
|
||||
sysflag = TRUE;
|
||||
break;
|
||||
|
@ -703,6 +725,7 @@ char **argv;
|
|||
p = "system software";
|
||||
else
|
||||
(void) sprintf (p = buf,"file %s",supfname);
|
||||
if (!silent)
|
||||
loginfo ("SUP %d.%d (%s) for %s at %s",PROTOVERSION,PGMVERSION,
|
||||
scmversion,p,fmttime (timenow));
|
||||
return (salloc (supfname));
|
||||
|
|
|
@ -32,6 +32,23 @@
|
|||
* across the network to save BandWidth
|
||||
*
|
||||
* $Log: supcmeat.c,v $
|
||||
* Revision 1.7 1996/09/05 16:50:09 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.6 1995/10/29 23:54:47 christos
|
||||
* - runio fails when result != 0 not only < 0
|
||||
* - print vis-encoded file in the scanner.
|
||||
|
@ -417,17 +434,33 @@ int login ()
|
|||
(void) sprintf (buf,FILELOCK,collname);
|
||||
f = open (buf,O_RDONLY,0);
|
||||
if (f >= 0) {
|
||||
if (flock (f,(LOCK_EX|LOCK_NB)) < 0) {
|
||||
if (errno != EWOULDBLOCK)
|
||||
goaway ("Can't lock collection %s",collname);
|
||||
if (flock (f,(LOCK_SH|LOCK_NB)) < 0) {
|
||||
|
||||
#if defined(LOCK_EX)
|
||||
# define TESTLOCK(f) flock(f, LOCK_EX|LOCK_NB)
|
||||
# define SHARELOCK(f) flock(f, LOCK_SH|LOCK_NB)
|
||||
# define WAITLOCK(f) flock(f, LOCK_EX)
|
||||
#elif defined(F_LOCK)
|
||||
# define TESTLOCK(f) lockf(f, F_TLOCK, 0)
|
||||
# define SHARELOCK(f) 1
|
||||
# define WAITLOCK(f) lockf(f, F_LOCK, 0)
|
||||
#else
|
||||
# define TESTLOCK(f) (close(f), f = -1, 1)
|
||||
# define SHARELOCK(f) 1
|
||||
# define WAITLOCK(f) 1
|
||||
#endif
|
||||
if (TESTLOCK(f) < 0) {
|
||||
if (errno != EWOULDBLOCK && errno != EAGAIN) {
|
||||
(void) close(f);
|
||||
if (errno == EWOULDBLOCK)
|
||||
goaway ("Can't lock collection %s",collname);
|
||||
}
|
||||
if (SHARELOCK(f) < 0) {
|
||||
(void) close (f);
|
||||
if (errno == EWOULDBLOCK && errno != EAGAIN)
|
||||
goaway ("Collection %s is locked by another sup",collname);
|
||||
goaway ("Can't lock collection %s",collname);
|
||||
}
|
||||
vnotify ("SUP Waiting for exclusive access lock\n");
|
||||
if (flock (f,LOCK_EX) < 0) {
|
||||
if (WAITLOCK(f) < 0) {
|
||||
(void) close (f);
|
||||
goaway ("Can't lock collection %s",collname);
|
||||
}
|
||||
|
@ -1054,7 +1087,7 @@ register char **fname;
|
|||
execone (t) /* execute command for file */
|
||||
register TREE *t;
|
||||
{
|
||||
union wait w;
|
||||
int w;
|
||||
|
||||
if (thisC->Cflags&CFLIST) {
|
||||
vnotify ("SUP Would execute %s\n",t->Tname);
|
||||
|
@ -1066,18 +1099,18 @@ register TREE *t;
|
|||
}
|
||||
vnotify ("SUP Executing %s\n",t->Tname);
|
||||
|
||||
w.w_status = system (t->Tname);
|
||||
if (WIFEXITED(w) && w.w_retcode != 0) {
|
||||
w = system (t->Tname);
|
||||
if (WIFEXITED(w) && WEXITSTATUS(w) != 0) {
|
||||
notify ("SUP: Execute command returned failure status %#o\n",
|
||||
w.w_retcode);
|
||||
WEXITSTATUS(w));
|
||||
thisC->Cnogood = TRUE;
|
||||
} else if (WIFSIGNALED(w)) {
|
||||
notify ("SUP: Execute command killed by signal %d\n",
|
||||
w.w_termsig);
|
||||
WTERMSIG(w));
|
||||
thisC->Cnogood = TRUE;
|
||||
} else if (WIFSTOPPED(w)) {
|
||||
notify ("SUP: Execute command stopped by signal %d\n",
|
||||
w.w_stopsig);
|
||||
WSTOPSIG(w));
|
||||
thisC->Cnogood = TRUE;
|
||||
}
|
||||
return (SCMOK);
|
||||
|
|
|
@ -27,6 +27,23 @@
|
|||
**********************************************************************
|
||||
* HISTORY
|
||||
* $Log: supcmisc.c,v $
|
||||
* Revision 1.3 1996/09/05 16:50:10 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.2 1995/06/03 21:21:57 christos
|
||||
* Changes to write ascii timestamps in the when files.
|
||||
* Looked into making it 64 bit clean, but it is hopeless.
|
||||
|
@ -309,16 +326,19 @@ va_dcl
|
|||
lockout (on) /* lock out interrupts */
|
||||
int on;
|
||||
{
|
||||
register int x;
|
||||
static int lockmask;
|
||||
static sigset_t oset;
|
||||
sigset_t nset;
|
||||
|
||||
if (on) {
|
||||
x = sigmask (SIGHUP) | sigmask (SIGINT) |
|
||||
sigmask (SIGQUIT) | sigmask (SIGTERM);
|
||||
lockmask = sigblock (x);
|
||||
sigemptyset(&nset);
|
||||
sigaddset(&nset, SIGHUP);
|
||||
sigaddset(&nset, SIGINT);
|
||||
sigaddset(&nset, SIGTERM);
|
||||
sigaddset(&nset, SIGQUIT);
|
||||
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
}
|
||||
else {
|
||||
(void) sigsetmask (lockmask);
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,11 +25,12 @@
|
|||
/*
|
||||
* supfilesrv -- SUP File Server
|
||||
*
|
||||
* Usage: supfilesrv [-l] [-P] [-N] [-R]
|
||||
* Usage: supfilesrv [-l] [-P] [-N] [-R] [-S]
|
||||
* -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
|
||||
* -S "Operate silently" -- Only print error messages
|
||||
*
|
||||
**********************************************************************
|
||||
* HISTORY
|
||||
|
@ -42,6 +43,23 @@
|
|||
* across the network to save BandWidth
|
||||
*
|
||||
* $Log: supfilesrv.c,v $
|
||||
* Revision 1.9 1996/09/05 16:50:12 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.8 1995/10/29 23:54:49 christos
|
||||
* - runio fails when result != 0 not only < 0
|
||||
* - print vis-encoded file in the scanner.
|
||||
|
@ -237,6 +255,7 @@
|
|||
#include <setjmp.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <fcntl.h>
|
||||
#if __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
|
@ -247,7 +266,12 @@
|
|||
#include <sys/wait.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/mount.h>
|
||||
#ifndef HAS_POSIX_DIR
|
||||
#include <sys/dir.h>
|
||||
#else
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
#if MACH
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
@ -260,6 +284,12 @@
|
|||
#define ACCESS_CODE_OK 0
|
||||
#define ACCESS_CODE_BADPASSWORD (-2)
|
||||
#endif CMUCS
|
||||
|
||||
#ifdef __SVR4
|
||||
# include <sys/mkdev.h>
|
||||
# include <sys/statvfs.h>
|
||||
#endif
|
||||
|
||||
#include "sup.h"
|
||||
#define MSGFILE
|
||||
#include "supmsg.h"
|
||||
|
@ -317,6 +347,7 @@ int progpid = -1; /* and process id */
|
|||
jmp_buf sjbuf; /* jump location for network errors */
|
||||
TREELIST *listTL; /* list of trees to upgrade */
|
||||
|
||||
int silent; /* -S flag */
|
||||
int live; /* -l flag */
|
||||
int dbgportsq; /* -P flag */
|
||||
extern int scmdebug; /* -N flag */
|
||||
|
@ -359,8 +390,9 @@ main (argc,argv)
|
|||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
register int x,pid,signalmask;
|
||||
struct sigvec chldvec,ignvec,oldvec;
|
||||
register int x,pid;
|
||||
sigset_t nset, oset;
|
||||
struct sigaction chld,ign;
|
||||
void chldsig ();
|
||||
long tloc;
|
||||
|
||||
|
@ -389,16 +421,16 @@ char **argv;
|
|||
(void) serviceend ();
|
||||
exit (0);
|
||||
}
|
||||
ignvec.sv_handler = SIG_IGN;
|
||||
ignvec.sv_onstack = 0;
|
||||
ignvec.sv_mask = 0;
|
||||
(void) sigvec (SIGHUP,&ignvec,&oldvec);
|
||||
(void) sigvec (SIGINT,&ignvec,&oldvec);
|
||||
(void) sigvec (SIGPIPE,&ignvec,&oldvec);
|
||||
chldvec.sv_handler = chldsig;
|
||||
chldvec.sv_mask = 0;
|
||||
chldvec.sv_onstack = 0;
|
||||
(void) sigvec (SIGCHLD,&chldvec,&oldvec);
|
||||
ign.sa_handler = SIG_IGN;
|
||||
sigemptyset(&ign.sa_mask);
|
||||
ign.sa_flags = 0;
|
||||
(void) sigaction (SIGHUP,&ign,NULL);
|
||||
(void) sigaction (SIGINT,&ign,NULL);
|
||||
(void) sigaction (SIGPIPE,&ign,NULL);
|
||||
chld.sa_handler = chldsig;
|
||||
sigemptyset(&chld.sa_mask);
|
||||
chld.sa_flags = 0;
|
||||
(void) sigaction (SIGCHLD,&chld,NULL);
|
||||
nchildren = 0;
|
||||
for (;;) {
|
||||
x = service ();
|
||||
|
@ -407,7 +439,9 @@ char **argv;
|
|||
(void) servicekill ();
|
||||
continue;
|
||||
}
|
||||
signalmask = sigblock(sigmask(SIGCHLD));
|
||||
sigemptyset(&nset);
|
||||
sigaddset(&nset, SIGCHLD);
|
||||
sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
if ((pid = fork()) == 0) { /* server process */
|
||||
(void) serviceprep ();
|
||||
answer ();
|
||||
|
@ -416,7 +450,7 @@ char **argv;
|
|||
}
|
||||
(void) servicekill (); /* parent */
|
||||
if (pid > 0) nchildren++;
|
||||
(void) sigsetmask(signalmask);
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -428,7 +462,7 @@ void
|
|||
chldsig(snum)
|
||||
int snum;
|
||||
{
|
||||
union wait w;
|
||||
int w;
|
||||
|
||||
while (wait3((int *) &w, WNOHANG, (struct rusage *)0) > 0) {
|
||||
if (nchildren) nchildren--;
|
||||
|
@ -470,6 +504,9 @@ char **argv;
|
|||
argv++;
|
||||
while (clienthost == NULL && argc > 0 && argv[0][0] == '-') {
|
||||
switch (argv[0][1]) {
|
||||
case 'S':
|
||||
silent = TRUE;
|
||||
break;
|
||||
case 'l':
|
||||
live = TRUE;
|
||||
break;
|
||||
|
@ -720,7 +757,7 @@ setup ()
|
|||
setupack = FSETUPSAME;
|
||||
(void) msgsetupack ();
|
||||
if (protver >= 6) longjmp (sjbuf,TRUE);
|
||||
goaway ("User not found");
|
||||
goaway ("User `%s' not found", xuser);
|
||||
}
|
||||
(void) free (xuser);
|
||||
xuser = salloc (pw->pw_dir);
|
||||
|
@ -887,6 +924,7 @@ setup ()
|
|||
}
|
||||
/* try to lock collection */
|
||||
(void) sprintf (buf,FILELOCK,collname);
|
||||
#ifdef LOCK_SH
|
||||
x = open (buf,O_RDONLY,0);
|
||||
if (x >= 0) {
|
||||
if (flock (x,(LOCK_SH|LOCK_NB)) < 0) {
|
||||
|
@ -900,6 +938,7 @@ setup ()
|
|||
}
|
||||
lockfd = x;
|
||||
}
|
||||
#endif
|
||||
setupack = FSETUPOK;
|
||||
x = msgsetupack ();
|
||||
if (x != SCMOK) goaway ("Error sending setup reply to client");
|
||||
|
@ -1151,7 +1190,7 @@ TREE *t;
|
|||
register int x,fd;
|
||||
register int fdtmp;
|
||||
char temp_file[STRINGLENGTH], rcs_file[STRINGLENGTH];
|
||||
union wait status;
|
||||
int status;
|
||||
char *uconvert(),*gconvert();
|
||||
int sendfile ();
|
||||
int ac;
|
||||
|
@ -1200,34 +1239,34 @@ TREE *t;
|
|||
#endif
|
||||
av[ac++] = t->Tname;
|
||||
av[ac++] = NULL;
|
||||
status.w_status = runio(av,
|
||||
NULL,
|
||||
rcs_file,
|
||||
status = runio(av, NULL, rcs_file,
|
||||
"/dev/null");
|
||||
/*loginfo("using rcs mode \n");*/
|
||||
if (status.w_status < 0 || status.w_retcode) {
|
||||
if (status < 0 || WEXITSTATUS(status)) {
|
||||
/* Just in case */
|
||||
unlink(rcs_file);
|
||||
if (status.w_status < 0) {
|
||||
goaway ("We died trying to run cvs or rcs");
|
||||
if (status < 0) {
|
||||
goaway ("We died trying to run cvs or rcs on %s", rcs_file);
|
||||
t->Tmode = 0;
|
||||
}
|
||||
else {
|
||||
/*logerr("rcs command failed = %d\n",
|
||||
status.w_retcode);*/
|
||||
#if 0
|
||||
logerr("rcs command failed = %d\n",
|
||||
WEXITSTATUS(status));
|
||||
#endif
|
||||
t->Tflags |= FUPDATE;
|
||||
}
|
||||
}
|
||||
else if (docompress) {
|
||||
tmpnam(temp_file);
|
||||
av[0] = "gzip";
|
||||
av[1] = "-c";
|
||||
av[1] = "-cf";
|
||||
av[2] = NULL;
|
||||
if (runio(av, rcs_file, temp_file, NULL) != 0) {
|
||||
/* Just in case */
|
||||
unlink(temp_file);
|
||||
unlink(rcs_file);
|
||||
goaway ("We died trying to gzip a file");
|
||||
goaway ("We died trying to gzip %s", rcs_file);
|
||||
t->Tmode = 0;
|
||||
}
|
||||
fd = open (temp_file,O_RDONLY,0);
|
||||
|
@ -1241,12 +1280,12 @@ TREE *t;
|
|||
if (docompress) {
|
||||
tmpnam(temp_file);
|
||||
av[0] = "gzip";
|
||||
av[1] = "-c";
|
||||
av[1] = "-cf";
|
||||
av[2] = NULL;
|
||||
if (runio(av, t->Tname, temp_file, NULL) != 0) {
|
||||
/* Just in case */
|
||||
unlink(temp_file);
|
||||
goaway ("We died trying to run gzip");
|
||||
goaway ("We died trying to gzip %s", t->Tname);
|
||||
t->Tmode = 0;
|
||||
}
|
||||
fd = open (temp_file,O_RDONLY,0);
|
||||
|
@ -1268,7 +1307,7 @@ TREE *t;
|
|||
if (dorcs)
|
||||
unlink(rcs_file);
|
||||
#endif
|
||||
if (x != SCMOK) goaway ("Error sending file to client");
|
||||
if (x != SCMOK) goaway ("Error sending file %s to client", t->Tname);
|
||||
return (SCMOK);
|
||||
}
|
||||
|
||||
|
@ -1289,7 +1328,7 @@ TREE *t;
|
|||
t->Tuser = salloc (uconvert (t->Tuid));
|
||||
t->Tgroup = salloc (gconvert (t->Tgid));
|
||||
x = msgrecv (sendfile,0);
|
||||
if (x != SCMOK) goaway ("Error sending file to client");
|
||||
if (x != SCMOK) goaway ("Error sending file %s to client", t->Tname);
|
||||
return (SCMOK);
|
||||
}
|
||||
|
||||
|
@ -1302,7 +1341,7 @@ va_list ap;
|
|||
if ((t->Tmode&S_IFMT) != S_IFREG || listonly || (t->Tflags&FUPDATE))
|
||||
return (SCMOK);
|
||||
x = writefile (fd);
|
||||
if (x != SCMOK) goaway ("Error sending file to client");
|
||||
if (x != SCMOK) goaway ("Error sending file %s to client", t->Tname);
|
||||
(void) close (fd);
|
||||
return (SCMOK);
|
||||
}
|
||||
|
@ -1800,10 +1839,28 @@ struct stat *sinfo;
|
|||
* determined this empirically -- DLC). Without a fstatfs()
|
||||
* system call, this will have to do for now.
|
||||
*/
|
||||
#ifdef __SVR4
|
||||
{
|
||||
struct statvfs sf;
|
||||
|
||||
if (fstatvfs(handle, &sf) == -1)
|
||||
return(-1);
|
||||
return strcmp(sf.f_basetype, "nfs") != 0;
|
||||
}
|
||||
#elif defined(__NetBSD__)
|
||||
{
|
||||
struct statfs sf;
|
||||
if (fstatfs(handle, &sf) == -1)
|
||||
return(-1);
|
||||
return strcmp(sf.f_fstypename, "nfs") != 0;
|
||||
}
|
||||
#else
|
||||
if (major(sb.st_dev) == 255 || major(sb.st_dev) == 130)
|
||||
return(0);
|
||||
|
||||
else
|
||||
return(1);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -28,6 +28,23 @@
|
|||
**********************************************************************
|
||||
* HISTORY
|
||||
* $Log: vprintf.c,v $
|
||||
* Revision 1.2 1996/09/05 16:50:13 christos
|
||||
* - for portability make sure that we never use "" as a pathname, always convert
|
||||
* it to "."
|
||||
* - include sockio.h if needed to define SIOCGIFCONF (for svr4)
|
||||
* - use POSIX signals and wait macros
|
||||
* - add -S silent flag, so that the client does not print messages unless there
|
||||
* is something wrong
|
||||
* - use flock or lockf as appropriate
|
||||
* - use fstatfs or fstatvfs to find out if a filesystem is mounted over nfs,
|
||||
* don't depend on the major() = 255 hack; it only works on legacy systems.
|
||||
* - use gzip -cf to make sure that gzip compresses the file even when the file
|
||||
* would expand.
|
||||
* - punt on defining vsnprintf if _IOSTRG is not defined; use sprintf...
|
||||
*
|
||||
* To compile sup on systems other than NetBSD, you'll need a copy of daemon.c,
|
||||
* vis.c, vis.h and sys/cdefs.h. Maybe we should keep those in the distribution?
|
||||
*
|
||||
* Revision 1.1.1.1 1993/05/21 14:52:19 cgd
|
||||
* initial import of CMU's SUP to NetBSD
|
||||
*
|
||||
|
@ -113,6 +130,7 @@ vsnprintf(s, n, fmt, args)
|
|||
char *s, *fmt;
|
||||
va_list args;
|
||||
{
|
||||
#ifdef _IOSTRG
|
||||
FILE fakebuf;
|
||||
|
||||
fakebuf._flag = _IOSTRG+_IOWRT; /* no _IOWRT: avoid stdio bug */
|
||||
|
@ -124,5 +142,9 @@ vsnprintf(s, n, fmt, args)
|
|||
if (fakebuf._cnt<0)
|
||||
fakebuf._cnt = 0;
|
||||
return (n-fakebuf._cnt-1);
|
||||
#else
|
||||
/* Will blow up. */
|
||||
vsprintf(s, fmt, args);
|
||||
#endif
|
||||
}
|
||||
#endif /* NEED_VPRINTF || NEED_VSNPRINTF */
|
||||
|
|
Loading…
Reference in New Issue