blob: e51860102078e0e7c8ed599a8a541604588a732d [file] [log] [blame]
Sean Middleditch29144852009-03-12 23:14:47 -04001/*
2 * The author or authors of this code dedicate any and all copyright interest
3 * in this code to the public domain. We make this dedication for the benefit
4 * of the public at large and to the detriment of our heirs and successors. We
5 * intend this dedication to be an overt act of relinquishment in perpetuity of
6 * all present and future rights to this code under copyright law.
7 */
8
9/* sub request buffer size increment (defualt 4K) */
10#define LIBTELNET_BUFFER_SIZE (4 * 1024)
11/* sub request buffer size (default 16K) */
12#define LIBTELNET_BUFFER_SIZE_MAX (16 * 1024)
13
14/* telnet special values */
15#define LIBTELNET_IAC 255
16#define LIBTELNET_DONT 254
17#define LIBTELNET_DO 253
18#define LIBTELNET_WONT 252
19#define LIBTELNET_WILL 251
20#define LIBTELNET_SB 250
21#define LIBTELNET_SE 240
22
23/* telnet options */
24#define LIBTELNET_OPTION_BINARY 0
25#define LIBTELNET_OPTION_ECHO 1
26#define LIBTELNET_OPTION_NAWS 31
27#define LIBTELNET_OPTION_ZMP 93
28
29/* telnet states */
30enum libtelnet_state_t {
31 LIBTELNET_STATE_TEXT = 0,
32 LIBTELNET_STATE_IAC,
33 LIBTELNET_STATE_DO,
34 LIBTELNET_STATE_DONT,
35 LIBTELNET_STATE_WILL,
36 LIBTELNET_STATE_WONT,
37 LIBTELNET_STATE_SB,
38 LIBTELNET_STATE_SB_IAC,
39};
40
41/* error codes */
42enum libtelnet_error_t {
43 LIBTELNET_ERROR_OK = 0,
Sean Middleditchb1e452e2009-03-12 23:26:34 -040044 LIBTELNET_ERROR_NOMEM, /* memory allocation failure */
Sean Middleditch29144852009-03-12 23:14:47 -040045 LIBTELNET_ERROR_OVERFLOW, /* input exceeds buffer size */
46 LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
47 LIBTELNET_ERROR_UNKNOWN, /* some crazy unexplainable unknown error */
48};
49
Sean Middleditchb1e452e2009-03-12 23:26:34 -040050/* libtelnet callback declarations
51 * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
52 */
53extern void libtelnet_input_cb(struct libtelnet_t *telnet, unsigned char
Sean Middleditch29144852009-03-12 23:14:47 -040054 byte, void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040055extern void libtelnet_output_cb(struct libtelnet_t *telnet, unsigned char
Sean Middleditch29144852009-03-12 23:14:47 -040056 byte, void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040057extern void libtelnet_command_cb(struct libtelnet_t *telnet, unsigned char
Sean Middleditch29144852009-03-12 23:14:47 -040058 cmd, void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040059extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet, unsigned char
Sean Middleditch29144852009-03-12 23:14:47 -040060 cmd, unsigned char opt, void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040061extern void libtelnet_subrequest_cb(struct libtelnet_t *telnet, unsigned char
Sean Middleditch29144852009-03-12 23:14:47 -040062 cmd, unsigned char type, unsigned char *data, size_t size,
63 void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040064extern void libtelnet_error_cb(struct libtelnet_t *telnet,
Sean Middleditch29144852009-03-12 23:14:47 -040065 enum libtelnet_error_t error, void *user_data);
66
67/* state tracker */
68struct libtelnet_t {
69 /* current state */
70 enum libtelnet_state_t state;
71 /* sub-request buffer */
72 char *buffer;
73 /* current size of the buffer */
74 size_t size;
75 /* length of data in the buffer */
76 size_t length;
Sean Middleditch29144852009-03-12 23:14:47 -040077};
78
79/* initialize a telnet state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040080extern void libtelnet_init(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040081
82/* free up any memory allocated by a state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040083extern void libtelnet_close(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040084
85/* push a single byte into the state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040086extern void libtelnet_push_byte(struct libtelnet_t *telnet, unsigned char byte,
Sean Middleditch29144852009-03-12 23:14:47 -040087 void *user_data);
88
89/* push a byte buffer into the state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040090extern void libtelnet_push_buffer(struct libtelnet_t *telnet,
91 unsigned char *buffer, size_t size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040092
93/* send an iac command */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040094extern void libtelnet_send_command(struct libtelnet_t *telnet,
95 unsigned char cmd, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040096
97/* send negotiation */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040098extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
99 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400100
101/* send non-command data (escapes IAC bytes) */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400102extern void libtelnet_send_data(struct libtelnet_t *telnet,
103 unsigned char *buffer, size_t size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400104
105/* send sub-request */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400106extern void libtelnet_send_subrequest(struct libtelnet_t *telnet,
107 unsigned char type, unsigned char *buffer, size_t size, void *user_data);