blob: f3d7e1ac6dce0cfbf623f59685c7872fdef43740 [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
21 - RFC 1143 option negotiation algorithm
22 - automatic MCCP2 handling (controllable by host app)
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040023 ? MCCP1
24 ? ZMP parsing
25 ? MSSP parsing
26 ? ENVIRON/NEW-ENVIRON parsing
27 ? telnet-status testing tool
Sean Middleditch9d2f98a2009-03-14 05:24:56 -040028
Sean Middleditchb9e48642009-03-12 23:33:27 -040029I. INTRODUCTION
30=====================================================================
31
32libtelnet provides safe and correct handling of the core TELNET
33protocol. It does not include any "smarts," and all use of the
34protocol (such as deciding which options to support, enabling
35and disabling options, or processing subrequests) must be implemented
36by the application author.
37
Sean Middleditch892c5f12009-03-14 13:39:07 -040038For more information on the TELNET protocol, see:
39
40 http://www.faqs.org/rfcs/rfc854.html
41
Sean Middleditchb9e48642009-03-12 23:33:27 -040042II. LIBTELNET API
43=====================================================================
44
Sean Middleditch892c5f12009-03-14 13:39:07 -040045The libtelnet API contains several distinct parts. The first part is
46the basic initialization and deinitialization routines. The second
47part is a single function for pushing received data into the
48libtelnet processor. The third part is the libtelnet_send_*()
49functions, which generate TELNET commands and ensure data is properly
Sean Middleditch637df7f2009-03-15 12:57:32 -040050formatted before sending over the wire. The final part is the event
51handler interface.
Sean Middleditch892c5f12009-03-14 13:39:07 -040052
53IIa. Initialization
54
55 struct libtelnet_t;
56 This structure represents the state of the TELNET protocol for a
57 single connection. Each connection utilizing TELNET must have
58 its own libtelnet_t structure, which is passed to all libtelnet
59 API calls.
60
61 void libtelnet_init(struct libtelnet_t *telnet,
Sean Middleditch637df7f2009-03-15 12:57:32 -040062 libtelnet_event_handler_t handler, enum libtelnet_mode_t mode);
Sean Middleditch892c5f12009-03-14 13:39:07 -040063 The libtelnet_init() function is responsible for initializing
64 the data in a libtelnet_t structure. It must be called
65 immediately after establishing a connection and before any other
66 libtelnet API calls are made.
67
Sean Middleditch637df7f2009-03-15 12:57:32 -040068 The handler parameter must be a function matching the
69 libtelnet_event_handler_t definition. More information about
70 events can be found in section IId.
Sean Middleditch30323022009-03-14 21:45:28 -040071
Sean Middleditchf66a7ee2009-03-15 11:54:07 -040072 The mode parameter must be one of LIBTELNET_MODE_SERVER,
73 LIBTELNET_MODE_CLIENT, or LIBTELNET_MODE_PROXY. These slightly
74 alter the behavior of libtelnet in certain instances. If you are
75 implementing a TELNET server, use the SERVER mode. If you are
76 implementing a client, use the CLIENT mode. The PROXY mode
77 enables special behavior for telnet-proxy (or similar
78 applications).
Sean Middleditch892c5f12009-03-14 13:39:07 -040079
80 boid libtelnet_free(struct libtelnet_t *telnet);
81 Releases any internal memory allocated by libtelnet. This must
82 be called whenever a connection is closed, or you will incur
83 memory leaks.
84
85IIb. Receiving Data
86
87 void libtelnet_push(struct libtelnet_t *telnet,
88 unsigned char *buffer, unsigned int size, void *user_data);
89 When your application receives data over the socket from the
90 remote end, it must pass the received bytes into this function.
Sean Middleditch637df7f2009-03-15 12:57:32 -040091
92 As the TELNET stream is parsed, events will be generated and
93 passed to the event handler given to libtelnet_init(). Of
94 particular interest for data receiving is the LIBTELNET_EV_DATA
95 event, which is triggered for any regular data such as user
96 input or server process output.
Sean Middleditch892c5f12009-03-14 13:39:07 -040097
98IIc. Sending Data
99
Sean Middleditch637df7f2009-03-15 12:57:32 -0400100 All of the libtelnet_send_*() functions will invoke the
101 LIBTELNET_EV_SEND event. The user_data parameter to each of these
102 functions is passed through to the callback.
103
104 Note: it is very important that ALL data sent to the remote end of
105 the connection be passed through libtelnet. All user input or
106 process output that you wish to send over the wire should be given
107 to libtelnet_send_data(). Do NOT send or buffer unprocessed output
108 data directly!
Sean Middleditch892c5f12009-03-14 13:39:07 -0400109
110 void libtelnet_send_command(struct libtelnet_t *telnet,
111 unsigned char cmd, void *user_data);
112 Sends a single "simple" TELNET command, such as the GO-AHEAD
113 commands (255 249).
114
115 void libtelnet_send_negotiate(struct libtelnet_t *telnet,
116 unsigned char cmd, unsigned char opt, void *user_data);
117 Sends a TELNET negotiation command. The cmd parameter must be
118 one of LIBTELNET_WILL, LIBTELNET_DONT, LIBTELNET_DO, or
119 LIBTELNET_DONT. The opt parameter is the option to
120 negotiate.
121
122 void libtelnet_send_data(struct libtelnet_t *telnet,
123 unsigned char *buffer, unsigned int size, void *user_data);
124 Sends raw data, which would be either the process output from
125 a server or the user input from a client.
126
127 void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
128 unsigned char opt, unsigned char *buffer, unsigned int size,
129 void *user_data);
130 Sends a TELNET sub-negotiation command. The opt parameter
131 is the sub-negotiation option.
132
Sean Middleditch637df7f2009-03-15 12:57:32 -0400133IId. Event Handling
Sean Middleditch892c5f12009-03-14 13:39:07 -0400134
Sean Middleditch637df7f2009-03-15 12:57:32 -0400135 libtelnet relies on an event-handling mechanism for processing
136 the parsed TELNET protocol stream as well as for buffering and
137 sending output data.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400138
Sean Middleditch637df7f2009-03-15 12:57:32 -0400139 When you initialize a libtelnet_t structure with libtelnet_init()
140 you had to pass in an event handler function. This function must
141 meet the following prototype:
Sean Middleditch30323022009-03-14 21:45:28 -0400142
Sean Middleditch637df7f2009-03-15 12:57:32 -0400143 void (libtelnet_t *telnet, libtelnet_event_t *event,
144 void *user_data);
145
146 The libtelnet_event_t structure has the following definition:
147
148 struct libtelnet_event_t {
149 enum libtelnet_event_type_t type;
150 unsigned char command;
151 unsigned char telopt;
152 unsigned char *buffer;
153 unsigned int size;
154 };
155
156 The enumeration values of libtelnet_event_type_t are described in
157 detail below. Whenever the the event handler is invoked, the
158 application must look at the event->type value and do any
159 necessary processing.
160
161 The only event that MUST be implemented is LIBTELNET_EV_SEND.
162 Most applications will also always want to implement the event
163 LIBTELNET_EV_DATA.
164
165 Here is an example event handler implementation which includes
166 handlers for several important events.
167
168 void my_event_handler(struct libtelnet_t *telnet,
169 libtelnet_event_t *ev, void *user_data) {
170 struct user_info *user = (struct user_info *)user_data;
171
172 switch (ev->type) {
173 case LIBTELNET_EV_DATA:
174 process_user_input(user, event->buffer, event->size);
175 break;
176 case LIBTELNET_EV_SEND:
177 write_to_descriptor(user, event->buffer, event->size);
178 break;
179 case LIBTELNET_EV_ERROR:
180 fatal_error("TELNET error: %s", event->buffer);
181 break;
182 }
Sean Middleditch30323022009-03-14 21:45:28 -0400183 }
184
Sean Middleditch637df7f2009-03-15 12:57:32 -0400185 LIBTELNET_EV_DATA:
186 The DATA event is triggered whenever regular data (not part of
187 any special TELNET command) is received. For a client, this
188 will be process output from the server. For a server, this will
189 be input typed by the user.
Sean Middleditch30323022009-03-14 21:45:28 -0400190
Sean Middleditch637df7f2009-03-15 12:57:32 -0400191 The event->buffer value will contain the bytes received and the
192 event->size value will contain the number of bytes received.
193 Note that event->buffer is not NUL terminated!
Sean Middleditch30323022009-03-14 21:45:28 -0400194
Sean Middleditch637df7f2009-03-15 12:57:32 -0400195 NOTE: there is no guarantee that user input or server output
196 will be received in whole lines. If you wish to process data
197 a line at a time, you are responsible for buffering the data and
198 checking for line terminators yourself!
199
200 LIBTELNET_EV_SEND:
201 This event is sent whenever libtelnet has generated data that
202 must be sent over the wire to the remove end. Generally that
203 means calling send() or adding the data to your application's
204 output buffer.
Sean Middleditch30323022009-03-14 21:45:28 -0400205
Sean Middleditch637df7f2009-03-15 12:57:32 -0400206 The event->buffer value will contain the bytes to send and the
207 event->size value will contain the number of bytes to send.
208 Note that event->buffer is not NUL terminated, and may include
209 NUL characters in its data, so always use event->size!
Sean Middleditch30323022009-03-14 21:45:28 -0400210
Sean Middleditch637df7f2009-03-15 12:57:32 -0400211 NOTE: Your SEND event handler must send or buffer the data in
212 its raw form as provided by libtelnet. If you wish to perform
213 any kind of preprocessing on data you want to send to the other
214
215 LIBTELNET_EV_IAC:
216 The IAC event is triggered whenever a simple IAC command is
217 received, such as the IAC EOR (end of record, also called
218 go ahead or GA) command.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400219
Sean Middleditch637df7f2009-03-15 12:57:32 -0400220 The command received is in the event->command value.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400221
Sean Middleditch637df7f2009-03-15 12:57:32 -0400222 The necessary processing depends on the specific commands; see
223 the TELNET RFC for more information.
224
225 LIBTELNET_EV_NEGOTIATE:
226 The NEGOTIATE event is sent when a TELNET neogitiation command
227 is received.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400228
Sean Middleditch637df7f2009-03-15 12:57:32 -0400229 The event->command value will be one of LIBTELNET_WILL,
230 LIBTELNET_WONT, LIBTELNET_DO, or LIBTELNET_DONT. The
231 event->telopt value will contain the option value being
232 negotiated.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400233
234 libtelnet does not currently manage negotiation for you. For
235 best practice in implementing TELNET negotiation, see:
236
237 http://www.faqs.org/rfcs/rfc1143.html
238
Sean Middleditch637df7f2009-03-15 12:57:32 -0400239 LIBTELNET_EV_SUBNEGOTIATION:
240 Triggered whenever a TELNET sub-negotiation has been received.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400241 Sub-negotiations include the NAWS option for communicating
242 terminal size to a server, the NEW-ENVIRON and TTYPE options
243 for negotiating terminal features, and MUD-centric protocols
244 such as ZMP, MSSP, and MCCP2.
245
Sean Middleditch637df7f2009-03-15 12:57:32 -0400246 The event->telopt value is the option under sub-negotiation.
247 The remaining data (if any) is passed in event->buffer and
248 event->size. Note that most subnegotiation commands can
249 include embedded NUL bytes in the subnegotiation data, and
250 the data event->buffer is not NUL terminated, so always use
251 the event->size value!
Sean Middleditch892c5f12009-03-14 13:39:07 -0400252
Sean Middleditch637df7f2009-03-15 12:57:32 -0400253 The meaning and necessary processing for subnegotiations are
254 defined in various TELNET RFCs and other informal
255 specifications. A subnegotiation should never be sent unless
256 the specific option has been enabled through the use of the
257 telnet negotiation feature.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400258
Sean Middleditch637df7f2009-03-15 12:57:32 -0400259 LIBTELNET_EV_COMPRESS
260 The COMPRESS event notifies the app that COMPRESS2/MCCP2
261 compression has begun or ended. Only servers can send compressed
262 data, and hence only clients will receive compressed data.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400263
Sean Middleditch637df7f2009-03-15 12:57:32 -0400264 The event->command value will be 1 if compression has started and
265 will be 0 if compression has ended.
266
267 LIBTELNET_EV_ERROR
268 This event is called whenever an error occurs while trying to
269 process the TELNET protocol. This includes both invalid protocol
270 sequences (which are rare) and out of memory conditions.
271
272 With few exceptions, an error is non-recoverable, and the only
273 solid course of action is to close the connection. This is
274 especially true for any errors involving the COMPRESS2 option.
275
276 The event->buffer value will contain a NUL terminated string
277 explaining the error, and the event->size value containers the
278 length of the string.
279
280 FIXME: we should pass the error code in one of the fields, and
281 better document which errors are definitely non-recoverable and
282 which are maybe-recoverable (mostly those are just IAC-in-SB
283 errors... every other error is related to MCCP2 and usually
284 results in being unable to further read the stream).
285
286III. INTEGRATING LIBTELNET WITH COMMON MUDS
Sean Middleditchb9e48642009-03-12 23:33:27 -0400287=====================================================================
288
Sean Middleditch637df7f2009-03-15 12:57:32 -0400289FIXME: fill in some notes about how to splice in libtelnet with
290common Diku/Merc/Circle/etc. MUD codebases.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400291
Sean Middleditch892c5f12009-03-14 13:39:07 -0400292IV. SAFETY AND CORRECTNESS CONSIDERATIONS
Sean Middleditchb9e48642009-03-12 23:33:27 -0400293=====================================================================
294
Sean Middleditch892c5f12009-03-14 13:39:07 -0400295Your existing application may make heavy use of its own output
296buffering and transmission commands, including hand-made routines
297for sending TELNET commands and sub-negotiation requests. There are
298at times subtle issues that need to be handled when communication
299over the TELNET protocol, not least of which is the need to escape
300any byte value 0xFF with a special TELNET command.
Sean Middleditchb9e48642009-03-12 23:33:27 -0400301
Sean Middleditch892c5f12009-03-14 13:39:07 -0400302For these reasons, it is very important that applications making use
303of libtelnet always make use of the libtelnet_send_*() family of
304functions for all data being sent over the TELNET connection.
305
Sean Middleditch637df7f2009-03-15 12:57:32 -0400306In particular, if you are writing a client, all user input must be
307passed through to libtelnet_send_data(). This also includes any
308input generated automatically by scripts, triggers, or macros.
309
310For a server, any and all output -- including ANSI/VT100 escape
311codes, regular text, newlines, and so on -- must be passed through
312to libtelnet_send_data().
313
314Any TELNET commands that are to be sent must be given to one of the
315following: libtelnet_send_command, libtelnet_send_negotiate, or
316libtelnet_send_subnegotiation().
317
318If you are attempting to enable COMPRESS2/MCCP2, you must use the
319libtelnet_begin_compress2() function.
320
Sean Middleditch892c5f12009-03-14 13:39:07 -0400321V. MCCP2 COMPRESSION
Sean Middleditchb9e48642009-03-12 23:33:27 -0400322=====================================================================
323
Sean Middleditch892c5f12009-03-14 13:39:07 -0400324The MCCP2 (COMPRESS2) TELNET extension allows for the compression of
325all traffic sent from server to client. For more information:
326
327 http://www.mudbytes.net/index.php?a=articles&s=mccp
328
Sean Middleditch637df7f2009-03-15 12:57:32 -0400329In order for libtelnet to support MCCP2, zlib must be installed and
330enabled when compiling libtelnet. Use -DHAVE_ZLIB to enable zlib
331when compiling libtelnet.c and pass -lz to the linker to link in the
332zlib shared library.
333
Sean Middleditch892c5f12009-03-14 13:39:07 -0400334libtelnet transparently supports MCCP2. For a server to support
335MCCP2, the application must begin negotiation of the COMPRESS2
336option using libtelnet_send_negotiate(), for example:
337
338 libtelnet_send_negotiate(&telnet, LIBTELNET_WILL,
339 LIBTELNET_OPTION_COMPRESS2, user_data);
340
Sean Middleditch637df7f2009-03-15 12:57:32 -0400341If a favorable DO COMPRESS2 is sent back from the client (processed
342in a LIBTELNET_EV_NEGOTIATE event, with event->command equal to
343LIBTELNET_DO and event->telopt equal to LIBTELNET_TELOPT_COMPRESS2),
344then the server application can begin compression at any time by
345calling libtelnet_begin_compress2().
Sean Middleditch892c5f12009-03-14 13:39:07 -0400346
Sean Middleditch637df7f2009-03-15 12:57:32 -0400347If a connection is in PROXY mode and COMPRESS2 support is enabled
348then libtelnet will automatically detect the start of a COMPRESS2
349stream, in either the sending or receiving direction.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400350
351VI. TELNET PROXY UTILITY
352=====================================================================
353
354The telnet-proxy utility is a small application that serves both as
355a testbed for libtelnet and as a powerful debugging tool for TELNET
356servers and clients.
357
358To use telnet-proxy, you must first compile it using:
359
360 $ make
361
362If you do not have zlib installed and wish to disable MCCP2 support
363then you must first edit the Makefile and remove the -DHAVE_ZLIB and
364the -lz from the compile flags.
365
Sean Middleditchd88f1832009-03-15 01:06:17 -0400366To run telnet-proxy, you simply give it the server's host name or
367IP address, the server's port number, and the port number that
368telnet-proxy should listen on. For example, to connect to the server
369on mud.example.com port 7800 and to listen on port 5000, run:
Sean Middleditch892c5f12009-03-14 13:39:07 -0400370
Sean Middleditchd88f1832009-03-15 01:06:17 -0400371 $ ./telnet-proxy mud.example.com 7800 5000
Sean Middleditch892c5f12009-03-14 13:39:07 -0400372
373You can then connect to the host telnet-proxy is running on (e.g.
Sean Middleditchd88f1832009-03-15 01:06:17 -0400374127.0.0.1) on port 500 and you will automatically be proxied into
375mud.example.com.
Sean Middleditch892c5f12009-03-14 13:39:07 -0400376
377telnet-proxy will display status information about the data
Sean Middleditchaefcd0c2009-03-15 13:16:44 -0400378passing through both ends of the tunnel. telnet-proxy can only
379support a single tunnel at a time. It will continue running until
380an error occurs or a terminating signal is sent to the proxy
381process.