require option table to fix negotiation "race" issie (experimental)
diff --git a/libtelnet.h b/libtelnet.h
index 4ea72c5..c9f2583 100644
--- a/libtelnet.h
+++ b/libtelnet.h
@@ -15,6 +15,7 @@
/* forward declarations */
typedef struct telnet_t telnet_t;
typedef struct telnet_event_t telnet_event_t;
+typedef struct telnet_telopt_t telnet_telopt_t;
/* telnet special values */
#define TELNET_IAC 255
@@ -144,18 +145,24 @@
unsigned char command;
/* telopt info: for negotiation events SUBNEGOTIATION */
unsigned char telopt;
- /* accept status: for WILL and DO events */
- unsigned char accept;
};
/* event handler declaration */
typedef void (*telnet_event_handler_t)(telnet_t *telnet,
telnet_event_t *event, void *user_data);
+/* telopt support table element; use telopt of -1 for end marker */
+struct telnet_telopt_t {
+ short telopt;
+ short us:1, him:1;
+};
+
/* state tracker */
struct telnet_t {
/* user data */
void *ud;
+ /* telopt support table */
+ const telnet_telopt_t *telopts;
/* event handler */
telnet_event_handler_t eh;
#ifdef HAVE_ZLIB
@@ -181,8 +188,8 @@
};
/* initialize a telnet state tracker */
-extern void telnet_init(telnet_t *telnet, telnet_event_handler_t eh,
- unsigned char flags, void *user_data);
+extern void telnet_init(telnet_t *telnet, const telnet_telopt_t *telopts,
+ telnet_event_handler_t eh, unsigned char flags, void *user_data);
/* free up any memory allocated by a state tracker */
extern void telnet_free(telnet_t *telnet);