1 2 3This is a distribution of both client and server telnet. These programs 4have been compiled on: 5 telnet telnetd 6 BSD 4.3 Reno X X 7 UNICOS 5.1 X X 8 UNICOS 6.0 X X 9 UNICOS 6.1 X X 10 UNICOS 7.0 X X 11 SunOs 3.5 X X (no linemode in server) 12 SunOs 4.1 X X (no linemode in server) 13 DYNIX V3.0.17.9 X X (no linemode in server) 14 Ultrix 3.1 X X (no linemode in server) 15 Ultrix 4.0 X X (no linemode in server) 16 17In addition, previous versions have been compiled on the following 18machines, but were not available for testing this version. 19 telnet telnetd 20 SunOs 4.0.3c X X (no linemode in server) 21 BSD 4.3 X X (no linemode in server) 22 DYNIX V3.0.12 X X (no linemode in server) 23 24Februrary 22, 1991: 25 26 Features: 27 28 This version of telnet/telnetd has support for both 29 the AUTHENTICATION and ENCRYPTION options. The 30 AUTHENTICATION option is fairly well defined, and 31 an option number has been assigned to it. The 32 ENCRYPTION option is still in a state of flux; an 33 option number has NOT been assigned to it yet. 34 The code is provided in this release for experimental 35 and testing purposes. 36 37 The telnet "send" command can now be used to send 38 do/dont/will/wont commands, with any telnet option 39 name. The rules for when do/dont/will/wont are sent 40 are still followed, so just because the user requests 41 that one of these be sent doesn't mean that it will 42 be sent... 43 44 The telnet "getstatus" command no longer requires 45 that option printing be enabled to see the response 46 to the "DO STATUS" command. 47 48 A -n flag has been added to telnetd to disable 49 keepalives. 50 51 A new telnet command, "auth" has been added (if 52 AUTHENTICATE is defined). It has four sub-commands, 53 "status", "debug", "disable", "enable" and "help". 54 55 A new telnet command, "encrypt" has been added (if 56 ENCRYPT is defined). It has many sub-commands: 57 "enable", "type", "start", "stop", "input", 58 "-input", "output", "-output", "status", "auto", 59 "verbose", "debug", and "help". 60 61 An "rlogin" interface has been added. If the program 62 is named "rlogin", or the "-r" flag is given, then 63 an rlogin type of interface will be used. 64 ~. Terminates the session 65 ~<susp> Suspend the session 66 ~^] Escape to telnet command mode 67 ~~ Pass through the ~. 68 BUG: If you type the rlogin escape character 69 in the middle of a line while in rlogin 70 mode, you cannot erase it or any characters 71 before it. Hopefully this can be fixed 72 in a future release... 73 74 General changes: 75 76 A "libtelnet.a" has now been created. This libraray 77 contains code that is common to both telnet and 78 telnetd. This is also where library routines that 79 are needed, but are not in the standard C library, 80 are placed. 81 82 The makefiles have been re-done. All of the site 83 specific configuration information has now been put 84 into a single "Config.generic" file, in the top level 85 directory. Changing this one file will take care of 86 all three subdirectories. Also, to add a new/local 87 definition, a "Config.local" file may be created 88 at the top level; if that file exists, the subdirectories 89 will use that file instead of "Config.generic". 90 91 Many 1-2 line functions in commands.c have been 92 removed, and just inserted in-line, or replaced 93 with a macro. 94 95 Bug Fixes: 96 97 The non-termio code in both telnet and telnetd was 98 setting/clearing CTLECH in the sg_flags word. This 99 was incorrect, and has been changed to set/clear the 100 LCTLECH bit in the local mode word. 101 102 The SRCRT #define has been removed. If IP_OPTIONS 103 and IPPROTO_IP are defined on the system, then the 104 source route code is automatically enabled. 105 106 The NO_GETTYTAB #define has been removed; there 107 is a compatability routine that can be built into 108 libtelnet to achive the same results. 109 110 The server, telnetd, has been switched to use getopt() 111 for parsing the argument list. 112 113 The code for getting the input/output speeds via 114 cfgetispeed()/cfgetospeed() was still not quite 115 right in telnet. Posix says if the ispeed is 0, 116 then it is really equal to the ospeed. 117 118 The suboption processing code in telnet now has 119 explicit checks to make sure that we received 120 the entire suboption (telnetd was already doing this). 121 122 The telnet code for processing the terminal type 123 could cause a core dump if an existing connection 124 was closed, and a new connection opened without 125 exiting telnet. 126 127 Telnetd was doing a TCSADRAIN when setting the new 128 terminal settings; This is not good, because it means 129 that the tcsetattr() will hang waiting for output to 130 drain, and telnetd is the only one that will drain 131 the output... The fix is to use TCSANOW which does 132 not wait. 133 134 Telnetd was improperly setting/clearing the ISTRIP 135 flag in the c_lflag field, it should be using the 136 c_iflag field. 137 138 When the child process of telnetd was opening the 139 slave side of the pty, it was re-setting the EXTPROC 140 bit too early, and some of the other initialization 141 code was wiping it out. This would cause telnetd 142 to go out of linemode and into single character mode. 143 144 One instance of leaving linemode in telnetd forgot 145 to send a WILL ECHO to the client, the net result 146 would be that the user would see double character 147 echo. 148 149 If the MODE was being changed several times very 150 quickly, telnetd could get out of sync with the 151 state changes and the returning acks; and wind up 152 being left in the wrong state. 153 154September 14, 1990: 155 156 Switch the client to use getopt() for parsing the 157 argument list. The 4.3Reno getopt.c is included for 158 systems that don't have getopt(). 159 160 Use the posix _POSIX_VDISABLE value for what value 161 to use when disabling special characters. If this 162 is undefined, it defaults to 0x3ff. 163 164 For non-termio systems, TIOCSETP was being used to 165 change the state of the terminal. This causes the 166 input queue to be flushed, which we don't want. This 167 is now changed to TIOCSETN. 168 169 Take out the "#ifdef notdef" around the code in the 170 server that generates a "sync" when the pty oputput 171 is flushed. The potential problem is that some older 172 telnet clients may go into an infinate loop when they 173 receive a "sync", if so, the server can be compiled 174 with "NO_URGENT" defined. 175 176 Fix the client where it was setting/clearing the OPOST 177 bit in the c_lflag field, not the c_oflag field. 178 179 Fix the client where it was setting/clearing the ISTRIP 180 bit in the c_lflag field, not the c_iflag field. (On 181 4.3Reno, this is the ECHOPRT bit in the c_lflag field.) 182 The client also had its interpretation of WILL BINARY 183 and DO BINARY reversed. 184 185 Fix a bug in client that would cause a core dump when 186 attempting to remove the last environment variable. 187 188 In the client, there were a few places were switch() 189 was being passed a character, and if it was a negative 190 value, it could get sign extended, and not match 191 the 8 bit case statements. The fix is to and the 192 switch value with 0xff. 193 194 Add a couple more printoption() calls in the client, I 195 don't think there are any more places were a telnet 196 command can be received and not printed out when 197 "options" is on. 198 199 A new flag has been added to the client, "-a". Currently, 200 this just causes the USER name to be sent across, in 201 the future this may be used to signify that automatic 202 authentication is requested. 203 204 The USER variable is now only sent by the client if 205 the "-a" or "-l user" options are explicity used, or 206 if the user explicitly asks for the "USER" environment 207 variable to be exported. In the server, if it receives 208 the "USER" environment variable, it won't print out the 209 banner message, so that only "Password:" will be printed. 210 This makes the symantics more like rlogin, and should be 211 more familiar to the user. (People are not used to 212 getting a banner message, and then getting just a 213 "Password:" prompt.) 214 215 Re-vamp the code for starting up the child login 216 process. The code was getting ugly, and it was 217 hard to tell what was really going on. What we 218 do now is after the fork(), in the child: 219 1) make sure we have no controlling tty 220 2) open and initialize the tty 221 3) do a setsid()/setpgrp() 222 4) makes the tty our controlling tty. 223 On some systems, #2 makes the tty our controlling 224 tty, and #4 is a no-op. The parent process does 225 a gets rid of any controlling tty after the child 226 is fork()ed. 227 228 Use the strdup() library routine in telnet, instead 229 of the local savestr() routine. If you don't have 230 strdup(), you need to define NO_STRDUP. 231 232 Add support for ^T (SIGINFO/VSTATUS), found in the 233 4.3Reno distribution. This maps to the AYT character. 234 You need a 4-line bugfix in the kernel to get this 235 to work properly: 236 237 > *** tty_pty.c.ORG Tue Sep 11 09:41:53 1990 238 > --- tty_pty.c Tue Sep 11 17:48:03 1990 239 > *************** 240 > *** 609,613 **** 241 > if ((tp->t_lflag&NOFLSH) == 0) 242 > ttyflush(tp, FREAD|FWRITE); 243 > ! pgsignal(tp->t_pgrp, *(unsigned int *)data); 244 > return(0); 245 > } 246 > --- 609,616 ---- 247 > if ((tp->t_lflag&NOFLSH) == 0) 248 > ttyflush(tp, FREAD|FWRITE); 249 > ! pgsignal(tp->t_pgrp, *(unsigned int *)data, 1); 250 > ! if ((*(unsigned int *)data == SIGINFO) && 251 > ! ((tp->t_lflag&NOKERNINFO) == 0)) 252 > ! ttyinfo(tp); 253 > return(0); 254 > } 255 256 The client is now smarter when setting the telnet escape 257 character; it only sets it to one of VEOL and VEOL2 if 258 one of them is undefined, and the other one is not already 259 defined to the telnet escape character. 260 261 Handle TERMIOS systems that have seperate input and output 262 line speed settings imbedded in the flags. 263 264 Many other minor bug fixes. 265 266June 20, 1990: 267 Re-organize makefiles and source tree. The telnet/Source 268 directory is now gone, and all the source that was in 269 telnet/Source is now just in the telnet directory. 270 271 Seperate makefile for each system are now gone. There 272 are two makefiles, Makefile and Makefile.generic. 273 The "Makefile" has the definitions for the various 274 system, and "Makefile.generic" does all the work. 275 There is a variable called "WHAT" that is used to 276 specify what to make. For example, in the telnet 277 directory, you might say: 278 make 4.4bsd WHAT=clean 279 to clean out the directory. 280 281 Add support for the ENVIRON and XDISPLOC options. 282 In order for the server to work, login has to have 283 the "-p" option to preserve environment variables. 284 285 Add the SOFT_TAB and LIT_ECHO modes in the LINEMODE support. 286 287 Add the "-l user" option to command line and open command 288 (This is passed through the ENVIRON option). 289 290 Add the "-e" command line option, for setting the escape 291 character. 292 293 Add the "-D", diagnostic, option to the server. This allows 294 the server to print out debug information, which is very 295 useful when trying to debug a telnet that doesn't have any 296 debugging ability. 297 298 Turn off the literal next character when not in LINEMODE. 299 300 Don't recognize ^Y locally, just pass it through. 301 302 Make minor modifications for Sun4.0 and Sun4.1 303 304 Add support for both FORW1 and FORW2 characters. The 305 telnet escpape character is set to whichever of the 306 two is not being used. If both are in use, the escape 307 character is not set, so when in linemode the user will 308 have to follow the escape character with a <CR> or <EOF) 309 to get it passed through. 310 311 Commands can now be put in single and double quotes, and 312 a backslash is now an escape character. This is needed 313 for allowing arbitrary strings to be assigned to environment 314 variables. 315 316 Switch telnetd to use macros like telnet for keeping 317 track of the state of all the options. 318 319 Fix telnetd's processing of options so that we always do 320 the right processing of the LINEMODE option, regardless 321 of who initiates the request to turn it on. Also, make 322 sure that if the other side went "WILL ECHO" in response 323 to our "DO ECHO", that we send a "DONT ECHO" to get the 324 option turned back off! 325 326 Fix the TERMIOS setting of the terminal speed to handle both 327 BSD's seperate fields, and the SYSV method of CBAUD bits. 328 329 Change how we deal with the other side refusing to enable 330 an option. The sequence used to be: send DO option; receive 331 WONT option; send DONT option. Now, the sequence is: send 332 DO option; receive WONT option. Both should be valid 333 according to the spec, but there has been at least one 334 client implementation of telnet identified that can get 335 really confused by this. (The exact sequence, from a trace 336 on the server side, is (numbers are number of responses that 337 we expect to get after that line...): 338 339 send WILL ECHO 1 (initial request) 340 send WONT ECHO 2 (server is changing state) 341 recv DO ECHO 1 (first reply, ok. expect DONT ECHO next) 342 send WILL ECHO 2 (server changes state again) 343 recv DONT ECHO 1 (second reply, ok. expect DO ECHO next) 344 recv DONT ECHO 0 (third reply, wrong answer. got DONT!!!) 345 *** send WONT ECHO (send WONT to acknowledge the DONT) 346 send WILL ECHO 1 (ask again to enable option) 347 recv DO ECHO 0 348 349 recv DONT ECHO 0 350 send WONT ECHO 1 351 recv DONT ECHO 0 352 recv DO ECHO 1 353 send WILL ECHO 0 354 (and the last 5 lines loop forever) 355 356 The line with the "***" is last of the WILL/DONT/WONT sequence. 357 The change to the server to not generate that makes this same 358 example become: 359 360 send will ECHO 1 361 send wont ECHO 2 362 recv do ECHO 1 363 send will ECHO 2 364 recv dont ECHO 1 365 recv dont ECHO 0 366 recv do ECHO 1 367 send will ECHO 0 368 369 There is other option negotiation going on, and not sending 370 the third part changes some of the timings, but this specific 371 example no longer gets stuck in a loop. The "telnet.state" 372 file has been modified to reflect this change to the algorithm. 373 374 A bunch of miscellaneous bug fixes and changes to make 375 lint happier. 376 377 This version of telnet also has some KERBEROS stuff in 378 it. This has not been tested, it uses an un-authorized 379 telnet option number, and uses an out-of-date version 380 of the (still being defined) AUTHENTICATION option. 381 There is no support for this code, do not enable it. 382 383 384March 1, 1990: 385CHANGES/BUGFIXES SINCE LAST RELEASE: 386 Some support for IP TOS has been added. Requires that the 387 kernel support the IP_TOS socket option (currently this 388 is only in UNICOS 6.0). 389 390 Both telnet and telnetd now use the cc_t typedef. typedefs are 391 included for systems that don't have it (in termios.h). 392 393 SLC_SUSP was not supported properly before. It is now. 394 395 IAC EOF was not translated properly in telnetd for SYSV_TERMIO 396 when not in linemode. It now saves a copy of the VEOF character, 397 so that when ICANON is turned off and we can't trust it anymore 398 (because it is now the VMIN character) we use the saved value. 399 400 There were two missing "break" commands in the linemode 401 processing code in telnetd. 402 403 Telnetd wasn't setting the kernel window size information 404 properly. It was using the rows for both rows and columns... 405 406Questions/comments go to 407 David Borman 408 Cray Research, Inc. 409 655F Lone Oak Drive 410 Eagan, MN 55123 411 dab@cray.com. 412 413README: You are reading it. 414 415Config.generic: 416 This file contains all the OS specific definitions. It 417 has pre-definitions for many common system types, and is 418 in standard makefile fromat. See the comments at the top 419 of the file for more information. 420 421Config.local: 422 This is not part of the distribution, but if this file exists, 423 it is used instead of "Config.generic". This allows site 424 specific configuration without having to modify the distributed 425 "Config.generic" file. 426 427kern.diff: 428 This file contains the diffs for the changes needed for the 429 kernel to support LINEMODE is the server. These changes are 430 for a 4.3BSD system. You may need to make some changes for 431 your particular system. 432 433 There is a new bit in the terminal state word, TS_EXTPROC. 434 When this bit is set, several aspects of the terminal driver 435 are disabled. Input line editing, character echo, and 436 mapping of signals are all disabled. This allows the telnetd 437 to turn of these functions when in linemode, but still keep 438 track of what state the user wants the terminal to be in. 439 440 New ioctl()s: 441 442 TIOCEXT Turn on/off the TS_EXTPROC bit 443 TIOCGSTATE Get t_state of tty to look at TS_EXTPROC bit 444 TIOCSIG Generate a signal to processes in the 445 current process group of the pty. 446 447 There is a new mode for packet driver, the TIOCPKT_IOCTL bit. 448 When packet mode is turned on in the pty, and the TS_EXTPROC 449 bit is set, then whenever the state of the pty is changed, the 450 next read on the master side of the pty will have the TIOCPKT_IOCTL 451 bit set, and the data will contain the following: 452 struct xx { 453 struct sgttyb a; 454 struct tchars b; 455 struct ltchars c; 456 int t_state; 457 int t_flags; 458 } 459 This allows the process on the server side of the pty to know 460 when the state of the terminal has changed, and what the new 461 state is. 462 463 However, if you define USE_TERMIO or SYSV_TERMIO, the code will 464 expect that the structure returned in the TIOCPKT_IOCTL is 465 the termio/termios structure. 466 467stty.diff: 468 This file contains the changes needed for the stty(1) program 469 to report on the current status of the TS_EXTPROC bit. It also 470 allows the user to turn on/off the TS_EXTPROC bit. This is useful 471 because it allows the user to say "stty -extproc", and the 472 LINEMODE option will be automatically disabled, and saying "stty 473 extproc" will re-enable the LINEMODE option. 474 475telnet.state: 476 Both the client and server have code in them to deal 477 with option negotiation loops. The algorithm that is 478 used is described in this file. 479 480tmac.doc: 481 Macros for use in formatting the man pages on non-4.3Reno 482 systems. 483 484telnet: 485 This directory contains the client code. No kernel changes are 486 needed to use this code. 487 488telnetd: 489 This directory contains the server code. If LINEMODE or KLUDGELINEMODE 490 are defined, then the kernel modifications listed above are needed. 491 492libtelnet: 493 This directory contains code that is common to both the client 494 and the server. 495 496arpa: 497 This directory has a new <arpa/telnet.h> 498 499 500The following TELNET options are supported: 501 502 LINEMODE: 503 The LINEMODE option is supported as per RFC1116. The 504 FORWARDMASK option is not currently supported. 505 506 BINARY: The client has the ability to turn on/off the BINARY 507 option in each direction. Turning on BINARY from 508 server to client causes the LITOUT bit to get set in 509 the terminal driver on both ends, turning on BINARY 510 from the client to the server causes the PASS8 bit 511 to get set in the terminal driver on both ends. 512 513 TERMINAL-TYPE: 514 This is supported as per RFC1091. On the server side, 515 when a terminal type is received, termcap/terminfo 516 is consulted to determine if it is a known terminal 517 type. It keeps requesting terminal types until it 518 gets one that it recongnizes, or hits the end of the 519 list. The server side looks up the entry in the 520 termcap/terminfo data base, and generates a list of 521 names which it then passes one at a time to each 522 request for a terminal type, duplicating the last 523 entry in the list before cycling back to the beginning. 524 525 NAWS: The Negotiate about Window Size, as per RFC 1073. 526 527 TERMINAL-SPEED: 528 Implemented as per RFC 1079 529 530 TOGGLE-FLOW-CONTROL: 531 Implemented as per RFC 1080 532 533 TIMING-MARK: 534 As per RFC 860 535 536 SGA: As per RFC 858 537 538 ECHO: As per RFC 857 539 540 STATUS: 541 The server will send its current status upon 542 request. It does not ask for the clients status. 543 The client will request the servers current status 544 from the "send getstatus" command. 545 546 ENVIRON: 547 This option is currently being defined by the IETF 548 Telnet Working Group, and an RFC has not yet been 549 issued, but should be in the near future... 550 551 X-DISPLAY-LOCATION: 552 This functionality can be done through the ENVIRON 553 option, it is added here for completeness. 554 555 AUTHENTICATION: 556 This option is currently being defined by the IETF 557 Telnet Working Group, and an RFC has not yet been 558 issued. The basic framework is pretty much decided, 559 but the definitions for the specific authentication 560 schemes is still in a state of flux. 561 562 ENCRYPT: 563 This option is currently being defined by the IETF 564 Telnet Working Group, and an RFC has not yet been 565 issued. The draft RFC is still in a state of flux, 566 so this code may change in the future. 567