#! /bin/sh
# $Header: /home/jerry/.bin/RCS/xrefile,v 1.3 92/08/09 23:26:37 jerry mh_contrib $
#
###	xrefile - refile mail from current account to another
###	Usage: xrefile -u other_username [msgs] [+remote-folder]
##
##	LIKE refile, BUT COPIES MESSAGES TO OTHER ACCOUNT AND THEM rmm'S.
##	NICER THAN dist BECAUSE IT PRESERVES THE ORIGINAL MESSAGE DATE
##	AND ETC.  NICER THAN forw BECAUSE THE ORIGINAL MESSAGE ISN'T
##	BURIED INSIDE DASHED LINES, BECAUSE IT DOESN'T TRASH THE STARTS
##	OF DASHED LINES IN THE ORIGINAL MESSAGE, AND BECAUSE pick CAN FIND
##	THE ORIGINAL MESSAGE WITHOUT NEEDING TO USE -search.
##
##	WATCH OUT: xrefile COPIES MESSAGES INTO A HIDDEN SUBDIRECTORY OF
##	/tmp FOR LONG ENOUGH TO TRANSFER THEM.  IF xrefile BOMBS BEFORE
##	IT FINISHES, IT COULD LEAVE MESSAGES UNDER /tmp.  (IT WON'T REMOVE
##	THE MESSAGES FROM THE SOURCE FOLDER, THOUGH, UNTIL THEY'RE IN THE
##	OTHER ACCOUNT'S FOLDER -- SO YOU WON'T LOSE MESSAGES IN A CRASH.)
#
#	NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE
#
#	USE AT YOUR OWN RISK.  SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
#	PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com

mh=/usr/local/mh		# WHERE mh COMMANDS LIVE
tmpdir=/tmp/.XFRDIR$$	# HIDDEN TEMPORARY DIRECTORY FOR MAIL TRANSFER
tmpscr=/tmp/.XFRSCR$$	# HIDDEN TEMPORARY SHELL SCRIPT; COPIES MESSAGES

stat=1	# ERROR EXIT STATUS (RESET TO 0 FOR NORMAL EXITS)
trap 'rm -rf $tmpdir $tmpscr; exit $stat' 0 1 2 15

myname="`basename $0`"
usage="$myname -u other_username [msgs] [+remote-folder]"

# PARSE COMMAND LINE:
while :
do
	case $# in
	0)	break ;;
	esac

	case "$1" in
	-u)	case "$2" in
		"")	echo "Usage: $usage
			(Missing user name after -u)" 1>&2
			exit
			;;
		*)	user="$2"
			shift	# SHIFT OFF -u (WILL shift $2 AT END OF LOOP)
			;;
		esac
		;;
	+*)	rmtfolder="$1" ;;
	*)	msgs="$msgs $1" ;; # IT'S A MESSAGE (WE HOPE...)
	esac

	shift
done

case "$user" in
"")	echo "Usage: $usage
	(missing -u)" 1>&2
	exit
	;;
esac

if mkdir $tmpdir
then chmod 711 $tmpdir	# OTHER ACCOUNT WILL KNOW EXACT FILENAMES
else
	echo "${myname}: problem making '$tmpdir' directory.  Quitting." 1>&2
	exit
fi

: ${msgs=cur}	# IF NO MESSAGES GIVEN, USE cur

# GO TO THE CURRENT FOLDER AND GET MESSAGE LIST.
# DO THIS TO MAKE PATHNAMES SHORTER; AVOIDS TOO-LONG COMMAND LINES:
srcfolder="`$mh/mhpath`" || {
	echo "${myname}: fatal: can't get current folder name?!?" 1>&2
	exit
}
cd "$srcfolder" || {
	echo "${myname}: fatal: 'cd $srcfolder' bombed." 1>&2
	exit
}
# GET LIST OF MESSAGES; LET cp COMPLAIN IF IT CAN'T READ THEM...
# (WE CAN'T JUST USE $msgs BECAUSE IT MIGHT HAVE last:10, ETC.)
# USE tr TO CHANGE NEWLINES TO SPACES SO $xfrscr DOESN'T BOMB:
cpfrom="`$mh/mhpath $msgs | sed \"s@^$srcfolder/@@\" | tr '\012' ' '`" || {
	echo "${myname}: fatal: 'mhpath \$msgs | sed' bombed." 1>&2
	exit
}


# MAKE THE SHELL SCRIPT THAT $user'S ACCOUNT WILL USE.  IT BOMBS (-e)
# AND DOESN'T PUT MESSAGE IN $xfr_done FILE IF ANYTHING FAILS:
echo "#! /bin/sh -e
# FILE-COPYING SCRIPT MADE BY $USER
cd $tmpdir
for msg in $cpfrom
do cp -i \$msg \`$mh/mhpath new $rmtfolder\`
done
# IF WE GET HERE, NOTHING BOMBED AND cp -i DIDN'T GET ANY n ANSWERS.
# RETURN STATUS TO su SHELL (AND FROM THERE TO CALLING PROGRAM):
exit 0" > $tmpscr

chmod +x $tmpscr || exit

# NOW THAT WE'VE GOT THE SCRIPT, COPY THE MESSAGES TO $tmpdir
# (LEAVE THEM THERE AS SHORT A TIME AS WE CAN...)
cp -i $cpfrom $tmpdir || {
	echo "${myname}: fatal: 'cp $cpfrom $tmpdir' bombed." 1>&2
	exit
}

cd $tmpdir	# MUST BE HERE OR su BOMBS (IF MH directory PROTECTED)
chmod 644 * || {
	echo "${myname}: fatal: 'chmod 644 *' bombed." 1>&2
	exit
}

# DO THE COPY (NOT ALL SYSTEMS LET YOU DO su -f TO A BOURNE SHELL!):
echo -n "$user "	# PUT USERNAME BEFORE Password:
su $user -c $tmpscr
case $? in
0)	$mh/rmm $cpfrom
	stat=0
	;;
*)	echo "$myname: Something went wrong with the copying...
	I won't remove the source messages." 1>&2 ;;
esac

exit
