aboutsummaryrefslogtreecommitdiff
path: root/cc3200/telnet
diff options
context:
space:
mode:
authorMatt Anderson2015-04-26 08:34:01 -0400
committerDaniel Campora2015-04-28 16:48:26 +0200
commit04588330726547fd10e1f9df05580fc29da0e0e4 (patch)
tree24bb38153252e03db8f8f21bf589f7b943271f1e /cc3200/telnet
parentabea1c38a94183999c07c848f0b48ca55b42b653 (diff)
cc3200: Make telnet login procedure work with Tera Term.
This is actually a workaround Ter Term's issue of not obeying to the telnet options that the server is sending. Therefore, we must buffer chars until either a '\r' or the max length of the username/password is received.
Diffstat (limited to 'cc3200/telnet')
-rw-r--r--cc3200/telnet/telnet.c55
1 files changed, 40 insertions, 15 deletions
diff --git a/cc3200/telnet/telnet.c b/cc3200/telnet/telnet.c
index 4100cec61..b96a09521 100644
--- a/cc3200/telnet/telnet.c
+++ b/cc3200/telnet/telnet.c
@@ -142,6 +142,28 @@ void telnet_init (void) {
telnet_data.state = E_TELNET_STE_DISABLED;
}
+
+static int telnet_process_credential (char *credential, _i16 rxLen) {
+ telnet_data.rxWindex += rxLen;
+ if (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX) {
+ telnet_data.rxWindex = SERVERS_USER_PASS_LEN_MAX;
+ }
+
+ uint8_t *p = telnet_data.rxBuffer + SERVERS_USER_PASS_LEN_MAX;
+ // if a '\r' is found, or the length exceeds the max username length
+ if ((p = memchr(telnet_data.rxBuffer, '\r', telnet_data.rxWindex)) || (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX)) {
+ uint8_t len = p - telnet_data.rxBuffer;
+
+ telnet_data.rxWindex = 0;
+ if ((len > 0) && (memcmp(credential, telnet_data.rxBuffer, MAX(len, strlen(credential))) == 0)) {
+ return 1;
+ }
+ return -1;
+ }
+ return 0;
+}
+
+
void telnet_run (void) {
_i16 rxLen;
switch (telnet_data.state) {
@@ -170,12 +192,14 @@ void telnet_run (void) {
telnet_send_and_proceed((void *)telnet_request_user, strlen(telnet_request_user), E_TELNET_STE_SUB_GET_USER);
break;
case E_TELNET_STE_SUB_GET_USER:
- if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) {
- // Skip /r/n
- if (rxLen < 2 || memcmp(servers_user, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_user)))) {
- telnet_data.credentialsValid = false;
+ if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
+ TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
+ &rxLen)) {
+ int result;
+ if ((result = telnet_process_credential (servers_user, rxLen))) {
+ telnet_data.credentialsValid = result > 0 ? true : false;
+ telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
}
- telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
}
break;
case E_TELNET_STE_SUB_REQ_PASSWORD:
@@ -187,16 +211,17 @@ void telnet_run (void) {
telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_GET_PASSWORD);
break;
case E_TELNET_STE_SUB_GET_PASSWORD:
- if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) {
- // skip /r/n
- if (rxLen < 2 || memcmp(servers_pass, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_pass)))) {
- telnet_data.credentialsValid = false;
- }
- if (telnet_data.credentialsValid) {
- telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS;
- }
- else {
- telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN;
+ if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
+ TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
+ &rxLen)) {
+ int result;
+ if ((result = telnet_process_credential (servers_pass, rxLen))) {
+ if ((telnet_data.credentialsValid = telnet_data.credentialsValid && (result > 0 ? true : false))) {
+ telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS;
+ }
+ else {
+ telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN;
+ }
}
}
break;