:
##########################################################################
# Title      :	ibackup - incremental backup
# Author     :	Heiner Steven
# Date       :	1994-02-03
# Requires   :	cfcat mklock mkunlock stopword transfer
# SCCS-Id.   :	@(#) ibackup	1.4 04/12/20
##########################################################################
# Description
#	Incremental backup
##########################################################################

PN=`basename "$0"`
VER='1.4'

: ${BackupRoot:=$HOME}
: ${BackupConfigDir:=$HOME/.ibackup}
: ${BackupDate:=$BackupConfigDir/backup.date}
: ${BackupDirs:=$BackupConfigDir/backup.dir}
: ${BackupStop:=$BackupConfigDir/backup.stop}
: ${BackupNr:=$BackupConfigDir/backup.nr}		# laufende Nummer
: ${BackupFile:=$HOME/bkup}		# Nummer wird angehaengt

datefmt="+%Y-%m-%d %H:%M:%S"

if [ $# -gt 0 -a "$1" = "-h" ]
then
    echo >&2 "$PN - Sicherungskopien erstellen, Version $VER
Aufruf: $PN [-h] [Verzeichnis ...]

Environmentvariablen:
   BackupRoot  Startverzeichnis fuer relative Pfadangaben
               (Vorgabe: $BackupRoot)
   BackupDirs  Datei mit zu sichernden Verzeichnisnamen
               (Vorgabe: $BackupDirs)
   BackupStop  Datei mit Dateiei, die nicht zu sichern sind
               (Vorgabe: $BackupStop)
   BackupFile  Name der zu erstellenden Datei (cpio -c Format)
               (Vorgabe: $BackupDirs)

Alle Pfadangaben muessen absolut (beginnend mit /) sein.
Wenn Verzeichnisse angegeben wurden, wird die BackupDirs
Environmentvariable ignoriert."
    exit 0
fi

# Remove temp. files at exit
trap 'rm -f "$Tmp" "$Neu" "$Liste" >/dev/null 2>&1
	mkunlock Backup >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

CpioOpt=-o
case "`uname`-`uname -r`" in
    SunOS-5.*)	CpioOpt="$CpioOpt -H odc";;
    *)		CpioOpt="$CpioOpt -H newc";;
esac

set +e					# Terminate at errors
mklock Backup
set -e

Neu=${TMPDIR:=/tmp}/ba$$.n
Tmp=$TMPDIR/ba$$.0
Liste=$TMPDIR/backup.lst

[ -d "$BackupConfigDir" ] || mkdir -p "$BackupConfigDir" ||
	fatal "cannot create configuration directory: $BackupConfigDir"

[ -f "$BackupDate" ] || exec date "$datefmt" > "$BackupDate"
[ -f "$BackupStop" ] || > "$BackupStop"

# Wenn $BackupDirs existiert, dann die dort angegebenen Verzeichnisse
# bearbeiten
if [ $# -gt 0 ]
then
   Dirs="$@"
elif [ -r "$BackupDirs" ]
then
    Dirs=`cfcat "$BackupDirs"`
else
    if [ X"$BackupRoot" = X"$HOME" ]
    then Dirs="."
    else Dirs=$HOME
    fi
fi

# Liste mit geaenderten Dateien erstellen
# "./" aus relativen Pfadnamen entfernen, sortieren
cd "$BackupRoot" || exit 1
find $Dirs -type f -newer "$BackupDate" -print |
    sed 's:^\./::' |
    sort -u > "$Neu"

# Dateien aus der Stopliste ignorieren
cfcat "$BackupStop" | sed 's:^\./::' | sort > "$Tmp"
cat "$Neu" | stopword "$Tmp" > "$Liste"

if [ -s "$Liste" ]
then
    # neuen Backup-Dateinamen ermitteln
    [ -r "$BackupNr" ] || echo 0 > "$BackupNr"
    Nr=`cfcat "$BackupNr" | sed q`
    : ${Nr:=0}
    echo `expr $Nr + 1` > "$BackupNr"
    BackupFile="${BackupFile}_$Nr.cpio"

    # sollte nicht vorkommen:
    [ -f "$BackupFile" ] && mv "$BackupFile" "$BackupFile.alt"

    BackupFile=$BackupFile.gz
    cpio $CpioOpt < "$Liste" | gzip > "$BackupFile"

    transfer "$BackupFile" && 
	 date "$datefmt" > "$BackupDate"
fi
exit 0
