From:	SMTP%"RELAY-INFO-VAX@CRVAX.SRI.COM" 12-MAY-1993 15:49:58.46
To:	EVERHART
CC:	
Subj:	RE: VMS mail patch

Message-Id: <9305100446.AA14245@uu3.psi.com>
Date: Mon, 10 May 93 00:17:41 EDT
From: Jerry Leichter <leichter@lrw.com>
To: INFO-VAX@kl.sri.com
Subject: RE: VMS mail patch
X-Vms-Mail-To: UUCP%"azog@world.std.com"

	A short while ago, one of our users gave me a hardcopy printout of a
	patch to mailshr.exe that will allow you to use an external delivery
	protocol without using the SMTP%"..." characters. (our site is running
	Multinet 3.2A, and I dont want people to use mm, but use VMS mail,
	since thats what they are used to. most of them are familiar with the
	internet @ style addressing, but I know that Ill have lots of trouble
	calls from people who forget the SMTP% stuff, wondering why they cant
	send netmail.  I found myself doing this also)

	Anyways, the problem is that it was several pages of printout, and I
	am not in a mood to type in seven pages of PATCH info, and have a
	small typo mess me up. Anyone know where I can find a patch like this,
	via ftp? Thanx

Is this what you had in mind?  (It uses IN% rather than SMTP%, which is not
easily changed, but there's a comment in there showing you how to work around
this limitation with an appropriate logical name.)

							-- Jerry

!----------------------  MAILSHR_PATCH_FOR_AT_02.COM -----------------
MAILSHR.EXE
!
! This patch will be of interest to any VAX/VMS system (more especially if it
! is running PMDF) since it lets TO: or CC: addresses such as
! user%machine@site.co.org to be accepted without the IN% prefix and without
! surrounding double quotes.  Yes, let's admit it, it lets VMS mail accept Un*x
! type addresses.  In addition to its original goal, the format of this
! modification is also original by the fact of the straight macro code that
! can easily be modified/expanded or altered (ie IN% could become M_INTERNET::
! in the case of most Schlumberger VMS nodes)
! If the address is "similar" (see algorithm below) to user%machine@site.co.org
! it is simply rewritten as IN%"user%machine@site.co.org" and passed along.
! At the same time, user@machine will be accepted and rewritten as machine::user
! If the IN% prefix is not the one in use on your VAX/VMS system, but XYZ% is,
! then all you have to do is $ DEFINE/SYSTEM/EXECUTIVE -
!	MAIL$PROTOCOL_IN -
!	XYZ_ROOT:[EXE]XYZ_MAILSHR	! or wherever the XYZ overlay for MAIL
!					! might be located and installed from
!
! See additional impact remarks below.
!
! This patch applies to SYS$LIBRARY:MAILSHR.EXE (usually SYS$COMMON:[SYSLIB])
! from VMS 5.0 to Field Test version of 5.4 as of June 1990
!
!	We recommend:
!
!	$ SET DEFAULT SYS$COMMON:[SYSLIB]
!	$ INSTALL:= $INSTALL/COMMAND
!	$ PATCH @ this_file.COM
!	$ INSTALL REPLACE SYS$COMMON:[SYSLIB]MAILSHR.EXE
!
! Claude Barbe - Schlumberger-Doll Research - Ridgefield, CT - USA
! (Internet) barbe@sdr.slb.com (a happy hacker of MAIL and PMDF for over 3yr)
!
! 3-Jul-1990
!
! No warranty implied.  This can be freely copied and altered.  Use it at
! your own risks.  It is probably pure chance if it ever worked on a
! particular system.
!
! Additional remarks on the impact of this patch
!
! 1) With this patch in place we hope to make addressing unique in the VMS world
!    whether a message is sent via DECnet or via a foreign protocol (such as
!    the successful/affordable PMDF) without forcing any one to use prefixes
!    and/or quotes.  Quotes are to be avoided by all means since MAIL and DEC's
!    MRGATE interface have no mechanisms to imbed quoted addresses between
!    quotes (ie MRGATE and PMDF cannot carry the same message!)
! 2) There are risks of confusion for new users who will learn that the Un*x
!    addressing format works on a patched VMS system and who will never bother
!    to know the DEC way to send mail with double colons between node and 
!    username until they use a non patched VMS system
! 3) The patch will certainly break when DECnet node names will contain dots
!    but this is in DECnet phase V and we still have to see a field test
!    for this product.  By that time a better patch will be developped or
!    whatever foreign protocol is used (PMDF by default) will just handle
!    these deliveries that could have gone also more simply across DECnet
! 4) The patch is far from being fully RFC822 compliant and there are risks
!    that some users will be confused by the lack of completeness.  This
!    in some case will be due to the approach taken in this patch where,
!    instead of redoing the address parsing that DEC is doing in MAIL, we
!    simply hacked a string filter on a "DEC approved string" which has already
!    been pruned of commas and exclamation points.  Users familiar with "bang"
!    addresses will still have to say IN%"node!node!user@relay.somewhere"
! 5) After a few extra weeks of testing on a larger scale, this patch will be
!    submitted to DEC as an SPR for improvement.  Hopefully, then DEC will
!    support the de facto standard (or at least the most commonly used part
!    of it).  In the mean time let's try to let our users access Internet
!    addresses in the most natural way.  At last!
!
! Validity of this patch
!
! It has only been tested on VMS 5.3-1 but is expected to work on VMS 5.0 to 5.4
! (well, 5.4 is not out yet, so at least up to T5.4-4).  This part of the code
! is the same for all these versions of VMS 5, only the addresses changed after
! 5.0.  For VMS 4.6/4.7, unfortunately the code was different and it was not
! found worth the effort to retrofit this patch for a version of VMS that was
! replaced 23 months ago.
!
! For VMS 5.0 only, uncomment the following 6 lines and comment another 6 lines
! below.
!
! If you patch, VMS 5.0, it is different from the following VMS versions
!                          MAIL$$ADD_ADDR     is located at 000049C2 and
!                          ADD_ADDR           is located at 000048EF
!    then uncomment the following 6 lines and comment out 6 similar lines below
!DEF
!MAIL$$ADD_ADDR
!000049C2
!ADD_ADDR
!000048EF
!EXI
!
! If you patch any versions from VMS 5.1 to T5.4-4 including 5.1 and 5.2, all
! appear to have identical MAIL$$ADD_ADDR always located at 000049D2 and
! calling                  ADD_ADDR       always located at 000048FF
! For VMS 5.0 comment out the following 6 lines and uncomment 6 lines above
!
DEF
MAIL$$ADD_ADDR
000049D2
ADD_ADDR
000048FF
EXI
! Now make sure that we have a patch area
!
ALI/B PATAREA
! And now enter instruction mode
! 
SE M
I
EXI
!	Start implementing the ALTER_TO subroutine
!	It was first developped and tested as a MACRO-32 program
!	and changed into the body of this patch.com file by
!	a MACRO_TO_PATCH.COM procedure developped for that purpose
DEP /PAT
PATAREA
       !;	ALTER_TO is called with the same 2 arguments used by
       !;	MAIL$$SEND_ADD_ADDR in calling MAIL$$ADD_ADDR and will call
       !;	ADD_ADDR itself with or without a rewrite. There is no rewrite
       !;	if SYS$FAO fails.  The original address is never modified and
       !;	will still appear unmodified in the "published" TO: field.
       !;
       !;	At this point when MAIL$$ADD_ADDR calls ALTER_TO, 4(AP) points
       !;	to a string descriptor which MAIL has already parsed to be one
       !;	of a single recipient (we don't have to look for commas or for
       !;	an @ sign preceding a distribution list).  Because of the
       !;	location of this patch, floating/unquoted "!"s seem unlikely.
       !;
       !;	The principle of this patch is to allow plain RFC addresses
       !;	to be acceptable by mail.  We never anticipated to fully deal
       !;	with the full RFC822 format but simply to lrt forms such as
       !;	user@site.org or user%machine@site.company.org with all atoms
       !;	being alphanumerics and the whole address void of double quotes
       !;
       !;	At the same time STRAIGHTFORWARD phase IV DECnet mail addresses
       !;	are also allowed in an RFC822 like format: USERNAME@NODENAME
       !;	is being transformed into NODENAME::USERNAME.  Note well that
       !;	the code will NOT transform any address with an "@" into
       !;	a more complex DECnet mail address such as AAA::BBB::USER.
       !;
       !;	The parsing is an adhoc scanning of the string looking for
       !;	no more than one "@", checking the absence of " and for the
       !;	A and B parts of A@B distinguish between A-Z,0-9,a-z,$,%,.,-
       !;	and other characters (in case MAIL's parser would any slip thru)
       !;
       !;	More exactly the algorithm is:
       !;
       !;	input string might look like A@B with A and B containing no "
       !;	if " or not A@B, pass the string to ADD_ADDR unchanged	! Case 1
       !;	else if A or B has any character not in A-Z,0-9,a-z,$,%,.,-
       !;			pass IN%"A@B"				! Case 2
       !;	     else
       !;		 if B has no dots (pure DECnet) pass B::A	! Case 3
       !;		 else pass IN%"A@B"				! Case 2
       !;
       'alter_to: .word	7C			' ! ; entry mask save R2-R6
       '	movq	@B^4(ap),r0'
       '	movzwl	r0,r0'
       '	clrl	r2'
       'cdblp1:	cmpb	#^x22,(r1)'
       '	beql	cdbcs1'
       '	cmpb	#^x40,(r1)+'
       '	beql	cdbl1x'
       '	incl	r2			' ! ; length of A in A@B
       '	sobgtr	r0,cdblp1'
       'cdbcs1: movab	@B^4(ap),r2'
       '	jmp	cdbcom			' ! ; no changes - case 1
       'cdbl1x:	decl	r0			' ! ; count "@"
       '	bleq	cdbcs1			' ! ; branch if at end
       '	tstl	r2'
       '	beql	cdbcs1			' ! ; branch if @B with no A
       '	clrl	r3			' ! ; now parse after "@"
       'cdblp2:	cmpb	#^x22,(r1)'
       '	beql	cdbcs1'
       '	cmpb	#^x40,(r1)+'
       '	beql	cdbcs1'
       '	incl	r3			' ! ; length of B in A@B
       '	sobgtr  r0,cdblp2'
       !; passed test 1 - we have A@B - Now check A
       '	movq	@B^4(ap),r0'
       !; allocate room on stack for 2 descriptors (for A and B)
       '	pushl	r1'
       '	pushl	r2'
       '	movl	sp,r5		' ! ; r5 points to desc(A)
       '	movl	r2,r0'
       '	beql	cdbcs1'
       '	jsb	cdbck1'
       '	tstl	r0'
       '	bneq	cdbcs2'
       '	incl	r1'
       '	pushl	r1'
       '	pushl	r3'
       '	movl	sp,r6		' ! ; r6 points to desc(B)
       '	movl	r3,r0'
       '	beql	cdbcs1'
       '	jsb	cdbck1'
       '	tstl	r0'
       '	beql	cdbps2'
       !					    ; build IN%"A@B" for case 2
       !; use the stack this way for all $FAO
       !;		outlen		initial sp	<- r3 <-r2
       !;		ptr to outbuf	initial sp-264	<- r2 minus 8
       !;		......				<- r2 to beg of ptr
       !;		outbuf		initial sp-4	<- r3 minus 4
       !;		......		initial sp-256  <- sp
       'cdbcs2:	pushl	#22534121		' ! ; ctrstr	#^A/!AS"/
       '	pushl	#22254E49		' ! ; ctrstr	#^A/IN%"/
       '	pushl	sp			' ! ; make desc to ctrstr
       '	pushl	#8			' ! ; make desc to ctrstr
       '	movl	sp,r4			' ! ; address of desc to ctrstr
       '	subl	#4,sp			' ! ; adjusted stack
       '	movl	sp,r3			' ! ; save stack for outlen
       '	movl	sp,r2			' ! ; end of desc to outbuf
       '	subl	#108,sp		' ! ; end of outbuf
       '	movl	sp,-(r2)	' ! ; make outbuf
       '	movzwl	#100,-(r2)	' ! ; make outbuf
       '	pushl	B^4(AP)			' ! ; #4 P1 pass what we got
       '	pushl	r2			' ! ; #3 outbuf
       '	pushl	r3			' ! ; #2 outlen
       '	pushl	r4			' ! ; #1 ctrstr
       '	calls	#4,@#7FFEDF50		' ! ; calls   #04,g^sys$fao
       '	blbs	r0,N102$'
       '	jmp	cdberr'
       'N102$:	movw	(r3),(r2)		' ! ; complete ptr to final text
       '	jmp	cdbcom'
       'cdbps2:	movq	@B^4(ap),r0'
       '	addl	r2,r1'
       '	incl	r1'
       '	movl	r3,r0'
       '	jsb	cdbck2'
       '	tstl	r0'
       '	bneq	cdbcs2'
       !					    ; build B::A for case 3
       'cdbcs3:	pushl	#5341213A		' ! ; ctrstr	#^A/:!AS/
       '	pushl	#3A534121		' ! ; ctrstr	#^A/!AS:/
       '	pushl	sp			' ! ; make desc to ctrstr
       '	pushl	#8			' ! ; make desc to ctrstr
       '	movl	sp,r4			' ! ; address of desc to ctrstr
       '	subl	#4,sp			' ! ; adjusted stack
       '	movl	sp,r3			' ! ; save stack for outlen
       '	movl	sp,r2			' ! ; end of desc to outbuf
       '	subl	#108,sp		' ! ; end of outbuf
       '	movl	sp,-(r2)	' ! ; make outbuf
       '	movzwl	#100,-(r2)	' ! ; make outbuf
       '	pushl	r5			' ! ; #5 Second sub string A
       '	pushl	r6			' ! ; #4 first  sub string B
       '	pushl	r2			' ! ; #3 outbuf
       '	pushl	r3			' ! ; #2 outlen
       '	pushl	r4			' ! ; #1 ctrstr
       '	calls	#5,@#7FFEDF50		' ! ; calls   #05,g^sys$fao
       '	blbs	r0,N103$'
       '	jmp	cdberr'
       'N103$:	movw	(r3),(r2)		' ! ; complete ptr to final text
       '	jmp	cdbcom'
       !; check if all alpha numerical + .-_$% returns non zero 
       'cdbck1:	cmpb	#^x41,(r1)'
       '	bgtr	cdbck11'
       '	cmpb	#^x5A,(r1)'
       '	bgeq	cdbck19'
       'cdbck11: cmpb	#^x61,(r1)'
       '	bgtr	cdbck12'
       '	cmpb	#^x7A,(r1)'
       '	bgeq	cdbck19'
       'cdbck12: cmpb	#^x30,(r1)'
       '	bgtr	cdbck13'
       '	cmpb	#^x39,(r1)'
       '	bgeq	cdbck19'
       'cdbck13: cmpb	#^x24,(r1)'
       '	beql	cdbck19'
       '	cmpb	#^x25,(r1)'
       '	beql	cdbck19'
       '	cmpb	#^x2D,(r1)'
       '	beql	cdbck19'
       '	cmpb	#^x2E,(r1)'
       '	beql	cdbck19'
       '	cmpb	#^x5F,(r1)'
       '	rsb'
       'cdbck19: incl	r1'
       '	sobgtr	r0,cdbck1'
       '	rsb'
       !; check if we have at least one dot (then r0 > 0)
       'cdbck2:	cmpb	#^x2E,(r1)'
       '	bneq	cdbck29'
       '	rsb'
       'cdbck29: incl	r1'
       '	sobgtr	r0,cdbck2'
       '	rsb'
       !;
       'cdberr: movab	@B^4(ap),r2	' !; If SYS$FAO fails, use original addr
       'cdbcom:	MOVQ    #^X00000001,-(SP)'
       '	movl	B^8(ap),-(sp)'
       '	pushl	r2'
       '	CALLS   #04,L^ADD_ADDR'
       '	ret			' !; this is the only RET for ALTER_TO
EXI
! Above was the new code
! Below is the patch in the existing code that
! will make use of the ALTER_TO new code
RE
MAIL$$ADD_ADDR
'MOVQ    #^X00000001,-(SP)'
'MOVQ    B^04(AP),-(SP)'
'CALLS   #04,W^ADD_ADDR'
'RET'
EXIT
'MOVQ    B^04(AP),-(SP)'
'CALLS   #02,ALTER_TO'
'RET'
EXIT
! And now update if we reached this point without a single error
U
!---------------------- end of patch ----------------------

