diff --git a/README b/README index 69a35ec..bcf98fe 100644 --- a/README +++ b/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 diff --git a/libtelnet.c b/libtelnet.c index eb04e0a..1f9e606 100644 --- a/libtelnet.c +++ b/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) diff --git a/libtelnet.h b/libtelnet.h index f9950ee..6a698c6 100644 --- a/libtelnet.h +++ b/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); diff --git a/telnet-client.c b/telnet-client.c index 2a82338..c79977b 100644 --- a/telnet-client.c +++ b/telnet-client.c @@ -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)); diff --git a/telnet-proxy.c b/telnet-proxy.c index 7f7d9dd..078806d 100644 --- a/telnet-proxy.c +++ b/telnet-proxy.c @@ -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 */