Fixes and enhancements to telnetd, transcmd and terminal I/O.
2. Previous Release Behavior
In absence of a negotiated binary option, telnet protocol requires any CR to be followed by a LF or NUL. SimpleTranslateOutput() always added CR before LF, making it impossible to send a LF character alone to the client.
Similar to above, the terminal output function in jlibCOUNT_WIN32_UTF8.c sent data to the telnet process (or a pipe) via the CRT _write() function, which is documented to insert a CR before every LF.
The expected output from the following jBC statements is a single LF character, but due to the above, these statements produced CR:LF instead of the expected LF :
OUT 10 CRT CHAR(10): PRINT CHAR(10): CRT @LF: PRINT @LF:
3. Current Release Behavior
Telnetd now recognizes the telnet binary option and sets the JBC_CLIENT_BINARY environment variable if the option is negotiated in both directions. This variable is used by Transcmd to indicate that the protocol is running in binary mode.
properly handles binary mode, eliminating the extra NUL after CR on output, and stripping it on input. The automatic translation of LF -> CR:LF is eliminated.
reads the telnetd registry value BreakChar to specify the character to use for a "break". The default is 3 (Ctrl+C). Setting this value to zero disables the break character.
- recognizes the telnet "interrupt process" and "break" commands and fires the Ctrl+C event when these commands are received.
Transcmd ParseProfileFile() implements the "CALL" command, allowing remote.cmd to call another .cmd file to set environment variables. CALLs can be nested up to 10 levels. ParseProfileFile() also accepts (and ignores) the /D option for the CD (Change Directory) command, allowing the same remote.cmd file to be executed by cmd.exe without error.
Transcmd searches for the remote.cmd file in the user's profile, default user directory (C:\users\default), and jBASE release directory (in that order) and executes it if found (reading from jBASE release directory is new behavior).
The jBC OUT, CRT and PRINT statements now call a new "raw" version of terminal output to bypass translation of LF to CR:LF for telnet (and pipe) output. CRT and PRINT call the raw version only if the statement ends with a colon. The following statements all produce the same output, a single LF character:
OUT 10 CRT CHAR(10): PRINT CHAR(10): CRT @LF: PRINT @LF: x = OCONV(@LF, 'U017E')
This allows all 256 8-bit character codes to be output to a telnet client (or pipe).
To better handle binary input, the jConsoleMapKey() function in jlibCOUNT_WIN32_UTF8.c has been modified to translate the following console input events:
Ctrl+Shift+2 NUL Ctrl+Enter LF Ctrl+Backspace DEL
This allows jBASE programs to accept all control characters for input that the client can produce. In the case of telnet, if the break character is disabled, and binary mode is in effect, all 256 8-bit codes are possible.
The jdiag command has been modified to open stdout in text mode instead of binary mode. Due to the change in transcmd which no longer forces a CR before every LF, output from jdiag was incorrect. Changing to text mode restores the correct output.
The change in "raw" output can be disabled by setting the new JBC_TELNET_OUT_LF_TO_CRLF environment variable.