dont use a separate event for ZMP
diff --git a/libtelnet.c b/libtelnet.c
index 5eff06a..ba08c73 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -408,46 +408,53 @@
  * must be aborted and reprocessed due to COMPRESS2 being activated
  */
 static int _subnegotiate(telnet_t *telnet) {
-	/* invoke callback */
-	_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
-			telnet->buffer, telnet->buffer_pos, 0, 0);
+	const char **argv;
+	const char *c;
+	size_t i, argc;
 
+	switch (telnet->sb_telopt) {
+#ifdef HAVE_ZLIB
 	/* received COMPRESS2 begin marker, setup our zlib box and
 	 * start handling the compressed stream if it's not already.
 	 */
-#ifdef HAVE_ZLIB
-	if (telnet->sb_telopt == TELNET_TELOPT_COMPRESS2) {
-		if (_init_zlib(telnet, 0, 1) != TELNET_EOK)
-			return 0;
+	case TELNET_TELOPT_COMPRESS2:
+		if (telnet->sb_telopt == TELNET_TELOPT_COMPRESS2) {
+			if (_init_zlib(telnet, 0, 1) != TELNET_EOK)
+				return 0;
 
-		/* notify app that compression was enabled */
-		_event(telnet, TELNET_EV_COMPRESS, 1, 0, 0, 0, 0, 0);
-		return 1;
-	}
+			/* standard SB notification */
+			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+					telnet->buffer, telnet->buffer_pos, 0, 0);
+
+			/* notify app that compression was enabled */
+			_event(telnet, TELNET_EV_COMPRESS, 1, 0, 0, 0, 0, 0);
+			return 1;
+		}
+		break;
 #endif /* HAVE_ZLIB */
-
-	/* parse ZMP args */
-	if (telnet->sb_telopt == TELNET_TELOPT_ZMP) {
-		const char **argv;
-		const char *c = telnet->buffer;
-		size_t i, argc = 0;
-
+	/* ZMP command */
+	case TELNET_TELOPT_ZMP:
 		/* make sure this is a valid ZMP buffer */
-		if (telnet->buffer_pos == 0 || telnet->buffer[telnet->buffer_pos - 1]
-				!= 0)
+		if (telnet->buffer_pos == 0 ||
+				telnet->buffer[telnet->buffer_pos - 1] != 0) {
+			_error(telnet, __LINE__, __func__, TELNET_EPROTOCOL, 0,
+					"incomplete ZMP frame");
+			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+					telnet->buffer, telnet->buffer_pos, 0, 0);
 			return 0;
+		}
 
 		/* count arguments */
-		while (c != telnet->buffer + telnet->buffer_pos) {
-			++argc;
+		for (argc = 0, c = telnet->buffer; c != telnet->buffer +
+				telnet->buffer_pos; ++argc)
 			c += strlen(c) + 1;
-		}
 
 		/* allocate argument array, bail on error */
 		if ((argv = (const char **)malloc(sizeof(char *) * argc)) == 0) {
 			_error(telnet, __LINE__, __func__, TELNET_ENOMEM, 0,
 					"malloc() failed: %s", strerror(errno));
-			return 0;
+			_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+					telnet->buffer, telnet->buffer_pos, 0, 0);
 		}
 
 		/* populate argument array */
@@ -456,11 +463,18 @@
 			c += strlen(c) + 1;
 		}
 
-		/* invoke ZMP event */
-		_event(telnet, TELNET_EV_ZMP, 0, 0, 0, 0, argv, argc);
+		/* invoke event with our arguments */
+		_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+				telnet->buffer, telnet->buffer_pos, argv, argc);
 
 		/* free argument array */
 		free(argv);
+		break;
+	/* other generic subnegotiation */
+	default:
+		_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+				telnet->buffer, telnet->buffer_pos, 0, 0);
+		break;
 	}
 
 	return 0;