]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Add "reconnect" cmdline argument to hostapd_cli/wpa_cli
authorBilal Hatipoglu <bilal.hatipoglu@airties.com>
Thu, 5 Sep 2019 09:31:00 +0000 (12:31 +0300)
committerJouni Malinen <j@w1.fi>
Wed, 25 Dec 2019 18:54:44 +0000 (20:54 +0200)
When the newly added "-r" parameter is used, both clis will try to
reconnect forever on connection lost until signalled (ctrl+c) or
terminated. This is useful only when used with -a to take action to
retrieve events or get status and the cli process stays even if
hostapd/wpa_supplicant daemons restart for some reason (e.g.,
configuration change).

Signed-off-by: Veli Demirel <veli.demirel@airties.com>
Signed-off-by: Bilal Hatipoglu <bilal.hatipoglu@airties.com>
hostapd/hostapd_cli.c
wpa_supplicant/wpa_cli.c

index 42edb7b25bcb4671e3039e9fcaded774ec2a41e1..6819a24bf9f20d1797270249a99189744877bf72 100644 (file)
@@ -54,7 +54,7 @@ static void usage(void)
        fprintf(stderr, "%s\n", hostapd_cli_version);
        fprintf(stderr,
                "\n"
-               "usage: hostapd_cli [-p<path>] [-i<ifname>] [-hvB] "
+               "usage: hostapd_cli [-p<path>] [-i<ifname>] [-hvBr] "
                "[-a<path>] \\\n"
                "                   [-P<pid file>] [-G<ping interval>] [command..]\n"
                "\n"
@@ -68,6 +68,9 @@ static void usage(void)
                "   -a<file>     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<ifname>   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);
index ac271b56bd0648e0a9cbfbfb157c1c10716ded89..a1b061514b5556202b08cc2c4ee1bf59f15e0ec4 100644 (file)
@@ -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<path to ctrl sockets>] [-i<ifname>] [-hvB] "
+       printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvBr] "
               "[-a<action file>] \\\n"
               "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] "
               "\\\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 &&