mark@ems.mn.org (07/07/87)
Here is a little program to help out those people who are not
fortunate enough to have a -mount option on their find command. We are
currently using this program to help with our weekly backups.
Mark H. Colburn mark@ems.mn.org
EMS/McGraw-Hill ihnp4!meccts!ems!mark
9855 West 78th Street
Eden Prairie, MN 55344 +1 612 829 8200
``Don't tell me she don't love me, the money's just a mere formality...''
- ------------------------------ CUT HERE -------------------------------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile README fsfilt.c weekback
# Wrapped by mark@ems on Sun Jun 28 16:58:07 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(2274 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# fsfilt - filesystem filtering program for use with find.
X# Written by Mark H. Colburn
X# Copyright (C) 1987, Mark H. Colburn
X#
X# Permission is hereby granted to use or modify this program for any
X# non-commercial purpose.
X#
X# AUTHOR(S)
X# Mark H. Colburn
X#
X# %W% %G%
X#
X# HISTORY
X#
X
XHEADER =
XSOURCE = fsfilt.c
XOBJECT = fsfilt.o
XCFLAGS = -O
XLDFLAGS = -s
XSCCSDIR = .
XMAKEFILE = Makefile
XLINT = /usr/bin/lint -b -x -h
XPR = /usr/local/bin/cpr
XLP = lp
XGFLAGS =
X
X
X#
X# Program construction rules
X#
X
Xfsfilt: $(OBJECT)
X cc $(LDFLAGS) $(OBJECT) -o fsfilt
X
Xall: fsfilt
X
X#
X# Generic Makefile Rules
X#
X
Xinstall: all
X
Xbuild: $(SOURCE) $(HEADER) $(MAKEFILE)
X
Xedit:
X @for file in $(SOURCE) $(HEADERS) $(MAKEFILE); do \
X if [ ! -w $$file]; then \
X get -e $(SCCSDIR)/s.$$file; \
X fi; \
X done
X
Xdelta:
X @for file in $(SOURCE) $(HEADERS) $(MAKEFILE); do \
X if [ -w $$file]; then \
X delta $(SCCSDIR)/s.$$file; \
X fi; \
X done
X rm -f $(SOURCE)
X rm -f $(HEADER)
X rm -f $(MAKEFILE)
X get $(GFLAGS) $(SCCSDIR)/s.$(MAKEFILE)
X
Xclean:
X rm -f a.out core
X rm -f cosy
X rm -f $(OBJECT)
X
Xclobber:
X rm -f $(OBJECT)
X rm -f $(SOURCE)
X rm -f $(HEADER)
X rm -f a.out core
X
Xlint: $(HEADER) $(SOURCE)
X $(LINT) $(SOURCE)
X
Xprint: $(HEADER) $(SOURCE)
X $(PR) $(HEADER) $(SOURCE) | $(LP) -T"COSY cosy"
X
Xdepend:
X# For the moment we are lazy and disregard /usr/include files because
X# the sources contain them conditionally. Perhaps we should use cpp.
X# ( /bin/grep '^#[ ]*include' $$i | sed -n \
X# -e 's,<\(.*\)>,"/usr/include/\1",' \
X#
X for i in ${SOURCE}; do \
X ( /bin/grep '^#[ ]*include[ ]*"' $$i | sed -n \
X -e 's/[^"]*"\([^"]*\)".*/\1/' \
X -e H -e '$$g' -e '$$s/\n/ /g' \
X -e '$$s/.*/'$$i': &/' -e '$$s/\.c:/.o:/p' \
X >> makedep); done
X @echo '/^# DO NOT DELETE THIS LINE/+2,$$d' >eddep
X @echo '$$r makedep' >>eddep
X @echo 'w' >>eddep
X @echo 'q' >>eddep
X @cp $(MAKEFILE) $(MAKEFILE).bak
X ed - $(MAKEFILE) < eddep
X @rm -f eddep makedep
X @echo '# DEPENDENCIES MUST END AT END OF FILE' >> $(MAKEFILE)
X @echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> $(MAKEFILE)
X @echo '# see make depend above' >> $(MAKEFILE)
X @rm -f $(MAKEFILE).bak
X
X# DO NOT DELETE THIS LINE
X
X# DEPENDENCIES MUST END AT END OF FILE
X# IF YOU PUT STUFF HERE IT WILL GO AWAY
X# see make depend above
END_OF_Makefile
if test 2274 -ne `wc -c <Makefile`; then
echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f README -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"README\"
else
echo shar: Extracting \"README\" \(1518 characters\)
sed "s/^X//" >README <<'END_OF_README'
X
X fsfilt - filesystem filter for find (System V).
X
X This program is intended for machines without a -mount option
X on their find(1) command. We use this program for doing backups,
X when we do not want find to cross mountpoints in the directory
X structure. This program will pick up the current working
X directory, read the mount table (/etc/mnttab on system V machines)
X and build a list of directories that should NOT be backed up.
X
X This program is inteneded to have find(1) output piped into it.
X Each filename is examined, and if it does not contain references
X to any of the children filesystems of the current filesystem, if
X any, then the filename is printed on standard output, otherwise
X it is trashed.
X
X An example command would be:
X find . -print | fsfilt | cpio -ocB > /dev/rmt1
X
X In addition to children filesystems, the tmp directory in both /
X and /usr are not backed up. This dependancy is hardcoded into the
X source.
X
X
X An example of how this program is used is given in the file
X ./backup. This is the shell script which we use to backup
X our machine each week.
X
X This source is copyright (c) 1987 by Mark H. Colburn.
X Permission is hereby given to use or modify this program for
X any non-commercial purpose. No gaurentee of fitness, or
X suitability for any purpose is expressed, or implied.
X (There, have I covered my butt sufficiently? :-)
X
X Please send any enhancements, comments or bugs to the author.
X
X Mark H. Colburn
X EMS/McGraw-Hill
X (mark@ems.mn.org)
END_OF_README
if test 1518 -ne `wc -c <README`; then
echo shar: \"README\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f fsfilt.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"fsfilt.c\"
else
echo shar: Extracting \"fsfilt.c\" \(3655 characters\)
sed "s/^X//" >fsfilt.c <<'END_OF_fsfilt.c'
X/*
X * fsfilt - filesystem filter for find (System V).
X *
X * This program is intended for machines without a -mount option on their
X * find(1) command. We use this program for doing backups, when we do not
X * want find to cross mountpoints in the directory structure. This program
X * will pick up the current working directory, read the mount table
X * (/etc/mnttab on system V machines) and build a list of directories that
X * should NOT be backed up.
X *
X * This program is inteneded to have find(1) output piped into it. Each
X * filename is examined, and if it does not contain references to any of
X * the children filesystems of the current filesystem (if any) then the
X * filename is printed on standard output, otherwise it is trashed.
X *
X * An example command would be:
X * find . -print | fsfilt | cpio -ocB > /dev/rmt1
X *
X * In addition to children filesystems, the tmp directory in both / and /usr
X * are not backed up. This dependancy is hardcoded into the source.
X *
X * Please send any enhancements, comments or bugs to the author.
X *
X * Author: Mark H. Colburn (mark@ems.mn.org)
X * EMS/McGraw-Hill
X *
X */
X
X#include <stdio.h>
X#include <string.h>
X#include <sys/types.h>
X#include <mnttab.h>
X
X#define STRSIZ 200
X
Xvoid perror();
Xint nmnt;
Xstruct mnttab fs[NMOUNT];
Xchar except[NMOUNT][32];
Xint numex = 0;
X
X/* ARGSUSED */
Xint main(argc, argv)
Xint argc;
Xchar *argv[];
X{
X int i, found;
X char str[STRSIZ];
X
X nmnt = read_mnttab();
X get_exceptions();
X while (!feof(stdin)) {
X if (fgets(str, STRSIZ, stdin) == NULL && !feof(stdin))
X perror("Unable to read stdin");
X str[strlen(str) - 1] = '\0';
X found = 0;
X if (numex > 0)
X for (i = 0; !found && i < numex; i++)
X found = (strncmp(str, except[i],
X strlen(except[i])) == 0);
X if (!found)
X puts(str);
X }
X return (0);
X}
X
X
X/*
X * get_exceptions - get list of children filesystem of this directory
X */
X
Xint get_exceptions()
X{
X char fsname[100], work[100], work1[100];
X int i, j, found = 0;
X char *cp;
X char *strindex();
X
X (void) getcwd(fsname, 100);
X if (strcmp(fsname, "/") == 0 || strcmp(fsname,"/usr") == 0)
X (void) strcpy(except[numex++], "./tmp/");
X for (i = 0; i < nmnt; i++) {
X if (strncmp(fsname, fs[i].mt_filsys, strlen(fsname)) == 0 &&
X strcmp(fsname, fs[i].mt_filsys) != 0) {
X if (strcmp(fsname, "/") == 0)
X (void) strcpy(work, fs[i].mt_filsys+
X strlen(fsname));
X else
X (void) strcpy(work, fs[i].mt_filsys +
X strlen(fsname)+1);
X if ((cp = strchr(work, '/')) == NULL) {
X (void) strcpy(work1, work);
X (void) strcat(work1, "/");
X } else {
X *(cp + 1) = '\0';
X (void) strcpy(work1, work);
X }
X found = 0;
X (void) sprintf(work,"./%s", work1);
X for (j = 0; !found && j < numex; j++)
X found = (strcmp(except[j], work) == 0);
X if (!found)
X strcpy(except[numex++], work);
X }
X }
X}
X
X/*
X * read_mount_table - get a list of all currently mounted filesystems
X */
X
Xint read_mnttab()
X{
X int i, ret;
X FILE *fp;
X
X if ((fp = fopen("/etc/mnttab", "r")) == NULL) {
X (void) fprintf("Unable to open /etc/mnttab, exiting\n");
X exit(1);
X }
X i = 0;
X while (!feof(fp))
X if (fread((char *) &fs[i], sizeof(struct mnttab), 1, fp) > 0)
X i++;
X (void) fclose(fp);
X return (i);
X}
X
X
X/*
X * char *strindex(s1,s2) - return a pointer to where s2 exists in s1, or
X * NULL.
X */
X
Xchar *strindex(s1, s2)
Xchar *s1, *s2;
X{
X register int i;
X register char *cp;
X
X i = strlen(s2);
X if (strlen(s1) == i)
X return (strcmp(s2, s1) ? NULL : s1);
X if (strlen(s1) > i) {
X for (cp = s1; *cp; cp++)
X if (*cp == *s2 && strncmp(cp, s2, i) == 0)
X return (cp);
X }
X return (NULL);
X}
END_OF_fsfilt.c
if test 3655 -ne `wc -c <fsfilt.c`; then
echo shar: \"fsfilt.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f weekback -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"weekback\"
else
echo shar: Extracting \"weekback\" \(558 characters\)
sed "s/^X//" >weekback <<'END_OF_weekback'
XTD=/dev/9hi # name of default tape drive
XFSFILT=/usr/local/etc/fsfilt # location of fsfilt program
Xecho "Who should be notified upon completion? \c"
Xread NOTIFY
Xset `cat /etc/mountable | sort -r`
Xfor fsys in $*
Xdo
X fsys=$2
X fnam=$3
X echo "Mount the backup for $fnam and press RETURN \c"
X read return
X cd $fnam
X find . -print | $FSFILT | cpio -ocvB >$TD
X (echo "backups of $fnam are complete") | write $NOTIFY
X echo "backups of $fnam are complete"
X shift 3 2>/dev/null
Xdone
Xtouch /usr/local/etc/DAY.DONE
X(echo "backups have been completed") | write $NOTIFY
END_OF_weekback
if test 558 -ne `wc -c <weekback`; then
echo shar: \"weekback\" unpacked with wrong size!
fi
chmod +x weekback
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
------- End of Forwarded Message