(FILECREATED "21-Jun-85 19:19:58" {ERIS}<LISPCORE>LIBRARY>TCPCONFIG.;7 17815  

      changes to:  (FNS \IP.READ.STRING.ADDRESS)

      previous date: " 7-Jun-85 11:08:41" {ERIS}<LISPCORE>LIBRARY>TCPCONFIG.;6)


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT TCPCONFIGCOMS)

(RPAQQ TCPCONFIGCOMS ((COMS (* TCP configuration module)
			    (RECORDS IPINIT)
			    (INITVARS (\IP.DEFAULT.CONFIGURATION (create IPINIT)))
			    (FNS TCP.CONFIGURE TCP.CONFIGURE.WINDOW TCPCONF.DIALOGUE 
				 TCPCONF.GET.LOCAL.ADDRESSES TCPCONF.PRINT.CONFIGURATION 
				 \IPNETADDRESS \IP.READ.STRING.ADDRESS TCPCONF.GET.LOCAL.NETWORKS 
				 TCPCONF.SET.PROPERTY TCPCONF.TITLECOMMANDFN))))



(* TCP configuration module)

[DECLARE: EVAL@COMPILE 

(RECORD IPINIT (LOCAL.ADDRESSES LOCAL.NETWORKS DEFAULT.GATEWAY HTE.FILE HOSTNAME))
]

(RPAQ? \IP.DEFAULT.CONFIGURATION (create IPINIT))
(DEFINEQ

(TCP.CONFIGURE
  (LAMBDA NIL                                                (* ejs: " 5-Jun-85 13:40")

          (* * Creates an inspect window to hold a configuration dialogue with the user)


    (DECLARE (GLOBALVARS \IP.DEFAULT.CONFIGURATION))
    (COND
      ((INFILEP (QUOTE {DSK}IP.INIT))
	(LET ((STREAM (OPENSTREAM (QUOTE {DSK}IP.INIT)
				  (QUOTE INPUT)
				  (QUOTE OLD))))
	  (SETQ \IP.DEFAULT.CONFIGURATION (READ STREAM))
	  (CLOSEF STREAM))))
    (COND
      ((TCPCONF.DIALOGUE)
	(LET ((STREAM (OPENSTREAM (QUOTE {DSK}IP.INIT)
				  (QUOTE OUTPUT)
				  (QUOTE NEW))))
	  (PRIN2 \IP.DEFAULT.CONFIGURATION STREAM)
	  (CLOSEF STREAM))))))

(TCP.CONFIGURE.WINDOW
  (LAMBDA NIL                                                (* MPL " 2-Jun-85 23:15")

          (* * Creates an inspect window to hold a configuration dialogue with the user)


    (DECLARE (GLOBALVARS \IP.DEFAULT.CONFIGURATION))
    (LET* ((HEIGHT (HEIGHTIFWINDOW (ITIMES (LENGTH (RECORDFIELDNAMES (QUOTE IPINIT)))
					   (FONTHEIGHT (fetch (FONTCLASS DISPLAYFD) of DEFAULTFONT)))
				   T))
       (POS (GETBOXPOSITION 600 HEIGHT))
       (INSPECTW (CREATEW (CREATEREGION (fetch (POSITION XCOORD) of POS)
					(fetch (POSITION YCOORD) of POS)
					600 HEIGHT)
			  "TCP/IP Configuration Window")))
      (INSPECT (COND
		 ((AND (BOUNDP (QUOTE \IP.DEFAULT.CONFIGURATION))
		       \IP.DEFAULT.CONFIGURATION))
		 (T (SETQ \IP.DEFAULT.CONFIGURATION (create IPINIT))))
	       (QUOTE IPINIT)
	       INSPECTW)
      (WINDOWPROP INSPECTW (QUOTE TITLE)
		  "TCP/IP Configuration Window")
      (for ITEM in (WINDOWPROP INSPECTW (QUOTE SELECTABLEITEMS)) by (CDDR ITEM)
	 do (RPLACA (CDR ITEM)
		    (FUNCTION TCPCONF.SET.PROPERTY)))
      (for ITEM in (CDR (WINDOWPROP INSPECTW (QUOTE SELECTABLEITEMS))) by (CDDR ITEM)
	 do (RPLACA (CDR ITEM)
		    (FUNCTION NILL)))
      (WINDOWPROP INSPECTW (QUOTE TITLECOMMANDFN)
		  (FUNCTION TCPCONF.TITLECOMMANDFN)))))

(TCPCONF.DIALOGUE
  (LAMBDA NIL                                                (* ejs: " 5-Jun-85 13:43")
    (bind SATISFIED? CHANGEDFLG (OLDCONFIGURATION ←(COPYALL \IP.DEFAULT.CONFIGURATION)) repeatuntil
											 SATISFIED?
       do
	(NLSETQ
	  (PROGN (printout T "Here is the current configuration:" T)
		 (TCPCONF.PRINT.CONFIGURATION)
		 (COND
		   ((EQ (ASKUSER NIL NIL "Are you satisfied with the current configuration? ")
			(QUOTE N))
		     (printout T .PARA 0 0
			       (QUOTE (In the following dialogue, you will be presented with the 
					  current value for a configuration parameter, and then be 
					  given a chance to enter a new value. Simply type <CR> to 
					  default to the current value.))
			       T)
		     (for PROPERTY in (QUOTE (HOSTNAME HTE.FILE DEFAULT.GATEWAY LOCAL.NETWORKS 
						       LOCAL.ADDRESSES))
			do (COND
			     ((LISTP (RECORDACCESS PROPERTY \IP.DEFAULT.CONFIGURATION
						   (RECLOOK (QUOTE IPINIT))
						   (QUOTE FETCH)))
			       (printout T T PROPERTY 20 .PPVTL (RECORDACCESS PROPERTY 
									\IP.DEFAULT.CONFIGURATION
									      (RECLOOK (QUOTE IPINIT))
									      (QUOTE FETCH))
					 T))
			     (T (printout T T PROPERTY 20 (RECORDACCESS PROPERTY 
									\IP.DEFAULT.CONFIGURATION
									(RECLOOK (QUOTE IPINIT))
									(QUOTE FETCH))
					  T)))
			   (RESETLST (SELECTQ
				       PROPERTY
				       (HOSTNAME (LET ((NAME (MKATOM (U-CASE (TTYIN 
								"Please enter this host's name: "
										    NIL 
							      "Enter a name to call this host by"
										    (QUOTE STRING)))))
						    )
						   (replace (IPINIT HOSTNAME) of 
									\IP.DEFAULT.CONFIGURATION
						      with (OR NAME (fetch (IPINIT HOSTNAME)
								       of \IP.DEFAULT.CONFIGURATION)))
						   ))
				       (HTE.FILE (replace (IPINIT HTE.FILE) of 
									\IP.DEFAULT.CONFIGURATION
						    with (OR (TTYIN 
"Please enter the name of a HOSTS.TXT file.  If you have no HOSTS.TXT file, type a carriage return."
								    NIL 
	 "Enter the name of a file to be used in translating IP host names to IP host addresses."
								    (QUOTE STRING))
							     (fetch (IPINIT HTE.FILE) of 
									\IP.DEFAULT.CONFIGURATION))))
				       (DEFAULT.GATEWAY (bind ADDRESS.STRING DEFAULT.GATEWAY
							   until DEFAULT.GATEWAY
							   do (SETQ ADDRESS.STRING
								(TTYIN 
"Please enter the IP address of the default gateway for this host.  If you have no gateway, just type a carriage return: "
								       NIL 
						  "Enter an IP address, in the form 192.10.200.1"
								       (QUOTE STRING)))
							      (COND
								((NULL ADDRESS.STRING)
								  (SETQ DEFAULT.GATEWAY NIL)
								  (GO $$OUT))
								(T (SETQ DEFAULT.GATEWAY
								     (\IP.READ.STRING.ADDRESS 
										   ADDRESS.STRING))))
							   finally (replace (IPINIT DEFAULT.GATEWAY)
								      of \IP.DEFAULT.CONFIGURATION
								      with
								       (OR ADDRESS.STRING
									   (fetch (IPINIT 
										  DEFAULT.GATEWAY)
									      of 
									\IP.DEFAULT.CONFIGURATION)))))
				       (LOCAL.NETWORKS
					 (LET ((LOCAL.NETWORKS (TCPCONF.GET.LOCAL.NETWORKS)))
					   (COND
					     (LOCAL.NETWORKS (replace (IPINIT LOCAL.NETWORKS)
								of \IP.DEFAULT.CONFIGURATION
								with (OR LOCAL.NETWORKS
									 (fetch (IPINIT 
										   LOCAL.NETWORKS)
									    of 
									\IP.DEFAULT.CONFIGURATION)))))
					   ))
				       (LOCAL.ADDRESSES
					 (LET ((LOCAL.ADDRESSES (TCPCONF.GET.LOCAL.ADDRESSES)))
					   (COND
					     (LOCAL.ADDRESSES (replace (IPINIT LOCAL.ADDRESSES)
								 of \IP.DEFAULT.CONFIGURATION
								 with (OR LOCAL.ADDRESSES
									  (fetch (IPINIT 
										  LOCAL.ADDRESSES)
									     of 
									\IP.DEFAULT.CONFIGURATION)))))
					   ))
				       NIL))))
		   (T (SETQ SATISFIED? T)))))
       finally (RETURN (NOT (EQUAL OLDCONFIGURATION \IP.DEFAULT.CONFIGURATION))))))

(TCPCONF.GET.LOCAL.ADDRESSES
  (LAMBDA NIL                                                (* ejs: " 5-Jun-85 12:27")

          (* * Return the local network list for this host. The list is an alist keyed by network address, and containing 
	  otherwise the atom 10 or 3 indicating the kind of network)


    (LET ((ADDRESSES (fetch (IPINIT LOCAL.ADDRESSES) of \IP.DEFAULT.CONFIGURATION)))
      (LET ((10MBADDRESS (COND
			   (\10MBLOCALNDB (bind STRING ADDRESS until ADDRESS
					     do (SETQ STRING (TTYIN 
		"Please enter this host's IP address on the 10MB network, in the form 36.9.0.9: "
								    NIL 
			  "Enter an IP address.  Leave the host number portion of the address 0."
								    (QUOTE STRING)))
						(COND
						  ((AND STRING (SETQ ADDRESS (\IP.READ.STRING.ADDRESS
							    STRING))
							(ZEROP (\IPNETADDRESS ADDRESS)))
						    (SETQ ADDRESS NIL)
						    (printout T 
	       "The network address you have entered is in an incorrect form.  Please try again."
							      T))
						  ((NULL STRING)
						    (SETQ STRING (pop ADDRESSES))
						    (SETQ ADDRESS (\IP.READ.STRING.ADDRESS STRING))))
					     finally (RETURN (LIST STRING))))))
	 (3MBADDRESS (COND
		       (\3MBLOCALNDB (bind STRING ADDRESS until ADDRESS
					do (SETQ STRING (TTYIN 
		 "Please enter this host's IP address on the 3MB network, in the form 36.9.0.9: "
							       NIL 
			  "Enter an IP address.  Leave the host number portion of the address 0."
							       (QUOTE STRING)))
					   (COND
					     ((AND STRING (SETQ ADDRESS (\IP.READ.STRING.ADDRESS
						       STRING))
						   (ZEROP (\IPNETADDRESS ADDRESS)))
					       (SETQ ADDRESS NIL)
					       (printout T 
	       "The network address you have entered is in an incorrect form.  Please try again."
							 T))
					     ((NULL STRING)
					       (SETQ STRING (pop ADDRESSES))
					       (SETQ ADDRESS (\IP.READ.STRING.ADDRESS STRING))))
					finally (RETURN (LIST STRING)))))))
	(APPEND 10MBADDRESS 3MBADDRESS)))))

(TCPCONF.PRINT.CONFIGURATION
  (LAMBDA NIL                                                (* ejs: " 5-Jun-85 12:32")
    (bind (DEC ←(RECLOOK (QUOTE IPINIT))) for FIELD in (RECORDFIELDNAMES (QUOTE IPINIT))
       do (COND
	    ((LISTP (RECORDACCESS FIELD \IP.DEFAULT.CONFIGURATION DEC (QUOTE FETCH)))
	      (printout T FIELD 20 .PPVTL (RECORDACCESS FIELD \IP.DEFAULT.CONFIGURATION DEC
							(QUOTE FETCH))
			T))
	    (T (printout T FIELD 20 (RECORDACCESS FIELD \IP.DEFAULT.CONFIGURATION DEC (QUOTE FETCH))
			 T))))))

(\IPNETADDRESS
  (LAMBDA (IPADDRESS)                                        (* ejs: "22-Apr-85 17:38")
    (COND
      ((EQ \IP.CLASS.A (LDB \IP.CLASS.A.BYTESPEC IPADDRESS))
	(LDB \IP.CLASS.A.NET.BYTESPEC IPADDRESS))
      ((EQ \IP.CLASS.B (LDB \IP.CLASS.B.BYTESPEC IPADDRESS))
	(LDB \IP.CLASS.B.NET.BYTESPEC IPADDRESS))
      ((EQ \IP.CLASS.C (LDB \IP.CLASS.C.BYTESPEC IPADDRESS))
	(LDB \IP.CLASS.C.NET.BYTESPEC IPADDRESS))
      (T (ERROR "Illegal address class" IPADDRESS)))))

(\IP.READ.STRING.ADDRESS
  (LAMBDA (STRING.OR.ATOM)                                   (* ejs: "27-Dec-84 15:42")

          (* * Convert a dotted notation -- 36.9.0.9 -- to an internal notation)


    (bind (CELL ←(ARRAY 4 (QUOTE BYTE)
			0 0))
	  (INDEX ← 0)
	  (TEMP ← 0) for CHAR instring (MKSTRING STRING.OR.ATOM)
       while (AND (ILEQ INDEX 3)
		  (ILEQ TEMP (MASK.1'S 0 8)))
       do (COND
	    ((EQ CHAR (CHARCODE %.))
	      (\BYTESETA CELL INDEX TEMP)
	      (SETQ TEMP 0)
	      (add INDEX 1))
	    ((AND (IGEQ CHAR (CHARCODE 0))
		  (ILEQ CHAR (CHARCODE 9)))
	      (SETQ TEMP (IPLUS (ITIMES TEMP 10)
				(IDIFFERENCE CHAR (CHARCODE 0))))))
       finally (COND
		 ((ILEQ TEMP (MASK.1'S 0 8))
		   (\BYTESETA CELL INDEX TEMP)))
	       (RETURN (COND
			 ((EQ INDEX 3)
			   (create FIXP
				   HINUM ←(create WORD
						  HIBYTE ←(\BYTELT CELL 0)
						  LOBYTE ←(\BYTELT CELL 1))
				   LONUM ←(create WORD
						  HIBYTE ←(\BYTELT CELL 2)
						  LOBYTE ←(\BYTELT CELL 3)))))))))

(TCPCONF.GET.LOCAL.NETWORKS
  (LAMBDA NIL                                                (* ejs: " 5-Jun-85 12:27")

          (* * Return the local network list for this host. The list is an alist keyed by network address, and containing 
	  otherwise the atom 10 or 3 indicating the kind of network)


    (LET ((10MBADDRESS (COND
			 (\10MBLOCALNDB (bind STRING ADDRESS until ADDRESS
					   do (SETQ STRING (TTYIN 
	   "Please enter the network number for this host's 10MB network, in the form 36.0.0.0: "
								  NIL 
			  "Enter an IP address.  Leave the host number portion of the address 0."
								  (QUOTE STRING)))
					      (COND
						((AND STRING (SETQ ADDRESS (\IP.READ.STRING.ADDRESS
							  STRING))
						      (ZEROP (\IPNETADDRESS ADDRESS)))
						  (SETQ ADDRESS NIL)
						  (printout T 
	       "The network address you have entered is in an incorrect form.  Please try again."
							    T))
						((NULL STRING)
						  (SETQ STRING (CAAR (SOME (fetch (IPINIT 
										   LOCAL.NETWORKS)
									      of 
									\IP.DEFAULT.CONFIGURATION)
									   (FUNCTION (LAMBDA (ENTRY)
									       (EQ (CDR ENTRY)
										   (QUOTE 10)))))))
						  (SETQ ADDRESS (\IP.READ.STRING.ADDRESS STRING))))
					   finally (RETURN (LIST (CONS STRING 10)))))))
       (3MBADDRESS (COND
		     (\3MBLOCALNDB (bind STRING ADDRESS until ADDRESS
				      do (SETQ STRING (TTYIN 
	    "Please enter the network number for this host's 3MB network, in the form 36.0.0.0: "
							     NIL 
			  "Enter an IP address.  Leave the host number portion of the address 0."
							     (QUOTE STRING)))
					 (COND
					   ((AND STRING (SETQ ADDRESS (\IP.READ.STRING.ADDRESS STRING)
						   )
						 (ZEROP (\IPNETADDRESS ADDRESS)))
					     (SETQ ADDRESS NIL)
					     (printout T 
	       "The network address you have entered is in an incorrect form.  Please try again."
						       T))
					   ((NULL STRING)
					     (SETQ STRING (CAAR (SOME (fetch (IPINIT LOCAL.NETWORKS)
									 of \IP.DEFAULT.CONFIGURATION)
								      (FUNCTION (LAMBDA (ENTRY)
									  (EQ (CDR ENTRY)
									      (QUOTE 3)))))))
					     (SETQ ADDRESS (\IP.READ.STRING.ADDRESS STRING))))
				      finally (RETURN (LIST (CONS STRING 3))))))))
      (APPEND 10MBADDRESS 3MBADDRESS))))

(TCPCONF.SET.PROPERTY
  (LAMBDA (PROPERTY DATUM INSPECTW)                          (* MPL " 2-Jun-85 22:32")
    (COND
      ((MOUSESTATE (NOT UP))
	(UNTILMOUSESTATE UP)
	(RESETLST (RESETSAVE (TTYDISPLAYSTREAM (GETPROMPTWINDOW INSPECTW 5)))
		  (RESETSAVE NIL (LIST (FUNCTION (LAMBDA NIL
					   (CLOSEW (WFROMDS (TTYDISPLAYSTREAM)))))))
		  (SELECTQ PROPERTY
			   (HOSTNAME (bind NAME until NAME
					do (SETQ NAME (MKATOM (U-CASE (TTYIN 
								"Please enter this host's name: "
									     NIL 
							      "Enter a name to call this host by"
									     (QUOTE STRING)))))
					finally (INSPECTW.REPLACE INSPECTW PROPERTY NAME)))
			   (HTE.FILE (INSPECTW.REPLACE INSPECTW PROPERTY (TTYIN 
"Please enter the name of a HOSTS.TXT file.  If you have no HOSTS.TXT file, type a carriage return."
										NIL 
	 "Enter the name of a file to be used in translating IP host names to IP host addresses."
										(QUOTE STRING))))
			   (DEFAULT.GATEWAY (bind ADDRESS.STRING DEFAULT.GATEWAY until 
										  DEFAULT.GATEWAY
					       do (SETQ ADDRESS.STRING (TTYIN 
"Please enter the IP address of the default gateway for this host.  If you have no gateway, just type a carriage return: "
									      NIL 
						  "Enter an IP address, in the form 192.10.200.1"
									      (QUOTE STRING)))
						  (COND
						    ((NULL ADDRESS.STRING)
						      (SETQ DEFAULT.GATEWAY NIL)
						      (GO $$OUT))
						    (T (SETQ DEFAULT.GATEWAY (\IP.READ.STRING.ADDRESS
							   ADDRESS.STRING))))
					       finally (INSPECTW.REPLACE INSPECTW PROPERTY 
									 ADDRESS.STRING)))
			   (LOCAL.NETWORKS (LET ((LOCAL.NETWORKS (TCPCONF.GET.LOCAL.NETWORKS)))
					     (COND
					       (LOCAL.NETWORKS (INSPECTW.REPLACE INSPECTW PROPERTY 
										 LOCAL.NETWORKS)))))
			   (LOCAL.ADDRESSES (LET ((LOCAL.ADDRESSES (TCPCONF.GET.LOCAL.ADDRESSES)))
					      (COND
						(LOCAL.ADDRESSES (INSPECTW.REPLACE INSPECTW PROPERTY 
										  LOCAL.ADDRESSES)))))
			   (DEFAULT.INSPECTW.PROPCOMMANDFN PROPERTY DATUM INSPECTW)))))))

(TCPCONF.TITLECOMMANDFN
  (LAMBDA (INSPECTW DATUM)                                   (* MPL " 2-Jun-85 22:43")

          (* * Called when middle button goes down in title bar)


    (COND
      ((MOUSESTATE (NOT UP))
	(SELECTQ (MENU (create MENU
			       ITEMS ←(QUOTE (ReFetch Create% Init))))
		 (ReFetch (INSPECTW.REDISPLAY INSPECTW))
		 (Create% Init (RESETLST (RESETSAVE (TTYDISPLAYSTREAM (GETPROMPTWINDOW INSPECTW 5)))
					 (RESETSAVE NIL (LIST (FUNCTION (LAMBDA NIL
								  (CLOSEW (WFROMDS (TTYDISPLAYSTREAM))
									  )))))
					 (LET ((FILE (TTYIN 
					     "Please specify the name for the new IP init file: "
							    NIL 
				    "Enter a filename.  Carriage return defaults to {DSK}IP.INIT"
							    (QUOTE STRING))))
					   (SETQ FILE (OPENSTREAM FILE (QUOTE OUTPUT)
								  (QUOTE NEW)))
					   (PRIN2 DATUM FILE)
					   (CLOSEF FILE))))
		 NIL)))))
)
(PUTPROPS TCPCONFIG COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (921 17735 (TCP.CONFIGURE 931 . 1673) (TCP.CONFIGURE.WINDOW 1675 . 3181) (
TCPCONF.DIALOGUE 3183 . 7469) (TCPCONF.GET.LOCAL.ADDRESSES 7471 . 9676) (TCPCONF.PRINT.CONFIGURATION 
9678 . 10270) (\IPNETADDRESS 10272 . 10779) (\IP.READ.STRING.ADDRESS 10781 . 11952) (
TCPCONF.GET.LOCAL.NETWORKS 11954 . 14502) (TCPCONF.SET.PROPERTY 14504 . 16737) (TCPCONF.TITLECOMMANDFN
 16739 . 17733)))))
STOP