wpa_cli: Print nice prompt when using remote UDP

When CONFIG_CTRL_IFACE=udp-remote is used, print user frendly PS in
wpa_cli. E.g.,
localhost/wlan0>
192.168.1.1/p2p-wlan-0-0>

Signed-hostap: Janusz Dziedzic <janusz.dziedzic@tieto.com>
This commit is contained in:
Janusz Dziedzic 2012-08-05 20:50:17 +03:00 committed by Jouni Malinen
parent 15b97bc3b5
commit 4307bb8c85
3 changed files with 28 additions and 2 deletions

View file

@ -49,6 +49,8 @@ struct wpa_ctrl {
struct sockaddr_in local; struct sockaddr_in local;
struct sockaddr_in dest; struct sockaddr_in dest;
char *cookie; char *cookie;
char *remote_ifname;
char *remote_ip;
#endif /* CONFIG_CTRL_IFACE_UDP */ #endif /* CONFIG_CTRL_IFACE_UDP */
#ifdef CONFIG_CTRL_IFACE_UNIX #ifdef CONFIG_CTRL_IFACE_UNIX
int s; int s;
@ -302,23 +304,27 @@ struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
port_id = WPA_CTRL_IFACE_PORT; port_id = WPA_CTRL_IFACE_PORT;
h = gethostbyname(name); h = gethostbyname(name);
ctrl->remote_ip = os_strdup(name);
os_free(name); os_free(name);
if (h == NULL) { if (h == NULL) {
perror("gethostbyname"); perror("gethostbyname");
close(ctrl->s); close(ctrl->s);
os_free(ctrl->remote_ip);
os_free(ctrl); os_free(ctrl);
return NULL; return NULL;
} }
ctrl->dest.sin_port = htons(port_id); ctrl->dest.sin_port = htons(port_id);
os_memcpy(h->h_addr, (char *) &ctrl->dest.sin_addr.s_addr, os_memcpy(h->h_addr, (char *) &ctrl->dest.sin_addr.s_addr,
h->h_length); h->h_length);
} } else
ctrl->remote_ip = os_strdup("localhost");
#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */ #endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest, if (connect(ctrl->s, (struct sockaddr *) &ctrl->dest,
sizeof(ctrl->dest)) < 0) { sizeof(ctrl->dest)) < 0) {
perror("connect"); perror("connect");
close(ctrl->s); close(ctrl->s);
os_free(ctrl->remote_ip);
os_free(ctrl); os_free(ctrl);
return NULL; return NULL;
} }
@ -329,14 +335,31 @@ struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path)
ctrl->cookie = os_strdup(buf); ctrl->cookie = os_strdup(buf);
} }
if (wpa_ctrl_request(ctrl, "IFNAME", 6, buf, &len, NULL) == 0) {
buf[len] = '\0';
ctrl->remote_ifname = os_strdup(buf);
}
return ctrl; return ctrl;
} }
char * wpa_ctrl_get_remote_ifname(struct wpa_ctrl *ctrl)
{
#define WPA_CTRL_MAX_PS_NAME 100
static char ps[WPA_CTRL_MAX_PS_NAME] = {};
os_snprintf(ps, WPA_CTRL_MAX_PS_NAME, "%s/%s",
ctrl->remote_ip, ctrl->remote_ifname);
return ps;
}
void wpa_ctrl_close(struct wpa_ctrl *ctrl) void wpa_ctrl_close(struct wpa_ctrl *ctrl)
{ {
close(ctrl->s); close(ctrl->s);
os_free(ctrl->cookie); os_free(ctrl->cookie);
os_free(ctrl->remote_ifname);
os_free(ctrl->remote_ip);
os_free(ctrl); os_free(ctrl);
} }

View file

@ -286,6 +286,8 @@ int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
*/ */
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl); int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);
char * wpa_ctrl_get_remote_ifname(struct wpa_ctrl *ctrl);
#ifdef ANDROID #ifdef ANDROID
/** /**
* wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that * wpa_ctrl_cleanup() - Delete any local UNIX domain socket files that

View file

@ -3806,6 +3806,7 @@ static void wpa_cli_edit_eof_cb(void *ctx)
static void wpa_cli_interactive(void) static void wpa_cli_interactive(void)
{ {
char *home, *hfile = NULL; char *home, *hfile = NULL;
const char *ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
printf("\nInteractive mode\n\n"); printf("\nInteractive mode\n\n");
@ -3820,7 +3821,7 @@ static void wpa_cli_interactive(void)
eloop_register_signal_terminate(wpa_cli_eloop_terminate, NULL); eloop_register_signal_terminate(wpa_cli_eloop_terminate, NULL);
edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb, edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
wpa_cli_edit_completion_cb, NULL, hfile, NULL); wpa_cli_edit_completion_cb, NULL, hfile, ps);
eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL); eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
eloop_run(); eloop_run();