mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-24 15:22:34 +01:00
client: Implement command execution
This commit is contained in:
parent
6385116cc8
commit
dcf2a0cae5
@ -51,24 +51,98 @@ static const struct command command_list[] = {
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void execute_cmd(const char *family, const char *entity,
|
||||||
|
const struct command *cmd, char *args)
|
||||||
|
{
|
||||||
|
display_refresh_set_cmd(family, entity, cmd, args);
|
||||||
|
|
||||||
|
cmd->function(entity, args);
|
||||||
|
|
||||||
|
if (cmd->refreshable)
|
||||||
|
display_refresh_timeout_set();
|
||||||
|
}
|
||||||
|
|
||||||
static bool match_cmd(const char *family, const char *entity, const char *cmd,
|
static bool match_cmd(const char *family, const char *entity, const char *cmd,
|
||||||
char *args, const struct command *command_list)
|
char *args, const struct command *command_list)
|
||||||
{
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; command_list[i].cmd; i++) {
|
||||||
|
if (strcmp(command_list[i].cmd, cmd))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!command_list[i].function)
|
||||||
|
goto nomatch;
|
||||||
|
|
||||||
|
execute_cmd(family, entity, &command_list[i], args);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
nomatch:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool match_cmd_family(const char *cmd_family, char *arg)
|
static bool match_cmd_family(const char *cmd_family, char *arg)
|
||||||
{
|
{
|
||||||
|
const struct l_queue_entry *entry;
|
||||||
|
const char *arg1;
|
||||||
|
const char *arg2;
|
||||||
|
|
||||||
|
for (entry = l_queue_get_entries(command_families); entry;
|
||||||
|
entry = entry->next) {
|
||||||
|
const struct command_family *family = entry->data;
|
||||||
|
|
||||||
|
if (strcmp(family->name, cmd_family))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
arg1 = strtok_r(NULL, " ", &arg);
|
||||||
|
if (!arg1)
|
||||||
|
goto nomatch;
|
||||||
|
|
||||||
|
if (match_cmd(family->name, NULL, arg1, arg,
|
||||||
|
family->command_list))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
arg2 = strtok_r(NULL, " ", &arg);
|
||||||
|
if (!arg2)
|
||||||
|
goto nomatch;
|
||||||
|
|
||||||
|
if (!match_cmd(family->name, arg1, arg2, arg,
|
||||||
|
family->command_list))
|
||||||
|
goto nomatch;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
nomatch:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void list_commands(const char *command_family,
|
static void list_commands(const char *command_family,
|
||||||
const struct command *cmd_list)
|
const struct command *cmd_list)
|
||||||
{
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; cmd_list[i].cmd; i++) {
|
||||||
|
if (!cmd_list[i].desc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
display_command_line(command_family, &cmd_list[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void list_cmd_families(void)
|
static void list_cmd_families(void)
|
||||||
{
|
{
|
||||||
|
const struct l_queue_entry *entry;
|
||||||
|
|
||||||
|
for (entry = l_queue_get_entries(command_families); entry;
|
||||||
|
entry = entry->next) {
|
||||||
|
const struct command_family *family = entry->data;
|
||||||
|
|
||||||
|
display("\n%s:\n", family->caption);
|
||||||
|
list_commands(family->name, family->command_list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void command_process_prompt(char *prompt)
|
void command_process_prompt(char *prompt)
|
||||||
@ -83,6 +157,8 @@ void command_process_prompt(char *prompt)
|
|||||||
if (match_cmd_family(cmd, arg))
|
if (match_cmd_family(cmd, arg))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
display_refresh_reset();
|
||||||
|
|
||||||
if (match_cmd(NULL, NULL, cmd, arg, command_list))
|
if (match_cmd(NULL, NULL, cmd, arg, command_list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -28,9 +28,11 @@ struct command {
|
|||||||
const char *arg;
|
const char *arg;
|
||||||
void (*function)(const char *entity, char *arg);
|
void (*function)(const char *entity, char *arg);
|
||||||
const char *desc;
|
const char *desc;
|
||||||
|
const bool refreshable;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct command_family {
|
struct command_family {
|
||||||
|
const char *caption;
|
||||||
const char *name;
|
const char *name;
|
||||||
const struct command *command_list;
|
const struct command *command_list;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user