diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c index 42edb7b25..6819a24bf 100644 --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c @@ -54,7 +54,7 @@ static void usage(void) fprintf(stderr, "%s\n", hostapd_cli_version); fprintf(stderr, "\n" - "usage: hostapd_cli [-p] [-i] [-hvB] " + "usage: hostapd_cli [-p] [-i] [-hvBr] " "[-a] \\\n" " [-P] [-G] [command..]\n" "\n" @@ -68,6 +68,9 @@ static void usage(void) " -a run in daemon mode executing the action file " "based on events\n" " from hostapd\n" + " -r try to reconnect when client socket is " + "disconnected.\n" + " This is useful only when used with -a.\n" " -B run a daemon in the background\n" " -i Interface to listen on (default: first " "interface found in the\n" @@ -2007,12 +2010,13 @@ int main(int argc, char *argv[]) int warning_displayed = 0; int c; int daemonize = 0; + int reconnect = 0; if (os_program_init()) return -1; for (;;) { - c = getopt(argc, argv, "a:BhG:i:p:P:s:v"); + c = getopt(argc, argv, "a:BhG:i:p:P:rs:v"); if (c < 0) break; switch (c) { @@ -2041,6 +2045,9 @@ int main(int argc, char *argv[]) case 'P': pid_file = optarg; break; + case 'r': + reconnect = 1; + break; case 's': client_socket_dir = optarg; break; @@ -2083,8 +2090,7 @@ int main(int argc, char *argv[]) printf("Connection established.\n"); break; } - - if (!interactive) { + if (!interactive && !reconnect) { perror("Failed to connect to hostapd - " "wpa_ctrl_open"); return -1; @@ -2102,8 +2108,14 @@ int main(int argc, char *argv[]) return -1; if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue()) return -1; - - if (interactive) + if (reconnect && action_file && ctrl_ifname) { + while (!hostapd_cli_quit) { + if (ctrl_conn) + hostapd_cli_action(ctrl_conn); + os_sleep(1, 0); + hostapd_cli_reconnect(ctrl_ifname); + } + } else if (interactive) hostapd_cli_interactive(); else if (action_file) hostapd_cli_action(ctrl_conn); diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index ac271b56b..a1b061514 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -52,6 +52,7 @@ static char *ctrl_ifname = NULL; static const char *global = NULL; static const char *pid_file = NULL; static const char *action_file = NULL; +static int reconnect = 0; static int ping_interval = 5; static int interactive = 0; static char *ifname_prefix = NULL; @@ -80,7 +81,7 @@ static void update_ifnames(struct wpa_ctrl *ctrl); static void usage(void) { - printf("wpa_cli [-p] [-i] [-hvB] " + printf("wpa_cli [-p] [-i] [-hvBr] " "[-a] \\\n" " [-P] [-g] [-G] " "\\\n" @@ -91,6 +92,8 @@ static void usage(void) " -a = run in daemon mode executing the action file based on " "events from\n" " wpa_supplicant\n" + " -r = try to reconnect when client socket is disconnected.\n" + " This is useful only when used with -a.\n" " -B = run a daemon in the background\n" " default path: " CONFIG_CTRL_IFACE_DIR "\n" " default interface: first interface found in socket path\n"); @@ -4035,7 +4038,8 @@ static void wpa_cli_action_process(const char *msg) wpa_cli_exec(action_file, ifname, pos); } else if (str_starts(pos, WPA_EVENT_TERMINATING)) { printf("wpa_supplicant is terminating - stop monitoring\n"); - wpa_cli_quit = 1; + if (!reconnect) + wpa_cli_quit = 1; } } @@ -4227,6 +4231,10 @@ static void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor) if (wpa_ctrl_pending(ctrl) < 0) { printf("Connection to wpa_supplicant lost - trying to " "reconnect\n"); + if (reconnect) { + eloop_terminate(); + return; + } wpa_cli_reconnect(); } } @@ -4574,6 +4582,8 @@ static void wpa_cli_cleanup(void) static void wpa_cli_terminate(int sig, void *ctx) { eloop_terminate(); + if (reconnect) + wpa_cli_quit = 1; } @@ -4654,7 +4664,7 @@ int main(int argc, char *argv[]) return -1; for (;;) { - c = getopt(argc, argv, "a:Bg:G:hi:p:P:s:v"); + c = getopt(argc, argv, "a:Bg:G:hi:p:P:rs:v"); if (c < 0) break; switch (c) { @@ -4686,6 +4696,9 @@ int main(int argc, char *argv[]) case 'P': pid_file = optarg; break; + case 'r': + reconnect = 1; + break; case 's': client_socket_dir = optarg; break; @@ -4711,7 +4724,22 @@ int main(int argc, char *argv[]) if (ctrl_ifname == NULL) ctrl_ifname = wpa_cli_get_default_ifname(); - if (interactive) { + if (reconnect && action_file && ctrl_ifname) { + while (!wpa_cli_quit) { + if (ctrl_conn) + wpa_cli_action(ctrl_conn); + else + os_sleep(1, 0); + wpa_cli_close_connection(); + wpa_cli_open_connection(ctrl_ifname, 0); + if (ctrl_conn) { + if (wpa_ctrl_attach(ctrl_conn) != 0) + wpa_cli_close_connection(); + else + wpa_cli_attached = 1; + } + } + } else if (interactive) { wpa_cli_interactive(); } else { if (!global &&