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 #include "TelnetServer.h"
rebonatto 0:65c41a68b49a 2
rebonatto 0:65c41a68b49a 3
rebonatto 0:65c41a68b49a 4 char *header_msg = "firmware update\r\n\r\n";
rebonatto 0:65c41a68b49a 5 char *usage_msg = "Wrong arguments\r\nUsage: update <firmware filename>\r\n\r\n";
rebonatto 0:65c41a68b49a 6 char *invalid_filename_msg = "Invalid filename. It must have at most 8 characters in the name and 3 in the extension\r\n\r\n";
rebonatto 0:65c41a68b49a 7 char *file_does_not_exist_msg = "A file with the supplied filename does not exist.\r\n\r\n";
rebonatto 0:65c41a68b49a 8 char *version_does_not_exist_msg = "Could not open version.txt. The update operation cannot continue.\r\n\r\n";
rebonatto 0:65c41a68b49a 9 char *unable_to_create_remove_msg = "Unable to create remove.txt. The update operation cannot continue.\r\n\r\n";
rebonatto 0:65c41a68b49a 10 char *unable_to_truncate_version_msg = "Unable to truncate version.txt. The update operation cannot continue.\r\n\r\n";
rebonatto 0:65c41a68b49a 11 char *operation_successful_msg = "Operation was completed successfully. Now resetting...\r\n\r\n";
rebonatto 0:65c41a68b49a 12
rebonatto 0:65c41a68b49a 13 extern LocalFileSystem local;
rebonatto 0:65c41a68b49a 14 extern "C" void mbed_reset();
rebonatto 0:65c41a68b49a 15
rebonatto 0:65c41a68b49a 16 int TelnetServer::UpdateCommand(TCPSocketConnection *conn,char** argv,int argc)
rebonatto 0:65c41a68b49a 17 {
rebonatto 0:65c41a68b49a 18 char old_filename[20];
rebonatto 0:65c41a68b49a 19 char new_filename[20];
rebonatto 0:65c41a68b49a 20
rebonatto 0:65c41a68b49a 21 conn->send(header_msg,strlen(header_msg));
rebonatto 0:65c41a68b49a 22 //0 - check if the file informed exists
rebonatto 0:65c41a68b49a 23 if(argc != 2)
rebonatto 0:65c41a68b49a 24 {
rebonatto 0:65c41a68b49a 25 conn->send(usage_msg,strlen(usage_msg));
rebonatto 0:65c41a68b49a 26 return 0;
rebonatto 0:65c41a68b49a 27 }
rebonatto 0:65c41a68b49a 28
rebonatto 0:65c41a68b49a 29 strcpy(new_filename,"/local/");
rebonatto 0:65c41a68b49a 30 strcat(new_filename,argv[1]);
rebonatto 0:65c41a68b49a 31 new_filename[19] = '\0';
rebonatto 0:65c41a68b49a 32 printf("New filename = %s\n",new_filename);
rebonatto 0:65c41a68b49a 33
rebonatto 0:65c41a68b49a 34 if(strlen(new_filename) > 19)
rebonatto 0:65c41a68b49a 35 {
rebonatto 0:65c41a68b49a 36 conn->send(invalid_filename_msg,strlen(invalid_filename_msg));
rebonatto 0:65c41a68b49a 37 return 0;
rebonatto 0:65c41a68b49a 38 }
rebonatto 0:65c41a68b49a 39
rebonatto 0:65c41a68b49a 40 FILE* fn = fopen(new_filename,"r");
rebonatto 0:65c41a68b49a 41 if(fn == NULL)
rebonatto 0:65c41a68b49a 42 {
rebonatto 0:65c41a68b49a 43 conn->send(file_does_not_exist_msg,strlen(file_does_not_exist_msg));
rebonatto 0:65c41a68b49a 44 return 0;
rebonatto 0:65c41a68b49a 45 }
rebonatto 0:65c41a68b49a 46 fclose(fn);
rebonatto 0:65c41a68b49a 47
rebonatto 0:65c41a68b49a 48 //1 - write remove.txt with the current FW filename
rebonatto 0:65c41a68b49a 49 fn = fopen("/local/version.txt","r");
rebonatto 0:65c41a68b49a 50 if(fn == NULL)
rebonatto 0:65c41a68b49a 51 {
rebonatto 0:65c41a68b49a 52 conn->send(version_does_not_exist_msg,strlen(version_does_not_exist_msg));
rebonatto 0:65c41a68b49a 53 return 0;
rebonatto 0:65c41a68b49a 54 }
rebonatto 0:65c41a68b49a 55 int rd = fread(old_filename,1,19,fn);
rebonatto 0:65c41a68b49a 56 old_filename[rd]='\0';
rebonatto 0:65c41a68b49a 57 fclose(fn);
rebonatto 0:65c41a68b49a 58
rebonatto 0:65c41a68b49a 59 fn = fopen("/local/remove.txt","w");
rebonatto 0:65c41a68b49a 60 if(fn == NULL)
rebonatto 0:65c41a68b49a 61 {
rebonatto 0:65c41a68b49a 62 conn->send(unable_to_create_remove_msg,strlen(unable_to_create_remove_msg));
rebonatto 0:65c41a68b49a 63 return 0;
rebonatto 0:65c41a68b49a 64 }
rebonatto 0:65c41a68b49a 65 fwrite(old_filename,1,strlen(old_filename),fn);
rebonatto 0:65c41a68b49a 66 fclose(fn);
rebonatto 0:65c41a68b49a 67
rebonatto 0:65c41a68b49a 68 //2 - write version.txt with the new FW filename
rebonatto 0:65c41a68b49a 69 fn = fopen("/local/version.txt","w");
rebonatto 0:65c41a68b49a 70 if(fn == NULL)
rebonatto 0:65c41a68b49a 71 {
rebonatto 0:65c41a68b49a 72 conn->send(unable_to_truncate_version_msg,strlen(unable_to_truncate_version_msg));
rebonatto 0:65c41a68b49a 73 return 0;
rebonatto 0:65c41a68b49a 74 }
rebonatto 0:65c41a68b49a 75 fwrite(new_filename,1,strlen(new_filename),fn);
rebonatto 0:65c41a68b49a 76 fclose(fn);
rebonatto 0:65c41a68b49a 77
rebonatto 0:65c41a68b49a 78 //3 - remove the old fw file
rebonatto 0:65c41a68b49a 79 local.remove(old_filename);
rebonatto 0:65c41a68b49a 80
rebonatto 0:65c41a68b49a 81 //4 - remove remove.txt
rebonatto 0:65c41a68b49a 82 local.remove("remove.txt");
rebonatto 0:65c41a68b49a 83
rebonatto 0:65c41a68b49a 84 conn->send(operation_successful_msg,strlen(operation_successful_msg));
rebonatto 0:65c41a68b49a 85
rebonatto 0:65c41a68b49a 86 //5 - reset
rebonatto 0:65c41a68b49a 87 delete conn;
rebonatto 0:65c41a68b49a 88
rebonatto 0:65c41a68b49a 89 mbed_reset();
rebonatto 0:65c41a68b49a 90
rebonatto 0:65c41a68b49a 91 return 0;
rebonatto 0:65c41a68b49a 92 }