blob: 0be8952f01154de8a999af286754258d3bb3e35c [file] [log] [blame]
Sean Middleditchb9e48642009-03-12 23:33:27 -04001=====================================================================
2 libtelnet - TELNET protocol handling library
3=====================================================================
4
Sean Middleditch892c5f12009-03-14 13:39:07 -04005 http://github.com/elanthis/libtelnet
6
7 Sean Middleditch
8 sean@sourcemud.org
Sean Middleditchb9e48642009-03-12 23:33:27 -04009
10---------------------------------------------------------------------
11The author or authors of this code dedicate any and all copyright
12interest in this code to the public domain. We make this dedication
13for the benefit of the public at large and to the detriment of our
14heirs and successors. We intend this dedication to be an overt act of
15relinquishment in perpetuity of all present and future rights to this
16code under copyright law.
17---------------------------------------------------------------------
18
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040019*** TODO ***
20
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040021 - automatic MCCP2 handling (controllable by host app)
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040022 ? ZMP parsing
23 ? MSSP parsing
24 ? ENVIRON/NEW-ENVIRON parsing
25 ? telnet-status testing tool
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040026
Sean Middleditchb9e48642009-03-12 23:33:27 -040027I. INTRODUCTION
28=====================================================================
29
30libtelnet provides safe and correct handling of the core TELNET
Sean Middleditch8b788962009-03-16 01:06:27 -040031protocol. In addition to the base TELNET protocol, libtelnet also
32implements the Q method of TELNET option negotiation. libtelnet
33can be used for writing servers, clients, or proxies.
Sean Middleditchb9e48642009-03-12 23:33:27 -040034
Sean Middleditch892c5f12009-03-14 13:39:07 -040035For more information on the TELNET protocol, see:
36
37 http://www.faqs.org/rfcs/rfc854.html
Sean Middleditch8b788962009-03-16 01:06:27 -040038 http://www.faqs.org/rfcs/rfc1143.html
Sean Middleditch892c5f12009-03-14 13:39:07 -040039
Sean Middleditchb9e48642009-03-12 23:33:27 -040040II. LIBTELNET API
41=====================================================================
42
Sean Middleditch892c5f12009-03-14 13:39:07 -040043The libtelnet API contains several distinct parts. The first part is
44the basic initialization and deinitialization routines. The second
45part is a single function for pushing received data into the
46libtelnet processor. The third part is the libtelnet_send_*()
47functions, which generate TELNET commands and ensure data is properly
Sean Middleditch637df7f2009-03-15 12:57:32 -040048formatted before sending over the wire. The final part is the event
49handler interface.
Sean Middleditch892c5f12009-03-14 13:39:07 -040050
51IIa. Initialization
52
53 struct libtelnet_t;
54 This structure represents the state of the TELNET protocol for a
55 single connection. Each connection utilizing TELNET must have
56 its own libtelnet_t structure, which is passed to all libtelnet
57 API calls.
58
Sean Middleditch812358d2009-03-15 23:24:03 -040059 void libtelnet_init(libtelnet_t *telnet, libtelnet_event_handler_t handler,
Sean Middleditch08bb05f2009-03-15 23:29:46 -040060 unsigned char flags, void *user_data);
Sean Middleditch892c5f12009-03-14 13:39:07 -040061 The libtelnet_init() function is responsible for initializing
62 the data in a libtelnet_t structure. It must be called
63 immediately after establishing a connection and before any other
64 libtelnet API calls are made.
65
Sean Middleditch637df7f2009-03-15 12:57:32 -040066 The handler parameter must be a function matching the
67 libtelnet_event_handler_t definition. More information about
68 events can be found in section IId.
Sean Middleditch30323022009-03-14 21:45:28 -040069
Sean Middleditch9f79cc52009-03-15 13:39:24 -040070 The user_data parameter is passed to the event handler whenver it
71 is invoked. This will usually be a structure container
72 information about the connection, including a socket descriptor
73 for implementing LIBTELNET_EV_SEND event handling.
74
Sean Middleditch08bb05f2009-03-15 23:29:46 -040075 The flags parameter can be any of the following flag constants
76 bit-or'd together, or 0 to leave all options disabled.
77
Sean Middleditchc337ba62009-03-16 16:47:27 -040078 LIBTELNET_FLAG_PROXY
79 Operate in proxy mode. This disables the RFC1143 support and
80 enables automatic detection of COMPRESS2 streams.
Sean Middleditch892c5f12009-03-14 13:39:07 -040081
Sean Middleditch812358d2009-03-15 23:24:03 -040082 boid libtelnet_free(libtelnet_t *telnet);
Sean Middleditch892c5f12009-03-14 13:39:07 -040083 Releases any internal memory allocated by libtelnet. This must
84 be called whenever a connection is closed, or you will incur
85 memory leaks.
86
87IIb. Receiving Data
88
Sean Middleditch812358d2009-03-15 23:24:03 -040089 void libtelnet_push(libtelnet_t *telnet,
Sean Middleditch97a8cb22009-03-16 16:51:41 -040090 const unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch892c5f12009-03-14 13:39:07 -040091 When your application receives data over the socket from the
92 remote end, it must pass the received bytes into this function.
Sean Middleditch637df7f2009-03-15 12:57:32 -040093
94 As the TELNET stream is parsed, events will be generated and
95 passed to the event handler given to libtelnet_init(). Of
96 particular interest for data receiving is the LIBTELNET_EV_DATA
97 event, which is triggered for any regular data such as user
98 input or server process output.
Sean Middleditch892c5f12009-03-14 13:39:07 -040099
100IIc. Sending Data
101
Sean Middleditch637df7f2009-03-15 12:57:32 -0400102 All of the libtelnet_send_*() functions will invoke the
Sean Middleditch9f79cc52009-03-15 13:39:24 -0400103 LIBTELNET_EV_SEND event.
Sean Middleditch637df7f2009-03-15 12:57:32 -0400104
105 Note: it is very important that ALL data sent to the remote end of
106 the connection be passed through libtelnet. All user input or
107 process output that you wish to send over the wire should be given
Sean Middleditch4613e682009-03-16 17:21:48 -0400108 to one of the following functions. Do NOT send or buffer
109 unprocessed output data directly!
Sean Middleditch892c5f12009-03-14 13:39:07 -0400110
Sean Middleditch812358d2009-03-15 23:24:03 -0400111 void libtelnet_send_command(libtelnet_t *telnet, unsigned char cmd);
Sean Middleditch892c5f12009-03-14 13:39:07 -0400112 Sends a single "simple" TELNET command, such as the GO-AHEAD
113 commands (255 249).
114
Sean Middleditch2b4bfc42009-03-16 01:25:52 -0400115 void libtelnet_send_command(libtelnet_t *telnet, unsigned char cmd,
116 unsigned char telopt);
117 Sends a TELNET command with an option code following. This is
118 only useful for the WILL, WONT, DO, DONT, and SB commands.
119
Sean Middleditch812358d2009-03-15 23:24:03 -0400120 void libtelnet_send_negotiate(libtelnet_t *telnet,
Sean Middleditch9f79cc52009-03-15 13:39:24 -0400121 unsigned char cmd, unsigned char opt);
Sean Middleditch892c5f12009-03-14 13:39:07 -0400122 Sends a TELNET negotiation command. The cmd parameter must be
123 one of LIBTELNET_WILL, LIBTELNET_DONT, LIBTELNET_DO, or
124 LIBTELNET_DONT. The opt parameter is the option to
125 negotiate.
126
Sean Middleditch97a8cb22009-03-16 16:51:41 -0400127 void libtelnet_send_data(libtelnet_t *telnet,
128 const unsigned char *buffer, unsigned int size);
Sean Middleditch892c5f12009-03-14 13:39:07 -0400129 Sends raw data, which would be either the process output from
130 a server or the user input from a client.
131
Sean Middleditch812358d2009-03-15 23:24:03 -0400132 void libtelnet_send_subnegotiation(libtelnet_t *telnet,
Sean Middleditch97a8cb22009-03-16 16:51:41 -0400133 unsigned char telopt, const unsigned char *buffer,
134 unsigned int size);
Sean Middleditch2b4bfc42009-03-16 01:25:52 -0400135 Sends a TELNET sub-negotiation command. The telopt parameter
Sean Middleditch892c5f12009-03-14 13:39:07 -0400136 is the sub-negotiation option.
137
Sean Middleditch2b4bfc42009-03-16 01:25:52 -0400138 Note that the above function is just a shorthand for:
139 libtelnet_send_telopt(telnet, LIBTELNET_SB, telopt);
140 libtelnet_send_data(telnet, buffer, size);
141 libtelnet_send_command(telnet, LIBTELNET_SE);
142
143 For some subnegotiations that involve a lot of complex formatted
144 data to be sent, it may be easier to manually send the SB telopt
145 header and SE footer around mulitple calls to send_data.
146
Sean Middleditch4613e682009-03-16 17:21:48 -0400147 NOTE: libtelnet_send_subnegotiation() does have special behavior
148 in PROXY mode, as in that mode this function will automatically
Sean Middleditch2b4bfc42009-03-16 01:25:52 -0400149 detect the COMPRESS2 marker and enable zlib compression.
150
Sean Middleditch4613e682009-03-16 17:21:48 -0400151 int libtelnet_printf(libtelnet_t *telnet, const char *fmt, ...);
152 This functions very similarly to fprintf, except that output
153 is sent through libtelnet for processing. This is equivalent
154 to using snprintf() to format data into a buffer and then
155 sending the buffer to libtelnet_send_data(). The return code
156 is the length of the formatted text.
157
158 NOTE: due to an internal implementation detail, the maximum
159 lenth of the formatted text is 4096 characters.
160
161 int libtelnet_printf2(libtelnet_T *telnet, const char *fmt, ...);
162 Identical to libtelnet_print(), except that this variant will
163 also translate C newlines (\n) into a CRLF and translates
164 carriage returns (\r) into CRNUL, as required by TELNET.
165
166 NOTE: this function should only be used for regular data such
167 as user input (in client applications) or process output (in
168 server applications). If you are formatting data that is part
169 of a subnegotiation, you should always use libtelnet_printf()
170 instead, as you will rarely want newline translation inside of
171 subnegotiations.
172
Sean Middleditch637df7f2009-03-15 12:57:32 -0400173IId. Event Handling
Sean Middleditch892c5f12009-03-14 13:39:07 -0400174
Sean Middleditch637df7f2009-03-15 12:57:32 -0400175 libtelnet relies on an event-handling mechanism for processing
176 the parsed TELNET protocol stream as well as for buffering and
177 sending output data.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400178
Sean Middleditch637df7f2009-03-15 12:57:32 -0400179 When you initialize a libtelnet_t structure with libtelnet_init()
180 you had to pass in an event handler function. This function must
181 meet the following prototype:
Sean Middleditch30323022009-03-14 21:45:28 -0400182
Sean Middleditch637df7f2009-03-15 12:57:32 -0400183 void (libtelnet_t *telnet, libtelnet_event_t *event,
Sean Middleditch9f79cc52009-03-15 13:39:24 -0400184 void *user_data);
185
186 The event structure is detailed below. The user_data value is the
187 pointer passed to libtelnet_init().
Sean Middleditch637df7f2009-03-15 12:57:32 -0400188
189 struct libtelnet_event_t {
Sean Middleditch97a8cb22009-03-16 16:51:41 -0400190 const unsigned char *buffer;
Sean Middleditch637df7f2009-03-15 12:57:32 -0400191 unsigned int size;
Sean Middleditch812358d2009-03-15 23:24:03 -0400192 libtelnet_event_type_t type;
193 unsigned char command;
194 unsigned char telopt;
195 unsigned char accept;
Sean Middleditch637df7f2009-03-15 12:57:32 -0400196 };
197
198 The enumeration values of libtelnet_event_type_t are described in
199 detail below. Whenever the the event handler is invoked, the
200 application must look at the event->type value and do any
201 necessary processing.
202
203 The only event that MUST be implemented is LIBTELNET_EV_SEND.
204 Most applications will also always want to implement the event
205 LIBTELNET_EV_DATA.
206
207 Here is an example event handler implementation which includes
208 handlers for several important events.
209
Sean Middleditch812358d2009-03-15 23:24:03 -0400210 void my_event_handler(libtelnet_t *telnet, libtelnet_event_t *ev,
211 void *user_data) {
Sean Middleditch637df7f2009-03-15 12:57:32 -0400212 struct user_info *user = (struct user_info *)user_data;
213
214 switch (ev->type) {
215 case LIBTELNET_EV_DATA:
216 process_user_input(user, event->buffer, event->size);
217 break;
218 case LIBTELNET_EV_SEND:
219 write_to_descriptor(user, event->buffer, event->size);
220 break;
221 case LIBTELNET_EV_ERROR:
222 fatal_error("TELNET error: %s", event->buffer);
223 break;
224 }
Sean Middleditch30323022009-03-14 21:45:28 -0400225 }
226
Sean Middleditch637df7f2009-03-15 12:57:32 -0400227 LIBTELNET_EV_DATA:
228 The DATA event is triggered whenever regular data (not part of
229 any special TELNET command) is received. For a client, this
230 will be process output from the server. For a server, this will
231 be input typed by the user.
Sean Middleditch30323022009-03-14 21:45:28 -0400232
Sean Middleditch637df7f2009-03-15 12:57:32 -0400233 The event->buffer value will contain the bytes received and the
234 event->size value will contain the number of bytes received.
235 Note that event->buffer is not NUL terminated!
Sean Middleditch30323022009-03-14 21:45:28 -0400236
Sean Middleditch637df7f2009-03-15 12:57:32 -0400237 NOTE: there is no guarantee that user input or server output
238 will be received in whole lines. If you wish to process data
239 a line at a time, you are responsible for buffering the data and
240 checking for line terminators yourself!
241
242 LIBTELNET_EV_SEND:
243 This event is sent whenever libtelnet has generated data that
244 must be sent over the wire to the remove end. Generally that
245 means calling send() or adding the data to your application's
246 output buffer.
Sean Middleditch30323022009-03-14 21:45:28 -0400247
Sean Middleditch637df7f2009-03-15 12:57:32 -0400248 The event->buffer value will contain the bytes to send and the
249 event->size value will contain the number of bytes to send.
250 Note that event->buffer is not NUL terminated, and may include
251 NUL characters in its data, so always use event->size!
Sean Middleditch30323022009-03-14 21:45:28 -0400252
Sean Middleditch637df7f2009-03-15 12:57:32 -0400253 NOTE: Your SEND event handler must send or buffer the data in
254 its raw form as provided by libtelnet. If you wish to perform
255 any kind of preprocessing on data you want to send to the other
256
257 LIBTELNET_EV_IAC:
258 The IAC event is triggered whenever a simple IAC command is
259 received, such as the IAC EOR (end of record, also called
260 go ahead or GA) command.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400261
Sean Middleditch637df7f2009-03-15 12:57:32 -0400262 The command received is in the event->command value.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400263
Sean Middleditch637df7f2009-03-15 12:57:32 -0400264 The necessary processing depends on the specific commands; see
265 the TELNET RFC for more information.
266
Sean Middleditch5b5bc922009-03-15 23:02:10 -0400267 LIBTELNET_EV_WILL:
268 LIBTELNET_EV_DO:
269 The WILL and DO events are sent when a TELNET negotiation
270 command of the same name is received.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400271
Sean Middleditch5b5bc922009-03-15 23:02:10 -0400272 WILL events are sent by the remote end when they wish to be
273 allowed to turn an option on on their end, or in confirmation
274 after you have sent a DO command to them.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400275
Sean Middleditch5b5bc922009-03-15 23:02:10 -0400276 DO events are sent by the remote end when they wish for you
277 to turn on an option on your end, or in confirmation after you
278 have sent a WILL command to them.
279
280 In either case, the TELNET option under negotiation will be in
281 event->telopt field.
282
283 If you support the option and wish for it to be enabled you
284 must set the event->accept field to 1, unless this event is
285 a confirmation for a previous WILL/DO command you sent to the
286 remote end. If you do not set event->field to 1 then
287 libtelnet will send a rejection command back to the other end.
288
289 libtelnet manages some of the pecularities of negotiation for
290 you. For information on libtelnet's negotiation method, see:
Sean Middleditch892c5f12009-03-14 13:39:07 -0400291
292 http://www.faqs.org/rfcs/rfc1143.html
293
Sean Middleditch5b5bc922009-03-15 23:02:10 -0400294 Examples:
295
296 You want remote end to use TTYPE, so you send DO TTYPE.
297 Remote accepts and sends WILL TTYPE.
298
299 Remote end wants you to use SGA, so they send DO_SGA.
300 You do not support SGA and set event->accept = 0.
301
302 Remote end wants to use ZMP, so they send WILL ZMP.
303 You support ZMP, so you set event->accept = 1 and enable
304 local ZMP support.
305
306 You want to use MCCP2, so you send WILL COMPRESS2.
307 Remote end accepts and sends DO COMPRESS2.
308
309 Note that in PROXY mode libtelnet will do no processing of its
310 own for you.
311
312 LIBTELNET_EV_WONT:
313 LIBTELNET_EV_DONT:
314 The WONT and DONT events are sent when the remote end of the
315 connection wishes to disable an option, when they are
316 refusing to a support an option that you have asked for, or
317 in confirmation of an option you have asked to be disabled.
318
319 Most commonly WONT and DONT events are sent as rejections of
320 features you requested by sending DO or WILL events. Receiving
321 these events means the TELNET option is not or will not be
322 supported by the remote end, so give up.
323
324 Sometimes WONT or DONT will be sent for TELNET options that are
325 already enabled, but the remote end wishes to stop using. You
326 cannot decline. These events are demands that must be complied
327 with. libtelnet will always send the appropriate response back
328 without consulting your application. These events are sent to
329 allow your application to disable its own use of the features.
330
331 In either case, the TELNET option under negotiation will be in
332 event->telopt field.
333
334 Note that in PROXY mode libtelnet will do no processing of its
335 own for you.
336
Sean Middleditch637df7f2009-03-15 12:57:32 -0400337 LIBTELNET_EV_SUBNEGOTIATION:
338 Triggered whenever a TELNET sub-negotiation has been received.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400339 Sub-negotiations include the NAWS option for communicating
340 terminal size to a server, the NEW-ENVIRON and TTYPE options
341 for negotiating terminal features, and MUD-centric protocols
342 such as ZMP, MSSP, and MCCP2.
343
Sean Middleditch637df7f2009-03-15 12:57:32 -0400344 The event->telopt value is the option under sub-negotiation.
345 The remaining data (if any) is passed in event->buffer and
346 event->size. Note that most subnegotiation commands can
347 include embedded NUL bytes in the subnegotiation data, and
348 the data event->buffer is not NUL terminated, so always use
349 the event->size value!
Sean Middleditch892c5f12009-03-14 13:39:07 -0400350
Sean Middleditch637df7f2009-03-15 12:57:32 -0400351 The meaning and necessary processing for subnegotiations are
352 defined in various TELNET RFCs and other informal
353 specifications. A subnegotiation should never be sent unless
354 the specific option has been enabled through the use of the
355 telnet negotiation feature.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400356
Sean Middleditch637df7f2009-03-15 12:57:32 -0400357 LIBTELNET_EV_COMPRESS
358 The COMPRESS event notifies the app that COMPRESS2/MCCP2
359 compression has begun or ended. Only servers can send compressed
360 data, and hence only clients will receive compressed data.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400361
Sean Middleditch637df7f2009-03-15 12:57:32 -0400362 The event->command value will be 1 if compression has started and
363 will be 0 if compression has ended.
Sean Middleditch16992272009-03-15 19:42:03 -0400364
365 LIBTELNET_EV_WARNING
366 The WARNING event is sent whenever something has gone wrong
367 inside of libtelnet (possibly due to malformed data sent by the
368 other end) but which recovery is (likely) possible. It may be
369 safe to continue using the connection, but some data may have
370 been lost or incorrectly interpreted.
Sean Middleditch637df7f2009-03-15 12:57:32 -0400371
372 The event->buffer value will contain a NUL terminated string
373 explaining the error, and the event->size value containers the
374 length of the string.
375
Sean Middleditch16992272009-03-15 19:42:03 -0400376 LIBTELNET_EV_ERROR
377 Similar to the WARNING event, the ERROR event is sent whenever
378 something has gone wrong. ERROR events are non-recoverable,
379 however, and the application should immediately close the
380 connection. Whatever has happened is likely going only to
381 result in garbage from libtelnet. This is most likely to
382 happen when a COMPRESS2 stream fails, but other problems can
383 occur.
384
385 The event->buffer value will contain a NUL terminated string
386 explaining the error, and the event->size value containers the
387 length of the string.
Sean Middleditch637df7f2009-03-15 12:57:32 -0400388
389III. INTEGRATING LIBTELNET WITH COMMON MUDS
Sean Middleditchb9e48642009-03-12 23:33:27 -0400390=====================================================================
391
Sean Middleditch637df7f2009-03-15 12:57:32 -0400392FIXME: fill in some notes about how to splice in libtelnet with
393common Diku/Merc/Circle/etc. MUD codebases.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400394
Sean Middleditch892c5f12009-03-14 13:39:07 -0400395IV. SAFETY AND CORRECTNESS CONSIDERATIONS
Sean Middleditchb9e48642009-03-12 23:33:27 -0400396=====================================================================
397
Sean Middleditch892c5f12009-03-14 13:39:07 -0400398Your existing application may make heavy use of its own output
399buffering and transmission commands, including hand-made routines
400for sending TELNET commands and sub-negotiation requests. There are
401at times subtle issues that need to be handled when communication
402over the TELNET protocol, not least of which is the need to escape
403any byte value 0xFF with a special TELNET command.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400404
Sean Middleditch892c5f12009-03-14 13:39:07 -0400405For these reasons, it is very important that applications making use
406of libtelnet always make use of the libtelnet_send_*() family of
407functions for all data being sent over the TELNET connection.
408
Sean Middleditch637df7f2009-03-15 12:57:32 -0400409In particular, if you are writing a client, all user input must be
410passed through to libtelnet_send_data(). This also includes any
411input generated automatically by scripts, triggers, or macros.
412
413For a server, any and all output -- including ANSI/VT100 escape
414codes, regular text, newlines, and so on -- must be passed through
415to libtelnet_send_data().
416
417Any TELNET commands that are to be sent must be given to one of the
418following: libtelnet_send_command, libtelnet_send_negotiate, or
419libtelnet_send_subnegotiation().
420
421If you are attempting to enable COMPRESS2/MCCP2, you must use the
422libtelnet_begin_compress2() function.
423
Sean Middleditch892c5f12009-03-14 13:39:07 -0400424V. MCCP2 COMPRESSION
Sean Middleditchb9e48642009-03-12 23:33:27 -0400425=====================================================================
426
Sean Middleditch892c5f12009-03-14 13:39:07 -0400427The MCCP2 (COMPRESS2) TELNET extension allows for the compression of
428all traffic sent from server to client. For more information:
429
430 http://www.mudbytes.net/index.php?a=articles&s=mccp
431
Sean Middleditch637df7f2009-03-15 12:57:32 -0400432In order for libtelnet to support MCCP2, zlib must be installed and
433enabled when compiling libtelnet. Use -DHAVE_ZLIB to enable zlib
434when compiling libtelnet.c and pass -lz to the linker to link in the
435zlib shared library.
436
Sean Middleditch892c5f12009-03-14 13:39:07 -0400437libtelnet transparently supports MCCP2. For a server to support
438MCCP2, the application must begin negotiation of the COMPRESS2
439option using libtelnet_send_negotiate(), for example:
440
441 libtelnet_send_negotiate(&telnet, LIBTELNET_WILL,
442 LIBTELNET_OPTION_COMPRESS2, user_data);
443
Sean Middleditch5b5bc922009-03-15 23:02:10 -0400444If a favorable DO COMPRESS2 is sent back from the client then the
445server application can begin compression at any time by calling
446libtelnet_begin_compress2().
Sean Middleditch892c5f12009-03-14 13:39:07 -0400447
Sean Middleditch637df7f2009-03-15 12:57:32 -0400448If a connection is in PROXY mode and COMPRESS2 support is enabled
449then libtelnet will automatically detect the start of a COMPRESS2
450stream, in either the sending or receiving direction.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400451
452VI. TELNET PROXY UTILITY
453=====================================================================
454
455The telnet-proxy utility is a small application that serves both as
456a testbed for libtelnet and as a powerful debugging tool for TELNET
457servers and clients.
458
459To use telnet-proxy, you must first compile it using:
460
461 $ make
462
463If you do not have zlib installed and wish to disable MCCP2 support
464then you must first edit the Makefile and remove the -DHAVE_ZLIB and
465the -lz from the compile flags.
466
Sean Middleditchd88f1832009-03-15 01:06:17 -0400467To run telnet-proxy, you simply give it the server's host name or
468IP address, the server's port number, and the port number that
469telnet-proxy should listen on. For example, to connect to the server
470on mud.example.com port 7800 and to listen on port 5000, run:
Sean Middleditch892c5f12009-03-14 13:39:07 -0400471
Sean Middleditchd88f1832009-03-15 01:06:17 -0400472 $ ./telnet-proxy mud.example.com 7800 5000
Sean Middleditch892c5f12009-03-14 13:39:07 -0400473
474You can then connect to the host telnet-proxy is running on (e.g.
Sean Middleditchd88f1832009-03-15 01:06:17 -0400475127.0.0.1) on port 500 and you will automatically be proxied into
476mud.example.com.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400477
478telnet-proxy will display status information about the data
Sean Middleditchaefcd0c2009-03-15 13:16:44 -0400479passing through both ends of the tunnel. telnet-proxy can only
480support a single tunnel at a time. It will continue running until
481an error occurs or a terminating signal is sent to the proxy
482process.