mirror of https://gerrit.osmocom.org/libtelnet
replace mode with flags (only a PROXY flag so far)
This commit is contained in:
parent
812358d92a
commit
08bb05f96e
13
README
13
README
|
@ -58,7 +58,7 @@ IIa. Initialization
|
|||
API calls.
|
||||
|
||||
void libtelnet_init(libtelnet_t *telnet, libtelnet_event_handler_t handler,
|
||||
libtelnet_mode_t mode, void *user_data);
|
||||
unsigned char flags, void *user_data);
|
||||
The libtelnet_init() function is responsible for initializing
|
||||
the data in a libtelnet_t structure. It must be called
|
||||
immediately after establishing a connection and before any other
|
||||
|
@ -73,13 +73,10 @@ IIa. Initialization
|
|||
information about the connection, including a socket descriptor
|
||||
for implementing LIBTELNET_EV_SEND event handling.
|
||||
|
||||
The mode parameter must be one of LIBTELNET_MODE_SERVER,
|
||||
LIBTELNET_MODE_CLIENT, or LIBTELNET_MODE_PROXY. These slightly
|
||||
alter the behavior of libtelnet in certain instances. If you are
|
||||
implementing a TELNET server, use the SERVER mode. If you are
|
||||
implementing a client, use the CLIENT mode. The PROXY mode
|
||||
enables special behavior for telnet-proxy (or similar
|
||||
applications).
|
||||
The flags parameter can be any of the following flag constants
|
||||
bit-or'd together, or 0 to leave all options disabled.
|
||||
|
||||
LIBTELNET_FLAG_PROXY - operate in proxy mode
|
||||
|
||||
boid libtelnet_free(libtelnet_t *telnet);
|
||||
Releases any internal memory allocated by libtelnet. This must
|
||||
|
|
16
libtelnet.c
16
libtelnet.c
|
@ -103,11 +103,11 @@ z_stream *_init_zlib(libtelnet_t *telnet, int deflate, int err_fatal) {
|
|||
|
||||
/* initialize a telnet state tracker */
|
||||
void libtelnet_init(libtelnet_t *telnet, libtelnet_event_handler_t eh,
|
||||
libtelnet_mode_t mode, void *user_data) {
|
||||
unsigned char flags, void *user_data) {
|
||||
memset(telnet, 0, sizeof(libtelnet_t));
|
||||
telnet->ud = user_data;
|
||||
telnet->eh = eh;
|
||||
telnet->mode = mode;
|
||||
telnet->flags = flags;
|
||||
}
|
||||
|
||||
/* free up any memory allocated by a state tracker */
|
||||
|
@ -288,8 +288,7 @@ static void _process(libtelnet_t *telnet, unsigned char *buffer,
|
|||
*/
|
||||
if (telnet->sb_telopt == LIBTELNET_TELOPT_COMPRESS2 &&
|
||||
telnet->z_inflate == 0 &&
|
||||
(telnet->mode == LIBTELNET_MODE_CLIENT ||
|
||||
telnet->mode == LIBTELNET_MODE_PROXY)) {
|
||||
telnet->flags & LIBTELNET_FLAG_PROXY) {
|
||||
|
||||
if ((telnet->z_inflate = _init_zlib(telnet, 0, 1)) == 0)
|
||||
break;
|
||||
|
@ -476,7 +475,7 @@ void libtelnet_send_subnegotiation(libtelnet_t *telnet, unsigned char opt,
|
|||
/* if we're a proxy and we just sent the COMPRESS2 marker, we must
|
||||
* make sure all further data is compressed if not already.
|
||||
*/
|
||||
if (telnet->mode == LIBTELNET_MODE_PROXY &&
|
||||
if (telnet->flags & LIBTELNET_FLAG_PROXY &&
|
||||
telnet->z_deflate == 0 &&
|
||||
opt == LIBTELNET_TELOPT_COMPRESS2) {
|
||||
|
||||
|
@ -499,13 +498,6 @@ void libtelnet_begin_compress2(libtelnet_t *telnet) {
|
|||
"compression already enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
/* only supported by servers */
|
||||
if (telnet->mode != LIBTELNET_MODE_SERVER) {
|
||||
_error(telnet, __LINE__, __func__, LIBTELNET_EBADVAL, 0,
|
||||
"only supported in SERVER mode");
|
||||
return;
|
||||
}
|
||||
|
||||
/* attempt to create output stream first, bail if we can't */
|
||||
if ((zlib = _init_zlib(telnet, 1, 0)) == 0)
|
||||
|
|
14
libtelnet.h
14
libtelnet.h
|
@ -89,12 +89,8 @@ typedef enum libtelnet_event_type_t libtelnet_event_type_t;
|
|||
#define LIBTELNET_TELOPT_ZMP 93
|
||||
#define LIBTELNET_TELOPT_EXOPL 255
|
||||
|
||||
/* libtelnet modes */
|
||||
enum libtelnet_mode_t {
|
||||
LIBTELNET_MODE_SERVER = 0,
|
||||
LIBTELNET_MODE_CLIENT,
|
||||
LIBTELNET_MODE_PROXY
|
||||
};
|
||||
/* libtelnet feature flags */
|
||||
#define LIBTELNET_FLAG_PROXY (1<<0)
|
||||
|
||||
/* telnet states */
|
||||
enum libtelnet_state_t {
|
||||
|
@ -167,15 +163,15 @@ struct libtelnet_t {
|
|||
unsigned int length;
|
||||
/* current state */
|
||||
enum libtelnet_state_t state;
|
||||
/* processing mode */
|
||||
enum libtelnet_mode_t mode;
|
||||
/* option flags */
|
||||
unsigned char flags;
|
||||
/* current subnegotiation telopt */
|
||||
unsigned char sb_telopt;
|
||||
};
|
||||
|
||||
/* initialize a telnet state tracker */
|
||||
extern void libtelnet_init(libtelnet_t *telnet, libtelnet_event_handler_t eh,
|
||||
libtelnet_mode_t mode, void *user_data);
|
||||
unsigned char flags, void *user_data);
|
||||
|
||||
/* free up any memory allocated by a state tracker */
|
||||
extern void libtelnet_free(libtelnet_t *telnet);
|
||||
|
|
|
@ -225,7 +225,7 @@ int main(int argc, char **argv) {
|
|||
do_echo = 1;
|
||||
|
||||
/* initialize telnet box */
|
||||
libtelnet_init(&telnet, _event_handler, LIBTELNET_MODE_CLIENT, &sock);
|
||||
libtelnet_init(&telnet, _event_handler, 0, &sock);
|
||||
|
||||
/* initialize poll descriptors */
|
||||
memset(pfd, 0, sizeof(pfd));
|
||||
|
|
|
@ -336,9 +336,9 @@ int main(int argc, char **argv) {
|
|||
client.remote = &server;
|
||||
|
||||
/* initialize telnet boxes */
|
||||
libtelnet_init(&server.telnet, _event_handler, LIBTELNET_MODE_PROXY,
|
||||
libtelnet_init(&server.telnet, _event_handler, LIBTELNET_FLAG_PROXY,
|
||||
&server);
|
||||
libtelnet_init(&client.telnet, _event_handler, LIBTELNET_MODE_PROXY,
|
||||
libtelnet_init(&client.telnet, _event_handler, LIBTELNET_FLAG_PROXY,
|
||||
&client);
|
||||
|
||||
/* initialize poll descriptors */
|
||||
|
|
Loading…
Reference in New Issue