Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libtksh/scripts/mailfile
1809 views
##########################################################################
# mailfile
# Jeff Korn
#
# This script allows the user to email a file or directory to another
# user.  It will gzip and uuencode files (if necessary) and tar 
# directories.  If the COMPRESS enviroment variable is set, it will
# use the program COMPRESS instead of gzip.
##########################################################################

if [[ $tk_version = "" ]]
then
	if whence tksh > /dev/null
	then
		tk_version=xxx exec tksh $0
	else
		print -u2 "This script requires Tksh"
	fi
	exit 1
fi

########################### Open File Dialog Box #########################

function GetFile # msg default
{
	typeset msg="${1-"Select a file:"}" olddir="$(pwd)" f="${2-"$(pwd)/"}"
	typeset w=$(toplevel .fileselect -bd 4 -class Getfile)

	GetFileName="$f"
	GetFileResources
	GetFileWindow $w "$msg" > /dev/null
	GetFileSetFiles $w.files

	wm title .fileselect "$msg"
	bind $w.files.file.list "<1>" \
		"GetFileSClick %W %y ; focus $w.sel.e"
	bind $w.files.dir.list "<1>" \
		"GetFileSClick %W %y ; focus $w.sel.e"
	bind $w.files.dir.list "<Double-1>" \
		"GetFileDClick $w.files %y ; focus $w.sel.e"
	bind $w.sel.e "<Return>" "GetFileSetFiles $w.files"

	tkwait variable GetFileDone
	destroy $w
	cd "$olddir"
}

function GetFileWindow # w msg
{
	typeset w=$1 msg="$2"

	# Create everything

	message $w.msg -aspect 1000 -text "$msg"

	frame $w.sel
	label $w.sel.l -padx 0
	entry $w.sel.e -textvariable GetFileName

	frame $w.files
	frame $w.files.dir
	frame $w.files.file
	MkXYScroll $w.files.dir
	MkXYScroll $w.files.file

	frame $w.buttons
	button $w.buttons.ok -command $'#!ksh\nGetFileDone=1'
	button $w.buttons.cancel \
		-command $'#!ksh\n'"GetFileName='' ; GetFileDone=1"

	# Take this out if you want a generic open file dialog box
	frame $w.dest
	label $w.dest.l -text "E-mail address:"
	entry $w.dest.e -textvar Dest

	# Pack everything

	pack $w.sel.l -side left
	pack $w.sel.e -side right -fill x -expand 1
	pack $w.msg -side top -fill x
	pack $w.files.dir $w.files.file -side left -fill both
	pack $w.buttons.ok $w.buttons.cancel -side right
	pack $w.dest.l -side left
	pack $w.dest.e -side left -expand 1 -fill x
	pack $w.msg $w.sel $w.files $w.dest $w.buttons -side top -fill both
}

function GetFileResources
{
	option add "*Getfile*ok.text"		OK		startup
	option add "*Getfile*cancel.text"	Cancel		startup
	option add "*Getfile*l.text"		Selection:	startup
}

function MkXYScroll # widget
{
	typeset w=$1

	listbox $w.list -yscrollcommand "$w.scroll set"
	scrollbar $w.scroll -command "$w.list yview"
	pack $w.list -side left -fill both -expand 1
	pack $w.scroll -side left -fill y
}

function GetFileSetFiles # widget
{
	typeset dwidget=$1.dir.list fwidget=$1.file.list i w

	if [[ -d $GetFileName ]]
	then	cd $GetFileName > /dev/null 2>&1
	else	cd $(dirname $GetFileName) > /dev/null 2>&1
	fi

	$dwidget delete 0 end
	$fwidget delete 0 end
	$dwidget insert end ..
	for i in *
	do
		w=$dwidget
		[[ -f $i ]] && w=$fwidget
		$w insert end $i
	done
}

function GetFileSClick # widget point
{
	GetFileName=$(pwd)/$($1 get $($1 nearest $2))
}

function GetFileDClick # widget point
{
	cd $($1.dir.list get $($1.dir.list nearest $2))
	GetFileName=$(pwd)/
	GetFileSetFiles $1
}

##########################################################################

wm withdraw .

GetFile "Select file to send:"

[[ $GetFileName == "" ]] && exit 0
[[ $Dest == "" ]] && exit 0
name=$(basename $GetFileName)

case $COMPRESS in
	compress)	EXT=Z ;;
	zip)		EXT=zip ;;
	pack)		EXT=z ;;
	*)		COMPRESS=gzip 
			EXT=gz ;;
esac

case $GetFileName in
	"")	break ;;
	*.gz)	uuencode $name < $GetFileName | mail $Dest ;;
	*.tgz)	uuencode $name < $GetFileName | mail $Dest ;;
	*.uu)	mail $Dest < $GetFileName ;;
	*)	
		if [[ -d $GetFileName ]]
		then
		    tar -cvpf - $GetFileName | COMPRESS | uuencode \
			$name.tar.$EXT | mail $Dest
		else
		    $COMPRESS < $GetFileName | uuencode $name.$EXT | mail $Dest
		fi
		;;
esac