blob: 4efc87bec26e1a1286c9efc9a545f34ae48e601e [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 Middleditch30323022009-03-14 21:45:28 -040015/* forward declarations */
16struct libtelnet_t;
17struct libtelnet_cb_t;
18
Sean Middleditch29144852009-03-12 23:14:47 -040019/* telnet special values */
20#define LIBTELNET_IAC 255
21#define LIBTELNET_DONT 254
22#define LIBTELNET_DO 253
23#define LIBTELNET_WONT 252
24#define LIBTELNET_WILL 251
25#define LIBTELNET_SB 250
Sean Middleditchc04224b2009-03-14 18:30:57 -040026#define LIBTELNET_SB 250
27#define LIBTELNET_GA 249
28#define LIBTELNET_EL 248
29#define LIBTELNET_EC 247
30#define LIBTELNET_AYT 246
31#define LIBTELNET_AO 245
32#define LIBTELNET_IP 244
33#define LIBTELNET_BREAK 243
34#define LIBTELNET_DM 242
35#define LIBTELNET_NOP 241
Sean Middleditch29144852009-03-12 23:14:47 -040036#define LIBTELNET_SE 240
Sean Middleditchc04224b2009-03-14 18:30:57 -040037#define LIBTELNET_EOR 239
38#define LIBTELNET_ABORT 238
39#define LIBTELNET_SUSP 237
40#define LIBTELNET_EOF 236
Sean Middleditch29144852009-03-12 23:14:47 -040041
42/* telnet options */
Sean Middleditchc04224b2009-03-14 18:30:57 -040043#define LIBTELNET_TELOPT_BINARY 0
44#define LIBTELNET_TELOPT_ECHO 1
45#define LIBTELNET_TELOPT_RCP 2
46#define LIBTELNET_TELOPT_SGA 3
47#define LIBTELNET_TELOPT_NAMS 4
48#define LIBTELNET_TELOPT_STATUS 5
49#define LIBTELNET_TELOPT_TM 6
50#define LIBTELNET_TELOPT_RCTE 7
51#define LIBTELNET_TELOPT_NAOL 8
52#define LIBTELNET_TELOPT_NAOP 9
53#define LIBTELNET_TELOPT_NAOCRD 10
54#define LIBTELNET_TELOPT_NAOHTS 11
55#define LIBTELNET_TELOPT_NAOHTD 12
56#define LIBTELNET_TELOPT_NAOFFD 13
57#define LIBTELNET_TELOPT_NAOVTS 14
58#define LIBTELNET_TELOPT_NAOVTD 15
59#define LIBTELNET_TELOPT_NAOLFD 16
60#define LIBTELNET_TELOPT_XASCII 17
61#define LIBTELNET_TELOPT_LOGOUT 18
62#define LIBTELNET_TELOPT_BM 19
63#define LIBTELNET_TELOPT_DET 20
64#define LIBTELNET_TELOPT_SUPDUP 21
65#define LIBTELNET_TELOPT_SUPDUPOUTPUT 22
66#define LIBTELNET_TELOPT_SNDLOC 23
67#define LIBTELNET_TELOPT_TTYPE 24
68#define LIBTELNET_TELOPT_EOR 25
69#define LIBTELNET_TELOPT_TUID 26
70#define LIBTELNET_TELOPT_OUTMRK 27
71#define LIBTELNET_TELOPT_TTYLOC 28
72#define LIBTELNET_TELOPT_3270REGIME 29
73#define LIBTELNET_TELOPT_X3PAD 30
74#define LIBTELNET_TELOPT_NAWS 31
75#define LIBTELNET_TELOPT_TSPEED 32
76#define LIBTELNET_TELOPT_LFLOW 33
77#define LIBTELNET_TELOPT_LINEMODE 34
78#define LIBTELNET_TELOPT_XDISPLOC 35
79#define LIBTELNET_TELOPT_ENVIRON 36
80#define LIBTELNET_TELOPT_AUTHENTICATION 37
81#define LIBTELNET_TELOPT_ENCRYPT 38
82#define LIBTELNET_TELOPT_NEW_ENVIRON 39
83#define LIBTELNET_TELOPT_COMPRESS 85
84#define LIBTELNET_TELOPT_COMPRESS2 86
85#define LIBTELNET_TELOPT_ZMP 93
86#define LIBTELNET_TELOPT_EXOPL 255
Sean Middleditch29144852009-03-12 23:14:47 -040087
Sean Middleditch61f8eb62009-03-14 04:57:27 -040088/* libtelnet modes */
89enum libtelnet_mode_t {
90 LIBTELNET_MODE_SERVER = 0,
Sean Middleditch72cc9642009-03-15 11:50:36 -040091 LIBTELNET_MODE_CLIENT,
92 LIBTELNET_MODE_PROXY
Sean Middleditch61f8eb62009-03-14 04:57:27 -040093};
94
Sean Middleditch29144852009-03-12 23:14:47 -040095/* telnet states */
96enum libtelnet_state_t {
Sean Middleditch9de15982009-03-14 03:35:49 -040097 LIBTELNET_STATE_DATA = 0,
Sean Middleditch29144852009-03-12 23:14:47 -040098 LIBTELNET_STATE_IAC,
99 LIBTELNET_STATE_DO,
100 LIBTELNET_STATE_DONT,
101 LIBTELNET_STATE_WILL,
102 LIBTELNET_STATE_WONT,
103 LIBTELNET_STATE_SB,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400104 LIBTELNET_STATE_SB_IAC
Sean Middleditch29144852009-03-12 23:14:47 -0400105};
106
107/* error codes */
108enum libtelnet_error_t {
Sean Middleditchf66a7ee2009-03-15 11:54:07 -0400109 LIBTELNET_EOK = 0,
110 LIBTELNET_ENOMEM, /* memory allocation failure */
111 LIBTELNET_EOVERFLOW, /* data exceeds buffer size */
112 LIBTELNET_EPROTOCOL, /* invalid sequence of special bytes */
113 LIBTELNET_EUNKNOWN /* some crazy unexplainable unknown error */
Sean Middleditch29144852009-03-12 23:14:47 -0400114};
115
Sean Middleditch30323022009-03-14 21:45:28 -0400116/* libtelnet callback declarations */
117struct libtelnet_cb_t {
118 /* received (processed) data */
Sean Middleditchd922c6f2009-03-14 22:35:01 -0400119 void (*data)(struct libtelnet_t *telnet, unsigned char *buffer,
120 unsigned int size, void *user_data);
Sean Middleditch30323022009-03-14 21:45:28 -0400121 /* processed data to buffer for sending */
Sean Middleditchd922c6f2009-03-14 22:35:01 -0400122 void (*send)(struct libtelnet_t *telnet, unsigned char *buffer,
123 unsigned int size, void *user_data);
Sean Middleditch30323022009-03-14 21:45:28 -0400124 /* unknown command notification */
Sean Middleditchd922c6f2009-03-14 22:35:01 -0400125 void (*command)(struct libtelnet_t *telnet, unsigned char cmd,
Sean Middleditch30323022009-03-14 21:45:28 -0400126 void *user_data);
Sean Middleditchd922c6f2009-03-14 22:35:01 -0400127 /* negotiation notification */
128 void (*negotiate)(struct libtelnet_t *telnet, unsigned char cmd,
129 unsigned char opt, void *user_data);
130 /* unknown subnegotiation notification */
131 void (*subnegotiation)(struct libtelnet_t *telnet, unsigned char opt,
132 unsigned char *data, unsigned int size, void *user_data);
Sean Middleditch30323022009-03-14 21:45:28 -0400133 /* error handler */
Sean Middleditchd922c6f2009-03-14 22:35:01 -0400134 void (*error)(struct libtelnet_t *telnet, enum libtelnet_error_t error,
135 const char *msg, void *user_data);
Sean Middleditch30323022009-03-14 21:45:28 -0400136
137 #ifdef HAVE_ZLIB
138 void (*compress)(struct libtelnet_t *telnet,
139 char enabled, void *user_data);
140 #endif
141};
142
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400143/* state tracker */
144struct libtelnet_t {
Sean Middleditch30323022009-03-14 21:45:28 -0400145 /* callback table */
146 struct libtelnet_cb_t *cb;
Sean Middleditch9de15982009-03-14 03:35:49 -0400147#ifdef HAVE_ZLIB
Sean Middleditch30323022009-03-14 21:45:28 -0400148 /* zlib (mccp2) compression */
Sean Middleditch72cc9642009-03-15 11:50:36 -0400149 z_stream *z_deflate;
150 z_stream *z_inflate;
Sean Middleditch9de15982009-03-14 03:35:49 -0400151#endif
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400152 /* sub-request buffer */
153 unsigned char *buffer;
154 /* current size of the buffer */
155 unsigned int size;
156 /* length of data in the buffer */
157 unsigned int length;
158 /* current state */
159 enum libtelnet_state_t state;
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400160 /* processing mode */
161 enum libtelnet_mode_t mode;
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400162};
163
Sean Middleditch29144852009-03-12 23:14:47 -0400164/* initialize a telnet state tracker */
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400165extern void libtelnet_init(struct libtelnet_t *telnet,
Sean Middleditch30323022009-03-14 21:45:28 -0400166 struct libtelnet_cb_t *cb, enum libtelnet_mode_t mode);
Sean Middleditch29144852009-03-12 23:14:47 -0400167
168/* free up any memory allocated by a state tracker */
Sean Middleditch51ad6792009-03-13 20:15:59 -0400169extern void libtelnet_free(struct libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -0400170
Sean Middleditch29144852009-03-12 23:14:47 -0400171/* push a byte buffer into the state tracker */
Sean Middleditch8b5e2b12009-03-13 23:39:18 -0400172extern void libtelnet_push(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400173 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400174
175/* send an iac command */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400176extern void libtelnet_send_command(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400177 unsigned char cmd, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400178
179/* send negotiation */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400180extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400181 unsigned char cmd, unsigned char opt, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400182
183/* send non-command data (escapes IAC bytes) */
Sean Middleditchb1e452e2009-03-12 23:26:34 -0400184extern void libtelnet_send_data(struct libtelnet_t *telnet,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400185 unsigned char *buffer, unsigned int size, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400186
187/* send sub-request */
Sean Middleditch6b372882009-03-14 13:06:47 -0400188extern void libtelnet_send_subnegotiation(struct libtelnet_t *telnet,
Sean Middleditchc974b972009-03-14 13:23:33 -0400189 unsigned char opt, unsigned char *buffer, unsigned int size,
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400190 void *user_data);
Sean Middleditch6aef0732009-03-12 23:27:35 -0400191
192#endif /* !defined(LIBTELNET_INCLUDE) */