Bläddra i källkod

reenable building the telnet server

Sergey Alirzaev 5 år sedan
förälder
incheckning
486a421f89
5 ändrade filer med 180 tillägg och 447 borttagningar
  1. 1 1
      Makefile.inc.stm32
  2. 2 2
      modules/Makefile
  3. 172 434
      modules/Telnet_Server/telnet_server.c
  4. 4 9
      modules/cli/cli.c
  5. 1 1
      modules/cli/cli.h

+ 1 - 1
Makefile.inc.stm32

@@ -8,7 +8,7 @@ CFLAGS += $(COMMONFLAGS) -Os $(INCLUDES) -I.
 CFLAGS += -std=gnu99 -Wall -Wextra -static -fdata-sections -ffunction-sections -fno-hosted -fno-builtin
 CFLAGS += -nostdlib -nodefaultlibs -fstack-usage
 CFLAGS += -mapcs-frame -msoft-float
-CFLAGS += -Werror-implicit-function-declaration
+CFLAGS += -Werror-implicit-function-declaration -Werror=char-subscripts #-Werror=incompatible-pointer-types
 CFLAGS += -MD -MP -MF $(DEPDIR)/$(@F).d
 LDFLAGS = $(COMMONFLAGS) -static
 LDFLAGS += -fno-exceptions -ffunction-sections -fdata-sections

+ 2 - 2
modules/Makefile

@@ -106,9 +106,9 @@ endif
 ifneq (,$(filter $(HARDWARE),bt6707 bt6709))
       INCLUDES += -Icli
       CSRC += $(wildcard cli/*.c)
-      #INCLUDES += -ITelnet_Server 
+      INCLUDES += -ITelnet_Server
       CSRC += $(wildcard HTTP_Server/http_server.c)
-      #CSRC += $(wildcard Telnet_Server/*.c)
+      CSRC += $(wildcard Telnet_Server/*.c)
 endif
     CSRC += $(wildcard HTTP_Server/trap_params.c)
     CSRC += $(wildcard HTTP_Server/web_params_api.c)

+ 172 - 434
modules/Telnet_Server/telnet_server.c

@@ -20,6 +20,7 @@
 /* Utils includes. */
 #include "FreeRTOS_CLI.h"
 #include "CLI_Commands.h"
+#include "cli.h"
 #include "telnet_server.h"
 #include "settings_api.h"
 #include "parameters.h"
@@ -157,7 +158,7 @@ typedef struct{
 	uint8_t state;
 	uint8_t code;
 	char buf[cmdMAX_INPUT_SIZE];
-	char bufptr;
+	uint_fast8_t bufptr;
 	char prev_cmd[cmdMAX_INPUT_SIZE];
 	unsigned char optdata[cmdMAX_INPUT_SIZE];
 	uint8_t optlen;
@@ -168,15 +169,11 @@ typedef struct{
 	uint8_t num_connect;
 	bool active_conn;
 	bool flag_telnet_ip_option;
-}telnetd_state_t;
+	cli_state_t *cli_state;
+} telnetd_state_t;
 
 static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  );
 static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  );
-void SensorInfoTimerCallback(TimerHandle_t pxTimer);
-
-state_telnet_server_t telnetState = TELNET_AUTH;
-uint8_t id_change_pwd = 0;
-user_level_t telnet_code_auth = USER;
 
 telnetd_state_t auth_tlnt_srvr_param[NUMBER_TELNET_CONNECT];
 
@@ -216,149 +213,16 @@ extern SETTINGS_t sSettings;
 void
 telnetd_close(telnetd_state_t *s)
 {
-  s->state = STATE_CLOSE;
-}
-
-static void telnetd_input(telnetd_state_t *s)
-{
-	portBASE_TYPE xReturned;
-
-	switch(s->telnetState){
-		case TELNET_AUTH:
-		case TELNET_AUTH_PASSW:
-			if(FreeRTOS_CLIAuthProcess(pcOutputString, s)){
-				send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
-				memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
-			}
-			else{
-				s->state = STATE_CLOSE;
-			}
-			break;
-		case TELNET_CMD:
-			/* The input string has been terminated.  Was the
-			input a quit command? */
-			if( strcmp( "quit", ( const char * ) s->buf ) == 0 )
-			{
-				s->state = STATE_CLOSE;
-			}
-			else
-			{
-				/* The input string was not a quit command.
-				Pass the string to the command interpreter. */
-
-				/* See if the command is empty, indicating that the last command is
-				to be executed again. */
-				if( s->bufptr == 0 )
-				{
-					if(s->flag_telnet_ip_option ){
-						s->flag_telnet_ip_option = false;
-						return;
-					}
-					else{
-						strcpy( s->buf, s->prev_cmd );
-					}
-				}
-
-				/* Transmit a line separator, just to make the
-				output easier to read. */
-				lwip_send( s->num_connect, "\r\n", strlen( "\r\n" ), 0 );
-
-				do
-				{
-					/* Ensure there is not a string lingering in
-					the output buffer. */
-					pcOutputString[ 0 ] = 0x00;
-					telnetState = s->telnetState;
-					xReturned = FreeRTOS_CLIProcessCommand( s->buf, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
-					s->telnetState = telnetState;
-					send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
-
-				} while( xReturned != pdFALSE );
-
-				if( strcmp( "sensor info", ( const char * ) s->buf ) == 0 ){
-					strcpy( s->prev_cmd, s->buf );
-					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
-					xTimerStart(s->RepeatSensorInfoTimer, 0);
-				}
-				else{
-
-					/* All the strings generated by the input
-					command have been sent.  Clear the input
-					string ready to receive the next command.
-					Remember the command that was just processed
-					first in case it is to be processed again. */
-					strcpy( s->prev_cmd, s->buf );
-					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
-					if(s->telnetState != TELNET_CHANGE_PWD)
-						send( s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
-				}
-			}
-			break;
-		case TELNET_CHANGE_PWD:
-		case TELNET_CHANGE_PWD_ACK:
-			FreeRTOS_ChangePWDProcess(pcOutputString, s);
-			send( s->num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
-			memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
-			break;
-
-	}
+	s->state = STATE_CLOSE;
 }
 
-/*-----------------------------------------------------------------------------------*/
-static void getchar(telnetd_state_t *s)
-{
-	if(type_term == 1 && s->telnetState != TELNET_AUTH_PASSW){
-		if(s->buf[s->bufptr] != 0x03 && s->buf[s->bufptr] != 0x7f){
-			send( s->num_connect, &s->buf[s->bufptr], 1, 0 );
-		}
-	}
-	else if(s->telnetState == TELNET_AUTH_PASSW){
-		send( s->num_connect, " ", 1, 0 );
-	}
-
-
-  if(s->buf[s->bufptr] == ISO_nl ||
-	s->buf[s->bufptr] == 0) {
-	s->bufptr = 0;
-    return;
-  }
-
-  if(s->buf[s->bufptr] == ISO_cr ||
-     s->bufptr == sizeof(s->buf) - 1) {
-    if(s->bufptr > 0) {
-      s->buf[s->bufptr] = 0;
-    }
-    telnetd_input(s);
-    s->bufptr = 0;
-  } else if( s->buf[s->bufptr] == '\b' || s->buf[s->bufptr] == 0x7f)
-	{
-		/* Backspace was pressed.  Erase the last
-		character in the string - if any. */
-	  	s->buf[s->bufptr] = '\0';
-		if( s->bufptr > 0 )
-		{
-			s->bufptr--;
-			s->buf[s->bufptr] = '\0';
-		}
-	}
-  else if (s->buf[s->bufptr] == 0x03){
-	  xTimerStop(s->RepeatSensorInfoTimer, 0);
-	  s->flag_telnet_ip_option = true;
-	  if(s->telnetState != TELNET_CHANGE_PWD && s->telnetState != TELNET_CHANGE_PWD_ACK)
-	  	send( s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
-  }
-  else {
-    ++s->bufptr;
-  }
-}
-/*-----------------------------------------------------------------------------------*/
 static void sendopt(telnetd_state_t *s, u8_t code, u8_t option)
 {
 	unsigned char buf[3];
 	buf[0] = TELNET_IAC;
 	buf[1] = code;
 	buf[2] = option;
-    send( s->num_connect, buf, 3, 0 );
+	send( s->num_connect, buf, 3, 0 );
 }
 
 static void sendsubopt(telnetd_state_t *s, u8_t code, u8_t *option, u8_t len)
@@ -370,49 +234,48 @@ static void sendsubopt(telnetd_state_t *s, u8_t code, u8_t *option, u8_t len)
 	memcpy(&buf[3], option, len);
 	buf[len + 3] = TELNET_IAC;
 	buf[len + 4] = TELNET_SE;
-    send( s->num_connect, buf, (len + 5), 0 );
+		send( s->num_connect, buf, (len + 5), 0 );
 }
 
 void parseopt(telnetd_state_t *ts, uint8_t code, uint8_t option)
 {
+	switch (option) {
+		case TELOPT_ECHO:
+			if (code == TELNET_WONT) {
+				type_term = 0;
+			}
+			else if (code == TELNET_WILL ){
+				type_term = 1;
+			}
+			break;
+		case TELOPT_SUPPRESS_GO_AHEAD:
+		case TELOPT_LINEMODE:
+		case TELOPT_NAWS:
+		case TELOPT_DISPLAY_POS:
+		case TELOPT_NEW_ENV_OPTION:
+		case TELOPT_TERMINAL_SPEED:
+		case TELOPT_TERMINAL_TYPE:
+		case TELOPT_STATUS:
+		case TELOPT_TOGGLE_FLOW_CONTROL:
+			break;
 
-  switch (option) {
-    case TELOPT_ECHO:
-    	if (code == TELNET_WONT) {
-    		type_term = 0;
-    	}
-    	else if (code == TELNET_WILL ){
-    		type_term = 1;
-    	}
-    	break;
-    case TELOPT_SUPPRESS_GO_AHEAD:
-    case TELOPT_LINEMODE:
-    case TELOPT_NAWS:
-    case TELOPT_DISPLAY_POS:
-    case TELOPT_NEW_ENV_OPTION:
-    case TELOPT_TERMINAL_SPEED:
-    case TELOPT_TERMINAL_TYPE:
-    case TELOPT_STATUS:
-    case TELOPT_TOGGLE_FLOW_CONTROL:
-      break;
-
-    case TELOPT_TIMING_MARK:
-    	xTimerStop(ts->RepeatSensorInfoTimer, 0);
-    	ts->flag_telnet_ip_option = true;
+		case TELOPT_TIMING_MARK:
+			xTimerStop(ts->RepeatSensorInfoTimer, 0);
+			ts->flag_telnet_ip_option = true;
 		sendopt(ts, TELNET_WILL, TELOPT_TIMING_MARK);
 		sendopt(ts, TELNET_MARK, 0);
 		if(ts->telnetState != TELNET_CHANGE_PWD && ts->telnetState != TELNET_CHANGE_PWD_ACK)
 			send( ts->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ), 0 );
-    	break;
-
-    default:
-      if (code == TELNET_WILL || code == TELNET_WONT) {
-        sendopt(ts, TELNET_DONT, option);
-      } else {
-        sendopt(ts, TELNET_WONT, option);
-      }
-      break;
-  }
+			break;
+
+		default:
+			if (code == TELNET_WILL || code == TELNET_WONT) {
+				sendopt(ts, TELNET_DONT, option);
+			} else {
+				sendopt(ts, TELNET_WONT, option);
+			}
+			break;
+	}
 }
 
 static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, uint8_t len) {
@@ -421,19 +284,19 @@ static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, ui
 	uint8_t subopt_val = 0;
 	uint8_t sub_opt_data[2] = {LINEMODE_MODE, LINEMODE_EDIT};
 
-  switch (option) {
-    case TELOPT_NAWS:
-      break;
+	switch (option) {
+		case TELOPT_NAWS:
+			break;
 
-    case TELOPT_TERMINAL_SPEED:
-      break;
+		case TELOPT_TERMINAL_SPEED:
+			break;
 
-    case TELOPT_TERMINAL_TYPE:
-      break;
-    case TELOPT_LINEMODE:
-    	subopt = data[0];
-    	switch (subopt) {
-		case LINEMODE_SLC:
+		case TELOPT_TERMINAL_TYPE:
+			break;
+		case TELOPT_LINEMODE:
+			subopt = data[0];
+			switch (subopt) {
+			case LINEMODE_SLC:
 			if(data[2] & LINEMODE_SLC_ACK){
 				return;
 			}
@@ -457,9 +320,9 @@ static void parseoptdat(telnetd_state_t *ts, int option, unsigned char *data, ui
 			}
 			sendsubopt(ts, option, data, len);
 			break;
-    	}
+			}
 		break;
-  }
+	}
 }
 
 /*-----------------------------------------------------------------------------------*/
@@ -467,31 +330,31 @@ static void newdata(telnetd_state_t *s)
 {
 	char c;
 
-    c = s->buf[s->bufptr];
-    switch(s->state) {
-    case STATE_IAC:
-    	switch (c) {
-		  case TELNET_IAC:
-			s->state = STATE_NORMAL;
-			break;
+	c = s->buf[s->bufptr];
+	switch(s->state) {
+	case STATE_IAC:
+		switch (c) {
+		case TELNET_IAC:
+		s->state = STATE_NORMAL;
+		break;
 
-		  case TELNET_WILL:
-		  case TELNET_WONT:
-		  case TELNET_DO:
-		  case TELNET_DONT:
-			s->code = c;
-			s->state = STATE_OPT;
-			break;
+		case TELNET_WILL:
+		case TELNET_WONT:
+		case TELNET_DO:
+		case TELNET_DONT:
+		s->code = c;
+		s->state = STATE_OPT;
+		break;
 
-		  case TELNET_SB:
-			s->state = STATE_SB;
-			break;
+		case TELNET_SB:
+		s->state = STATE_SB;
+		break;
 
-		  default:
-			s->state = STATE_NORMAL;
-			break;
-		}
-      break;
+		default:
+		s->state = STATE_NORMAL;
+		break;
+	}
+		break;
 	case STATE_OPT:
 		parseopt(s, s->code, c);
 		s->state = STATE_NORMAL;
@@ -507,9 +370,9 @@ static void newdata(telnetd_state_t *s)
 		if (c == TELNET_SE && s->optdata[s->optlen-1] == TELNET_IAC) {
 			parseoptdat(s, s->code, s->optdata, (s->optlen-1));
 			s->state = STATE_NORMAL;
-		  //s->state = STATE_SE;
+			//s->state = STATE_SE;
 		} else if (s->optlen < sizeof(s->optdata)) {
-		  s->optdata[s->optlen++] = c;
+			s->optdata[s->optlen++] = c;
 		}
 		break;
 
@@ -517,14 +380,14 @@ static void newdata(telnetd_state_t *s)
 		if (c == TELNET_SE) parseoptdat(s, s->code, s->optdata, s->optlen);
 		s->state = STATE_NORMAL;
 		break;*/
-    case STATE_NORMAL:
-      if(c == TELNET_IAC) {
-    	  s->state = STATE_IAC;
-      } else {
-    	  getchar(s);
-      }
-      break;
-    }
+	case STATE_NORMAL:
+		if(c == TELNET_IAC) {
+			s->state = STATE_IAC;
+		} else {
+			cli_getchar(s, c);
+		}
+		break;
+	}
 
 }
 
@@ -532,63 +395,63 @@ static void newdata(telnetd_state_t *s)
 
 /* Stop server */
 static void stop_server(void) {
-    /* Clean up all of the sockets that are open */
-    for (int i = 0; i <= max_sd; ++i)
-    {
-       if (FD_ISSET(i, &master_set)) {
-          DBG printf("Close sock %d\n", i);
-          closesocket(i);
-          FD_CLR(i, &master_set);
-       }
-    }
-    DBG printf("Portgw stopped\n");
+	/* Clean up all of the sockets that are open */
+	for (int i = 0; i <= max_sd; ++i)
+	{
+		 if (FD_ISSET(i, &master_set)) {
+				DBG printf("Close sock %d\n", i);
+				closesocket(i);
+				FD_CLR(i, &master_set);
+		 }
+	}
+	DBG printf("Portgw stopped\n");
 }
 
 /* Start server */
 static bool start_server(uint16_t port)
 {
-    int res;
-
-    lSocket = socket(PF_INET, SOCK_STREAM, 0);
-
-    if (lSocket < 0) {
-      DBG printf("Socket create failed\r\n");
-      return false;
-    }
-
-    res = fcntl(lSocket, F_SETFL, O_NONBLOCK);
-    if (res < 0) {
-        DBG printf("fcntl() failed");
-        closesocket(lSocket);
-        return false;
-    }
-
-    memset(&sa, 0, sizeof(struct sockaddr_in));
-    sa.sin_family = AF_INET;
-    sa.sin_addr.s_addr = IPADDR_ANY;
-    sa.sin_port = htons(port);
-
-    if (bind(lSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
-    {
-        DBG printf("Bind to port %d failed\n", port);
-        closesocket(lSocket);
-        return false;
-    }
-
-    res = listen(lSocket, 20);
-    if (res < 0) {
-        DBG printf("Listen failed failed\r\n");
-        closesocket(lSocket);
-        return false;
-    }
-
-    FD_ZERO(&master_set);
-    max_sd = lSocket;
-    FD_SET(lSocket, &master_set);
-
-    DBG printf("Port %d opened\n", port);
-
-    return true;
+		int res;
+
+		lSocket = socket(PF_INET, SOCK_STREAM, 0);
+
+		if (lSocket < 0) {
+			DBG printf("Socket create failed\r\n");
+			return false;
+		}
+
+		res = fcntl(lSocket, F_SETFL, O_NONBLOCK);
+		if (res < 0) {
+				DBG printf("fcntl() failed");
+				closesocket(lSocket);
+				return false;
+		}
+
+		memset(&sa, 0, sizeof(struct sockaddr_in));
+		sa.sin_family = AF_INET;
+		sa.sin_addr.s_addr = IPADDR_ANY;
+		sa.sin_port = htons(port);
+
+		if (bind(lSocket, (struct sockaddr *)&sa, sizeof(sa)) == -1)
+		{
+				DBG printf("Bind to port %d failed\n", port);
+				closesocket(lSocket);
+				return false;
+		}
+
+		res = listen(lSocket, 20);
+		if (res < 0) {
+				DBG printf("Listen failed failed\r\n");
+				closesocket(lSocket);
+				return false;
+		}
+
+		FD_ZERO(&master_set);
+		max_sd = lSocket;
+		FD_SET(lSocket, &master_set);
+
+		DBG printf("Port %d opened\n", port);
+
+		return true;
 }
 
 
@@ -598,30 +461,30 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 	struct sockaddr_in sLocalAddr;
 	struct sockaddr_in client_addr;
 	int new_sd;
-    int desc_ready, rc;
-    struct timeval timeout;
-    uint16_t port;
-    bool enabled;
-    bool firstrun = true;
+		int desc_ready, rc;
+		struct timeval timeout;
+		uint16_t port;
+		bool enabled;
+		bool firstrun = true;
 #ifdef HARDWARE_BT6709
-    struct sockaddr_in sa_temp;
-    socklen_t len;
+		struct sockaddr_in sa_temp;
+		socklen_t len;
 #endif
-    static int active_sd = -1;
-    static uint8_t cnt_conn = 0;
-    uint8_t cur_cnt = 0;
+		static int active_sd = -1;
+		static uint8_t cnt_conn = 0;
+		uint8_t cur_cnt = 0;
 
-    FD_ZERO(&master_set);
+		FD_ZERO(&master_set);
 
 	timeout.tv_sec = 5;
 	timeout.tv_usec = 0;
 
 	( void ) pvParameters;
 	pcOutputString = FreeRTOS_CLIGetOutputBuffer();
-    enabled = sSettings.sTelnet.TelnetEnable;
-    port = ( uint16_t ) sSettings.sTelnet.port;
+		enabled = sSettings.sTelnet.TelnetEnable;
+		port = ( uint16_t ) sSettings.sTelnet.port;
 
-    while (1) {
+		while (1) {
 		/* Check if network settings was changed */
 		if ((sSettings.sTelnet.port != port) ||
 				(sSettings.sTelnet.TelnetEnable != enabled) ||
@@ -765,20 +628,20 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 						}
 
 #if TCP_DROP_PREV_CONNECTION
-                    /* Close previous active connection */
-                    if (active_sd != -1 && active_sd != new_sd) {
-                        DBG printf("  Close prev active connection %d\n", active_sd);
-                        close(active_sd);
-                        FD_CLR(active_sd, &master_set);
-                        if (active_sd == max_sd) {
-                            while (FD_ISSET(max_sd, &master_set) == false) {
-                                max_sd -= 1;
-                            }
-                        }
-                    }
-                    /* Mark new connection as active */
-                    active_sd = new_sd;
-                    DBG printf("  New active connection %d\n", active_sd);
+						/* Close previous active connection */
+						if (active_sd != -1 && active_sd != new_sd) {
+								DBG printf("	Close prev active connection %d\n", active_sd);
+								close(active_sd);
+								FD_CLR(active_sd, &master_set);
+								if (active_sd == max_sd) {
+										while (FD_ISSET(max_sd, &master_set) == false) {
+												max_sd -= 1;
+										}
+								}
+						}
+						/* Mark new connection as active */
+						active_sd = new_sd;
+						DBG printf("	New active connection %d\n", active_sd);
 #endif
 
 						/* Loop back up and accept another incoming   */
@@ -793,8 +656,8 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 
 					for(cur_cnt = 0; cur_cnt < NUMBER_TELNET_CONNECT; cur_cnt ++){
 						if(auth_tlnt_srvr_param[cur_cnt].num_connect == i){
-							telnetState = auth_tlnt_srvr_param[cur_cnt].telnetState;
-							telnet_code_auth = auth_tlnt_srvr_param[cur_cnt].telnet_code_auth;
+							//telnetState = auth_tlnt_srvr_param[cur_cnt].telnetState;
+							const user_level_t telnet_code_auth = auth_tlnt_srvr_param[cur_cnt].telnet_code_auth;
 							switch (telnet_code_auth) {
 							  case ADMIN:
 								  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
@@ -855,55 +718,21 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
 						closesocket(i);
 						FD_CLR(i, &master_set);
 						if (i == max_sd) {
-						   while (FD_ISSET(max_sd, &master_set) == false) {
-							  max_sd -= 1;
-						   }
+							while (FD_ISSET(max_sd, &master_set) == false) {
+								max_sd -= 1;
+							}
 						}
 					}
 				}
 			}
 		}
-    }
+	}
 }
 
 void telnet_server_init(void) {
-	for(uint8_t i = 0; i < NUMBER_TELNET_CONNECT; i++){
-		memset(auth_tlnt_srvr_param[i].buf, 0, cmdMAX_INPUT_SIZE);
-		memset(auth_tlnt_srvr_param[i].prev_cmd, 0, cmdMAX_INPUT_SIZE);
-		memset(auth_tlnt_srvr_param[i].optdata, 0, cmdMAX_INPUT_SIZE);
-		auth_tlnt_srvr_param[i].optlen = 0;
-		auth_tlnt_srvr_param[i].num_connect = 0;
-		auth_tlnt_srvr_param[i].active_conn = false;
-		auth_tlnt_srvr_param[i].telnetState = TELNET_AUTH;
-		auth_tlnt_srvr_param[i].telnet_code_auth = USER;
-		auth_tlnt_srvr_param[i].flag_telnet_ip_option = false;
-		auth_tlnt_srvr_param[i].RepeatSensorInfoTimer = xTimerCreate("SensorInfoTmr", REPEAT_SENSOR_INFO_TIME, pdFALSE, ( void * ) i, SensorInfoTimerCallback);
-	}
-	vRegisterCLICommands();
 	xTaskCreate(vBasicSocketsCommandInterpreterTask, ( char * ) "vBasicSocketsCommandInterpreterTask", 8*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
 }
 
-void SensorInfoTimerCallback(TimerHandle_t pxTimer) {
-	portBASE_TYPE xReturned = pdTRUE;
-	uint8_t num_timer;
-	for(uint8_t i = 0; i < NUMBER_TELNET_CONNECT; i ++){
-		if(pxTimer == auth_tlnt_srvr_param[i].RepeatSensorInfoTimer){
-			num_timer = i;
-			break;
-		}
-	}
-	do
-	{
-		/* Ensure there is not a string lingering in
-		the output buffer. */
-		pcOutputString[ 0 ] = 0x00;
-		xReturned = FreeRTOS_CLIProcessCommand( "sensor info", pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE );
-		send( auth_tlnt_srvr_param[num_timer].num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
-
-	} while( xReturned != pdFALSE );
-	xTimerStart(auth_tlnt_srvr_param[num_timer].RepeatSensorInfoTimer, 0);
-}
-
 static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  )
 {
 	portBASE_TYPE xReturn = pdTRUE;
@@ -938,39 +767,8 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_st
 		memset(password, 0, MAX_WEB_PASSWD_LEN);
 		len = strlen(s->buf);
 		strncpy(password, s->buf, len);
-		for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
-
-			GetUserLogin(user_id, WebLogin, &valueLen);
-			GetUserPassword(user_id, WebPassword, &valueLen);
-
-			/* Check login and password */
-			if ((strncmp(WebLogin, s->login, MAX_WEB_LOGIN_LEN) == 0) &&
-				(strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
-
-				/* Login and pass are valid */
-				s->telnet_code_auth = user_id;
-				s->login_err = 0;
-				strcpy( ( char * ) pcWriteBuffer, "\r\nАвторизация успешно пройдена\r\n>" );
-				s->telnetState = TELNET_CMD;
-				switch (user_id) {
-				  case 0:
-					  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
-					  break;
-				  case 1:
-					  snprintf(name_login_telnet, sizeof(name_login_telnet), "Пользователь");
-					  break;
-				  default:
-					  break;
-				}
-
-				log_event_data(LOG_LOGIN_TELNET, name_login_telnet);
-				xReturn = pdTRUE;
-				break;
-			}
-			else{
-				xReturn = pdFALSE;
-			}
-		}
+		user_id = cli_auth_user(s->login, password);
+		xReturn = user_id == MAX_USER_LEVELS ? pdFALSE : pdTRUE;
 		break;
 	default:
 		xReturn = pdFALSE;
@@ -995,63 +793,3 @@ static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_st
 
 	return xReturn;
 }
-
-static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, telnetd_state_t *s  )
-{
-	portBASE_TYPE xReturn = pdTRUE;
-	uint32_t len;
-	static char password[ MAX_WEB_PASSWD_LEN ] = { 0 };
-	char password2[ MAX_WEB_PASSWD_LEN ] = { 0 };
-	const int8_t * const pcNewPSWHeader = ( int8_t * ) "\r\nВведите повторно новый пароль:";
-
-	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
-
-	len = strlen(s->buf);
-	if(s->telnetState == TELNET_CHANGE_PWD){
-		memset(password, 0, MAX_WEB_PASSWD_LEN);
-		if(len >= MAX_WEB_PASSWD_LEN){
-			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-			s->telnetState = TELNET_CMD;
-		}
-		else{
-			if(!control_string_en_digit(s->buf, len)){
-				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-				s->telnetState = TELNET_CMD;
-			}
-			else{
-				strncpy(password, s->buf, len);
-				strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcNewPSWHeader, strlen( ( char * ) pcNewPSWHeader ) );
-				s->telnetState = TELNET_CHANGE_PWD_ACK;
-			}
-		}
-	}
-	else{
-		s->telnetState = TELNET_CHANGE_PWD;
-		memset(password2, 0, cmdMAX_INPUT_SIZE);
-		if(len >= MAX_WEB_LOGIN_LEN){
-			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-			s->telnetState = TELNET_CMD;
-		}
-		else{
-			strncpy(password2, s->buf, len);
-
-			if (strncmp(password, password2, MAX_WEB_PASSWD_LEN) == 0) {
-				memcpy(sSettings.sAuth[id_change_pwd].password, password, 11);
-				telnet_act = true;
-				HTTP_SaveSettings();
-				log_event_data(LOG_PSW_CHANGE, name_login_telnet);
-				strcpy( ( char * ) pcWriteBuffer, "\r\nПароль успешно изменен\r\n>" );
-				s->telnetState = TELNET_CMD;
-				xReturn = pdTRUE;
-			}
-			else{
-				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
-				s->telnetState = TELNET_CMD;
-			}
-		}
-	}
-
-
-	return xReturn;
-}
-

+ 4 - 9
modules/cli/cli.c

@@ -23,14 +23,6 @@
   */
 extern SETTINGS_t sSettings;
 
-uint8_t id_change_pwd = 0;
-
-const int8_t * const pcWarningMessage = ( const int8_t * ) "Количество соединенений превышено. Данное соединение будет закрыто\r\n";
-#ifdef HARDWARE_BT6709
-const int8_t * const pcWelcomeMessage = ( const int8_t * ) "BT-6709 command server - connection accepted.\r\nlogin:";
-#else
-const int8_t * const pcWelcomeMessage = ( const int8_t * ) "BT-6707 command server - connection accepted.\r\nlogin:";
-#endif
 static const int8_t * const pcEndOfCommandOutputString = ( int8_t * ) "\r\n[Нажмите клавишу ENTER для повторного выполнения предыдущей команды]\r\n>";
 extern int8_t cOutputBuffer[ configCOMMAND_INT_MAX_OUTPUT_SIZE ];
 cli_state_t cli_states[MAX_SESSIONS];
@@ -182,6 +174,8 @@ static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, cli_stat
 		} else {
 			strncpy(password2, s->buf, len);
 
+			// FIXME
+			/*
 			if (strncmp(password, password2, MAX_WEB_PASSWD_LEN) == 0) {
 				memcpy(sSettings.sAuth[id_change_pwd].password, password, 11);
 				telnet_act = true;
@@ -194,6 +188,7 @@ static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, cli_stat
 				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
 				s->input_state = CLI_CMD;
 			}
+			*/
 		}
 	}
 
@@ -332,7 +327,7 @@ void cli_getchar(cli_state_t *s, char incoming_char)
 
 void cli_init(void)
 {
-	for (uint8_t i = 0; i < array_len(cli_states); i++) {
+	for (unsigned i = 0; i < array_len(cli_states); i++) {
 		memset(cli_states[i].buf, 0, cmdMAX_INPUT_SIZE);
 		memset(cli_states[i].prev_cmd, 0, cmdMAX_INPUT_SIZE);
 		memset(cli_states[i].optdata, 0, cmdMAX_INPUT_SIZE);

+ 1 - 1
modules/cli/cli.h

@@ -38,7 +38,7 @@ typedef struct {
 	conn_state_t state;
 //	uint8_t code;
 	char buf[cmdMAX_INPUT_SIZE];
-	char bufptr;
+	uint_fast8_t bufptr;
 	char prev_cmd[cmdMAX_INPUT_SIZE];
 	unsigned char optdata[cmdMAX_INPUT_SIZE];
 	uint8_t optlen;