OpenSolaris_b135/cmd/bnu/uupick

#!/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 1999 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
#ident	"%Z%%M%	%I%	%E% SMI"
#
export IFS PATH
IFS=" 	
"
PATH="/usr/bin"

# sys: system; user: login name;  cdir: current directory;
# tdir: temporary directory; pu: PUBDIR/receive/user;
cdir=`pwd`
dir=""
abs=""
sys=""
var=""
varto=""
varfrom=""
trap "exit 1" 1 2 13 15

# mktmpdir - Create a private (mode 0700) temporary directory inside of /tmp
# for this process's temporary files.  We set up a trap to remove the 
# directory on exit (trap 0), and also on SIGHUP, SIGINT, SIGQUIT, and
# SIGTERM.
#
mktmpdir() {
        tmpdir=/tmp/bnu.$$
        trap '/usr/bin/rm -rf $tmpdir' 0 1 2 3 15
        /usr/bin/mkdir -m 700 $tmpdir || exit 1
}

mktmpdir

# get options
while getopts s: FLAG; do
	case $FLAG in
	s)	sys=$OPTARG
		;;
	?)	gettext "Usage: uupick [-s sysname]\n" 1>&2;
		exit 1
		;;
	esac
done
shift `expr $OPTIND - 1`

if [ $# -gt 0 ]; then
	gettext "Usage: uupick [-s sysname]\n" 1>&2;
fi

user=`id | sed -n "/^uid=[0-9]*(\([^)]*\)).*/s//\1/p"`

if test -z "$user"
then gettext "User id required!\n" >&2; exit 1
fi

pu=/var/spool/uucppublic/receive/$user
if test -d $pu -a -s $pu
then
    for i in `/usr/bin/ls $pu`
    do
	if test $sys
	then
	    if test $sys != $i;  then continue;  fi
	fi
	if test -d $pu/$i -a -s $pu/$i
	then
	    cd $pu/$i
	    for j in `/usr/bin/ls -a`
	    do
		if test $j = "." -o $j = ".."; then continue; fi
		if test -d $j
		then printf "`gettext 'from system %s: directory %s '`" $i $j
		else printf "`gettext 'from system %s: file %s '`" $i $j
		fi
		while true
		do
		    echo '? \c'
		    if read cmd dir
		    then
			trap ": ;;" 1
			case $cmd in
			d)
			    rm -fr $j ; break ;;
			"")
			    break ;;
# options m, a:
#	If dir path begins with a slash, use full path for destination;
#	otherwise, use path relative to current dir;
#	default destination is current dir
#
#	As files are transferred, put their names in $tmpdir/$$uupick.
#	Only remove those named files from...receive/..dir if cmp
#	verifies transfer took place. then find & remove directories
#	(separate find is necessary because cpio -v doesn't print dir names)
			a|m)
			    eval dir="$dir"
			    if test $dir
			    then abs=`expr "$dir" : '/.*'`
				if test $abs != 0
				then tdir=$dir
				else tdir=$cdir/$dir
				fi
			    else
				tdir=$cdir
			    fi
			    if [ ! -d $tdir -o ! -w $tdir ]; then
				printf "`gettext 'directory %s doesn't exist or isn't writable'`" $tdir >&2
				continue
			    fi
			    if [ "$cmd" = "a" ]
			    then
				find . -depth -print | \
				grep -v '^\.$' > $tmpdir/$$uupick
				level=2
			    else
				find $j -depth -print > $tmpdir/$$uupick
				level=1
			    fi
			    cpio -pdmu $tdir < $tmpdir/$$uupick 
			    for k in `cat $tmpdir/$$uupick`
			    do
				varto="$tdir/$k"
				varfrom="$pu/$i/$k"
				if test -f $varfrom; then
				    if cmp $varfrom $varto ; then
					rm -f $varfrom
				    else
					printf "`gettext 'file %s not removed'`" $varfrom >&2
				    fi
				else
				    rmdir $varfrom 2>/dev/null
				fi
			    done
			    rm -f $tmpdir/$$uupick
			    break $level;; 
			p)
			    if test -d $j
			    then find $j -print
			    elif test -s $j 
				then cat $j
			    fi;;
			q)
			    break 3;;
			!*)
			    ex=`expr "$cmd $dir" : '!\(.*\)'`
			    tdir=`pwd`
			    cd $cdir
			    sh -c "$ex"
			    cd $tdir
			    echo '!';;
			*)
			    gettext "Usage: [d][m dir][a dir][p][q][cntl-d][!cmd][*][new-line]";;
			esac
			trap "exit 1" 1
		    else
			break 3
		    fi
		done
	    done
	fi
    done
fi