From 2487dfeb07edb8e08fa4ceadf187bcda87927455 Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Fri, 6 Nov 2015 11:34:43 +0100 Subject: [PATCH] fix: .history was never written --- .gitignore | 1 + client/cmdmain.c | 25 +++++++------- client/cmdmain.h | 2 +- client/cmdparser.c | 82 ++++++++++++++++++++++++---------------------- client/cmdparser.h | 2 +- client/proxmark3.c | 23 ++++++------- 6 files changed, 70 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index 880c092f..fa74326e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # .gitignore # don't push these files to the repository +.history *.log *.eml *.o diff --git a/client/cmdmain.c b/client/cmdmain.c index deced558..7bba80f4 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -42,15 +42,15 @@ static int cmd_tail;//Starts as 0 static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help. Use ' help' for details of a particular command."}, - {"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"}, - {"hf", CmdHF, 1, "{ High Frequency commands... }"}, - {"hw", CmdHW, 1, "{ Hardware commands... }"}, - {"lf", CmdLF, 1, "{ Low Frequency commands... }"}, - {"script", CmdScript, 1,"{ Scripting commands }"}, - {"quit", CmdQuit, 1, "Exit program"}, - {"exit", CmdQuit, 1, "Exit program"}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, 1, "This help. Use ' help' for details of a particular command."}, + {"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"}, + {"hf", CmdHF, 1, "{ High Frequency commands... }"}, + {"hw", CmdHW, 1, "{ Hardware commands... }"}, + {"lf", CmdLF, 1, "{ Low Frequency commands... }"}, + {"script", CmdScript, 1, "{ Scripting commands }"}, + {"quit", CmdQuit, 1, "Exit program"}, + {"exit", CmdQuit, 1, "Exit program"}, + {NULL, NULL, 0, NULL} }; command_t* getTopLevelCommandTable() @@ -65,8 +65,7 @@ int CmdHelp(const char *Cmd) int CmdQuit(const char *Cmd) { - exit(0); - return 0; + return 99; } /** * @brief This method should be called when sending a new command to the pm3. In case any old @@ -164,8 +163,8 @@ bool WaitForResponse(uint32_t cmd, UsbCommand* response) { // Entry point into our code: called whenever the user types a command and // then presses Enter, which the full command line that they typed. //----------------------------------------------------------------------------- -void CommandReceived(char *Cmd) { - CmdsParse(CommandTable, Cmd); +int CommandReceived(char *Cmd) { + return CmdsParse(CommandTable, Cmd); } diff --git a/client/cmdmain.h b/client/cmdmain.h index 0cf2b35d..500320ee 100644 --- a/client/cmdmain.h +++ b/client/cmdmain.h @@ -14,7 +14,7 @@ #include "usb_cmd.h" #include "cmdparser.h" void UsbCommandReceived(UsbCommand *UC); -void CommandReceived(char *Cmd); +int CommandReceived(char *Cmd); bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout); bool WaitForResponse(uint32_t cmd, UsbCommand* response); void clearCommandBuffer(); diff --git a/client/cmdparser.c b/client/cmdparser.c index 6910e86a..32508997 100644 --- a/client/cmdparser.c +++ b/client/cmdparser.c @@ -15,6 +15,7 @@ #include "cmdparser.h" #include "proxmark3.h" + void CmdsHelp(const command_t Commands[]) { if (Commands[0].Name == NULL) @@ -28,48 +29,51 @@ void CmdsHelp(const command_t Commands[]) } } -void CmdsParse(const command_t Commands[], const char *Cmd) + +int CmdsParse(const command_t Commands[], const char *Cmd) { - if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0) - {// Help dump children - dumpCommandsRecursive(Commands, 0); - return; - } - if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0) - {// Markdown help dump children - dumpCommandsRecursive(Commands, 1); - return; - } - char cmd_name[32]; - int len = 0; - memset(cmd_name, 0, 32); - sscanf(Cmd, "%31s%n", cmd_name, &len); - int i = 0; - while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name)) - ++i; + if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0) + {// Help dump children + dumpCommandsRecursive(Commands, 0); + return 0; + } + if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0) + {// Markdown help dump children + dumpCommandsRecursive(Commands, 1); + return 0; + } + char cmd_name[32]; + int len = 0; + memset(cmd_name, 0, 32); + sscanf(Cmd, "%31s%n", cmd_name, &len); + int i = 0; + while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name)) + ++i; - /* try to find exactly one prefix-match */ - if(!Commands[i].Name) { - int last_match = 0; - int matches = 0; - - for(i=0;Commands[i].Name;i++) { - if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) { - last_match = i; - matches++; - } - } - if(matches == 1) i=last_match; - } + /* try to find exactly one prefix-match */ + if(!Commands[i].Name) { + int last_match = 0; + int matches = 0; - if (Commands[i].Name) { - while (Cmd[len] == ' ') - ++len; - Commands[i].Parse(Cmd + len); - } else { - // show help for selected hierarchy or if command not recognised - CmdsHelp(Commands); - } + for(i=0;Commands[i].Name;i++) { + if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) { + last_match = i; + matches++; + } + } + if(matches == 1) i=last_match; + } + + if (Commands[i].Name) { + while (Cmd[len] == ' ') + ++len; + return Commands[i].Parse(Cmd + len); + } else { + // show help for selected hierarchy or if command not recognised + CmdsHelp(Commands); + } + + return 0; } char pparent[512] = {0}; diff --git a/client/cmdparser.h b/client/cmdparser.h index b7997ecc..5217d04b 100644 --- a/client/cmdparser.h +++ b/client/cmdparser.h @@ -24,7 +24,7 @@ typedef struct command_s // Print help for each command in the command array void CmdsHelp(const command_t Commands[]); // Parse a command line -void CmdsParse(const command_t Commands[], const char *Cmd); +int CmdsParse(const command_t Commands[], const char *Cmd); void dumpCommandsRecursive(const command_t cmds[], int markdown); #endif diff --git a/client/proxmark3.c b/client/proxmark3.c index 2f370308..f184d9e9 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -155,12 +155,11 @@ static void *main_loop(void *targ) { cmd[strlen(cmd) - 1] = 0x00; if (cmd[0] != 0x00) { - if (strncmp(cmd, "quit", 4) == 0) { - exit(0); + int ret = CommandReceived(cmd); + add_history(cmd); + if (ret == 99) { // exit or quit break; } - CommandReceived(cmd); - add_history(cmd); } free(cmd); } else { @@ -223,7 +222,7 @@ int main(int argc, char* argv[]) { .usb_present = 0, .script_cmds_file = NULL }; - pthread_t main_loop_t; + pthread_t main_loop_threat; sp = uart_open(argv[1]); @@ -258,18 +257,20 @@ int main(int argc, char* argv[]) { // create a mutex to avoid interlacing print commands from our different threads pthread_mutex_init(&print_lock, NULL); - pthread_create(&main_loop_t, NULL, &main_loop, &marg); + pthread_create(&main_loop_threat, NULL, &main_loop, &marg); InitGraphics(argc, argv); MainGraphics(); - pthread_join(main_loop_t, NULL); + pthread_join(main_loop_threat, NULL); // Clean up the port - uart_close(sp); - + if (offline == 0) { + uart_close(sp); + } + // clean up mutex pthread_mutex_destroy(&print_lock); - - return 0; + + exit(0); } -- 2.39.2