perm filename HOST.FAI[S,NET] blob sn#861141 filedate 1988-09-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	 History A B C X Y P PDLEN PDL MONCMP SOFT HSTEXT ADRTXT CRLF DOMRTS HSTTAB CACHE1 CACHE2 HOST GETCOM FLSINP HSTCOM CMDSCN PRMPT0 PROMPT DOCMD HSTLUP GOTHST ERRTYP GOTNAM GOTNA1 ADLOOP ADLOP1 ADLOP2 NICNAM HSTLUZ NOTIPA NOADDS NOADDH MXNEXT MXLAST NOMXRS NOMXRH NOMXRR BADDOM
C00012 ENDMK
C⊗;
;⊗ History A B C X Y P PDLEN PDL MONCMP SOFT HSTEXT ADRTXT CRLF DOMRTS HSTTAB CACHE1 CACHE2 HOST GETCOM FLSINP HSTCOM CMDSCN PRMPT0 PROMPT DOCMD HSTLUP GOTHST ERRTYP GOTNAM GOTNA1 ADLOOP ADLOP1 ADLOP2 NICNAM HSTLUZ NOTIPA NOADDS NOADDH MXNEXT MXLAST NOMXRS NOMXRH NOMXRR BADDOM

	TITLE HOST

Comment ⊗

This is a domain-based version of HOST, replacing the host-table based
version used previously.

History: (add changes at end)

11 Apr 88  JJW	Initial implementation.
19 Apr 88  JJW	Rewrote to call GETDOM directly for A and MX lookups.
13 Sep 88  ME	Starting at start address -1 or -2 sets CACHEU to 1 or 2,
		respectively, to specify domain cache usage.

To be done: Host table lookup when MX lookup fails.
	    Better processing of domain errors.

⊗; end of history

A←12				;Our AC's don't interfere with NETWRK's
B←13
C←14
X←15
Y←16
P←17

PDLEN←←20

PDL:	BLOCK PDLEN
MONCMP:	BLOCK 1			;-1 → got a monitor command
SOFT:	BLOCK 1			;-1 → got a soft error
HSTEXT:	BLOCK 25		;Buffer for input text
ADRTXT:	BLOCK 4			;Buffer for address text
CRLF:	BYTE (7)15,12

DOMRTS←←1			;We want domain routines
HSTTAB←←1			;Use host table as backup
.INSERT NETWRK.FAI[S,NET]

CACHE1:	SKIPA A,[1]
CACHE2:	MOVEI A,2
	MOVEM A,CACHEU		;set up cache-use flag
	JRST HOST

	JRST CACHE2		;S-2: don't use cache
	JRST CACHE1		;S-1: use only cache
HOST:	CAI
	RESET
	SETZM DVERBOSE		;Keep domain code quiet
	SETZM MONCMP
	MOVE P,[IOWD PDLEN,PDL]
	RESCAN A
	JUMPE A,PROMPT
GETCOM:	INCHRS X
	 JRST PRMPT0
	CAIE X," "		;Skip whitespace
	CAIN X,11
	JRST GETCOM
	CAIE X,"H"		;Check for HOST command
	CAIN X,"h"
	JRST HSTCOM
FLSINP:	INCHRS X
	 JRST PRMPT0
	CAIE X,175
	CAIN X,12
	JRST PRMPT0
	JRST FLSINP

HSTCOM:	OUTSTR CRLF
CMDSCN:	INCHRS X
	 JRST GOTHST
	CAIE X,175
	CAIN X,12
	JRST GOTHST		;No command argument
	CAIE X," "
	JRST CMDSCN
	SETOM MONCMP
	JRST DOCMD

PRMPT0:	GETPPN A,
	CAME A,['100100']
PROMPT:	SKIPE MONCMP
	EXIT 1,
	OUTSTR [ASCIZ/
Host name or address: /]
DOCMD:	SETZM HSTEXT
	MOVE Y,[POINT 7,HSTEXT]
HSTLUP:	INCHWL X
	ANDI X,177
	CAIN X,15
	INCHWL X
	CAIE X,175
	CAIN X,12
	JRST GOTHST
	IDPB X,Y
	JRST HSTLUP

GOTHST:	SETZ X,			;Got a host name or address
	IDPB X,Y		;End with a null byte
	SETZM SOFT		;No soft errors yet
;Here with input text string in HSTEXT.
	SKIPN HSTEXT		;Empty input text?
	JRST PRMPT0		;Yes, reprompt or exit
	MOVE Y,[POINT 7,HSTEXT]	;Start at beginning of text
	ILDB X,Y		;Now see if we got a name or a address
	CAIL X,"0"
	CAILE X,"9"
	JRST GOTNAM		;Got a name
	MOVEI 0,HSTEXT
	PUSHJ P,HSTNBR		;Parse a numeric address
	 JRST HSTLUZ
	TLNE 1,(NN%IP)		;Make sure it's an IP address
	 JRST NOTIPA		;Not an IP address
	MOVE 0,1		;Set up for ADRNAM
	PUSHJ P,ADRNAM		;Look up the address
	 JRST ERRTYP		;Hard error
	 JRST ERRTYP		;Soft error
	OUTSTR HSTEXT
	OUTSTR [ASCIZ/ is the address for /]
	MOVE B,0		;Point to name
	OUTSTR (B)
	OUTSTR [ASCIZ/.
/]
	JRST PROMPT

ERRTYP:	OUTSTR [ASCIZ/Domain error: /]
	OUTSTR (1)		;Print error text
	OUTSTR [ASCIZ/.
/]
	JRST PROMPT

GOTNAM:	MOVEI 0,HSTEXT		;Point to host name
GOTNA1:	MOVEI 1,TY.A		;Look for address record
	MOVEI 2,CL.IN
	PUSHJ P,GETDOM
	 JRST NOADDH		;Hard error
	 JRST NOADDS		;Soft error
	 JRST NICNAM		;Name was a nickname
	MOVE X,0		;Print updated name
	OUTSTR (X)
	OUTSTR [ASCIZ/ has Internet address/]
	PUSH P,3		;Save first address
	PUSHJ P,GETDMA		;See if it has more addresses
	 JRST ADLOP1		;No more
	OUTSTR [ASCIZ/es/]
	EXCH 3,(P)		;Get back first address
	MOVE 0,3
	MOVEI 1,ADRTXT
	PUSHJ P,HNUMST		;Convert first address to string
	OUTCHR [" "]
	OUTSTR ADRTXT		;Print it
	POP P,0			;Get back second address
ADLOOP:	MOVEI 1,ADRTXT
	PUSHJ P,HNUMST		;Convert next address to string
	OUTSTR [ASCIZ/, /]
	OUTSTR ADRTXT		;Print it
	PUSHJ P,GETDMA		;See if any more addresses
	 JRST ADLOP2		;No more
	MOVE 0,3
	JRST ADLOOP

;Here if only one address
ADLOP1:	POP P,0			;Get back address
	MOVEI 1,ADRTXT
	PUSHJ P,HNUMST		;Convert address to string
	OUTCHR [" "]
	OUTSTR ADRTXT		;Print it
ADLOP2:	OUTSTR [ASCIZ/.
/]
	JRST PROMPT

NICNAM:	MOVE X,0
	OUTSTR (X)
	OUTSTR [ASCIZ/ is a nickname for /]
	OUTSTR (3)
	OUTSTR [ASCIZ/.
/]
	MOVE 0,3
	JRST GOTNA1

HSTLUZ:	OUTSTR [ASCIZ/Bad host address format.
/]
	JRST PROMPT

NOTIPA:	OUTSTR [ASCIZ/Not an IP address, we don't handle those yet.
/]
	JRST PROMPT

;Here if address lookup fails (soft or hard error).  0 points to
;current domain name.
NOADDS:	SETOM SOFT		;Remember soft error seen
NOADDH:	CAMN 3,[EC.NAM]		;Was it a name error?
	JRST BADDOM		;Yes, no need to check for MX
	MOVEI 1,TY.MX
	MOVEI 2,CL.IN
	PUSHJ P,GETDOM		;Look for an MX record
	 JRST NOMXRH		;Hard error
	 JRST NOMXRS		;Soft error
	 JRST NICNAM		;This shouldn't happen!
	MOVE X,0		;Updated name
	OUTSTR (X)
	OUTSTR [ASCIZ/ is not an Internet host, but can be used as a
mail destination.  Mail will be routed through /]
MXNEXT:	OUTSTR (3)		;Print name of MX host
	PUSHJ P,GETDMA		;See if any others
	 JRST MXLAST
	OUTSTR [ASCIZ/
or /]
	JRST MXNEXT

MXLAST:	OUTSTR [ASCIZ/.
/]
	JRST PROMPT

;Here if address and MX lookup both fail.  Fail for now, maybe add code
;to try host table.
NOMXRS:	SETOM SOFT
NOMXRH:	SKIPN SOFT
	JRST NOMXRR
	OUTSTR [ASCIZ/No Internet address or mail (MX) records found, but some name
servers may be unreachable at present.
/]
	JRST PROMPT

NOMXRR:	MOVE X,0
	OUTSTR (X)
	OUTSTR [ASCIZ/ has no Internet address or mail (MX) records.
/]
	JRST PROMPT

BADDOM:	MOVE X,0
	OUTSTR (X)
	OUTSTR [ASCIZ/ is not a registered domain name.
/]
	JRST PROMPT

	END HOST