示例#1
0
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);
	}
示例#3
0
文件: command.c 项目: versenaut/chat2
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;
}
示例#4
0
文件: sam.c 项目: ewqasd200g/vis
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;
}