diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index ff7b71d94..ec9f50e20 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -47,6 +47,55 @@ int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char * return 0; } +void CLIParserPrintHelp(CLIParserContext *ctx) { + if (ctx->programHint) + PrintAndLogEx(NORMAL, "\n"_DescriptionColor_("%s"), ctx->programHint); + + PrintAndLogEx(NORMAL, "\n"_SectionTagColor_("usage:")); + PrintAndLogEx(NORMAL, " "_CommandColor_("%s")NOLF, ctx->programName); + arg_print_syntax(stdout, ctx->argtable, "\n\n"); + + PrintAndLogEx(NORMAL, _SectionTagColor_("options:")); + + arg_print_glossary(stdout, ctx->argtable, " "_ArgColor_("%-30s")" "_ArgHelpColor_("%s")"\n"); + + PrintAndLogEx(NORMAL, ""); + if (ctx->programHelp) { + PrintAndLogEx(NORMAL, _SectionTagColor_("examples/notes:")); + char *buf = NULL; + int idx = 0; + buf = realloc(buf, strlen(ctx->programHelp) + 1); // more then enough as we are splitting + + char *p2; // pointer to split example from comment. + int egWidth = 30; + for (int i = 0; i <= strlen(ctx->programHelp); i++) { // <= so to get string terminator. + buf[idx++] = ctx->programHelp[i]; + if ((ctx->programHelp[i] == '\n') || (ctx->programHelp[i] == 0x00)) { + buf[idx - 1] = 0x00; + p2 = strstr(buf, "->"); // See if the example has a comment. + if (p2 != NULL) { + *(p2 - 1) = 0x00; + + if (strlen(buf) > 28) + egWidth = strlen(buf) + 5; + else + egWidth = 30; + + PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s")" %s", egWidth, buf, p2); + } else { + PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s"), egWidth, buf); + } + idx = 0; + } + } + + PrintAndLogEx(NORMAL, ""); + free(buf); + } + + fflush(stdout); +} + int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { int nerrors; @@ -65,52 +114,7 @@ int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargta /* special case: '--help' takes precedence over error reporting */ if ((argc < 2 && !allowEmptyExec) || ((struct arg_lit *)(ctx->argtable)[0])->count > 0) { // help must be the first record - if (ctx->programHint) - PrintAndLogEx(NORMAL, "\n"_DescriptionColor_("%s"), ctx->programHint); - - PrintAndLogEx(NORMAL, "\n"_SectionTagColor_("usage:")); - PrintAndLogEx(NORMAL, " "_CommandColor_("%s")NOLF, ctx->programName); - arg_print_syntax(stdout, ctx->argtable, "\n\n"); - - PrintAndLogEx(NORMAL, _SectionTagColor_("options:")); - - arg_print_glossary(stdout, ctx->argtable, " "_ArgColor_("%-30s")" "_ArgHelpColor_("%s")"\n"); - - PrintAndLogEx(NORMAL, ""); - if (ctx->programHelp) { - PrintAndLogEx(NORMAL, _SectionTagColor_("examples/notes:")); - char *buf = NULL; - int idx = 0; - buf = realloc(buf, strlen(ctx->programHelp) + 1); // more then enough as we are splitting - - char *p2; // pointer to split example from comment. - int egWidth = 30; - for (int i = 0; i <= strlen(ctx->programHelp); i++) { // <= so to get string terminator. - buf[idx++] = ctx->programHelp[i]; - if ((ctx->programHelp[i] == '\n') || (ctx->programHelp[i] == 0x00)) { - buf[idx - 1] = 0x00; - p2 = strstr(buf, "->"); // See if the example has a comment. - if (p2 != NULL) { - *(p2 - 1) = 0x00; - - if (strlen(buf) > 28) - egWidth = strlen(buf) + 5; - else - egWidth = 30; - - PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s")" %s", egWidth, buf, p2); - } else { - PrintAndLogEx(NORMAL, " "_ExampleColor_("%-*s"), egWidth, buf); - } - idx = 0; - } - } - - PrintAndLogEx(NORMAL, ""); - free(buf); - } - - fflush(stdout); + CLIParserPrintHelp(ctx); return 1; } diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index 0213d1917..39a5792f8 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -60,6 +60,7 @@ typedef struct { char buf[1024 + 60]; } CLIParserContext; int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); +void CLIParserPrintHelp(CLIParserContext *ctx); int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); diff --git a/client/src/cmdscript.c b/client/src/cmdscript.c index 9c8c794b9..184d9d695 100644 --- a/client/src/cmdscript.c +++ b/client/src/cmdscript.c @@ -237,30 +237,29 @@ static int CmdScriptRun(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "script run", "Run a Lua, Cmd or Python script", - "script run my_script.lua -- --my_script_args" + "script run my_script.lua --my_script_args" ); void *argtable[] = { arg_param_begin, arg_file1(NULL, NULL, "", "script to run"), - arg_rem("--", "separator for script params"), arg_strx0(NULL, NULL, "", "params for the script"), arg_param_end }; - CLIExecWithReturn(ctx, Cmd, argtable, true); char preferredName[128] = {0}; char arguments[256] = {0}; int name_len = 0; int arg_len = 0; static uint8_t luascriptfile_idx = 0; - CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)preferredName, sizeof(preferredName), &name_len); -// this one removes all spaces -// CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)arguments, sizeof(arguments), &arg_len); - CLIParserFree(ctx); - sscanf(Cmd + name_len + 1, "-- %255[^\n\r]%n", arguments, &arg_len); - if (arg_len == 0) { - sscanf(Cmd + name_len + 1, "%255[^\n\r]%n", arguments, &arg_len); + sscanf(Cmd, "%127s%n %255[^\n\r]%n", preferredName, &name_len, arguments, &arg_len); + if ((strcmp(preferredName, "-h") == 0) || (strcmp(preferredName, "--help") == 0)) { + ctx->argtable = argtable; + ctx->argtableLen = arg_getsize(argtable); + CLIParserPrintHelp(ctx); + CLIParserFree(ctx); + return PM3_ESOFT; } + CLIParserFree(ctx); if (strlen(preferredName) == 0) { PrintAndLogEx(FAILED, "no script name provided"); PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`script list`") " to see available scripts");