minor cleanups
diff --git a/libtelnet.c b/libtelnet.c
index 95b40dc..09ffd8d 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -48,13 +48,7 @@
#define Q_WANTYES_OP 5
/* buffer sizes */
-static const size_t _buffer_sizes[] = {
- 0,
- 512,
- 2048,
- 8192,
- 16384,
-};
+static const size_t _buffer_sizes[] = { 0, 512, 2048, 8192, 16384, };
static const size_t _buffer_sizes_count = sizeof(_buffer_sizes) /
sizeof(_buffer_sizes[0]);
@@ -416,12 +410,6 @@
* must be aborted and reprocessed due to COMPRESS2 being activated
*/
static int _subnegotiate(telnet_t *telnet) {
- const char **argv; /* for ZMP */
- char **argv2; /* for everything else */
- const char *c;
- const char *l;
- size_t i, argc;
-
switch (telnet->sb_telopt) {
#ifdef HAVE_ZLIB
/* received COMPRESS2 begin marker, setup our zlib box and
@@ -430,7 +418,7 @@
case TELNET_TELOPT_COMPRESS2:
if (telnet->sb_telopt == TELNET_TELOPT_COMPRESS2) {
if (_init_zlib(telnet, 0, 1) != TELNET_EOK)
- break;
+ return 0;
/* standard SB notification */
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
@@ -440,11 +428,14 @@
_event(telnet, TELNET_EV_COMPRESS, 1, 0, 0, 0, 0, 0);
return 1;
}
- break;
+ return 0;
#endif /* HAVE_ZLIB */
#ifdef HAVE_ALLOCA
+
/* ZMP command */
- case TELNET_TELOPT_ZMP:
+ case TELNET_TELOPT_ZMP: {
+ const char **argv, *c;
+ size_t i, argc;
/* make sure this is a valid ZMP buffer */
if (telnet->buffer_pos == 0 ||
telnet->buffer[telnet->buffer_pos - 1] != 0) {
@@ -452,7 +443,7 @@
"incomplete ZMP frame");
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
/* count arguments */
@@ -466,7 +457,7 @@
"alloca() failed: %s", strerror(errno));
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
/* populate argument array */
@@ -478,19 +469,24 @@
/* invoke event with our arguments */
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, argv, argc);
- break;
+ return 0;
+ }
+
/* any of a number of commands that use the form <BYTE>data<BYTE>data,
* including TTYPE, ENVIRON, NEW-ENVIRON, and MSSP
*/
case TELNET_TELOPT_TTYPE:
case TELNET_TELOPT_ENVIRON:
case TELNET_TELOPT_NEW_ENVIRON:
- case TELNET_TELOPT_MSSP:
+ case TELNET_TELOPT_MSSP: {
+ char **argv, *c, *l;
+ size_t i, argc;
+
/* if we have no data, just pass it through */
if (telnet->buffer_pos == 0) {
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
/* very first byte must be in range 0-3 */
@@ -499,7 +495,7 @@
"telopt %d subneg has invalid data", telnet->sb_telopt);
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
/* count arguments; each argument is preceded by a byte in the
@@ -512,49 +508,52 @@
++argc;
/* allocate argument array, bail on error */
- if ((argv2 = (char **)alloca(sizeof(char *) * argc)) == 0) {
+ if ((argv = (char **)alloca(sizeof(char *) * argc)) == 0) {
_error(telnet, __LINE__, __func__, TELNET_ENOMEM, 0,
"alloca() failed: %s", strerror(errno));
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
/* allocate strings in argument array */
for (i = 0, l = telnet->buffer; i != argc; ++i) {
+ /* search for end marker */
c = l + 1;
while (c != telnet->buffer + telnet->buffer_pos &&
(unsigned)*c > 3)
++c;
- argv2[i] = (char *)alloca(c - l + 1);
- l = c;
- /* FIXME: check failure */
- }
- /* populate argument array */
- for (i = 0, l = telnet->buffer; i != argc; ++i) {
- c = l + 1;
- while (c != telnet->buffer + telnet->buffer_pos &&
- (unsigned)*c > 3)
- ++c;
- memcpy(argv2[i], l, c - l);
- argv2[i][c - l] = 0;
+ /* allocate space; bail on error */
+ if ((argv[i] = (char *)alloca(c - l + 1)) == 0) {
+ _error(telnet, __LINE__, __func__, TELNET_ENOMEM, 0,
+ "alloca() failed: %s", strerror(errno));
+ _event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
+ telnet->buffer, telnet->buffer_pos, 0, 0);
+ return 0;
+ }
+
+ /* copy data */
+ memcpy(argv[i], l, c - l);
+ argv[i][c - l] = 0;
+
+ /* prepare for next loop */
l = c;
}
/* invoke event with our arguments */
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
- telnet->buffer, telnet->buffer_pos, (const char **)argv2, argc);
- break;
+ telnet->buffer, telnet->buffer_pos, (const char **)argv, argc);
+ return 0;
+ }
#endif /* HAVE_ALLOCA */
+
/* other generic subnegotiation */
default:
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
telnet->buffer, telnet->buffer_pos, 0, 0);
- break;
+ return 0;
}
-
- return 0;
}
/* initialize a telnet state tracker */