Annotation of src/usr.bin/telnet/README, Revision 1.1.1.1
1.1 deraadt 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.