|
@@ -5,6 +5,8 @@
|
|
|
* Author: balbekova
|
|
|
*/
|
|
|
|
|
|
+#pragma GCC diagnostic error "-Wall"
|
|
|
+
|
|
|
/* Standard includes. */
|
|
|
#include <string.h>
|
|
|
|
|
@@ -172,17 +174,13 @@ typedef struct{
|
|
|
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 );
|
|
|
-
|
|
|
telnetd_state_t auth_tlnt_srvr_param[NUMBER_TELNET_CONNECT];
|
|
|
|
|
|
uint8_t type_term = 0;
|
|
|
|
|
|
static int32_t lSocket;
|
|
|
static int8_t *pcOutputString;
|
|
|
-static bool flagTelnetChange = false;
|
|
|
-static struct fd_set master_set, read_set, write_set;
|
|
|
+static struct fd_set master_set, read_set;
|
|
|
static int max_sd;
|
|
|
static struct sockaddr_in sa;
|
|
|
|
|
@@ -384,7 +382,7 @@ static void newdata(telnetd_state_t *s)
|
|
|
if(c == TELNET_IAC) {
|
|
|
s->state = STATE_IAC;
|
|
|
} else {
|
|
|
- cli_getchar(s, c);
|
|
|
+ cli_getchar(s->cli_state, c);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -410,81 +408,81 @@ static void stop_server(void) {
|
|
|
/* Start server */
|
|
|
static bool start_server(uint16_t port)
|
|
|
{
|
|
|
- int res;
|
|
|
+ int res;
|
|
|
|
|
|
- lSocket = socket(PF_INET, SOCK_STREAM, 0);
|
|
|
+ lSocket = socket(PF_INET, SOCK_STREAM, 0);
|
|
|
|
|
|
- if (lSocket < 0) {
|
|
|
- DBG printf("Socket create failed\r\n");
|
|
|
- return false;
|
|
|
- }
|
|
|
+ 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;
|
|
|
- }
|
|
|
+ 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);
|
|
|
+ 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;
|
|
|
- }
|
|
|
+ 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;
|
|
|
- }
|
|
|
+ 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);
|
|
|
+ FD_ZERO(&master_set);
|
|
|
+ max_sd = lSocket;
|
|
|
+ FD_SET(lSocket, &master_set);
|
|
|
|
|
|
- DBG printf("Port %d opened\n", port);
|
|
|
+ DBG printf("Port %d opened\n", port);
|
|
|
|
|
|
- return true;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
|
|
|
void vBasicSocketsCommandInterpreterTask( void *pvParameters )
|
|
|
{
|
|
|
- int32_t lBytes, lAddrLen = sizeof( struct sockaddr_in );
|
|
|
- struct sockaddr_in sLocalAddr;
|
|
|
- struct sockaddr_in client_addr;
|
|
|
+ int32_t lBytes;
|
|
|
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;
|
|
|
+#if TCP_DROP_PREV_CONNECTION
|
|
|
+ static int active_sd = -1;
|
|
|
+#endif
|
|
|
+ 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) ||
|
|
@@ -648,7 +646,6 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
|
|
|
/* connection */
|
|
|
} while (new_sd != -1);
|
|
|
}
|
|
|
-
|
|
|
/* This is not the listening socket, therefore an */
|
|
|
/* existing connection must be readable */
|
|
|
else {
|
|
@@ -732,64 +729,3 @@ void vBasicSocketsCommandInterpreterTask( void *pvParameters )
|
|
|
void telnet_server_init(void) {
|
|
|
xTaskCreate(vBasicSocketsCommandInterpreterTask, ( char * ) "vBasicSocketsCommandInterpreterTask", 8*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
|
|
|
}
|
|
|
-
|
|
|
-static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, telnetd_state_t *s )
|
|
|
-{
|
|
|
- portBASE_TYPE xReturn = pdTRUE;
|
|
|
- uint32_t len;
|
|
|
- uint8_t valueLen, user_id;
|
|
|
- char WebPassword[MAX_WEB_PASSWD_LEN];
|
|
|
- char WebLogin[MAX_WEB_LOGIN_LEN];
|
|
|
- char password[cmdMAX_INPUT_SIZE] = { 0 };
|
|
|
- const int8_t * const pcPSWHeader = ( int8_t * ) "\r\npassword:";
|
|
|
- const int8_t * const pcLoginHeader = ( int8_t * ) "\r\nlogin:";
|
|
|
-
|
|
|
- memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
|
|
|
-
|
|
|
- switch(s->telnetState){
|
|
|
- case TELNET_AUTH:
|
|
|
- memset(s->login, 0, MAX_WEB_LOGIN_LEN);
|
|
|
- len = strlen(s->buf);
|
|
|
- if(len < MAX_WEB_LOGIN_LEN){
|
|
|
- strncpy(s->login, s->buf, len);
|
|
|
- sendopt(s, TELNET_WILL, TELOPT_ECHO);
|
|
|
- strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPSWHeader, strlen( ( char * ) pcPSWHeader ) );
|
|
|
- s->telnetState = TELNET_AUTH_PASSW;
|
|
|
- xReturn = pdTRUE;
|
|
|
- }
|
|
|
- else{
|
|
|
- xReturn = pdFALSE;
|
|
|
- }
|
|
|
- break;
|
|
|
- case TELNET_AUTH_PASSW:
|
|
|
- sendopt(s, TELNET_WONT, TELOPT_ECHO);
|
|
|
- memset(name_login_telnet, 0, 50);
|
|
|
- memset(password, 0, MAX_WEB_PASSWD_LEN);
|
|
|
- len = strlen(s->buf);
|
|
|
- strncpy(password, s->buf, len);
|
|
|
- user_id = cli_auth_user(s->login, password);
|
|
|
- xReturn = user_id == MAX_USER_LEVELS ? pdFALSE : pdTRUE;
|
|
|
- break;
|
|
|
- default:
|
|
|
- xReturn = pdFALSE;
|
|
|
- s->telnetState = TELNET_AUTH;
|
|
|
- return xReturn;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if(xReturn == pdFALSE){
|
|
|
- s->telnetState = TELNET_AUTH;
|
|
|
- if(s->login_err < 4){
|
|
|
- s->login_err ++;
|
|
|
- strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка авторизации\r\n" );
|
|
|
- strncat( ( char * ) pcWriteBuffer, ( const char * ) pcLoginHeader, strlen( ( char * ) pcLoginHeader ) );
|
|
|
- xReturn = pdTRUE;
|
|
|
- }
|
|
|
- else{
|
|
|
- s->login_err = 0;
|
|
|
- xReturn = pdFALSE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return xReturn;
|
|
|
-}
|