xref: /original-bsd/usr.bin/telnet/README (revision f91c1509)
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