wpa_cli: Argument completion for p2p_group_remove
Track active P2P groups and complete p2p_group_remove argument.
This commit is contained in:
parent
a624f20bcd
commit
767885423b
1 changed files with 71 additions and 0 deletions
|
@ -111,6 +111,7 @@ struct cli_txt_entry {
|
|||
|
||||
static DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
|
||||
static DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */
|
||||
static DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */
|
||||
|
||||
|
||||
static void print_help(void);
|
||||
|
@ -183,6 +184,23 @@ static void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
|
|||
}
|
||||
|
||||
|
||||
static void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
|
||||
{
|
||||
const char *end;
|
||||
char *buf;
|
||||
end = os_strchr(txt, ' ');
|
||||
if (end == NULL)
|
||||
end = txt + os_strlen(txt);
|
||||
buf = os_malloc(end - txt + 1);
|
||||
if (buf == NULL)
|
||||
return;
|
||||
os_memcpy(buf, txt, end - txt);
|
||||
buf[end - txt] = '\0';
|
||||
cli_txt_list_del(txt_list, buf);
|
||||
os_free(buf);
|
||||
}
|
||||
|
||||
|
||||
static int cli_txt_list_add(struct dl_list *txt_list, const char *txt)
|
||||
{
|
||||
struct cli_txt_entry *e;
|
||||
|
@ -213,6 +231,25 @@ static int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
|
|||
}
|
||||
|
||||
|
||||
static int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
|
||||
{
|
||||
const char *end;
|
||||
char *buf;
|
||||
int ret;
|
||||
end = os_strchr(txt, ' ');
|
||||
if (end == NULL)
|
||||
end = txt + os_strlen(txt);
|
||||
buf = os_malloc(end - txt + 1);
|
||||
if (buf == NULL)
|
||||
return -1;
|
||||
os_memcpy(buf, txt, end - txt);
|
||||
buf[end - txt] = '\0';
|
||||
ret = cli_txt_list_add(txt_list, buf);
|
||||
os_free(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static char ** cli_txt_list_array(struct dl_list *txt_list)
|
||||
{
|
||||
unsigned int i, count = dl_list_len(txt_list);
|
||||
|
@ -1990,6 +2027,21 @@ static int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
|
|||
}
|
||||
|
||||
|
||||
static char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
|
||||
{
|
||||
int arg = get_cmd_arg_num(str, pos);
|
||||
char **res = NULL;
|
||||
|
||||
switch (arg) {
|
||||
case 1:
|
||||
res = cli_txt_list_array(&p2p_groups);
|
||||
break;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
|
||||
char *argv[])
|
||||
{
|
||||
|
@ -3033,6 +3085,8 @@ static char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
|
|||
return wpa_cli_complete_p2p_connect(str, pos);
|
||||
if (os_strcasecmp(cmd, "p2p_peer") == 0)
|
||||
return wpa_cli_complete_p2p_peer(str, pos);
|
||||
if (os_strcasecmp(cmd, "p2p_group_remove") == 0)
|
||||
return wpa_cli_complete_p2p_group_remove(str, pos);
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
for (i = 0; wpa_cli_commands[i].cmd; i++) {
|
||||
|
@ -3286,6 +3340,22 @@ static void cli_event(const char *str)
|
|||
cli_txt_list_del_addr(&p2p_peers, s + 14);
|
||||
return;
|
||||
}
|
||||
|
||||
if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
|
||||
s = os_strchr(start, ' ');
|
||||
if (s == NULL)
|
||||
return;
|
||||
cli_txt_list_add_word(&p2p_groups, s + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
|
||||
s = os_strchr(start, ' ');
|
||||
if (s == NULL)
|
||||
return;
|
||||
cli_txt_list_del_word(&p2p_groups, s + 1);
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_P2P */
|
||||
}
|
||||
|
||||
|
@ -3420,6 +3490,7 @@ static void wpa_cli_interactive(void)
|
|||
eloop_run();
|
||||
|
||||
cli_txt_list_flush(&p2p_peers);
|
||||
cli_txt_list_flush(&p2p_groups);
|
||||
cli_txt_list_flush(&bsses);
|
||||
edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
|
||||
os_free(hfile);
|
||||
|
|
Loading…
Reference in a new issue