#! /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