int main(int argc, char *argv[]) #endif /* brcm end */ { cmd_t *cmd; struct ifreq ifr; int skfd; int rc; if (argc < 3) { help(); return -1; } cmd = command_lookup(argv[2]); if (cmd == NULL) { fprintf(stderr, "invalid command [%s]\n", argv[2]); help(); return -1; } if (argc < cmd->nargs + 3) { fprintf(stderr, "incorrect number of arguments for command\n"); command_help(cmd); return -1; } if ( (skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { fprintf(stderr, "socket open error\n"); return -1; } if (strncmp(argv[1], "eth", strlen("eth")) == 0) { strcpy(ifr.ifr_name, argv[1]); if ( ioctl(skfd, SIOCGIFINDEX, &ifr) < 0 ) { fprintf(stderr, "invalid interface name %s\n", argv[1]); command_help(cmd); close(skfd); return -1; } } else { fprintf(stderr, "invalid interface name %sx\n", argv[1]); command_help(cmd); close(skfd); return -1; } rc = cmd->func(skfd, &ifr, cmd, argv); close(skfd); return rc; }
void interpret_command_call(char* input_string, char* output_string, uint8_t length) { uint8_t cmd_argc = 0; char *cmd_argv[MAX_COMMAND_PARAMS]; tokanize_command_string(input_string, cmd_argc, cmd_argv); CommandFunction command_function = command_lookup(cmd_argv[0]); if(command_function == NULL) { strcpy(output_string,"Invalid Command\r\n"); } else { command_function(output_string, cmd_argc, cmd_argv); } uart->write(reinterpret_cast<uint8_t*>(output_string), (size_t)MAX_COMMAND_OUTPUT_SIZE); }
Command * command_new(const char *name, const char *label, const char *args, const char *description, int (*handler)(Channel *channel, User *speaker, const char *text)) { Command *c; if((c = command_lookup(name)) != NULL) { fprintf(stderr, "Can't register command \"%s\", already exists\n", name); return NULL; } if((c = malloc(sizeof *c)) != NULL) { snprintf(c->name, sizeof c->name, "%s", name); snprintf(c->label, sizeof c->label, "%s", label); snprintf(c->args, sizeof c->args, "%s", args); snprintf(c->desc, sizeof c->desc, "%s", description); c->handler = handler; qsarr_insert(CmdInfo.commands, c); } return c; }
static Command *command_parse(Vis *vis, const char **s, int level, enum SamError *err) { if (!**s) return NULL; Command *cmd = command_new(NULL); if (!cmd) return NULL; cmd->address = address_parse_compound(vis, s, err); skip_spaces(s); cmd->argv[0] = parse_cmdname(s); if (!cmd->argv[0]) { char name[2] = { **s ? **s : 'p', '\0' }; if (**s) (*s)++; if (!(cmd->argv[0] = strdup(name))) goto fail; } const CommandDef *cmddef = command_lookup(vis, cmd->argv[0]); if (!cmddef) { *err = SAM_ERR_COMMAND; goto fail; } cmd->cmddef = cmddef; if (strcmp(cmd->argv[0], "{") == 0) { Command *prev = NULL, *next; do { skip_spaces(s); if (**s == '\n') (*s)++; next = command_parse(vis, s, level+1, err); if (prev) prev->next = next; else cmd->cmd = next; } while ((prev = next)); } else if (strcmp(cmd->argv[0], "}") == 0) { if (level == 0) { *err = SAM_ERR_UNMATCHED_BRACE; goto fail; } command_free(cmd); return NULL; } if (cmddef->flags & CMD_ADDRESS_NONE && cmd->address) { *err = SAM_ERR_NO_ADDRESS; goto fail; } if (cmddef->flags & CMD_COUNT) cmd->count = parse_number(s); if (cmddef->flags & CMD_FORCE && **s == '!') { cmd->flags = '!'; (*s)++; } if (cmddef->flags & CMD_FILE) { if (!(cmd->argv[1] = parse_filename(s)) && cmd->argv[0][0] != 'w') { *err = SAM_ERR_FILENAME; goto fail; } } if (cmddef->flags & CMD_REGEX) { if ((cmddef->flags & CMD_REGEX_DEFAULT) && (!**s || **s == ' ')) { skip_spaces(s); } else if (!(cmd->regex = parse_regex(vis, s))) { *err = SAM_ERR_REGEX; goto fail; } } if (cmddef->flags & CMD_SHELL && !(cmd->argv[1] = parse_shellcmd(s))) { *err = SAM_ERR_SHELL; goto fail; } if (cmddef->flags & CMD_TEXT && !(cmd->argv[1] = parse_text(s))) { *err = SAM_ERR_TEXT; goto fail; } if (cmddef->flags & CMD_ARGV) { parse_argv(s, &cmd->argv[1], MAX_ARGV-2); cmd->argv[MAX_ARGV-1] = NULL; } if (cmddef->flags & CMD_CMD) { skip_spaces(s); if (cmddef->defcmd && (**s == '\n' || **s == '\0')) { if (**s == '\n') (*s)++; if (!(cmd->cmd = command_new(cmddef->defcmd))) goto fail; cmd->cmd->cmddef = command_lookup(vis, cmddef->defcmd); } else { if (!(cmd->cmd = command_parse(vis, s, level, err))) goto fail; if (strcmp(cmd->argv[0], "X") == 0 || strcmp(cmd->argv[0], "Y") == 0) { Command *sel = command_new("s"); if (!sel) goto fail; sel->cmd = cmd->cmd; sel->cmddef = &cmddef_select; cmd->cmd = sel; } } } return cmd; fail: command_free(cmd); return NULL; }