Commit | Line | Data |
---|---|---|
1658eeff WJ |
1 | |
2 | ||
3 | This is a distribution of both client and server telnet. These programs | |
4 | have 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 | ||
17 | In addition, previous versions have been compiled on the following | |
18 | machines, 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 | ||
24 | Februrary 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 | ||
154 | September 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 | ||
266 | June 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 | ||
384 | March 1, 1990: | |
385 | CHANGES/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 | ||
406 | Questions/comments go to | |
407 | David Borman | |
408 | Cray Research, Inc. | |
409 | 655F Lone Oak Drive | |
410 | Eagan, MN 55123 | |
411 | dab@cray.com. | |
412 | ||
413 | README: You are reading it. | |
414 | ||
415 | Config.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 | ||
421 | Config.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 | ||
427 | kern.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 | ||
467 | stty.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 | ||
475 | telnet.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 | ||
480 | tmac.doc: | |
481 | Macros for use in formatting the man pages on non-4.3Reno | |
482 | systems. | |
483 | ||
484 | telnet: | |
485 | This directory contains the client code. No kernel changes are | |
486 | needed to use this code. | |
487 | ||
488 | telnetd: | |
489 | This directory contains the server code. If LINEMODE or KLUDGELINEMODE | |
490 | are defined, then the kernel modifications listed above are needed. | |
491 | ||
492 | libtelnet: | |
493 | This directory contains code that is common to both the client | |
494 | and the server. | |
495 | ||
496 | arpa: | |
497 | This directory has a new <arpa/telnet.h> | |
498 | ||
499 | ||
500 | The 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. |