blob: a262bee4bffee3b80efcaf83c20b373762e90748 [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
Sean Middleditch6aef0732009-03-12 23:27:35 -04009#if !defined(LIBTELNET_INCLUDE)
10#define LIBTELNET 1
11
Sean Middleditch29144852009-03-12 23:14:47 -040012/* telnet special values */
13#define LIBTELNET_IAC 255
14#define LIBTELNET_DONT 254
15#define LIBTELNET_DO 253
16#define LIBTELNET_WONT 252
17#define LIBTELNET_WILL 251
18#define LIBTELNET_SB 250
19#define LIBTELNET_SE 240
20
21/* telnet options */
22#define LIBTELNET_OPTION_BINARY 0
23#define LIBTELNET_OPTION_ECHO 1
24#define LIBTELNET_OPTION_NAWS 31
25#define LIBTELNET_OPTION_ZMP 93
26
27/* telnet states */
28enum libtelnet_state_t {
29 LIBTELNET_STATE_TEXT = 0,
30 LIBTELNET_STATE_IAC,
31 LIBTELNET_STATE_DO,
32 LIBTELNET_STATE_DONT,
33 LIBTELNET_STATE_WILL,
34 LIBTELNET_STATE_WONT,
35 LIBTELNET_STATE_SB,
36 LIBTELNET_STATE_SB_IAC,
37};
38
39/* error codes */
40enum libtelnet_error_t {
41 LIBTELNET_ERROR_OK = 0,
Sean Middleditchb1e452e2009-03-12 23:26:34 -040042 LIBTELNET_ERROR_NOMEM, /* memory allocation failure */
Sean Middleditch29144852009-03-12 23:14:47 -040043 LIBTELNET_ERROR_OVERFLOW, /* input exceeds buffer size */
44 LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
45 LIBTELNET_ERROR_UNKNOWN, /* some crazy unexplainable unknown error */
46};
47
Sean Middleditch4d9444d2009-03-13 22:48:05 -040048/* state tracker */
49struct libtelnet_t {
50 /* sub-request buffer */
51 unsigned char *buffer;
52 /* current size of the buffer */
53 unsigned int size;
54 /* length of data in the buffer */
55 unsigned int length;
56 /* current state */
57 enum libtelnet_state_t state;
58};
59
Sean Middleditchb1e452e2009-03-12 23:26:34 -040060/* libtelnet callback declarations
61 * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
62 */
Sean Middleditch4d9444d2009-03-13 22:48:05 -040063extern void libtelnet_input_cb(struct libtelnet_t *telnet,
64 unsigned char *buffer, unsigned int size, void *user_data);
65extern void libtelnet_output_cb(struct libtelnet_t *telnet,
66 unsigned char *buffer, unsigned int size, void *user_data);
67extern void libtelnet_command_cb(struct libtelnet_t *telnet,
68 unsigned char cmd, void *user_data);
69extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
70 unsigned char cmd, unsigned char opt, void *user_data);
71extern void libtelnet_subrequest_cb(struct libtelnet_t *telnet,
72 unsigned char type, unsigned char *data, unsigned int size,
73 void *user_data);
Sean Middleditchb1e452e2009-03-12 23:26:34 -040074extern void libtelnet_error_cb(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040075 enum libtelnet_error_t error, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040076
77/* initialize a telnet state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040078extern void libtelnet_init(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040079
80/* free up any memory allocated by a state tracker */
Sean Middleditch51ad6792009-03-13 20:15:59 -040081extern void libtelnet_free(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -040082
83/* push a single byte into the state tracker */
Sean Middleditch4d9444d2009-03-13 22:48:05 -040084extern void libtelnet_push_byte(struct libtelnet_t *telnet,
85 unsigned char byte, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040086
87/* push a byte buffer into the state tracker */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040088extern void libtelnet_push_buffer(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -040089 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040090
91/* send an iac command */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040092extern void libtelnet_send_command(struct libtelnet_t *telnet,
93 unsigned char cmd, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040094
95/* send negotiation */
Sean Middleditchb1e452e2009-03-12 23:26:34 -040096extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
97 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -040098
99/* send non-command data (escapes IAC bytes) */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400100extern void libtelnet_send_data(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400101 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400102
103/* send sub-request */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400104extern void libtelnet_send_subrequest(struct libtelnet_t *telnet,
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400105 unsigned char type, unsigned char *buffer, unsigned int size,
106 void *user_data);
Sean Middleditch6aef0732009-03-12 23:27:35 -0400107
108#endif /* !defined(LIBTELNET_INCLUDE) */