V10/cmd/dist/cmd/dist.sh

#! /bin/sh

LDIR=%LDIR%
SDIR=%SDIR%

PATH=$LDIR:/bin:/usr/bin
export PATH

umask 022

# improve this
usage="usage: dist [options] files..."

distcmd=
dest=
insopts=
mkopts=
nonotify=
subst=
verbose=

set -- `qargs getopt qrnvd:D:f:F:R:x:X: "$@"` || { echo "$usage" 1>&2; exit 1; }
while :
do
	case $1 in
	-q) distcmd=q; shift;;
	-r) distcmd=r; shift;;
	-n) nonotify=n; shift;;
	-v) verbose=-v; shift;;
	-d) dest="$dest `uargs echo $2`"; shift 2;;
	-D) subst="$subst -D$2"; shift 2;;
	-f) dest="$dest `cat $2`"; shift 2;;
	-F) dest="$dest `cat $LDIR/destinations/$2`"; shift 2;;
	-R) insopts="$insopts -R$2"; shift 2;;
	-x) mkopts="$mkopts -x$2"; shift 2;;
	-X) mkopts="$mkopts -X$2"; shift 2;;
	--) shift; break;;
	esac
done

case "$distcmd" in
q)
	case $# in
	0) showq;;
	*) for arg in $*; do uargs connect $arg showq i /bin/cat; done;;
	esac
	exit $?
	;;
r)
	case $# in
	0) echo "$usage" 1>&2; exit 1;;
	*) sys=$1; shift;;
	esac
	uargs connect $sys transmit io $LDIR/receive $verbose $insopts $subst $*
	exit $?
	;;
esac

test -n "$dest" || dest=`cat $LDIR/destinations/default 2>/dev/null` || {
	echo "dist: $LDIR/destinations/default not found" 1>&2
	exit 1
}

# make spool directory
for n in `seq -w 0 999`
do
	dir=Q.$$.$n
	test -d $dir -o -f $dir || {
		trap 'rm -fr $SDIR/$dir' 1 2 3
		mkdir $SDIR/$dir && break
		echo "dist: can't make spool directory" 1>&2
		exit 1
	}
done

case "$verbose" in -v) echo "queue job $dir:" 1>&2;; esac

data=$SDIR/$dir/data
ctl=$SDIR/$dir/tempctl
files=$SDIR/$dir/files

# use canonical system names.
cansys $dest | awk '{print ++n, $1}' > $ctl

uargs mkdist $verbose $mkopts $subst $* > $data

cwd=`pwd`
for f
do
	case $f in
	/*)
		echo $f
		;;
	*)
		echo $cwd/$f
		;;
	esac
done | sort | sedsubst $subst > $files

mv $ctl $SDIR/$dir/ctl

# supersede old jobs containing the same files
cd $SDIR
for d in Q.*
do
	case $d in
	$dir)
		continue
		;;
	*)
		test -w $d || continue
		if [ `comm -23 $d/files $dir/files | wc -c` = 0 ]
		then
			sort +1 $d/ctl $dir/ctl | uniq -d -1 |
			while read num sys
			do
				echo superseded by $dir > $d/$num.done
			done
		fi
		;;
	esac
done
cleanq

case $nonotify in n) exit $?;; esac

# notify destination systems in the background
exec < /dev/null >/dev/null 2>&1 3>&-
for d in $dest
do
	connect $d notice io $LDIR/notify $dir
done &