mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-31 12:00:10 -07:00
fix: .history was never written
This commit is contained in:
parent
5d0e190169
commit
2487dfeb07
6 changed files with 69 additions and 64 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,6 +1,7 @@
|
||||||
# .gitignore
|
# .gitignore
|
||||||
# don't push these files to the repository
|
# don't push these files to the repository
|
||||||
|
|
||||||
|
.history
|
||||||
*.log
|
*.log
|
||||||
*.eml
|
*.eml
|
||||||
*.o
|
*.o
|
||||||
|
|
|
@ -42,15 +42,15 @@ static int cmd_tail;//Starts as 0
|
||||||
|
|
||||||
static command_t CommandTable[] =
|
static command_t CommandTable[] =
|
||||||
{
|
{
|
||||||
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
|
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
|
||||||
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
|
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
|
||||||
{"hf", CmdHF, 1, "{ High Frequency commands... }"},
|
{"hf", CmdHF, 1, "{ High Frequency commands... }"},
|
||||||
{"hw", CmdHW, 1, "{ Hardware commands... }"},
|
{"hw", CmdHW, 1, "{ Hardware commands... }"},
|
||||||
{"lf", CmdLF, 1, "{ Low Frequency commands... }"},
|
{"lf", CmdLF, 1, "{ Low Frequency commands... }"},
|
||||||
{"script", CmdScript, 1,"{ Scripting commands }"},
|
{"script", CmdScript, 1, "{ Scripting commands }"},
|
||||||
{"quit", CmdQuit, 1, "Exit program"},
|
{"quit", CmdQuit, 1, "Exit program"},
|
||||||
{"exit", CmdQuit, 1, "Exit program"},
|
{"exit", CmdQuit, 1, "Exit program"},
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
command_t* getTopLevelCommandTable()
|
command_t* getTopLevelCommandTable()
|
||||||
|
@ -65,8 +65,7 @@ int CmdHelp(const char *Cmd)
|
||||||
|
|
||||||
int CmdQuit(const char *Cmd)
|
int CmdQuit(const char *Cmd)
|
||||||
{
|
{
|
||||||
exit(0);
|
return 99;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @brief This method should be called when sending a new command to the pm3. In case any old
|
* @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
|
// Entry point into our code: called whenever the user types a command and
|
||||||
// then presses Enter, which the full command line that they typed.
|
// then presses Enter, which the full command line that they typed.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void CommandReceived(char *Cmd) {
|
int CommandReceived(char *Cmd) {
|
||||||
CmdsParse(CommandTable, Cmd);
|
return CmdsParse(CommandTable, Cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include "usb_cmd.h"
|
#include "usb_cmd.h"
|
||||||
#include "cmdparser.h"
|
#include "cmdparser.h"
|
||||||
void UsbCommandReceived(UsbCommand *UC);
|
void UsbCommandReceived(UsbCommand *UC);
|
||||||
void CommandReceived(char *Cmd);
|
int CommandReceived(char *Cmd);
|
||||||
bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
|
bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
|
||||||
bool WaitForResponse(uint32_t cmd, UsbCommand* response);
|
bool WaitForResponse(uint32_t cmd, UsbCommand* response);
|
||||||
void clearCommandBuffer();
|
void clearCommandBuffer();
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "cmdparser.h"
|
#include "cmdparser.h"
|
||||||
#include "proxmark3.h"
|
#include "proxmark3.h"
|
||||||
|
|
||||||
|
|
||||||
void CmdsHelp(const command_t Commands[])
|
void CmdsHelp(const command_t Commands[])
|
||||||
{
|
{
|
||||||
if (Commands[0].Name == NULL)
|
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)
|
if(strcmp( Cmd, "XX_internal_command_dump_XX") == 0)
|
||||||
{// Help dump children
|
{// Help dump children
|
||||||
dumpCommandsRecursive(Commands, 0);
|
dumpCommandsRecursive(Commands, 0);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0)
|
if(strcmp( Cmd, "XX_internal_command_dump_markdown_XX") == 0)
|
||||||
{// Markdown help dump children
|
{// Markdown help dump children
|
||||||
dumpCommandsRecursive(Commands, 1);
|
dumpCommandsRecursive(Commands, 1);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
char cmd_name[32];
|
char cmd_name[32];
|
||||||
int len = 0;
|
int len = 0;
|
||||||
memset(cmd_name, 0, 32);
|
memset(cmd_name, 0, 32);
|
||||||
sscanf(Cmd, "%31s%n", cmd_name, &len);
|
sscanf(Cmd, "%31s%n", cmd_name, &len);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name))
|
while (Commands[i].Name && strcmp(Commands[i].Name, cmd_name))
|
||||||
++i;
|
++i;
|
||||||
|
|
||||||
/* try to find exactly one prefix-match */
|
/* try to find exactly one prefix-match */
|
||||||
if(!Commands[i].Name) {
|
if(!Commands[i].Name) {
|
||||||
int last_match = 0;
|
int last_match = 0;
|
||||||
int matches = 0;
|
int matches = 0;
|
||||||
|
|
||||||
for(i=0;Commands[i].Name;i++) {
|
for(i=0;Commands[i].Name;i++) {
|
||||||
if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) {
|
if( !strncmp(Commands[i].Name, cmd_name, strlen(cmd_name)) ) {
|
||||||
last_match = i;
|
last_match = i;
|
||||||
matches++;
|
matches++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(matches == 1) i=last_match;
|
if(matches == 1) i=last_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Commands[i].Name) {
|
if (Commands[i].Name) {
|
||||||
while (Cmd[len] == ' ')
|
while (Cmd[len] == ' ')
|
||||||
++len;
|
++len;
|
||||||
Commands[i].Parse(Cmd + len);
|
return Commands[i].Parse(Cmd + len);
|
||||||
} else {
|
} else {
|
||||||
// show help for selected hierarchy or if command not recognised
|
// show help for selected hierarchy or if command not recognised
|
||||||
CmdsHelp(Commands);
|
CmdsHelp(Commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char pparent[512] = {0};
|
char pparent[512] = {0};
|
||||||
|
|
|
@ -24,7 +24,7 @@ typedef struct command_s
|
||||||
// Print help for each command in the command array
|
// Print help for each command in the command array
|
||||||
void CmdsHelp(const command_t Commands[]);
|
void CmdsHelp(const command_t Commands[]);
|
||||||
// Parse a command line
|
// 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);
|
void dumpCommandsRecursive(const command_t cmds[], int markdown);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -155,12 +155,11 @@ static void *main_loop(void *targ) {
|
||||||
cmd[strlen(cmd) - 1] = 0x00;
|
cmd[strlen(cmd) - 1] = 0x00;
|
||||||
|
|
||||||
if (cmd[0] != 0x00) {
|
if (cmd[0] != 0x00) {
|
||||||
if (strncmp(cmd, "quit", 4) == 0) {
|
int ret = CommandReceived(cmd);
|
||||||
exit(0);
|
add_history(cmd);
|
||||||
|
if (ret == 99) { // exit or quit
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
CommandReceived(cmd);
|
|
||||||
add_history(cmd);
|
|
||||||
}
|
}
|
||||||
free(cmd);
|
free(cmd);
|
||||||
} else {
|
} else {
|
||||||
|
@ -223,7 +222,7 @@ int main(int argc, char* argv[]) {
|
||||||
.usb_present = 0,
|
.usb_present = 0,
|
||||||
.script_cmds_file = NULL
|
.script_cmds_file = NULL
|
||||||
};
|
};
|
||||||
pthread_t main_loop_t;
|
pthread_t main_loop_threat;
|
||||||
|
|
||||||
|
|
||||||
sp = uart_open(argv[1]);
|
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
|
// create a mutex to avoid interlacing print commands from our different threads
|
||||||
pthread_mutex_init(&print_lock, NULL);
|
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);
|
InitGraphics(argc, argv);
|
||||||
|
|
||||||
MainGraphics();
|
MainGraphics();
|
||||||
|
|
||||||
pthread_join(main_loop_t, NULL);
|
pthread_join(main_loop_threat, NULL);
|
||||||
|
|
||||||
// Clean up the port
|
// Clean up the port
|
||||||
uart_close(sp);
|
if (offline == 0) {
|
||||||
|
uart_close(sp);
|
||||||
|
}
|
||||||
|
|
||||||
// clean up mutex
|
// clean up mutex
|
||||||
pthread_mutex_destroy(&print_lock);
|
pthread_mutex_destroy(&print_lock);
|
||||||
|
|
||||||
return 0;
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue