blob: f9950ee32e95099b58eef1155b0f4ecdecad7ee9 [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 */
Sean Middleditch812358d2009-03-15 23:24:03 -040016typedef struct libtelnet_t libtelnet_t;
17typedef struct libtelnet_event_t libtelnet_event_t;
18typedef enum libtelnet_mode_t libtelnet_mode_t;
19typedef enum libtelnet_state_t libtelnet_state_t;
20typedef enum libtelnet_error_t libtelnet_error_t;
21typedef enum libtelnet_event_type_t libtelnet_event_type_t;
Sean Middleditch30323022009-03-14 21:45:28 -040022
Sean Middleditch29144852009-03-12 23:14:47 -040023/* telnet special values */
24#define LIBTELNET_IAC 255
25#define LIBTELNET_DONT 254
26#define LIBTELNET_DO 253
27#define LIBTELNET_WONT 252
28#define LIBTELNET_WILL 251
29#define LIBTELNET_SB 250
Sean Middleditchc04224b2009-03-14 18:30:57 -040030#define LIBTELNET_SB 250
31#define LIBTELNET_GA 249
32#define LIBTELNET_EL 248
33#define LIBTELNET_EC 247
34#define LIBTELNET_AYT 246
35#define LIBTELNET_AO 245
36#define LIBTELNET_IP 244
37#define LIBTELNET_BREAK 243
38#define LIBTELNET_DM 242
39#define LIBTELNET_NOP 241
Sean Middleditch29144852009-03-12 23:14:47 -040040#define LIBTELNET_SE 240
Sean Middleditchc04224b2009-03-14 18:30:57 -040041#define LIBTELNET_EOR 239
42#define LIBTELNET_ABORT 238
43#define LIBTELNET_SUSP 237
44#define LIBTELNET_EOF 236
Sean Middleditch29144852009-03-12 23:14:47 -040045
46/* telnet options */
Sean Middleditchc04224b2009-03-14 18:30:57 -040047#define LIBTELNET_TELOPT_BINARY 0
48#define LIBTELNET_TELOPT_ECHO 1
49#define LIBTELNET_TELOPT_RCP 2
50#define LIBTELNET_TELOPT_SGA 3
51#define LIBTELNET_TELOPT_NAMS 4
52#define LIBTELNET_TELOPT_STATUS 5
53#define LIBTELNET_TELOPT_TM 6
54#define LIBTELNET_TELOPT_RCTE 7
55#define LIBTELNET_TELOPT_NAOL 8
56#define LIBTELNET_TELOPT_NAOP 9
57#define LIBTELNET_TELOPT_NAOCRD 10
58#define LIBTELNET_TELOPT_NAOHTS 11
59#define LIBTELNET_TELOPT_NAOHTD 12
60#define LIBTELNET_TELOPT_NAOFFD 13
61#define LIBTELNET_TELOPT_NAOVTS 14
62#define LIBTELNET_TELOPT_NAOVTD 15
63#define LIBTELNET_TELOPT_NAOLFD 16
64#define LIBTELNET_TELOPT_XASCII 17
65#define LIBTELNET_TELOPT_LOGOUT 18
66#define LIBTELNET_TELOPT_BM 19
67#define LIBTELNET_TELOPT_DET 20
68#define LIBTELNET_TELOPT_SUPDUP 21
69#define LIBTELNET_TELOPT_SUPDUPOUTPUT 22
70#define LIBTELNET_TELOPT_SNDLOC 23
71#define LIBTELNET_TELOPT_TTYPE 24
72#define LIBTELNET_TELOPT_EOR 25
73#define LIBTELNET_TELOPT_TUID 26
74#define LIBTELNET_TELOPT_OUTMRK 27
75#define LIBTELNET_TELOPT_TTYLOC 28
76#define LIBTELNET_TELOPT_3270REGIME 29
77#define LIBTELNET_TELOPT_X3PAD 30
78#define LIBTELNET_TELOPT_NAWS 31
79#define LIBTELNET_TELOPT_TSPEED 32
80#define LIBTELNET_TELOPT_LFLOW 33
81#define LIBTELNET_TELOPT_LINEMODE 34
82#define LIBTELNET_TELOPT_XDISPLOC 35
83#define LIBTELNET_TELOPT_ENVIRON 36
84#define LIBTELNET_TELOPT_AUTHENTICATION 37
85#define LIBTELNET_TELOPT_ENCRYPT 38
86#define LIBTELNET_TELOPT_NEW_ENVIRON 39
87#define LIBTELNET_TELOPT_COMPRESS 85
88#define LIBTELNET_TELOPT_COMPRESS2 86
89#define LIBTELNET_TELOPT_ZMP 93
90#define LIBTELNET_TELOPT_EXOPL 255
Sean Middleditch29144852009-03-12 23:14:47 -040091
Sean Middleditch61f8eb62009-03-14 04:57:27 -040092/* libtelnet modes */
93enum libtelnet_mode_t {
94 LIBTELNET_MODE_SERVER = 0,
Sean Middleditch72cc9642009-03-15 11:50:36 -040095 LIBTELNET_MODE_CLIENT,
96 LIBTELNET_MODE_PROXY
Sean Middleditch61f8eb62009-03-14 04:57:27 -040097};
98
Sean Middleditch29144852009-03-12 23:14:47 -040099/* telnet states */
100enum libtelnet_state_t {
Sean Middleditch9de15982009-03-14 03:35:49 -0400101 LIBTELNET_STATE_DATA = 0,
Sean Middleditch29144852009-03-12 23:14:47 -0400102 LIBTELNET_STATE_IAC,
103 LIBTELNET_STATE_DO,
104 LIBTELNET_STATE_DONT,
105 LIBTELNET_STATE_WILL,
106 LIBTELNET_STATE_WONT,
107 LIBTELNET_STATE_SB,
Sean Middleditchda0e6952009-03-15 13:28:09 -0400108 LIBTELNET_STATE_SB_DATA,
109 LIBTELNET_STATE_SB_DATA_IAC
Sean Middleditch29144852009-03-12 23:14:47 -0400110};
111
112/* error codes */
113enum libtelnet_error_t {
Sean Middleditchf66a7ee2009-03-15 11:54:07 -0400114 LIBTELNET_EOK = 0,
Sean Middleditch16992272009-03-15 19:42:03 -0400115 LIBTELNET_EBADVAL, /* invalid parameter, or API misuse */
Sean Middleditchf66a7ee2009-03-15 11:54:07 -0400116 LIBTELNET_ENOMEM, /* memory allocation failure */
117 LIBTELNET_EOVERFLOW, /* data exceeds buffer size */
118 LIBTELNET_EPROTOCOL, /* invalid sequence of special bytes */
Sean Middleditch16992272009-03-15 19:42:03 -0400119 LIBTELNET_ECOMPRESS /* error handling compressed streams */
Sean Middleditch29144852009-03-12 23:14:47 -0400120};
121
Sean Middleditch637df7f2009-03-15 12:57:32 -0400122/* event codes */
123enum libtelnet_event_type_t {
124 LIBTELNET_EV_DATA = 0,
125 LIBTELNET_EV_SEND,
126 LIBTELNET_EV_IAC,
127 LIBTELNET_EV_NEGOTIATE,
128 LIBTELNET_EV_SUBNEGOTIATION,
129 LIBTELNET_EV_COMPRESS,
Sean Middleditch16992272009-03-15 19:42:03 -0400130 LIBTELNET_EV_WARNING,
Sean Middleditch637df7f2009-03-15 12:57:32 -0400131 LIBTELNET_EV_ERROR
Sean Middleditch30323022009-03-14 21:45:28 -0400132};
133
Sean Middleditch637df7f2009-03-15 12:57:32 -0400134/* event information */
135struct libtelnet_event_t {
136 /* type of event */
137 enum libtelnet_event_type_t type;
138 /* command info: only for IAC event */
139 unsigned char command;
140 /* telopt info: for NEGOTIATE and SUBNEGOTIATION events */
141 unsigned char telopt;
142 /* data buffer: for DATA, SEND, SUBNEGOTIATION, and ERROR events */
143 unsigned char *buffer;
144 unsigned int size;
145};
146
147/* event handler declaration */
Sean Middleditch812358d2009-03-15 23:24:03 -0400148typedef void (*libtelnet_event_handler_t)(libtelnet_t *telnet,
149 libtelnet_event_t *event, void *user_data);
Sean Middleditch637df7f2009-03-15 12:57:32 -0400150
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400151/* state tracker */
152struct libtelnet_t {
Sean Middleditch9f79cc52009-03-15 13:39:24 -0400153 /* user data */
154 void *ud;
Sean Middleditch637df7f2009-03-15 12:57:32 -0400155 /* event handler */
156 libtelnet_event_handler_t eh;
Sean Middleditch9de15982009-03-14 03:35:49 -0400157#ifdef HAVE_ZLIB
Sean Middleditch30323022009-03-14 21:45:28 -0400158 /* zlib (mccp2) compression */
Sean Middleditch72cc9642009-03-15 11:50:36 -0400159 z_stream *z_deflate;
160 z_stream *z_inflate;
Sean Middleditch9de15982009-03-14 03:35:49 -0400161#endif
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400162 /* sub-request buffer */
163 unsigned char *buffer;
164 /* current size of the buffer */
165 unsigned int size;
166 /* length of data in the buffer */
167 unsigned int length;
168 /* current state */
169 enum libtelnet_state_t state;
Sean Middleditch61f8eb62009-03-14 04:57:27 -0400170 /* processing mode */
171 enum libtelnet_mode_t mode;
Sean Middleditchda0e6952009-03-15 13:28:09 -0400172 /* current subnegotiation telopt */
173 unsigned char sb_telopt;
Sean Middleditch4d9444d2009-03-13 22:48:05 -0400174};
175
Sean Middleditch29144852009-03-12 23:14:47 -0400176/* initialize a telnet state tracker */
Sean Middleditch812358d2009-03-15 23:24:03 -0400177extern void libtelnet_init(libtelnet_t *telnet, libtelnet_event_handler_t eh,
178 libtelnet_mode_t mode, void *user_data);
Sean Middleditch29144852009-03-12 23:14:47 -0400179
180/* free up any memory allocated by a state tracker */
Sean Middleditch812358d2009-03-15 23:24:03 -0400181extern void libtelnet_free(libtelnet_t *telnet);
Sean Middleditch29144852009-03-12 23:14:47 -0400182
Sean Middleditch29144852009-03-12 23:14:47 -0400183/* push a byte buffer into the state tracker */
Sean Middleditch812358d2009-03-15 23:24:03 -0400184extern void libtelnet_push(libtelnet_t *telnet, unsigned char *buffer,
185 unsigned int size);
Sean Middleditch29144852009-03-12 23:14:47 -0400186
187/* send an iac command */
Sean Middleditch812358d2009-03-15 23:24:03 -0400188extern void libtelnet_send_command(libtelnet_t *telnet, unsigned char cmd);
Sean Middleditch29144852009-03-12 23:14:47 -0400189
190/* send negotiation */
Sean Middleditch812358d2009-03-15 23:24:03 -0400191extern void libtelnet_send_negotiate(libtelnet_t *telnet, unsigned char cmd,
192 unsigned char opt);
Sean Middleditch29144852009-03-12 23:14:47 -0400193
194/* send non-command data (escapes IAC bytes) */
Sean Middleditch812358d2009-03-15 23:24:03 -0400195extern void libtelnet_send_data(libtelnet_t *telnet, unsigned char *buffer,
196 unsigned int size);
Sean Middleditch29144852009-03-12 23:14:47 -0400197
198/* send sub-request */
Sean Middleditch812358d2009-03-15 23:24:03 -0400199extern void libtelnet_send_subnegotiation(libtelnet_t *telnet,
Sean Middleditch9f79cc52009-03-15 13:39:24 -0400200 unsigned char opt, unsigned char *buffer, unsigned int size);
Sean Middleditch6aef0732009-03-12 23:27:35 -0400201
Sean Middleditch124a1c22009-03-15 13:20:03 -0400202/* begin sending compressed data (server only) */
Sean Middleditch812358d2009-03-15 23:24:03 -0400203extern void libtelnet_begin_compress2(libtelnet_t *telnet);
Sean Middleditch124a1c22009-03-15 13:20:03 -0400204
Sean Middleditch6aef0732009-03-12 23:27:35 -0400205#endif /* !defined(LIBTELNET_INCLUDE) */