# BITNET
#
# The configuration supports native BITNET hosts communicating directly
# with the various types of BITNET mail hosts.  These are defined by
# the :servers1. -tag in the BITEARN NODES -file.  The understood tags are:
#
#	bsmtp3			- send BSMTP to mailer  (with node addresses)
#	bsmtp3rfc		- BSMTP with RFC addresses
#	bsmtp3nd		- NETDATA but BSMTP (with node addresses)
#	bsmtp3ndrfc		- As above, but RFC addresses
#
#	defrt1			- send a NOTE file to the recipient directly
#
# The local RSCS (BITNET) node name should be the only contents of the
# file /etc/name.bitnet.  A specialized version of the routes
# database is also defined (called routes.bitnet), mostly to make it
# easy to generate and update automatically from the BITNET tables.

require bitnetdb canonicalize smtp standard
provide bitnet

bitnet_neighbour (domain, address, A) {
	local tmp

	tsift "$domain" in
	(.+)\.(bitnet|netnorth|earn)
		domain="\1" ;;
	tfist
	tmp=$(bitnetdb "$domain") &&
	tmp=$(routes_spec "$tmp" "$address" $A) &&
		return $tmp

#| The routes_spec function interprets the values in the bitnet.routes database.

	return 1
}

bitnetroute (address) {
	local tmp

	tsift "$address" in
#	.*@.*		address="$(canonicalize "$address")" ;;
#	(.*)<(.*)>(.*)	address="\1\2\3" ;;
#	.*		address="$(rfc822route "$address")" ;;

	.*:([^:]+)	address="\1" ;;
	[^@]+		return "$address@$bitnetname.bitnet" ;;# add our name
	(.)@(.)\.(bitnet|netnorth|earn)
			address="\1@\2" ;;
	(.+)@($hostname|$bitnetname)
			return "\1@$bitnetname.bitnet" ;; # hostname hiding
	(.+)@(([^@\.]\.)+$mydomain)
			tmp=$(deliver "\2") && return "\1@$bitnetname.bitnet" ;;
	.@.		address="${address}.bitnet" ;;
### FIX THIS>...
### need to change heuristic here ... look up the chanel instead
### of just the db of bitnet (look up both host and bitnet and check
### which channel it returns.
#	(.+)@([^\.])+	if [ "\2" = $bitnetname ]; then
#				break
#			else
#				sift "$(bitnetdb \2)" in
#				(.?)!(.)!(.)	break;;
#				(.?)!(.*)	break;;
#				.*		address="$address.uucp"; break;;
#				tfis
#			fi
#			;;
	tfist
	return "$address"
}	# end of bitnetroute

# A version of bitnetroute that truncates addresses enough so it'll all fit
# in a 79-column card image...

bitnetShortroute (address) {
	local tmp

	tsift "$address" in
#	.*@.*		address="$(canonicalize "$address")" ;;
#	(.*)<(.*)>(.*)	address="\1\2\3" ;;
#	.*		address="$(rfc822route "$address")" ;;

# check that the source route is < 70-some characters long...
#	@(gpu.utcs.utoronto.ca|ugw.utcs.utoronto.ca)[,:](.+@.+)
#			address="\2" ;;
#	@([^@,]+):([^:]+)@([^:]+)
#			return $address;;
#			#address = $2%$3@$1;; # most machines handle this
#					      # vm.utcs does not
#	@([^@,]+),@([^@,]+):([^:]+)@([^:]+)
#			return $address;; # source for now (CHECK THIS)
#					  # need to handle others?
#					  # long lines?
#					  # at least vm.utcs can handle source route
#			#return $1!$2!$4!$3;; # at least vm.utcs cannot eat this

	.*:([^:]+)	address="\1" ;;
	[^@]+		return "$address@$bitnetname.bitnet" ;; # add our name
	(.)@(.)\.(bitnet|netnorth|earn)
			address="\1@\2" ;;
	(.+)@($hostname|$bitnetname)
			return "\1@$bitnetname.bitnet" ;; # hostname hiding
	(.+)@(([^@\.]\.)+$mydomain)
			tmp=$(deliver "\2") && return "\1@$bitnetname.bitnet" ;;
	.@.		address="${address}.bitnet" ;;
### FIX THIS>...
### need to change heuristic here ... look up the chanel instead
### of just the db of bitnet (look up both host and bitnet and check
### which channel it returns.
#	(.+)@([^\.])+	if [ "\2" = $bitnetname ]; then
#				break
#			else
#				sift "$(bitnetdb \2)" in
#				(.?)!(.)!(.)	break;;
#				(.?)!(.*)	break;;
#				.*		address="$address.uucp"; break;;
#				tfis
#			fi
#			;;
	tfist
	return "$address"
}	# end of bitnetShortroute

bitnet2internet (address) {
	tsift "$address" in
	(.)@(.)		address="$(recase -l "\1%\2").bitnet@${mydomain}" ;;
	tfist
	return $(internet "$address")
}	# end of bitnet2internet

