Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
rebonatto
Date:
Fri Dec 13 11:45:06 2013 +0000
Revision:
1:238ac24e46dd
Parent:
0:65c41a68b49a
Atual 13-12-2013.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:65c41a68b49a 1 /*
rebonatto 0:65c41a68b49a 2 Original autor: Francisco
rebonatto 0:65c41a68b49a 3 Modificacao do uso da rede: rebonatto
rebonatto 0:65c41a68b49a 4 */
rebonatto 0:65c41a68b49a 5
rebonatto 0:65c41a68b49a 6
rebonatto 0:65c41a68b49a 7 #include "TelnetServer.h"
rebonatto 0:65c41a68b49a 8
rebonatto 0:65c41a68b49a 9 #include "Split.h"
rebonatto 0:65c41a68b49a 10
rebonatto 0:65c41a68b49a 11 #define OPT_WILL 251
rebonatto 0:65c41a68b49a 12 #define OPT_WONT 252
rebonatto 0:65c41a68b49a 13 #define OPT_DO 253
rebonatto 0:65c41a68b49a 14 #define OPT_DONT 254
rebonatto 0:65c41a68b49a 15
rebonatto 0:65c41a68b49a 16 char* welcome_msg = "Protegemed - welcome to telnet\r\nType 'help' for a list of commands\r\n";
rebonatto 0:65c41a68b49a 17 char* prompt_msg = "\r\n$ ";
rebonatto 0:65c41a68b49a 18 char iac_will_echo[] = {0xFF,0xFB,0x01};
rebonatto 0:65c41a68b49a 19 char erase_cmd[] = { 0x1B,0x5B,0x44,0x1B,0x5B,0x4B};
rebonatto 0:65c41a68b49a 20
rebonatto 0:65c41a68b49a 21 const struct telnet_cmd_handler TelnetServer::cmds[] = {
rebonatto 0:65c41a68b49a 22 {"exit",(cmd_function)-1},
rebonatto 0:65c41a68b49a 23 {"help",TelnetServer::HelpCommand},
rebonatto 0:65c41a68b49a 24 {"reset",TelnetServer::ResetCommand},
rebonatto 0:65c41a68b49a 25 {"remove",TelnetServer::RemoveCommand},
rebonatto 0:65c41a68b49a 26 {"listparam",TelnetServer::ListParamCommand},
rebonatto 0:65c41a68b49a 27 {"getparam",TelnetServer::GetParamCommand},
rebonatto 0:65c41a68b49a 28 {"setparam",TelnetServer::SetParamCommand},
rebonatto 0:65c41a68b49a 29 {"version",TelnetServer::VersionCommand},
rebonatto 0:65c41a68b49a 30 {"update",TelnetServer::UpdateCommand},
rebonatto 0:65c41a68b49a 31 {"",(cmd_function)0}
rebonatto 0:65c41a68b49a 32 };
rebonatto 0:65c41a68b49a 33
rebonatto 0:65c41a68b49a 34 void TelnetServer::TelnetServer_Thread(void const* arg)
rebonatto 0:65c41a68b49a 35 {
rebonatto 0:65c41a68b49a 36 int r=0;
rebonatto 0:65c41a68b49a 37 printf("Telnet Thread starting... \r\nCommands up to 100 chars\n");
rebonatto 0:65c41a68b49a 38
rebonatto 0:65c41a68b49a 39 TCPSocketServer server;
rebonatto 0:65c41a68b49a 40
rebonatto 0:65c41a68b49a 41 server.bind(23);
rebonatto 0:65c41a68b49a 42 server.listen();
rebonatto 0:65c41a68b49a 43
rebonatto 0:65c41a68b49a 44 while(1)
rebonatto 0:65c41a68b49a 45 {
rebonatto 0:65c41a68b49a 46 TCPSocketConnection* conn ;
rebonatto 0:65c41a68b49a 47 TCPSocketConnection aux;
rebonatto 0:65c41a68b49a 48 r = server.accept(aux);
rebonatto 0:65c41a68b49a 49 conn = &aux;
rebonatto 0:65c41a68b49a 50 printf("Aceitou conexao \n");
rebonatto 0:65c41a68b49a 51 if (r != 0){
rebonatto 0:65c41a68b49a 52 printf("Error in connection\n");
rebonatto 0:65c41a68b49a 53 exit(1);
rebonatto 0:65c41a68b49a 54 }
rebonatto 0:65c41a68b49a 55
rebonatto 0:65c41a68b49a 56 TelnetSession(conn);
rebonatto 0:65c41a68b49a 57 printf("Fechou\n");
rebonatto 0:65c41a68b49a 58 conn->close();
rebonatto 0:65c41a68b49a 59 }
rebonatto 0:65c41a68b49a 60 }
rebonatto 0:65c41a68b49a 61
rebonatto 0:65c41a68b49a 62 void TelnetServer::TelnetSession(TCPSocketConnection *conn)
rebonatto 0:65c41a68b49a 63 {
rebonatto 0:65c41a68b49a 64 int r;
rebonatto 0:65c41a68b49a 65 int buffer_ptr=0;
rebonatto 0:65c41a68b49a 66
rebonatto 0:65c41a68b49a 67 printf("Connected to %s:%d\n",conn->get_address(),conn->get_port());
rebonatto 0:65c41a68b49a 68
rebonatto 0:65c41a68b49a 69 conn->send(welcome_msg,strlen(welcome_msg));
rebonatto 0:65c41a68b49a 70 conn->send(prompt_msg,strlen(prompt_msg));
rebonatto 0:65c41a68b49a 71
rebonatto 0:65c41a68b49a 72 conn->set_blocking(true);
rebonatto 0:65c41a68b49a 73
rebonatto 0:65c41a68b49a 74 while(1)
rebonatto 0:65c41a68b49a 75 {
rebonatto 0:65c41a68b49a 76 char buf_rec[260];
rebonatto 0:65c41a68b49a 77 unsigned char buf[260];
rebonatto 0:65c41a68b49a 78 char buffer[260];
rebonatto 0:65c41a68b49a 79
rebonatto 0:65c41a68b49a 80 //printf("Vai recevber\n");
rebonatto 0:65c41a68b49a 81 r = conn->receive(buf_rec, strlen(buf_rec) );
rebonatto 0:65c41a68b49a 82
rebonatto 0:65c41a68b49a 83 /* need memcpy becouse commands are ready to unsigned char and tcp receive char */
rebonatto 0:65c41a68b49a 84 memcpy(buf, buf_rec, r);
rebonatto 0:65c41a68b49a 85
rebonatto 0:65c41a68b49a 86 //printf("Receive %d\n", r);
rebonatto 0:65c41a68b49a 87
rebonatto 0:65c41a68b49a 88 if(r == -1)
rebonatto 0:65c41a68b49a 89 {
rebonatto 0:65c41a68b49a 90 printf("Error %d %s\n", r, buf);
rebonatto 0:65c41a68b49a 91 break;
rebonatto 0:65c41a68b49a 92 }
rebonatto 0:65c41a68b49a 93
rebonatto 0:65c41a68b49a 94 if (r > 120){
rebonatto 0:65c41a68b49a 95 printf("Max command length = 100 chars\n");
rebonatto 0:65c41a68b49a 96 //send
rebonatto 0:65c41a68b49a 97 break;
rebonatto 0:65c41a68b49a 98 }
rebonatto 0:65c41a68b49a 99
rebonatto 0:65c41a68b49a 100 //printf("Got Here\n");
rebonatto 0:65c41a68b49a 101
rebonatto 0:65c41a68b49a 102 for(int i=0;i<r;i++)
rebonatto 0:65c41a68b49a 103 {
rebonatto 0:65c41a68b49a 104 //check if it is a printable or any of the line control chars
rebonatto 0:65c41a68b49a 105 if((buf[i]>31 && buf[i] < 128) || buf[i]=='\r' || buf[i]=='\n' || buf[i]=='\t')
rebonatto 0:65c41a68b49a 106 {
rebonatto 0:65c41a68b49a 107 //append to the buffer
rebonatto 0:65c41a68b49a 108 buffer[buffer_ptr] = buf[i];
rebonatto 0:65c41a68b49a 109 buffer_ptr++;
rebonatto 0:65c41a68b49a 110 }
rebonatto 0:65c41a68b49a 111 else if(buf[i] == '\b') //backspace
rebonatto 0:65c41a68b49a 112 {
rebonatto 0:65c41a68b49a 113 //erases the character from the command buffer
rebonatto 0:65c41a68b49a 114 if(buffer_ptr > 0)
rebonatto 0:65c41a68b49a 115 {
rebonatto 0:65c41a68b49a 116 buffer_ptr--;
rebonatto 0:65c41a68b49a 117 }
rebonatto 0:65c41a68b49a 118 //resets m variable state (will not cause error on the next block of code
rebonatto 0:65c41a68b49a 119
rebonatto 0:65c41a68b49a 120 }
rebonatto 0:65c41a68b49a 121 else if((int)buf[i] == 255) //IAC - Interpret As Command
rebonatto 0:65c41a68b49a 122 {
rebonatto 0:65c41a68b49a 123 if((int)buf[i+1] >= 251)
rebonatto 0:65c41a68b49a 124 {
rebonatto 0:65c41a68b49a 125 option_negotiator(conn,buf[i+1],buf[i+2]);
rebonatto 0:65c41a68b49a 126 i+=2;
rebonatto 0:65c41a68b49a 127 }
rebonatto 0:65c41a68b49a 128 else
rebonatto 0:65c41a68b49a 129 i+=1;
rebonatto 0:65c41a68b49a 130 }
rebonatto 0:65c41a68b49a 131 }
rebonatto 0:65c41a68b49a 132
rebonatto 0:65c41a68b49a 133 //detect a carriage return and line feed sequence. Trigger command processor
rebonatto 0:65c41a68b49a 134 if(buffer_ptr >= 2)
rebonatto 0:65c41a68b49a 135 {
rebonatto 0:65c41a68b49a 136 if(buffer[buffer_ptr-1] == '\n' && buffer[buffer_ptr-2] == '\r')
rebonatto 0:65c41a68b49a 137 {
rebonatto 0:65c41a68b49a 138 char **command;
rebonatto 0:65c41a68b49a 139 int command_count;
rebonatto 0:65c41a68b49a 140
rebonatto 0:65c41a68b49a 141 buffer[buffer_ptr-2] = '\0';
rebonatto 0:65c41a68b49a 142 command_count = split((char*)buffer," ",&command);
rebonatto 0:65c41a68b49a 143
rebonatto 0:65c41a68b49a 144 printf("Command found: %s\n", command[0]);
rebonatto 0:65c41a68b49a 145
rebonatto 0:65c41a68b49a 146 //must find a function in the table and then execute it, passing the command array as an argument
rebonatto 0:65c41a68b49a 147 for(int i=0;cmds[i].pfn != 0;i++)
rebonatto 0:65c41a68b49a 148 {
rebonatto 0:65c41a68b49a 149 if(!strcasecmp(command[0],cmds[i].command_name))
rebonatto 0:65c41a68b49a 150 {
rebonatto 0:65c41a68b49a 151 if((int)cmds[i].pfn == -1)//exit cmd
rebonatto 0:65c41a68b49a 152 {
rebonatto 0:65c41a68b49a 153 //delete buffer;
rebonatto 0:65c41a68b49a 154 return;
rebonatto 0:65c41a68b49a 155 }
rebonatto 0:65c41a68b49a 156 else
rebonatto 0:65c41a68b49a 157 {
rebonatto 0:65c41a68b49a 158 cmds[i].pfn(conn,command,command_count);
rebonatto 0:65c41a68b49a 159 break;
rebonatto 0:65c41a68b49a 160 }
rebonatto 0:65c41a68b49a 161 }
rebonatto 0:65c41a68b49a 162 }
rebonatto 0:65c41a68b49a 163
rebonatto 0:65c41a68b49a 164 //write the prompt
rebonatto 0:65c41a68b49a 165 conn->send(prompt_msg,strlen(prompt_msg));
rebonatto 0:65c41a68b49a 166 buffer_ptr=0;
rebonatto 0:65c41a68b49a 167 }
rebonatto 0:65c41a68b49a 168 }
rebonatto 0:65c41a68b49a 169 }
rebonatto 0:65c41a68b49a 170 //delete buffer;
rebonatto 0:65c41a68b49a 171 }
rebonatto 0:65c41a68b49a 172
rebonatto 0:65c41a68b49a 173 void TelnetServer::option_negotiator(TCPSocketConnection *conn,unsigned char opt_cmd,unsigned char opt_param)
rebonatto 0:65c41a68b49a 174 {
rebonatto 0:65c41a68b49a 175 char opt[3]={0,0,0};
rebonatto 0:65c41a68b49a 176
rebonatto 0:65c41a68b49a 177 if(opt_param == 1 && (opt_cmd == OPT_DO || opt_cmd == OPT_DONT)) //response for our will echo
rebonatto 0:65c41a68b49a 178 {
rebonatto 0:65c41a68b49a 179 printf("HERE");
rebonatto 0:65c41a68b49a 180 return;
rebonatto 0:65c41a68b49a 181 }
rebonatto 0:65c41a68b49a 182 if(opt_cmd == OPT_DO) //every other option that it will ask to us to do, we won't
rebonatto 0:65c41a68b49a 183 {
rebonatto 0:65c41a68b49a 184 opt[0] = 255;
rebonatto 0:65c41a68b49a 185 opt[1] = OPT_WONT;
rebonatto 0:65c41a68b49a 186 opt[2] = opt_param;
rebonatto 0:65c41a68b49a 187 conn->send(opt,3);
rebonatto 0:65c41a68b49a 188 }
rebonatto 0:65c41a68b49a 189 else if(opt_cmd == OPT_WILL && opt_param==3) //OK to supperss go ahead
rebonatto 0:65c41a68b49a 190 {
rebonatto 0:65c41a68b49a 191 opt[0] = 255;
rebonatto 0:65c41a68b49a 192 opt[1] = OPT_DO;
rebonatto 0:65c41a68b49a 193 opt[2] = opt_param;
rebonatto 0:65c41a68b49a 194 conn->send(opt,3);
rebonatto 0:65c41a68b49a 195 }
rebonatto 0:65c41a68b49a 196 else if(opt_cmd == OPT_WILL) //every other option that it will ask do, we don't
rebonatto 0:65c41a68b49a 197 {
rebonatto 0:65c41a68b49a 198 opt[0] = 255;
rebonatto 0:65c41a68b49a 199 opt[1] = OPT_DONT;
rebonatto 0:65c41a68b49a 200 opt[2] = opt_param;
rebonatto 0:65c41a68b49a 201 conn->send(opt,3);
rebonatto 0:65c41a68b49a 202
rebonatto 0:65c41a68b49a 203 }
rebonatto 0:65c41a68b49a 204
rebonatto 0:65c41a68b49a 205 }
rebonatto 0:65c41a68b49a 206