initial commit
diff --git a/libtelnet.h b/libtelnet.h
new file mode 100644
index 0000000..a3cba24
--- /dev/null
+++ b/libtelnet.h
@@ -0,0 +1,111 @@
+/*
+ * The author or authors of this code dedicate any and all copyright interest
+ * in this code to the public domain. We make this dedication for the benefit
+ * of the public at large and to the detriment of our heirs and successors. We
+ * intend this dedication to be an overt act of relinquishment in perpetuity of
+ * all present and future rights to this code under copyright law.
+ */
+
+/* sub request buffer size increment (defualt 4K) */
+#define LIBTELNET_BUFFER_SIZE (4 * 1024)
+/* sub request buffer size (default 16K) */
+#define LIBTELNET_BUFFER_SIZE_MAX (16 * 1024)
+
+/* telnet special values */
+#define LIBTELNET_IAC 255
+#define LIBTELNET_DONT 254
+#define LIBTELNET_DO 253
+#define LIBTELNET_WONT 252
+#define LIBTELNET_WILL 251
+#define LIBTELNET_SB 250
+#define LIBTELNET_SE 240
+
+/* telnet options */
+#define LIBTELNET_OPTION_BINARY 0
+#define LIBTELNET_OPTION_ECHO 1
+#define LIBTELNET_OPTION_NAWS 31
+#define LIBTELNET_OPTION_ZMP 93
+
+/* telnet states */
+enum libtelnet_state_t {
+ LIBTELNET_STATE_TEXT = 0,
+ LIBTELNET_STATE_IAC,
+ LIBTELNET_STATE_DO,
+ LIBTELNET_STATE_DONT,
+ LIBTELNET_STATE_WILL,
+ LIBTELNET_STATE_WONT,
+ LIBTELNET_STATE_SB,
+ LIBTELNET_STATE_SB_IAC,
+};
+
+/* error codes */
+enum libtelnet_error_t {
+ LIBTELNET_ERROR_OK = 0,
+ LIBTELNET_ERROR_OVERFLOW, /* input exceeds buffer size */
+ LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
+ LIBTELNET_ERROR_UNKNOWN, /* some crazy unexplainable unknown error */
+};
+
+/* callback prototypes */
+typedef (void)(*libtelnet_input)(struct libtelnet_t *telnet, unsigned char
+ byte, void *user_data);
+typedef (void)(*libtelnet_output)(struct libtelnet_t *telnet, unsigned char
+ byte, void *user_data);
+typedef (void)(*libtelnet_command)(struct libtelnet_t *telnet, unsigned char
+ cmd, void *user_data);
+typedef (void)(*libtelnet_negotiate)(struct libtelnet_t *telnet, unsigned char
+ cmd, unsigned char opt, void *user_data);
+typedef (void)(*libtelnet_subrequest)(struct libtelnet_t *telnet, unsigned char
+ cmd, unsigned char type, unsigned char *data, size_t size,
+ void *user_data);
+typedef (void)(*libtelnet_error)(struct libtelnet_t *telnet,
+ enum libtelnet_error_t error, void *user_data);
+
+/* state tracker */
+struct libtelnet_t {
+ /* current state */
+ enum libtelnet_state_t state;
+ /* sub-request buffer */
+ char *buffer;
+ /* current size of the buffer */
+ size_t size;
+ /* length of data in the buffer */
+ size_t length;
+
+ /* callbacks */
+ libtelnet_input input_cb;
+ libtelnet_output output_cb;
+ libtelnet_command command_cb;
+ libtelnet_negotiate negotiate_cb;
+ libtelnet_subrequest subrequest_cb;
+};
+
+/* initialize a telnet state tracker */
+void libtelnet_init(struct libtelnet_t *telnet);
+
+/* free up any memory allocated by a state tracker */
+void libtelnet_close(struct libtelnet_t *telnet);
+
+/* push a single byte into the state tracker */
+void libtelnet_push_byte(struct libtelnet_t *telnet, unsigned char byte,
+ void *user_data);
+
+/* push a byte buffer into the state tracker */
+void libtelnet_push_buffer(struct libtelnet_t *telnet, unsigned char *buffer,
+ size_t size, void *user_data);
+
+/* send an iac command */
+void libtelnet_send_command(struct libtelnet_t *telnet, unsigned char cmd,
+ void *user_data);
+
+/* send negotiation */
+void libtelnet_send_negotiate(struct libtelnet_t *telnet, unsigned char cmd,
+ unsigned char opt, void *user_data);
+
+/* send non-command data (escapes IAC bytes) */
+void libtelnet_send_data(struct libtelnet_t *telnet, unsigned char *buffer,
+ size_t size, void *user_data);
+
+/* send sub-request */
+void libtelnet_send_subrequest(struct libtelnet_t *telnet, unsigned char type,
+ unsigned char *buffer, size_t size, void *user_data);