File MSR312.UPD 19 August 1992 MS-DOS KERMIT 3.12 UPDATE NOTES Author: Professor Joe R. Doupnik, Utah State University, Logan, UT, USA Use this file as a supplement to the MS-DOS Kermit 3.11 documentation: Christine M. Gianone, "Using MS-DOS Kermit", Second Edition, Digital Press, Bedford, MA, 1991, 345 pages. Packaged with version 3.11 of MS-DOS Kermit for the IBM PC, PS/2, and compatibles on a 5.25-inch diskette. Order Number: EY-H893E-DP Digital Press ISBN: 1-55558-082-3 Prentice Hall ISBN: 0-13-952276-X Internation Edition Order Number: EY-H893E-DI International Prentice Hall ISBN: 0-13-953043-6 US single-copy price: $34.95; quantity discounts available. Available in computer bookstores or directly from Digital Press. In the USA, call Digital Press toll-free 1-800-344-4825 to order; major credit cards accepted. Overseas, order through your bookstore or your local Digital Equipment Corporation branch. A German-language edition is also available: Christine M. Gianone, "MS-DOS Kermit, Das universelle Kommunikationsprogramm", Verlag Heinz Heise, Hannover, Germany (1991), 414 pages. Packaged with version 3.11 of MS-DOS Kermit for the IBM PC, PS/2, and compatibles on a 5.25-inch diskette, including German language help files. Price: DM 69,00. ISBN 3-88229-006-4 And a French-language edition is in preparation by Schiefer & Cie., Versailles; publication expected Fall 1992. The English-language edition can also be ordered from: Kermit Development and Distribution Columbia University Center for Computing Activities 612 West 115th Street New York, NY 10025 USA Telephone: (USA) 212 854-3703 Domestic and overseas orders accepted. Price: $34.95 (US, Canada, and Mexico), $45 elsewhere. Orders must be prepaid by check in US dollars. Add $10 to add a 3.5-inch Distribution diskette. Price includes shipping. Do not include sales tax. PATCHES Version 3.12 includes the corrections of the MS-DOS Kermit 3.11 patch file: Patch 1 Optional. Patch 2 Corrected unwanted double echo from Telnet negotiations. Patch 3 correct cursor indexing problem with scrolling region setup Patch 4 nested curly brace matching Patch 5 fix skipped reports to host Patch 6 correct 8-bit command end of transparent print, print report Patch 7 correct use of CR/LF with parity on networks Patch 8 correct decoding of DEC UDK hex characters Patch 9 work around problem in TES v2.2/R8 which clobbers Kermit NEW FEATURES TCP/IP Telnet ------------- 1. Add direct support for Novell ODI board drivers. This is transparently used if a Packet Driver is not found. No extra protocol shim is needed. Frame types usable are limited by the board so they "should" include Ethernet_II (Blue Book, regular), 802.3, 802.2, 802.2 with SNAP header, Token Ring, and perhaps Arcnet. The ODI interface will be tried if a Packet Driver is not found, and it can be selected in preference to a PD interface by using command: SET TCP/IP PACKET-DRIVER-INTERRUPT ODI where "ODI" replaces the interrupt number of a Packet Driver. For ODI, file NET.CFG should have the lines "Protocol IP etc" as shown below as an example: # File NET.CFG, example PB buffers=10 show dots=on Link Support buffers 6 1514 MemPool 2048 Link Driver SMCPLUS Port 280 20 Mem 000CA000 2000/10 Int 7 frame Ethernet_II Protocol IPX 8137 Ethernet_II Protocol IP 0800 Ethernet_II Protocol ARP 0806 Ethernet_II Protocol RARP 8035 Ethernet_II There is the question of which board Kermit (or IPX or other application) will use if two or more boards are available. The answer discovered from experiments is in several steps. The application wishes to find a board which supports "its protocol", meaning lines such as: Protocol IPX 8137 Ethernet_II or: Protocol IP 0800 Ethernet_II in a Link Driver section of NET.CFG. The protocol in this case is character string "IPX" or "IP". There may be several board supporting the same frame (Ethernet_II in these examples) required by that protocol. The default method of finding a board is the application chooses "the first board" offering a suitable frame, regardless of whether or not the Protocol IPX etc line is present for that board. The "first" part refers not to the contents of NET.CFG but to the order in which board drivers are loaded at DOS level. So the indented (important to note the indentation) protocol lines tell ODI which frame a protocol needs, and a TYPE to use for recognizing packets, but the lines do not identify a particular board. I know, it seems to be counterintutitive. However, it is probably wise to include the lines for each candidate board. To target a particular board a separate main section is used in NET.CFG. The section starts with the word Protocol against the left margin and has BIND indented beneath it, like this, Protocol IPX starts in column 1 to create main sec bind smcplus interior must be indented Kermit uses two forms of this main section, to bind to the first board whose driver name is listed after the word "bind", or to a particular board in DOS loading order. The Protocol line uses keyword Kermit so that Kermit knows which of several such to examine. Examples are: Protocol Kermit this section is for Kermit bind exos bind to first driver named exos or: Protocol Kermit this section is for Kermit bind #2 bind to the board loaded second Kermit considers the text in these sections to be case insensitive. The # construction must not have a separation between the number sign (#) and the digit. The # case is normally used when two or more boards share the same driver and thus are not distinguishable by name alone. A sample STARTNET.BAT file might look like this: c:\lsl LSL is always loaded before boards c:\smcplus.com SMC/WD8003E board, the first c:\exos.com EXOS-205T board, the second rem c:\odinsup Odinsup can coexist with Kermit rem c:\odipkt 0 96 Odipkt can coexist with Kermit c:\ipxodi IPX is always loaded after boards c:\bnetx ps=my-preferred-server Burst mode NETX loads after IPX If both exos and smcplus boards offer frame Ethernet_II, Kermit will choose the first loaded board, smcplus, in lieu of a BIND command. Putting the section "Protocol Kermit, bind " anywhere in NET.CFG selects a particular board for Kermit. Kermit requires three "protocols", IP, ARP, and optionally RARP as shown above. The frame types can be anything the board will support: Ethernet, Token Ring, Arcnet, all IEEE 802.2 based frames etc. ODI will complain if the frame type cannot support these protocols. A complete NET.CFG file using two boards is shown below. # File NET.CFG, an example with two boards PB buffers=10 show dots=on # all main sections must start in column 1, indent local material. # Protocol "IPX" is for Novell's IPXODI Protocol IPX Bind EXOS # Protocol "Kermit" is for MS-DOS Kermit Protocol KERMIT Bind EXOS Link Support buffers 6 1514 MemPool 2048 Link Driver exos Port 310 20 Mem 000D0000 400 Int 5 frame Ethernet_II Protocol IPX 8137 Ethernet_II Protocol IP 0800 Ethernet_II Protocol ARP 0806 Ethernet_II Protocol RARP 8035 Ethernet_II Link Driver SMCPLUS Port 280 20 Mem 000CA000 2000/10 Int 7 frame Ethernet_II frame Ethernet_Snap Protocol IPX 8137 Ethernet_II Protocol IP 0800 Ethernet_II Protocol ARP 0806 Ethernet_II Protocol RARP 8035 Ethernet_II # Protocol "TCPIP" is for Novell's Lan WorkPlace for DOS Protocol TCPIP ip_address 129.123.1.99 ip_router 129.123.1.254 ip_netmask 255.255.255.0 tcp_sockets 8 udp_sockets 8 raw_sockets 1 nb_sessions 4 nb_commands 8 nb_adapter 0 nb_domain usu.edu As a usual reminder, only one protocol stack of a given kind can be used over the same board at the same time. At the moment there is no Windows support for this ODI coupling. Throughput is about the same as with a Packet Driver, and incoming packets are not dropped. 2. Add support for SLIP (IP over serial links). A SLIP Packet Driver is required, such as that from the Crynwyr (formerly Clarkson) Collection. The Crynwyr packet driver SLIP8250 was improved to avoid lost interrupts. SLIP is Packet Driver Class 6. Kermit changes its internal TCP/IP timers when real SLIP is used and thus sends fewer packets than would be expected with Ethernet timing. Packet Driver ETHERSLIP by Michael Martineau also works fine. Etherslip behaves like an Ethernet Packet Driver by internally faking ARPs and Ethernet headers; the TCP/IP program thinks it is using Ethernet. 3. Add optional argument "port" to command SET PORT TCP host port. Port defaults to 23, the Telnet port. Value 25 is for SMTP mail and is forbidden to reduce incidences of faked mail. Port defaults to 23 unless a value is given on the SET PORT TCP/IP command line. 4. Add Telnet server mode. This mode can be invoked two ways. a) SET PORT TCP/IP * port. The "*" identifies the connection as accept "any client". CONNECT or SERVER or script commands may follow to open the communications pathway. Saying Connect forms a terminal to terminal connection, not a remote terminal to local DOS connection. b) SET PORT TCP/IP, SERVER. Provides Kermit to Kermit file transfers. Port 25 is forbidden and will be translated into default port 23. Only one client may be served at a time. 5. Add command SET TCP/IP PACKET-DRIVER-INTERRUPT to specify a particular interrupt to be used for a Packet Driver, vs searching for the PD. The operational value is shown on the SHOW COMMUNICATIONS screen. Note that if is "ODI" then the ODI driver will be used instead. 6. Revise Telnet Options negotiations to work more smoothly. Add immediate feedback of local-echo status and a much improved algorithm for negotiating it (thanks to Frank da Cruz). 7. Add Options report of display size, available if the host requests it, as per RFC-1073. 8. Add command SET TCP/IP TELNET-TERM-TYPE to use this word as the terminal type reported to Telnet hosts as a Telnet Option. Otherwise Kermit automatically uses one of the following strings matching the current terminal emulation: "H-19", "VT52", "VT100", "VT102", "VT220", "VT320", "TEK4014"," VIP7809", "PT200", and "UNKNOWN". 9. Add better end-of-line sending when using Telnet. Always send CR as CR LF, and send accumulated material when CR is entered at the keyboard. 10. Remove use of Int 14h to communicate between the internal Telnet and main body parts of Kermit. This frees Int 14h for uses such as by a speech synthesizer. 11. Speed up the process of obtaining the host IP address from Domain Name Servers. 12. Fix protocol code for sending TCP Reset packets. 13. Add reply mechanism for Traceroute requests. 14. Add a workaround for a bug discovered in the combination of Kermit over ODIPKT over ODI over an Ethernet board. The ODI drivers tested here corrupt a register (DI) used by the Kermit Telnet C code and that prevented, among other things, resolving host names via a DNS. Regular Packet Drivers (including dis_pkt and winpkt) have not shown this fault. Also TCP/IP traffic through the pair of ODIPKT and ODI shows high rates of dropped incoming packets before they should get to Kermit; the reason is not known. 15. Add a small safety factor in Telnet Options code, as a copy of C-Kermit material by Frank da Cruz. 16. Add full support for ICMP Redirect messages, which arise when two or more gateways share the wire with the client, and one tells us to use another gateway. 17. By popular demand revise the action of HANGUP to leave modem signal DTR off (down) until the port is needed again. Other communications paths -------------------------- 1. Revise DEC Pathworks LAT sections to enable use of LAT in expanded memory. Also detect Pathworks version 3 and treat it as version 2 rather than 4. 2. Revise Novell Lan WorkPlace for DOS support to work with both v3.5 and v4 TELAPI, without the need of a Novell conversion utility. Two copies of Kermit have successfully used TELAPI with MS Windows Enhanced mode. 3. DESQview corrections and enhancements. Fix two items causing trouble with the more recent DESQviews: a stray interrupt problem and keeping EGA cursors from being set to mid-character cell. Add sensitivity to the formal background screen size supported by DV and adjust Kermit's screen accordingly. 4. Revise slightly the sequence of testing IRQ values for serial ports to avoid testing IRQ 4 first if COM1 is not the desired port. 5. Add workaround for Interconnections Inc program TES version 2.2 release 8. 6. Add workaround for Western Digital's Packet Driver program 8003PKDR.EXE. This program is very very selective about the packet TYPEs it will accept, such that a PD version of Novell's IPX (with the BYU shell materials) is rejected. Recommend using the Crynwr (nee Clarkson) PD Collection program WD8003E.COM instead. 7. If the user attempts to exit from Kermit while a network connection is still active then inform the user and ask for confirmation to proceed. As graceful a network shutdown as reasonable will be done if the exit process is to continue. 8. Modify code used to delay between UART chip accesses to work better with the fastest 486 machines. Terminal emulation ------------------ 1. Add terminal type of Prime PT200. This is executed as a VT320 with small corrections for the real Prime PT200. The identification sent to the host is 17 byte string ESCAPE "! ~0 ~..6~C~2 ~$", without the pair of double quotes but with the three embedded spaces. 2. Add command SET TERMINAL OUTPUT-SHIFT {NONE, AUTOMATIC, SI/SO, SS2, SS3}, default NONE. Selects the table shifting commands surrounding a character sent to the host when, and only when, parity is other than none and the character has its high bit set. The idea is to form a virtual 8-bit wide communications channel by sending 7-bit material telling the host that the data byte came from the right hand (high bit set) side of one of the character sets G1, G2, or G3. The host must obey ISO 2022 rules and have the same character set loaded into it's right hand table. Option NONE, the default, says do nothing about the matter and thus the character's high bit will be lost and replaced by a parity bit. The other options also lose the high bit but signal the host several ways. Prefix SI means the following byte comes from set G1, and the character is followed by SO which means shift back to G0; these form a triplet. Prefix SS2 (ESCAPE N) means the following byte comes from set G2, and similarly prefix SS3 (ESCAPE P) means from set G3. SS2 and SS3 are single shifts which apply only for the following character. Option AUTO finds the character set table G1, G2 or G3 being used as the active right half (high bit set) of the complete set and uses SI/SO, SS2, or SS3 appropriately. Note that VT300 level terminals use G2 as the normal right half set, but VT100 level terminals use G1 but not G2 nor G3. 3. Correctly recognize extended (bold) line drawing patterns for Tek drawing. 4. NOTICE: use of ESC 1 and ESC 2 to enter and leave Tek mode is disabled in this release of MS-DOS Kermit. This pair has multiple uses, depending upon who wrote the mainframe Tek program, and we have had reports of difficulties when programs use this pair for selecting (against DEC's advise) a DEC Tek mode character set size on VT340 terminals. File transfer ------------- 1. Add SET TRANSLATION CHARACTER-SET {READABLE, INVERTIBLE}. The default is READABLE. INVERTIBLE is the new form and attempts to use code points as much in common between the transfer and file character sets as possible, with the transfer character set having priority. Thus Invertible can create code points which do not display correctly on the destination machine but yield the closest match when a file is sent back to the originator. Tables are from Frank da Cruz and are consistent with C-Kermit and IBM mainframe Kermit. 2. Add SET TRANSFER CHARACTER-SET Japanese-EUC, from Hirofumi Fujii. The file character set is automatically Katakana or Shift-JIS, based on the contents of the file. The transfer (wire) character set is Japanese-EUC. Single and double byte codes are supported. The character set identification is I14/87/13, in Kermit terminology. Specifying a File character set of Shift-JIS forces use of Transfer character set Japanese-EUC, and vice versa. Reception of a Japanese-EUC file (as denoted in the attributes packets) also changes the file character set to Shift-JIS. IBM Code Page CP932 is used for Shift-JIS. 3. Add SET TRANSFER LOCKING-SHIFT {OFF, ON, FORCED}. Parity setting of other than NONE is required to negotiate locking-shifts in file transfers. The default state is ON, but the default parity setting is NONE. FORCED sends or receives a file with locking-shifts active whether or not the other Kermit agrees and regardless of parity state; beware. A correlary addition is using ASCII control character DLE to prefix the presence of DLE, SI, and SO characters in the data stream. Locking shifts use byte SO "lock shift" to imply that all following data bytes have their high bit set. Appearance of SI reverses the shift to normal, much like Caps Lock on a keyboard. Thus a lock shift replaces the occurence of the 8-bit prefix character before each applicable byte in a sequence of them. High bit prefixing occurs when the communications channel is only 7-bits wide; thus with an 8-bit wide channel there is no reason to use either prefixes or locking shifts. 4. Create zero-length files if the host sends them. 5. Allow commands SET SEND (and RECEIVE) START-OF-PACKET to use printable characters in addition to the normal control characters. This is to accommodate certain IBM mainframe front ends which destroy all control characters and thus prevent normal Kermit packets from traveling. There is a warning attached to the help for these commands saying that use of printable SOP characters reduces the strength of the protocol. Avoid printable SOP characters if at all possible. The default SOP character remains Control-A. 6. Correct a problem affecting some BBS file downloads. If the remote Kermit server thinks the communications line is 8-bits wide, the line is really 7-bits wide, and the server is given the command SEND filespec, and the MS-DOS Kermit client is given the command RECEIVE, then (still there?) make sure MS-DOS Kermit requests quoting of bytes with their high bit set by SET PARITY to SPACE or MARK etc. Previous recent MS-DOS Kermit programs would not make the request with the above sequence of events and the file transfer could fail because of lost high bits. This effect has been noted with Compuserve where MARK parity is needed but the Compuserve Kermit is unaware of the situation (why?). Now the client can force 8-bit quoting. Normally both Kermits should be set to the same parity as the communications link. Other Commands --------------- 1. Add IF [NOT] INPATH command. This tests whether the file is found in the current directory or in those in the PATH statement. IF EXIST checks only the current directory. 2. Correct TRANSMIT command to wait for handshake character from the host. Add SET TRANSMIT PAUSE to wait "pause" milliseconds after sending a line. 3. SET PROMPT now limits the string to 60 bytes rather than letting a buffer overflow and damaging other things. 4. Add Script word \L for send a long BREAK in OUTPUT strings. This matches \B for a regular length BREAK. A long BREAK is long only for RS232C connections; networks see both as the same (regular) thing. 5. Add keyword "O" as a snyonym for OUTPUT. 6. Add variable \v(terminal) which reports the current terminal type. 7. Prevent command STOP (exit all Take files and macros) from also exiting the DOS level command line (which becomes the first internal macro upon Kermit startup). 8. Add commands "INCREMENT " and "DECREMENT ". The default is one. The variable can be either the text subsitution kind, \%, or the name of a Kermit macro; its contents must be numeric. The range of values can be 0..65535. If either end of the range is exceeded the variable is not changed and the command returns a status of FAILURE. If the variable is not numeric the command also fails. 9. Keyword DO removed from prompt level "?" help display. The word is archaic and the screen space is given to INC/DEC variable. 10. Correct status report from WAIT command when no time interval is given. 11. Close log files when asked to do so, not just when exiting Kermit. 12. Add optional argument "path" to the Patch command, meaning search only that directory for file mskermit.pch. Example: PATCH C:\KERMIT. 13. Modify the way lexical comparison commands IF LLT, IF LGT operate. Of the two strings being compared use the length of the shortest, so that "IF LGT d abc echo SUCCESS" will echo "SUCCESS" because d is lexically greater than a. Previously LLT and LGT would fail if the strings lengths differed. IF EQUAL still requires equal lengths strings for success. 14. Add optional numerical argument to the STOP command to return that value as the command return status value, \v(status), and place the lower 8 bits in Kermit's \v(errorlevel) variable. For reference, the status and errorlevel values generated internally by Kermit are currently: 0 success condition 1 send file failed 2 get/receive file failed 4 Remote command failed 8 Take file failure 16 general command failure 128 user intervention (aka Control-C) These may occur as summations (they are individual bits in a byte). 15. Add option BLANK-FREE-2 to the command SET BLOCK-CHECK. This is a special case of encoding two-byte checksums so that blank (space) characters do not appear as checksum codes. For use with IBM mainframe frontends. Avoid this choice for normal use. 16. Correct a subtle bug of command STOP not being obeyed in a top-level macro or TAKE file if Kermit were invoked with command STAY on the DOS command line. Thanks to Skip Knoble of Penn State for identifying the conditions for this to occur. 17. Add processing of the command line submitted to DOS by RUN so that literal or \44 numerical commas may be seen by DOS. Example: define test run {echo this is a real comma, and a numerical one\44} The RUN command was an exception to the rule on such processing. 18. (there is no 18) 19. Modify the GOTO script command to sense Control-C to break out of loops without also consuming other keystrokes. Now if other characters are typed and a break out is necessary then type Control-Break so that typeahead is flushed and the implicit Control-C is observed. 20. Append a backslash, \, to the end of the \v(directory) variable string if one is not already present. This will permit forming a full filename using Kermit string substitution variables such as \v(dir)myfile.txt. Microsoft Windows ----------------- 1. Packet Driver shim WINPKT was made available to act as a second Packet Driver to interface between the real PD and applications running in Windows. WINPKT is able to recognize the Windows Enhanced mode virtual machine in which the program is running and to invoke that machine before delivering a packet to the program. This eliminates the need to "fix task in memory" in its PIF file and eliminates the Crynwr (nee Clarkson) PD command argument "-w". The latter simply rejects a packet if the program is not immediately active. WINPKT was originally written by Roger F. James and was revised by Joe Doupnik. The mechanisms will also appear in the next edition of the shim DIS_PKT (PD interface while using NDIS) from Joe Doupnik. My special thanks for assistance, contributions, and suggestions from Frank da Cruz, Hirofumi Fujii, John Chandler, James Sturdevant, Andre Asselin, Jim Fregin, Jim Reisert, Rick Sladkey, Richard Stanton, Bertil Stenstrom, Konstantin Vinogradov, Robert Weiner; and from companies: Digital Equipment Corporation, Quarterdeck Online Systems, Novell, AT&T, and Interconnections. (End of MSR312.UPD)