wpa_gui: Use separate ctrl_iface connection for event messages

This commit is contained in:
Jouni Malinen 2010-02-13 21:37:35 +02:00
parent 62477841a1
commit 4a3ade4e11

View file

@ -87,6 +87,7 @@ static const char *wpa_cli_full_license =
"\n"; "\n";
static struct wpa_ctrl *ctrl_conn; static struct wpa_ctrl *ctrl_conn;
static struct wpa_ctrl *mon_conn;
static int wpa_cli_quit = 0; static int wpa_cli_quit = 0;
static int wpa_cli_attached = 0; static int wpa_cli_attached = 0;
static int wpa_cli_connected = 0; static int wpa_cli_connected = 0;
@ -96,6 +97,7 @@ static char *ctrl_ifname = NULL;
static const char *pid_file = NULL; static const char *pid_file = NULL;
static const char *action_file = NULL; static const char *action_file = NULL;
static int ping_interval = 5; static int ping_interval = 5;
static int interactive = 0;
static void print_help(); static void print_help();
@ -119,32 +121,58 @@ static void usage(void)
} }
static struct wpa_ctrl * wpa_cli_open_connection(const char *ifname) static int wpa_cli_open_connection(const char *ifname, int attach)
{ {
#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE) #if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
ctrl_conn = wpa_ctrl_open(ifname); ctrl_conn = wpa_ctrl_open(ifname);
return ctrl_conn; if (ctrl_conn == NULL)
return -1;
if (attach && interactive)
mon_conn = wpa_ctrl_open(ifname);
else
mon_conn = NULL;
#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ #else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
char *cfile; char *cfile;
int flen, res; int flen, res;
if (ifname == NULL) if (ifname == NULL)
return NULL; return -1;
flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2; flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
cfile = os_malloc(flen); cfile = os_malloc(flen);
if (cfile == NULL) if (cfile == NULL)
return NULL; return -1L;
res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname); res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname);
if (res < 0 || res >= flen) { if (res < 0 || res >= flen) {
os_free(cfile); os_free(cfile);
return NULL; return -1;
} }
ctrl_conn = wpa_ctrl_open(cfile); ctrl_conn = wpa_ctrl_open(cfile);
if (ctrl_conn == NULL) {
os_free(cfile);
return -1;
}
if (attach && interactive)
mon_conn = wpa_ctrl_open(cfile);
else
mon_conn = NULL;
os_free(cfile); os_free(cfile);
return ctrl_conn;
#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ #endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
if (mon_conn) {
if (wpa_ctrl_attach(mon_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
"wpa_supplicant.\n");
return -1;
}
}
return 0;
} }
@ -154,11 +182,15 @@ static void wpa_cli_close_connection(void)
return; return;
if (wpa_cli_attached) { if (wpa_cli_attached) {
wpa_ctrl_detach(ctrl_conn); wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
wpa_cli_attached = 0; wpa_cli_attached = 0;
} }
wpa_ctrl_close(ctrl_conn); wpa_ctrl_close(ctrl_conn);
ctrl_conn = NULL; ctrl_conn = NULL;
if (mon_conn) {
wpa_ctrl_close(mon_conn);
mon_conn = NULL;
}
} }
@ -1160,14 +1192,8 @@ static int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
os_free(ctrl_ifname); os_free(ctrl_ifname);
ctrl_ifname = os_strdup(argv[0]); ctrl_ifname = os_strdup(argv[0]);
if (wpa_cli_open_connection(ctrl_ifname)) { if (wpa_cli_open_connection(ctrl_ifname, 1)) {
printf("Connected to interface '%s.\n", ctrl_ifname); printf("Connected to interface '%s.\n", ctrl_ifname);
if (wpa_ctrl_attach(ctrl_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
"wpa_supplicant.\n");
}
} else { } else {
printf("Could not connect to interface '%s' - re-trying\n", printf("Could not connect to interface '%s' - re-trying\n",
ctrl_ifname); ctrl_ifname);
@ -1714,16 +1740,7 @@ static void wpa_cli_action_cb(char *msg, size_t len)
static void wpa_cli_reconnect(void) static void wpa_cli_reconnect(void)
{ {
wpa_cli_close_connection(); wpa_cli_close_connection();
ctrl_conn = wpa_cli_open_connection(ctrl_ifname); wpa_cli_open_connection(ctrl_ifname, 1);
if (ctrl_conn) {
printf("Connection to wpa_supplicant re-established\n");
if (wpa_ctrl_attach(ctrl_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
"wpa_supplicant.\n");
}
}
} }
@ -1829,7 +1846,7 @@ static void wpa_cli_interactive(void)
#endif /* CONFIG_READLINE */ #endif /* CONFIG_READLINE */
do { do {
wpa_cli_recv_pending(ctrl_conn, 0, 0); wpa_cli_recv_pending(mon_conn, 0, 0);
#ifndef CONFIG_NATIVE_WINDOWS #ifndef CONFIG_NATIVE_WINDOWS
alarm(ping_interval); alarm(ping_interval);
#endif /* CONFIG_NATIVE_WINDOWS */ #endif /* CONFIG_NATIVE_WINDOWS */
@ -1853,7 +1870,7 @@ static void wpa_cli_interactive(void)
#endif /* CONFIG_NATIVE_WINDOWS */ #endif /* CONFIG_NATIVE_WINDOWS */
if (cmd == NULL) if (cmd == NULL)
break; break;
wpa_cli_recv_pending(ctrl_conn, 0, 0); wpa_cli_recv_pending(mon_conn, 0, 0);
pos = cmd; pos = cmd;
while (*pos != '\0') { while (*pos != '\0') {
if (*pos == '\n') { if (*pos == '\n') {
@ -1987,8 +2004,8 @@ static void wpa_cli_alarm(int sig)
} }
if (!ctrl_conn) if (!ctrl_conn)
wpa_cli_reconnect(); wpa_cli_reconnect();
if (ctrl_conn) if (mon_conn)
wpa_cli_recv_pending(ctrl_conn, 1, 0); wpa_cli_recv_pending(mon_conn, 1, 0);
alarm(ping_interval); alarm(ping_interval);
} }
#endif /* CONFIG_NATIVE_WINDOWS */ #endif /* CONFIG_NATIVE_WINDOWS */
@ -2051,7 +2068,6 @@ static char * wpa_cli_get_default_ifname(void)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int interactive;
int warning_displayed = 0; int warning_displayed = 0;
int c; int c;
int daemonize = 0; int daemonize = 0;
@ -2118,31 +2134,6 @@ int main(int argc, char *argv[])
} }
} }
for (; !global;) {
if (ctrl_ifname == NULL)
ctrl_ifname = wpa_cli_get_default_ifname();
ctrl_conn = wpa_cli_open_connection(ctrl_ifname);
if (ctrl_conn) {
if (warning_displayed)
printf("Connection established.\n");
break;
}
if (!interactive) {
perror("Failed to connect to wpa_supplicant - "
"wpa_ctrl_open");
return -1;
}
if (!warning_displayed) {
printf("Could not connect to wpa_supplicant - "
"re-trying\n");
warning_displayed = 1;
}
os_sleep(1, 0);
continue;
}
#ifndef _WIN32_WCE #ifndef _WIN32_WCE
signal(SIGINT, wpa_cli_terminate); signal(SIGINT, wpa_cli_terminate);
signal(SIGTERM, wpa_cli_terminate); signal(SIGTERM, wpa_cli_terminate);
@ -2151,14 +2142,41 @@ int main(int argc, char *argv[])
signal(SIGALRM, wpa_cli_alarm); signal(SIGALRM, wpa_cli_alarm);
#endif /* CONFIG_NATIVE_WINDOWS */ #endif /* CONFIG_NATIVE_WINDOWS */
if (interactive || action_file) { if (ctrl_ifname == NULL)
if (wpa_ctrl_attach(ctrl_conn) == 0) { ctrl_ifname = wpa_cli_get_default_ifname();
wpa_cli_attached = 1;
} else { if (interactive) {
printf("Warning: Failed to attach to " for (; !global;) {
"wpa_supplicant.\n"); if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
if (!interactive) if (warning_displayed)
printf("Connection established.\n");
break;
}
if (!warning_displayed) {
printf("Could not connect to wpa_supplicant - "
"re-trying\n");
warning_displayed = 1;
}
os_sleep(1, 0);
continue;
}
} else {
if (!global &&
wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
perror("Failed to connect to wpa_supplicant - "
"wpa_ctrl_open");
return -1;
}
if (action_file) {
if (wpa_ctrl_attach(ctrl_conn) == 0) {
wpa_cli_attached = 1;
} else {
printf("Warning: Failed to attach to "
"wpa_supplicant.\n");
return -1; return -1;
}
} }
} }