	TITLE	FORWRD Mail to another host
	SUBTTL	Phil Budne@DEC; December 12, 1983
	.DECSAVE
 
COMMENT \
@RENAME MAIL.TXT MAIL.TEMP
@FORWRD
Mail File? MAIL.TEMP
To Host? FOOBAR
To User? HSTRAPPMAN
n files output
@APPEND MAIL.TEMP MAIL.FORWRD
@DEL MAIL.TEMP
\
 
FLGPAG==400000
 
A==1
B==2
C==3
D==4
 
T==5
TT==6
 
P==17
 
.INSRT LIB:SYMBOLS
.INSRT LIB:MACROS
.INSRT LIB:PRARG
.INSRT LIB:COMND
 
TRGNOD:	BLOCK	2
TRGUSR:	BLOCK	20
LCLNOD:	BLOCK	2
LCLUSR:	BLOCK	20
 
PDL:	BLOCK	<LPDL==20>	;PUSH DOWN LIST
BUFFER:	BLOCK	<LBUF==100>	;STRING BUFFER
NUMBER:	BLOCK	1
IGNORED:BLOCK	1
MAIJFN:	BLOCK	1		;JFN FOR MAIL FILE
REQJFN:	BLOCK	1		;JFN FOR OUTPUT
DATE:	BLOCK	1		;MESSAGE APPEND DATE
COUNT:	BLOCK	1		;MESSAGE BYTE COUNT
 
CALL=PUSHJ P,
RET=POPJ P,
 
DEFINE	FATAL	&STR
	CALL [	HRROI	A,[ASCIZ STR]
		ESOUT
		JRST	DIE ]
TERMIN
 
START:	JFCL
	RESET
	MOVE	P, [-LPDL,,PDL]
 
	GJINF
	MOVE	B, A
	HRROI	A, LCLUSR
	DIRST
	 TRN
	SETZ	C,
	IDPB	C, B
 
	MOVEI	A, .NDGLN
	MOVEI	B, C
	HRROI	C, LCLNOD
	NODE
	SETZ	C,
	IDPB	C, B
 
	Hrroi	A, [Asciz 'Mail file ?']
	PSOUT
	SETZM	NUMBER
	SETZM	IGNORED
	MOVSI	A, (GJ%OLD\GJ%SHT\GJ%FNS\GJ%CFM\GJ%MSG)
	MOVE	B, [.PRIOU,,.PRIIN]
	GTJFN
	 FATAL	'You lose'
	MOVE	B, [FIELD(7,OF%BSZ)+OF%RD]
	OPENF
	 FATAL	'Could not open file'
	MOVEM	A, MAIJFN
 
	Hrroi	A, [Asciz 'To Host ?']
	Move	C, A
	PSOUT
	Hrroi	A, TRGNOD
	Move	B, [<20.*5-1>\RD%CRF]
	RDTTY
	 ErJmp	DIE
	Setz	C,
	Dpb	C, A
 
	Hrroi	A, [Asciz 'To User ?']
	Move	C, A
	PSOUT
	Hrroi	A, TRGUSR
	Move	B, [<20.*5-1>\RD%CRF]
	RDTTY
	 ErJmp	DIE
	Setz	C,
	Dpb	C, A
 
;HERE TO READ HEADER LINE OUT OF FILE
NEXT:	 MOVE	A, MAIJFN
	HRROI	B, BUFFER
	MOVEI	C, LBUF*5-1
	MOVEI	D,^J
	SIN
	 ERJMP	DIE
	JUMPE	C,TOOBIG
	SETZ	A,
	IDPB	A,B
 
;DIGEST DATE
	HRROI	A, BUFFER
	MOVSI	B, (IT%SNM\IT%AIS)
	IDTIM
	 JRST	BADFMT
	MOVEM	B, DATE
 
;DIGEST LENGTH
	MOVEI	C, 10.		;DECIMAL RADIX
	NIN			;READ IN NUMBER
	 JRST	BADFMT		;YOU LOSE
	JUMPE	B, BADFMT	;POSITIVE LENGTH?
	MOVNM	B, COUNT	;SAVE
 
	MOVEI	C, 10		;OCTAL RADIX
	NIN			;READ NUMBER
	 JRST	BADFMT		; YOU LOSE
 
;B HAS FLAGS
	TRNN	B, 4		;"ATTENTION" ?
	 TRNN	B, 1		; NO, "SEEN"
	  JRST	NEWFIL		;  ATTENTION || NOT SEEN
	AOS	IGNORED		;COUNT
	SETZM	REQJFN		;NO, IGNORE THIS MESSAGE
	JRST	CPYLOP
 
;OPEN NEW OUTPUT FILE
NEWFIL:	AOS	NUMBER
	GJINF
	MOVE	B, A
	HRLI	B, PSLH
	HRROI	A, BUFFER
	DIRST
	 .LOSE
	HRROI	B, [ASCIZ '[--DECNET-MAIL--].']
	SETZ	C,
	SOUT
	HRROI	B, TRGNOD
	SOUT
 
	HRLOI	A, (GJ%FOU\GJ%SHT\GJ%NEW)
	HRROI	B, BUFFER
	GTJFN
	 .LOSE
	MOVE	B, [FIELD(7,OF%BSZ)+OF%WR]
	OPENF
	 .LOSE
	MOVEM	A, REQJFN	;SAVE JFN
	HRLI	A, .FBBYV	;FDB WORD
	MOVSI	B, (FB%RET)	;SET RETENTION COUNT
	SETZ	C,		;TO ZERO!?
	CHFDB			;KEEP ALL VERSIONS
	 ERJMP	.+1
 
	MOVE	A, REQJFN	;GET OUTPUT JFN
	HRROI	B, [ASCIZ 'From: ']
	SETZ	C,
	SOUT
	HRROI	B, LCLUSR
	SOUT
	HRROI	B, AT
	SOUT
	HRROI	B, LCLNOD
	SOUT
	HRROI	B, CRLF
	SOUT
	HRROI	B, [ASCIZ 'To: ']
	SOUT
	HRROI	B, TRGUSR
	SOUT
	HRROI	B, AT
	SOUT
	HRROI	B, TRGNOD
	SOUT
	HRROI	B, CRLF
	SOUT
	HRROI	B, [ASCIZ 'Date: ']
	SOUT
	SETOB	B, C
	ODTIM
	SETZ	C,
	HRROI	B, CRLF
	SOUT
	HRROI	B, [ASCIZ 'Re: ']
	SOUT
	HRROI	B, LCLNOD
	SOUT
	HRROI	B, [ASCIZ ' -- forwarded mail']
	SOUT
	HRROI	B, CRLF
	SOUT
	HRROI	B, CRLF
	SOUT
 
CPYLOP:	MOVN	T, COUNT	;GET COUNT
	JUMPE	T, DONE		;NO MAW
	CAILE	T, LBUF*5	;TOO BIG?
	 MOVEI	T, LBUF*5	; YES, DO JUST THIS MUCH
	ADDM	T, COUNT	;CHECK OFF
 
	MOVE	A, MAIJFN
	HRROI	B, BUFFER
	MOVNI	C, (T)
	SIN
	 ERJMP	[.LOSE]
 
	SKIPN	A, REQJFN	;DOING OUTPUT?
	 JRST	CPYLOP		; NOPE
	HRROI	B, BUFFER
	MOVNI	C, (T)
	SOUT
	 ERJMP	[.LOSE]
	JRST	CPYLOP
 
DONE:	MOVE	A, REQJFN
	CLOSF
	 TRN
	JRST	NEXT
 
DIE:	SKIPE	A, MAIJFN
	 CLOSF
	  TRN
	SKIPN	B, IGNORED
	 JRST	DIE1
	CALL	DECOUT
	HRROI	A, [ASCIZ ' messages ignored']
	PSOUT
	HRROI	A, CRLF
	PSOUT
DIE1:	SKIPN	B, NUMBER
	 JRST	DEAD
	CALL	DECOUT
	HRROI	A, [ASCIZ ' files output']
	PSOUT
 
; HERE TO DINK BIT TABLE (THANKEW MRC)
	MOVSI	A,(GJ%SHT\GJ%OLD)
	HRROI	B,[ASCIZ/SYSTEM:DECNET-MAILER.FLAGS/]
	GTJFN				;Get JFN on flags file
	 JRST	DEAD
	PUSH	P, A
	MOVEI	B, OF%THW\OF%WR\OF%RD
	OPENF
	 JRST	DEAD
	HRLZ	A, (P)		;Page 0
	MOVE	B, [.FHSLF,,FLGPAG/1000]
	MOVSI	C, (PM%RD\PM%WR)
	PMAP
	GJINF
	HRRZ	C, B
	IDIVI	C, 36.
	MOVSI	A, (SETZ)
	MOVN	D, D
	ROT	A, (D)
	IORM	A, FLGPAG(C)	;Set my bit
	SETO	A,
	MOVE	B, [.FHSLF,,FLGPAG/1000]
	SETZ	C,
	PMAP
	POP	P, A
	CLOSF
	 TRN
DEAD:	HALTF
	JRST	.-1
 
DECOUT:	MOVEI	A, .PRIOU
	MOVEI	C, 10.
	NOUT
	 TRN
	RET
 
CRLF:	ASCIZ	'
'
AT:	ASCIZ	' at '
BADFMT:	FATAL	'Bad header format'
TOOBIG:	FATAL	'Header too big'
 
	END	START
