From fb464f579f084eda882df0396984140befdcf160 Mon Sep 17 00:00:00 2001 From: CPunch Date: Thu, 9 Jun 2022 20:57:57 -0500 Subject: [PATCH] Shell: Support for spaces in arguments - Just like a normal shell, any space after a '\' will be treated as a raw space and not a command delimiter - minor refactoring --- shell/src/scmd.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/shell/src/scmd.c b/shell/src/scmd.c index 94a8bfe..5b16244 100644 --- a/shell/src/scmd.c +++ b/shell/src/scmd.c @@ -32,14 +32,14 @@ int shellS_readInt(char *str) { /* ===========================================[[ Command Handlers ]]============================================= */ -void helpCMD(tShell_client *client, int args, char *argc[]); +void helpCMD(tShell_client *client, int argc, char *argv[]); -void quitCMD(tShell_client *client, int args, char *argc[]) { +void quitCMD(tShell_client *client, int argc, char *argv[]) { PRINTINFO("Killing socket...\n"); laikaS_kill(&client->peer->sock); } -void listPeersCMD(tShell_client *client, int args, char *argc[]) { +void listPeersCMD(tShell_client *client, int argc, char *argv[]) { int i; for (i = 0; i < client->peerTblCount; i++) { @@ -50,14 +50,14 @@ void listPeersCMD(tShell_client *client, int args, char *argc[]) { } } -void infoCMD(tShell_client *client, int args, char *argc[]) { +void infoCMD(tShell_client *client, int argc, char *argv[]) { tShell_peer *peer; int id; - if (args < 2) + if (argc < 2) CMD_ERROR("Usage: info [PEER_ID]\n"); - id = shellS_readInt(argc[1]); + id = shellS_readInt(argv[1]); peer = shellS_getPeer(client, id); /* print info */ @@ -65,15 +65,15 @@ void infoCMD(tShell_client *client, int args, char *argc[]) { shellP_printInfo(peer); } -void openShellCMD(tShell_client *client, int args, char *argc[]) { +void openShellCMD(tShell_client *client, int argc, char *argv[]) { uint8_t buf[LAIKA_SHELL_DATA_MAX_LENGTH]; tShell_peer *peer; int id, sz, cols, rows; - if (args < 2) + if (argc < 2) CMD_ERROR("Usage: shell [PEER_ID]\n"); - id = shellS_readInt(argc[1]); + id = shellS_readInt(argv[1]); peer = shellS_getPeer(client, id); PRINTINFO("Opening shell on peer %04d...\n"); @@ -136,7 +136,7 @@ tShell_cmdDef *shellS_findCmd(char *cmd) { return NULL; } -void helpCMD(tShell_client *client, int args, char *argc[]) { +void helpCMD(tShell_client *client, int argc, char *argv[]) { int i; shellT_printf("======= [[ %sCommand List%s ]] =======\n", shellT_getForeColor(TERM_BRIGHT_YELLOW), shellT_getForeColor(TERM_BRIGHT_WHITE)); @@ -156,13 +156,23 @@ void shellS_cleanupCmds(void) { char **shellS_splitCmd(char *cmd, int *argSize) { int argCount = 0; int argCap = 4; + char *temp; char **args = NULL; char *arg = cmd; do { /* replace space with NULL terminator */ - if (arg != cmd) + if (arg != cmd) { + if (arg[-1] == '\\') { /* space is part of the argument */ + /* remove the '\' character */ + for (temp = arg-1; *temp != '\0'; temp++) { + temp[0] = temp[1]; + } + arg++; + continue; + } *arg++ = '\0'; + } /* insert into our 'args' array */ laikaM_growarray(char*, args, 1, argCount, argCap);