|
@@ -160,9 +160,6 @@ typedef enum {
|
|
typedef struct{
|
|
typedef struct{
|
|
telnet_state_t state;
|
|
telnet_state_t state;
|
|
uint8_t code;
|
|
uint8_t code;
|
|
- char buf[cmdMAX_INPUT_SIZE];
|
|
|
|
- uint_fast8_t bufptr;
|
|
|
|
- char prev_cmd[cmdMAX_INPUT_SIZE];
|
|
|
|
unsigned char optdata[cmdMAX_INPUT_SIZE];
|
|
unsigned char optdata[cmdMAX_INPUT_SIZE];
|
|
uint8_t optlen;
|
|
uint8_t optlen;
|
|
user_level_t telnet_code_auth;
|
|
user_level_t telnet_code_auth;
|
|
@@ -200,8 +197,6 @@ static void deconfigure_telnet_state(telnetd_state_t *state)
|
|
free_state(state->cli_state);
|
|
free_state(state->cli_state);
|
|
state->cli_state = NULL;
|
|
state->cli_state = NULL;
|
|
}
|
|
}
|
|
- memset(state->buf, 0, cmdMAX_INPUT_SIZE);
|
|
|
|
- memset(state->prev_cmd, 0, cmdMAX_INPUT_SIZE);
|
|
|
|
memset(state->optdata, 0, cmdMAX_INPUT_SIZE);
|
|
memset(state->optdata, 0, cmdMAX_INPUT_SIZE);
|
|
state->optlen = 0;
|
|
state->optlen = 0;
|
|
state->state = TELNET_STATE_NORMAL;
|
|
state->state = TELNET_STATE_NORMAL;
|
|
@@ -425,11 +420,8 @@ portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, cli_state_t *s)
|
|
}
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------*/
|
|
/*-----------------------------------------------------------------------------------*/
|
|
-static void newdata(telnetd_state_t *s)
|
|
|
|
|
|
+static void newdata(telnetd_state_t *s, char c)
|
|
{
|
|
{
|
|
- char c;
|
|
|
|
-
|
|
|
|
- c = s->buf[s->bufptr];
|
|
|
|
switch(s->state) {
|
|
switch(s->state) {
|
|
case TELNET_STATE_IAC:
|
|
case TELNET_STATE_IAC:
|
|
switch (c) {
|
|
switch (c) {
|
|
@@ -711,16 +703,17 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
|
|
cli_state->state = STATE_NORMAL;
|
|
cli_state->state = STATE_NORMAL;
|
|
auth_tlnt_srvr_param[k].cli_state = cli_state;
|
|
auth_tlnt_srvr_param[k].cli_state = cli_state;
|
|
|
|
|
|
- while(recv( new_sd, &auth_tlnt_srvr_param[k].buf[auth_tlnt_srvr_param[k].bufptr], 1, MSG_DONTWAIT ) > 0){
|
|
|
|
- newdata(&auth_tlnt_srvr_param[k]);
|
|
|
|
|
|
+ char c;
|
|
|
|
+ while (recv(new_sd, &c, 1, MSG_DONTWAIT) > 0) {
|
|
|
|
+ newdata(&auth_tlnt_srvr_param[k], c);
|
|
vTaskDelay(10);
|
|
vTaskDelay(10);
|
|
}
|
|
}
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DO, TELOPT_SUPPRESS_GO_AHEAD);
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DO, TELOPT_SUPPRESS_GO_AHEAD);
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DO, TELOPT_LINEMODE);
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DO, TELOPT_LINEMODE);
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DONT, TELOPT_ECHO);
|
|
sendopt(&auth_tlnt_srvr_param[k], TELNET_DONT, TELOPT_ECHO);
|
|
vTaskDelay(50);
|
|
vTaskDelay(50);
|
|
- while(recv( new_sd, &auth_tlnt_srvr_param[k].buf[auth_tlnt_srvr_param[k].bufptr], 1, MSG_DONTWAIT ) > 0){
|
|
|
|
- newdata(&auth_tlnt_srvr_param[k]);
|
|
|
|
|
|
+ while (recv(new_sd, &c, 1, MSG_DONTWAIT) > 0) {
|
|
|
|
+ newdata(&auth_tlnt_srvr_param[k], c);
|
|
vTaskDelay(5);
|
|
vTaskDelay(5);
|
|
}
|
|
}
|
|
send( new_sd, pcWelcomeMessage, strlen( ( const char * ) pcWelcomeMessage ), 0 );
|
|
send( new_sd, pcWelcomeMessage, strlen( ( const char * ) pcWelcomeMessage ), 0 );
|
|
@@ -791,8 +784,9 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
|
|
/* recv fails with EWOULDBLOCK. If any other */
|
|
/* recv fails with EWOULDBLOCK. If any other */
|
|
/* failure occurs, we will close the */
|
|
/* failure occurs, we will close the */
|
|
/* connection. */
|
|
/* connection. */
|
|
- if ((lBytes = recv(sock, &auth_tlnt_srvr_param[cur_cnt].buf[auth_tlnt_srvr_param[cur_cnt].bufptr], 1, 0 )) > 0) {
|
|
|
|
- newdata(&auth_tlnt_srvr_param[cur_cnt]);
|
|
|
|
|
|
+ char c;
|
|
|
|
+ if ((lBytes = recv(sock, &c, 1, 0)) > 0) {
|
|
|
|
+ newdata(&auth_tlnt_srvr_param[cur_cnt], c);
|
|
}
|
|
}
|
|
|
|
|
|
if (lBytes < 0) {
|
|
if (lBytes < 0) {
|