make use of a callback table instead of undefined functions for integration
diff --git a/libtelnet.h b/libtelnet.h
index 729bd50..821839f 100644
--- a/libtelnet.h
+++ b/libtelnet.h
@@ -12,6 +12,10 @@
#if !defined(LIBTELNET_INCLUDE)
#define LIBTELNET_INCLUDE 1
+/* forward declarations */
+struct libtelnet_t;
+struct libtelnet_cb_t;
+
/* telnet special values */
#define LIBTELNET_IAC 255
#define LIBTELNET_DONT 254
@@ -108,10 +112,40 @@
LIBTELNET_ERROR_UNKNOWN /* some crazy unexplainable unknown error */
};
+/* libtelnet callback declarations */
+struct libtelnet_cb_t {
+ /* received (processed) data */
+ void (*data)(struct libtelnet_t *telnet,
+ unsigned char *buffer, unsigned int size, void *user_data);
+ /* processed data to buffer for sending */
+ void (*send)(struct libtelnet_t *telnet,
+ unsigned char *buffer, unsigned int size, void *user_data);
+ /* unknown command notification */
+ void (*command)(struct libtelnet_t *telnet,
+ unsigned char cmd, void *user_data);
+ /* negotiation notification */
+ void (*negotiate)(struct libtelnet_t *telnet,
+ unsigned char cmd, unsigned char opt, void *user_data);
+ /* unknown subnegotiation notification */
+ void (*subnegotiation)(struct libtelnet_t *telnet,
+ unsigned char opt, unsigned char *data, unsigned int size,
+ void *user_data);
+ /* error handler */
+ void (*error)(struct libtelnet_t *telnet,
+ enum libtelnet_error_t error, void *user_data);
+
+ #ifdef HAVE_ZLIB
+ void (*compress)(struct libtelnet_t *telnet,
+ char enabled, void *user_data);
+ #endif
+};
+
/* state tracker */
struct libtelnet_t {
- /* zlib (mccp2) compression */
+ /* callback table */
+ struct libtelnet_cb_t *cb;
#ifdef HAVE_ZLIB
+ /* zlib (mccp2) compression */
z_stream *zlib;
#endif
/* sub-request buffer */
@@ -126,30 +160,9 @@
enum libtelnet_mode_t mode;
};
-/* libtelnet callback declarations
- * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
- */
-extern void libtelnet_data_cb(struct libtelnet_t *telnet,
- unsigned char *buffer, unsigned int size, void *user_data);
-extern void libtelnet_send_cb(struct libtelnet_t *telnet,
- unsigned char *buffer, unsigned int size, void *user_data);
-extern void libtelnet_command_cb(struct libtelnet_t *telnet,
- unsigned char cmd, void *user_data);
-extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
- unsigned char cmd, unsigned char opt, void *user_data);
-extern void libtelnet_subnegotiation_cb(struct libtelnet_t *telnet,
- unsigned char opt, unsigned char *data, unsigned int size,
- void *user_data);
-#ifdef HAVE_ZLIB
-extern void libtelnet_compress_cb(struct libtelnet_t *telnet,
- char enabled, void *user_data);
-#endif
-extern void libtelnet_error_cb(struct libtelnet_t *telnet,
- enum libtelnet_error_t error, void *user_data);
-
/* initialize a telnet state tracker */
extern void libtelnet_init(struct libtelnet_t *telnet,
- enum libtelnet_mode_t mode);
+ struct libtelnet_cb_t *cb, enum libtelnet_mode_t mode);
/* free up any memory allocated by a state tracker */
extern void libtelnet_free(struct libtelnet_t *telnet);