minor cleanup, added libtelnet_send_telopt()
diff --git a/libtelnet.c b/libtelnet.c
index 5bf5295..cf786a9 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -206,13 +206,6 @@
telnet->q[telnet->q_size++] = q;
}
-/* send a negotiation without going through the RFC1143 checks */
-static void _send_negotiate(libtelnet_t *telnet, unsigned char cmd,
- unsigned char opt) {
- unsigned char bytes[3] = { LIBTELNET_IAC, cmd, opt };
- _send(telnet, bytes, 3);
-}
-
/* negotiation handling magic for RFC1143 */
static void _negotiate(libtelnet_t *telnet, unsigned char cmd,
unsigned char telopt) {
@@ -249,9 +242,9 @@
if (_event(telnet, LIBTELNET_EV_WILL, cmd, telopt, 0, 0) == 1) {
q.him = RFC1143_YES;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_DO, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_DO, telopt);
} else
- _send_negotiate(telnet, LIBTELNET_DONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_DONT, telopt);
break;
case RFC1143_YES:
break;
@@ -274,7 +267,7 @@
case RFC1143_WANTYES_OP:
q.him = RFC1143_WANTNO;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_DONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_DONT, telopt);
break;
}
break;
@@ -287,7 +280,7 @@
case RFC1143_YES:
q.him = RFC1143_NO;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_DONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_DONT, telopt);
_event(telnet, LIBTELNET_EV_WONT, 0, telopt,
0, 0);
break;
@@ -318,9 +311,9 @@
if (_event(telnet, LIBTELNET_EV_DO, cmd, telopt, 0, 0) == 1) {
q.us = RFC1143_YES;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_WILL, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_WILL, telopt);
} else
- _send_negotiate(telnet, LIBTELNET_WONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_WONT, telopt);
break;
case RFC1143_YES:
break;
@@ -343,7 +336,7 @@
case RFC1143_WANTYES_OP:
q.us = RFC1143_WANTNO;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_WONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_WONT, telopt);
break;
}
break;
@@ -356,7 +349,7 @@
case RFC1143_YES:
q.us = RFC1143_NO;
_set_rfc1143(telnet, q);
- _send_negotiate(telnet, LIBTELNET_WONT, telopt);
+ libtelnet_send_telopt(telnet, LIBTELNET_WONT, telopt);
_event(telnet, LIBTELNET_EV_DONT, 0, telopt, 0, 0);
break;
case RFC1143_WANTNO:
@@ -673,6 +666,13 @@
_send(telnet, bytes, 2);
}
+/* send an iac command with telopt */
+void libtelnet_send_telopt(libtelnet_t *telnet, unsigned char cmd,
+ unsigned char telopt) {
+ unsigned char bytes[3] = { LIBTELNET_IAC, cmd, telopt };
+ _send(telnet, bytes, 3);
+}
+
/* send negotiation */
void libtelnet_send_negotiate(libtelnet_t *telnet, unsigned char cmd,
unsigned char telopt) {
@@ -814,10 +814,9 @@
}
/* send sub-request */
-void libtelnet_send_subnegotiation(libtelnet_t *telnet, unsigned char opt,
+void libtelnet_send_subnegotiation(libtelnet_t *telnet, unsigned char telopt,
unsigned char *buffer, unsigned int size) {
- libtelnet_send_command(telnet, LIBTELNET_SB);
- libtelnet_send_data(telnet, &opt, 1);
+ libtelnet_send_telopt(telnet, LIBTELNET_SB, telopt);
libtelnet_send_data(telnet, buffer, size);
libtelnet_send_command(telnet, LIBTELNET_SE);
@@ -826,8 +825,7 @@
* make sure all further data is compressed if not already.
*/
if (telnet->flags & LIBTELNET_FLAG_PROXY &&
- telnet->z == 0 &&
- opt == LIBTELNET_TELOPT_COMPRESS2) {
+ telopt == LIBTELNET_TELOPT_COMPRESS2) {
if (_init_zlib(telnet, 1, 1) != LIBTELNET_EOK)
return;
@@ -852,5 +850,8 @@
* the compress marker itself being compressed.
*/
_event(telnet, LIBTELNET_EV_SEND, 0, 0, compress2, sizeof(compress2));
+
+ /* notify app that compression was successfully enabled */
+ _event(telnet, LIBTELNET_EV_COMPRESS, 1, 0, 0, 0);
#endif /* HAVE_ZLIB */
}