blob: 1ad8e3d09f58200ec91f31c030d1b437f31690fa [file] [log] [blame]
Sean Middleditch29144852009-03-12 23:14:47 -04001/*
Sean Middleditch9de15982009-03-14 03:35:49 -04002 * Sean Middleditch
3 * sean@sourcemud.org
4 *
Sean Middleditch29144852009-03-12 23:14:47 -04005 * The author or authors of this code dedicate any and all copyright interest
6 * in this code to the public domain. We make this dedication for the benefit
7 * of the public at large and to the detriment of our heirs and successors. We
8 * intend this dedication to be an overt act of relinquishment in perpetuity of
9 * all present and future rights to this code under copyright law.
10 */
11
Sean Middleditch6aef0732009-03-12 23:27:35 -040012#if !defined(LIBTELNET_INCLUDE)
13#define LIBTELNET 1
14
Sean Middleditch29144852009-03-12 23:14:47 -040015/* telnet special values */
16#define LIBTELNET_IAC 255
17#define LIBTELNET_DONT 254
18#define LIBTELNET_DO 253
19#define LIBTELNET_WONT 252
20#define LIBTELNET_WILL 251
21#define LIBTELNET_SB 250
22#define LIBTELNET_SE 240
23
24/* telnet options */
25#define LIBTELNET_OPTION_BINARY 0
26#define LIBTELNET_OPTION_ECHO 1
27#define LIBTELNET_OPTION_NAWS 31
Sean Middleditch9de15982009-03-14 03:35:49 -040028#define LIBTELNET_OPTION_COMPRESS2 86
Sean Middleditch29144852009-03-12 23:14:47 -040029#define LIBTELNET_OPTION_ZMP 93
30
31/* telnet states */
32enum libtelnet_state_t {
Sean Middleditch9de15982009-03-14 03:35:49 -040033 LIBTELNET_STATE_DATA = 0,
Sean Middleditch29144852009-03-12 23:14:47 -040034 LIBTELNET_STATE_IAC,
35 LIBTELNET_STATE_DO,
36 LIBTELNET_STATE_DONT,
37 LIBTELNET_STATE_WILL,
38 LIBTELNET_STATE_WONT,
39 LIBTELNET_STATE_SB,
40 LIBTELNET_STATE_SB_IAC,
41};
42
43/* error codes */
44enum libtelnet_error_t {
45 LIBTELNET_ERROR_OK = 0,
Sean Middleditchb1e452e2009-03-12 23:26:34 -040046 LIBTELNET_ERROR_NOMEM, /* memory allocation failure */
Sean Middleditch78f400f2009-03-14 01:26:43 -040047 LIBTELNET_ERROR_OVERFLOW, /* data exceeds buffer size */
Sean Middleditch29144852009-03-12 23:14:47 -040048 LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
49 LIBTELNET_ERROR_UNKNOWN, /* some crazy unexplainable unknown error */
50};
51
Sean Middleditch4d9444d2009-03-13 22:48:05 -040052/* state tracker */
53struct libtelnet_t {
Sean Middleditch9de15982009-03-14 03:35:49 -040054 /* zlib (mccp2) compression */
55#ifdef HAVE_ZLIB
56 z_stream *zlib;
57#endif
Sean Middleditch4d9444d2009-03-13 22:48:05 -040058 /* sub-request buffer */
59 unsigned char *buffer;
60 /* current size of the buffer */
61 unsigned int size;
62 /* length of data in the buffer */
63 unsigned int length;
64 /* current state */
65 enum libtelnet_state_t state;
66};
67
Sean Middleditchb1e452e2009-03-12 23:26:34 -040068/* libtelnet callback declarations
69 * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
70 */
Sean Middleditch78f400f2009-03-14 01:26:43 -040071extern void libtelnet_data_cb(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040072 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch78f400f2009-03-14 01:26:43 -040073extern void libtelnet_send_cb(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040074 unsigned char *buffer, unsigned int size, void *user_data);
75extern void libtelnet_command_cb(struct libtelnet_t *telnet,
76 unsigned char cmd, void *user_data);
77extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
78 unsigned char cmd, unsigned char opt, void *user_data);
79extern void libtelnet_subrequest_cb(struct libtelnet_t *telnet,
80 unsigned char type, unsigned char *data, unsigned int size,
81 void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040082extern void libtelnet_error_cb(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040083 enum libtelnet_error_t error, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040084
85/* initialize a telnet state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040086extern void libtelnet_init(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040087
88/* free up any memory allocated by a state tracker */
Sean Middleditch51ad6792009-03-13 20:15:59 -040089extern void libtelnet_free(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040090
Sean Middleditch29144852009-03-12 23:14:47 -040091/* push a byte buffer into the state tracker */
Sean Middleditch8b5e2b12009-03-13 23:39:18 -040092extern void libtelnet_push(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040093 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040094
95/* send an iac command */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040096extern void libtelnet_send_command(struct libtelnet_t *telnet,
97 unsigned char cmd, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040098
99/* send negotiation */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400100extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
101 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400102
103/* send non-command data (escapes IAC bytes) */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400104extern void libtelnet_send_data(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400105 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400106
107/* send sub-request */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400108extern void libtelnet_send_subrequest(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400109 unsigned char type, unsigned char *buffer, unsigned int size,
110 void *user_data);
Sean Middleditch6aef0732009-03-12 23:27:35 -0400111
112#endif /* !defined(LIBTELNET_INCLUDE) */