wpa_cli: Argument completion for p2p_group_remove

Track active P2P groups and complete p2p_group_remove argument.
This commit is contained in:
Jouni Malinen 2011-10-28 23:59:13 +03:00
parent a624f20bcd
commit 767885423b

View file

@ -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);