perm filename DQUERY.FAI[S,NET]2 blob sn#849412 filedate 1987-11-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE DQUERY  A B C P PDLEN DOMRTS PDL CRLF CMDBUF TYPE CLASS NAME QTYPE QCLASS TYPNAM NTYNMS CLSNAM NCLNMS DQUERY TOPLEV GETCMD GOTTYP GOTCLS SHOWRR ERRNAM ERRSFT SHOWDA SH.UNK SH.A SH.MX SH.DOM SH.WKS SH.HIN GTOKEN GTOKE1 DECOUT CPOPJ HELP
C00010 ENDMK
C⊗;
	TITLE DQUERY ;⊗ A B C P PDLEN DOMRTS PDL CRLF CMDBUF TYPE CLASS NAME QTYPE QCLASS TYPNAM NTYNMS CLSNAM NCLNMS DQUERY TOPLEV GETCMD GOTTYP GOTCLS SHOWRR ERRNAM ERRSFT SHOWDA SH.UNK SH.A SH.MX SH.DOM SH.WKS SH.HIN GTOKEN GTOKE1 DECOUT CPOPJ HELP

COMMENT ⊗ History (please record changes):

13 Sep 87  JJW	Initial implementation.
04 Oct 87  JJW	Changed syntax from <type> <class> <domain> to
		<domain> <type> <class>, with defaults.
24 Nov 87  JJW	Fixed "?" code broken by 04 Oct 87 change.  Added
		domain name to output text.

⊗ ;end of comment

A←11		;Try not to interfere with NETWRK's ACs
B←12
C←13
P←17
PDLEN←←40

DOMRTS←←1
.INSERT NETWRK.FAI[S,NET]

PDL:	BLOCK PDLEN
CRLF:	BYTE (7)15,12
CMDBUF:	BLOCK 40
TYPE:	BLOCK 2
CLASS:	BLOCK 2
NAME:	BLOCK 40
QTYPE:	BLOCK 1
QCLASS:	BLOCK 1

TYPNAM:	-1
	ASCII/A/
	ASCII/NS/
	ASCII/MD/
	ASCII/MF/
	ASCII/CNAME/
	ASCII/SOA/
	ASCII/MB/
	ASCII/MG/
	ASCII/MR/
	ASCII/NULL/
	ASCII/WKS/
	ASCII/PTR/
	ASCII/HINFO/
	ASCII/MINFO/
	ASCII/MX/
NTYNMS←←.-TYPNAM

CLSNAM:	-1
	ASCII/IN/
	ASCII/CS/
	ASCII/CH/
NCLNMS←←.-CLSNAM

DQUERY:	RESET
	MOVE P,[IOWD PDLEN,PDL]
	OUTSTR [ASCIZ/Type "?" for help
/]

TOPLEV:	OUTSTR [ASCIZ/
Dquery> /]

	;Get command line, copy to CMDBUF
	MOVE B,[POINT 7,CMDBUF]
GETCMD:	INCHWL A
	CAIN A,15
	JRST GETCMD
	CAIE A,12
	CAIN A,175
	MOVEI A,0
	IDPB A,B
	JUMPN A,GETCMD
	CAMN B,[POINT 7,CMDBUF,6]
	EXIT			;Null input line to exit
	IDPB A,B		;Add two more nulls in case
	IDPB A,B		;type and class not given

	;Check for leading "?" on command line
	MOVE B,[POINT 7,CMDBUF]
	ILDB A,B
	CAIN A,"?"
	JRST HELP

	;Extract type, class and domain name from CMDBUF
	MOVE B,[POINT 7,CMDBUF]
	MOVE C,[POINT 7,NAME]
	PUSHJ P,GTOKEN
	SETZM TYPE
	MOVE C,[POINT 7,TYPE]
	PUSHJ P,GTOKEN
	SETZM CLASS
	MOVE C,[POINT 7,CLASS]
	PUSHJ P,GTOKEN

	;See if we recognize the type and class name
	MOVEI B,TY.ALL		;Default type
	SKIPE A,TYPE
	CAMN A,[ASCII/*/]
	JRST GOTTYP
	MOVSI B,-NTYNMS
	CAME A,TYPNAM(B)
	AOBJN B,.-1
	JUMPL B,GOTTYP
	OUTSTR [ASCIZ/Unrecognized type name: /]
	OUTSTR TYPE
	OUTSTR CRLF
	JRST TOPLEV

GOTTYP:	HRRZM B,QTYPE
	MOVEI B,CL.IN		;Default class
	SKIPN A,CLASS
	JRST GOTCLS
	MOVEI B,CL.ALL
	CAMN A,[ASCII/*/]
	JRST GOTCLS
	MOVSI B,-NCLNMS
	CAME A,CLSNAM(B)
	AOBJN B,.-1
	JUMPL B,GOTCLS
	OUTSTR [ASCIZ/Unrecognized class name: /]
	OUTSTR CLASS
	OUTSTR CRLF
	JRST TOPLEV

GOTCLS:	HRRZM B,QCLASS
	MOVEI 0,NAME		;Set up query
	MOVE 1,QTYPE
	MOVE 2,QCLASS
	PUSHJ P,GETDOM
	 JRST ERRNAM
	 JRST ERRSFT
	 JFCL			;Treat CNAME like ordinary response
SHOWRR:	OUTSTR @0		;Show domain name
	OUTCHR [" "]
	MOVE A,TYPNAM(1)
	OUTSTR A		;Show type
	OUTCHR [" "]
	MOVE A,CLSNAM(2)
	OUTSTR A		;Show class
	OUTCHR [" "]
	PUSHJ P,@SHOWDA(1)	;Show data
	OUTSTR CRLF
	PUSHJ P,GETDMA		;See if there's another RR
	 JRST TOPLEV		;No
	JRST SHOWRR		;Yes

ERRNAM:	OUTSTR [ASCIZ/Name error -- name does not exist
/]
	JRST TOPLEV

ERRSFT:	OUTSTR [ASCIZ/Soft error -- unable to answer query
/]
	JRST TOPLEV

SHOWDA:	SH.UNK
	SH.A			;TY.A
	SH.DOM			;TY.NS
	SH.DOM			;TY.MD (obsolete)
	SH.DOM			;TY.MF (obsolete)
	SH.DOM			;TY.CNAME
	SH.UNK			;TY.SOA
	SH.DOM			;TY.MB
	SH.DOM			;TY.MG
	SH.DOM			;TY.MR
	SH.UNK			;TY.NULL
	SH.WKS			;TY.WKS
	SH.DOM			;TY.PTR
	SH.HIN			;TY.HINFO
	SH.UNK			;TY.MINFO
	SH.MX			;TY.MX

SH.UNK:	POPJ P,

SH.A:	LDB A,[POINT 8,3,11]
	PUSHJ P,DECOUT
	OUTCHR ["."]
	LDB A,[POINT 8,3,19]
	PUSHJ P,DECOUT
	OUTCHR ["."]
	LDB A,[POINT 8,3,27]
	PUSHJ P,DECOUT
	OUTCHR ["."]
	LDB A,[POINT 8,3,35]
	JRST DECOUT

SH.MX:	MOVE A,MXPREF
	PUSHJ P,DECOUT
	OUTCHR [" "]
SH.DOM:	OUTSTR (3)
	POPJ P,

SH.WKS:	POPJ P,

SH.HIN:	OUTSTR (3)
	OUTCHR [" "]
	OUTSTR @OSNAME
	POPJ P,

;GTOKEN first skips spaces and tabs, then copies a token from command
;buffer to buffer pointed to by C.

GTOKEN:	ILDB A,B		;Get next char
	CAIE A," "
	CAIN A,11
	JRST GTOKEN		;Space or tab, skip it
GTOKE1:	CAIL A,"a"
	CAILE A,"z"
	CAIA
	SUBI A,"a"-"A"		;Uppercasify
	IDPB A,C
	JUMPE A,CPOPJ		;Return if end of token
	ILDB A,B		;Get next char
	CAIE A," "
	CAIN A,11
	MOVEI A,0		;Space or tab, end of token
	JRST GTOKE1

DECOUT:	IDIVI A,=10
	PUSH P,B
	JUMPE A,.+2
	PUSHJ P,DECOUT
	POP P,B
	ADDI B,"0"
	OUTCHR B
CPOPJ:	POPJ P,

HELP:	OUTSTR [ASCIZ/Enter an input line of the form:  <domain name> <type> <class>
<type> can be the name of a record type, or "*" (the default) for all records.
<class> defaults to "IN" for Internet.

Type <return> to exit the program.
/]
	JRST TOPLEV

	END DQUERY