#!/bin/akanga -p
#

fn debug {
	if (~ $debug yes) {
		echo $* >[1=2]
		}

	return 0
	}

#
# readresponse <expect> <exitcode>
#
fn readresponse {
	read resp data line
	debug '<<<' $resp $data $line

	if (! ~ $resp $1) {
		echo error: $resp $data $line >[1=2]
		if (! ~ $2 0)
			exit $2

		return 1
		}
	
	return 0
	}

#
# putline <line>
#
fn putline {
	if (~ $debug yes)
		echo '>>>' $* >[1=2]

	echo $*  ||  {
		echo remote side closed the connection >[1=2]
		exit 1
		}

	return 0
	}


fn sendblock {
	putline +DATA
	des -3 -ehk $key <$1 | mimencode 
	echo .

	readresponse +OK 2
	return 0
	}

fn receiveblock {
	readresponse +DATA 2
	{ while (read line  &&  ! ~ $line .) {
		echo $line
		}
	  } | mimencode -u | des -3 -d -hk $key >$1
	
	putline +OK
	}


	
#
# initsession
#
#	Server Greeting lesen und Session-Schluessel berechnen
#
fn initsession {
	readresponse +OK 2
	key = `{ echo $data ^ : ^ $'config.key' | md5sum | awk '{ print $1 }' }
	passwd = `{ echo $'config.passwd' ^ : ^ $data | md5sum | awk '{ print $1 }' }

	if (! ~ $username '') {
		putline +PASSWD $username $passwd
	} else {
		putline +PASSWD $passwd
		}

	readresponse +OK 2
	return 0
	}


#
# cmsg <server> [<message>]
#
#	Standardeingabe verschluesselt an <server> schicken.
#

configfile = /usr/local/cmsg/etc/client.conf
username = ''
port = 7001
debug = no
umask 077

parseopt '*' c:dp:u: $*  ||  exit 1
while (~ $1 -*) {
	switch ($1) {
	case -c
		configfile = $2
		shift 2

	case -d
		debug = yes
		shift

	case -p
		port = $2
		shift 2

	case -u
		username = $2
		shift 2

	case - --
		shift
		break

	case *
		echo $0: unknown option: $1 >[1=2]
		exit 1
		}
	}


if (~ $#* 0) {
	echo usage: $0 '<server> [<message> <arg> ...]' >[1=2]
	exit 1
	}

server = $1; shift
if (~ $server *:*) {
	x = ``($ifs :) { echo $server }
	server = $x(1)
	port   = $x(2)
	}
	
if (~ $#* 0)
	* = echo

let 'perm = stat("-p", configfile)'
if (! ~ $perm 0600) {
	chmod 000 $configfile
	echo $0: wrong permission on configuration $configfile: $perm >[1=2]
	exit 1
	}

#
# Konfiguration lesen
#
initvars '' config.key config.passwd config.des
profile = $server
if (! ~ $username '')
	profile = $username

readconf config. $configfile $profile
if (~ $(config.key) ''  ||  ~ $(config.passwd) '') {
	echo $0: no configuration available: $profile >[1=2]
	exit 1
	}

if (~ $(config.des) '')
	config.des = (des -3)


connect -wp $server:$port /bin/akanga -c '
	stdout = /proc/self/fd/$CONNECT_STDOUT
	stdin = /proc/self/fd/$CONNECT_STDIN

	initsession

	mktemp in
	{ echo message: $*
	  echo
	  cat $stdin } >$in
	sendblock $in

	mktemp out
	receiveblock $out
	cat $out >$stdout
	' $*  ||  exit 1

exit $status



