blob: 729bd502f8c057c8fd64060603ce1e12306c1351 [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)
Sean Middleditchaac2c122009-03-14 18:31:26 -040013#define LIBTELNET_INCLUDE 1
Sean Middleditch6aef0732009-03-12 23:27:35 -040014
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
Sean Middleditchc04224b2009-03-14 18:30:57 -040022#define LIBTELNET_SB 250
23#define LIBTELNET_GA 249
24#define LIBTELNET_EL 248
25#define LIBTELNET_EC 247
26#define LIBTELNET_AYT 246
27#define LIBTELNET_AO 245
28#define LIBTELNET_IP 244
29#define LIBTELNET_BREAK 243
30#define LIBTELNET_DM 242
31#define LIBTELNET_NOP 241
Sean Middleditch29144852009-03-12 23:14:47 -040032#define LIBTELNET_SE 240
Sean Middleditchc04224b2009-03-14 18:30:57 -040033#define LIBTELNET_EOR 239
34#define LIBTELNET_ABORT 238
35#define LIBTELNET_SUSP 237
36#define LIBTELNET_EOF 236
Sean Middleditch29144852009-03-12 23:14:47 -040037
38/* telnet options */
Sean Middleditchc04224b2009-03-14 18:30:57 -040039#define LIBTELNET_TELOPT_BINARY 0
40#define LIBTELNET_TELOPT_ECHO 1
41#define LIBTELNET_TELOPT_RCP 2
42#define LIBTELNET_TELOPT_SGA 3
43#define LIBTELNET_TELOPT_NAMS 4
44#define LIBTELNET_TELOPT_STATUS 5
45#define LIBTELNET_TELOPT_TM 6
46#define LIBTELNET_TELOPT_RCTE 7
47#define LIBTELNET_TELOPT_NAOL 8
48#define LIBTELNET_TELOPT_NAOP 9
49#define LIBTELNET_TELOPT_NAOCRD 10
50#define LIBTELNET_TELOPT_NAOHTS 11
51#define LIBTELNET_TELOPT_NAOHTD 12
52#define LIBTELNET_TELOPT_NAOFFD 13
53#define LIBTELNET_TELOPT_NAOVTS 14
54#define LIBTELNET_TELOPT_NAOVTD 15
55#define LIBTELNET_TELOPT_NAOLFD 16
56#define LIBTELNET_TELOPT_XASCII 17
57#define LIBTELNET_TELOPT_LOGOUT 18
58#define LIBTELNET_TELOPT_BM 19
59#define LIBTELNET_TELOPT_DET 20
60#define LIBTELNET_TELOPT_SUPDUP 21
61#define LIBTELNET_TELOPT_SUPDUPOUTPUT 22
62#define LIBTELNET_TELOPT_SNDLOC 23
63#define LIBTELNET_TELOPT_TTYPE 24
64#define LIBTELNET_TELOPT_EOR 25
65#define LIBTELNET_TELOPT_TUID 26
66#define LIBTELNET_TELOPT_OUTMRK 27
67#define LIBTELNET_TELOPT_TTYLOC 28
68#define LIBTELNET_TELOPT_3270REGIME 29
69#define LIBTELNET_TELOPT_X3PAD 30
70#define LIBTELNET_TELOPT_NAWS 31
71#define LIBTELNET_TELOPT_TSPEED 32
72#define LIBTELNET_TELOPT_LFLOW 33
73#define LIBTELNET_TELOPT_LINEMODE 34
74#define LIBTELNET_TELOPT_XDISPLOC 35
75#define LIBTELNET_TELOPT_ENVIRON 36
76#define LIBTELNET_TELOPT_AUTHENTICATION 37
77#define LIBTELNET_TELOPT_ENCRYPT 38
78#define LIBTELNET_TELOPT_NEW_ENVIRON 39
79#define LIBTELNET_TELOPT_COMPRESS 85
80#define LIBTELNET_TELOPT_COMPRESS2 86
81#define LIBTELNET_TELOPT_ZMP 93
82#define LIBTELNET_TELOPT_EXOPL 255
Sean Middleditch29144852009-03-12 23:14:47 -040083
Sean Middleditch61f8eb62009-03-14 04:57:27 -040084/* libtelnet modes */
85enum libtelnet_mode_t {
86 LIBTELNET_MODE_SERVER = 0,
87 LIBTELNET_MODE_CLIENT
88};
89
Sean Middleditch29144852009-03-12 23:14:47 -040090/* telnet states */
91enum libtelnet_state_t {
Sean Middleditch9de15982009-03-14 03:35:49 -040092 LIBTELNET_STATE_DATA = 0,
Sean Middleditch29144852009-03-12 23:14:47 -040093 LIBTELNET_STATE_IAC,
94 LIBTELNET_STATE_DO,
95 LIBTELNET_STATE_DONT,
96 LIBTELNET_STATE_WILL,
97 LIBTELNET_STATE_WONT,
98 LIBTELNET_STATE_SB,
Sean Middleditch61f8eb62009-03-14 04:57:27 -040099 LIBTELNET_STATE_SB_IAC
Sean Middleditch29144852009-03-12 23:14:47 -0400100};
101
102/* error codes */
103enum libtelnet_error_t {
104 LIBTELNET_ERROR_OK = 0,
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400105 LIBTELNET_ERROR_NOMEM, /* memory allocation failure */
Sean Middleditch78f400f2009-03-14 01:26:43 -0400106 LIBTELNET_ERROR_OVERFLOW, /* data exceeds buffer size */
Sean Middleditch29144852009-03-12 23:14:47 -0400107 LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400108 LIBTELNET_ERROR_UNKNOWN /* some crazy unexplainable unknown error */
Sean Middleditch29144852009-03-12 23:14:47 -0400109};
110
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400111/* state tracker */
112struct libtelnet_t {
Sean Middleditch9de15982009-03-14 03:35:49 -0400113 /* zlib (mccp2) compression */
114#ifdef HAVE_ZLIB
115 z_stream *zlib;
116#endif
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400117 /* sub-request buffer */
118 unsigned char *buffer;
119 /* current size of the buffer */
120 unsigned int size;
121 /* length of data in the buffer */
122 unsigned int length;
123 /* current state */
124 enum libtelnet_state_t state;
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400125 /* processing mode */
126 enum libtelnet_mode_t mode;
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400127};
128
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400129/* libtelnet callback declarations
130 * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
131 */
Sean Middleditch78f400f2009-03-14 01:26:43 -0400132extern void libtelnet_data_cb(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400133 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch78f400f2009-03-14 01:26:43 -0400134extern void libtelnet_send_cb(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400135 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400136extern void libtelnet_command_cb(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400137 unsigned char cmd, void *user_data);
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400138extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400139 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch6b372882009-03-14 13:06:47 -0400140extern void libtelnet_subnegotiation_cb(struct libtelnet_t *telnet,
Sean Middleditchc974b972009-03-14 13:23:33 -0400141 unsigned char opt, unsigned char *data, unsigned int size,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400142 void *user_data);
143#ifdef HAVE_ZLIB
144extern void libtelnet_compress_cb(struct libtelnet_t *telnet,
145 char enabled, void *user_data);
146#endif
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400147extern void libtelnet_error_cb(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400148 enum libtelnet_error_t error, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400149
150/* initialize a telnet state tracker */
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400151extern void libtelnet_init(struct libtelnet_t *telnet,
152 enum libtelnet_mode_t mode);
Sean Middleditch29144852009-03-12 23:14:47 -0400153
154/* free up any memory allocated by a state tracker */
Sean Middleditch51ad6792009-03-13 20:15:59 -0400155extern void libtelnet_free(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -0400156
Sean Middleditch29144852009-03-12 23:14:47 -0400157/* push a byte buffer into the state tracker */
Sean Middleditch8b5e2b12009-03-13 23:39:18 -0400158extern void libtelnet_push(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400159 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400160
161/* send an iac command */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400162extern void libtelnet_send_command(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400163 unsigned char cmd, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400164
165/* send negotiation */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400166extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400167 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400168
169/* send non-command data (escapes IAC bytes) */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400170extern void libtelnet_send_data(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400171 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400172
173/* send sub-request */
Sean Middleditch6b372882009-03-14 13:06:47 -0400174extern void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
Sean Middleditchc974b972009-03-14 13:23:33 -0400175 unsigned char opt, unsigned char *buffer, unsigned int size,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400176 void *user_data);
Sean Middleditch6aef0732009-03-12 23:27:35 -0400177
178#endif /* !defined(LIBTELNET_INCLUDE) */