Add "reconnect" cmdline argument to hostapd_cli/wpa_cli
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>
This commit is contained in:
parent
4318a635a9
commit
0b1839405e
2 changed files with 50 additions and 10 deletions
|
@ -54,7 +54,7 @@ static void usage(void)
|
||||||
fprintf(stderr, "%s\n", hostapd_cli_version);
|
fprintf(stderr, "%s\n", hostapd_cli_version);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\n"
|
"\n"
|
||||||
"usage: hostapd_cli [-p<path>] [-i<ifname>] [-hvB] "
|
"usage: hostapd_cli [-p<path>] [-i<ifname>] [-hvBr] "
|
||||||
"[-a<path>] \\\n"
|
"[-a<path>] \\\n"
|
||||||
" [-P<pid file>] [-G<ping interval>] [command..]\n"
|
" [-P<pid file>] [-G<ping interval>] [command..]\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -68,6 +68,9 @@ static void usage(void)
|
||||||
" -a<file> run in daemon mode executing the action file "
|
" -a<file> run in daemon mode executing the action file "
|
||||||
"based on events\n"
|
"based on events\n"
|
||||||
" from hostapd\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"
|
" -B run a daemon in the background\n"
|
||||||
" -i<ifname> Interface to listen on (default: first "
|
" -i<ifname> Interface to listen on (default: first "
|
||||||
"interface found in the\n"
|
"interface found in the\n"
|
||||||
|
@ -2007,12 +2010,13 @@ int main(int argc, char *argv[])
|
||||||
int warning_displayed = 0;
|
int warning_displayed = 0;
|
||||||
int c;
|
int c;
|
||||||
int daemonize = 0;
|
int daemonize = 0;
|
||||||
|
int reconnect = 0;
|
||||||
|
|
||||||
if (os_program_init())
|
if (os_program_init())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (;;) {
|
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)
|
if (c < 0)
|
||||||
break;
|
break;
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -2041,6 +2045,9 @@ int main(int argc, char *argv[])
|
||||||
case 'P':
|
case 'P':
|
||||||
pid_file = optarg;
|
pid_file = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
reconnect = 1;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
client_socket_dir = optarg;
|
client_socket_dir = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -2083,8 +2090,7 @@ int main(int argc, char *argv[])
|
||||||
printf("Connection established.\n");
|
printf("Connection established.\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!interactive && !reconnect) {
|
||||||
if (!interactive) {
|
|
||||||
perror("Failed to connect to hostapd - "
|
perror("Failed to connect to hostapd - "
|
||||||
"wpa_ctrl_open");
|
"wpa_ctrl_open");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -2102,8 +2108,14 @@ int main(int argc, char *argv[])
|
||||||
return -1;
|
return -1;
|
||||||
if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
|
if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
|
||||||
return -1;
|
return -1;
|
||||||
|
if (reconnect && action_file && ctrl_ifname) {
|
||||||
if (interactive)
|
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();
|
hostapd_cli_interactive();
|
||||||
else if (action_file)
|
else if (action_file)
|
||||||
hostapd_cli_action(ctrl_conn);
|
hostapd_cli_action(ctrl_conn);
|
||||||
|
|
|
@ -52,6 +52,7 @@ static char *ctrl_ifname = NULL;
|
||||||
static const char *global = NULL;
|
static const char *global = 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 reconnect = 0;
|
||||||
static int ping_interval = 5;
|
static int ping_interval = 5;
|
||||||
static int interactive = 0;
|
static int interactive = 0;
|
||||||
static char *ifname_prefix = NULL;
|
static char *ifname_prefix = NULL;
|
||||||
|
@ -80,7 +81,7 @@ static void update_ifnames(struct wpa_ctrl *ctrl);
|
||||||
|
|
||||||
static void usage(void)
|
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"
|
"[-a<action file>] \\\n"
|
||||||
" [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] "
|
" [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] "
|
||||||
"\\\n"
|
"\\\n"
|
||||||
|
@ -91,6 +92,8 @@ static void usage(void)
|
||||||
" -a = run in daemon mode executing the action file based on "
|
" -a = run in daemon mode executing the action file based on "
|
||||||
"events from\n"
|
"events from\n"
|
||||||
" wpa_supplicant\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"
|
" -B = run a daemon in the background\n"
|
||||||
" default path: " CONFIG_CTRL_IFACE_DIR "\n"
|
" default path: " CONFIG_CTRL_IFACE_DIR "\n"
|
||||||
" default interface: first interface found in socket path\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);
|
wpa_cli_exec(action_file, ifname, pos);
|
||||||
} else if (str_starts(pos, WPA_EVENT_TERMINATING)) {
|
} else if (str_starts(pos, WPA_EVENT_TERMINATING)) {
|
||||||
printf("wpa_supplicant is terminating - stop monitoring\n");
|
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) {
|
if (wpa_ctrl_pending(ctrl) < 0) {
|
||||||
printf("Connection to wpa_supplicant lost - trying to "
|
printf("Connection to wpa_supplicant lost - trying to "
|
||||||
"reconnect\n");
|
"reconnect\n");
|
||||||
|
if (reconnect) {
|
||||||
|
eloop_terminate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
wpa_cli_reconnect();
|
wpa_cli_reconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4574,6 +4582,8 @@ static void wpa_cli_cleanup(void)
|
||||||
static void wpa_cli_terminate(int sig, void *ctx)
|
static void wpa_cli_terminate(int sig, void *ctx)
|
||||||
{
|
{
|
||||||
eloop_terminate();
|
eloop_terminate();
|
||||||
|
if (reconnect)
|
||||||
|
wpa_cli_quit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4654,7 +4664,7 @@ int main(int argc, char *argv[])
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (;;) {
|
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)
|
if (c < 0)
|
||||||
break;
|
break;
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -4686,6 +4696,9 @@ int main(int argc, char *argv[])
|
||||||
case 'P':
|
case 'P':
|
||||||
pid_file = optarg;
|
pid_file = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
reconnect = 1;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
client_socket_dir = optarg;
|
client_socket_dir = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -4711,7 +4724,22 @@ int main(int argc, char *argv[])
|
||||||
if (ctrl_ifname == NULL)
|
if (ctrl_ifname == NULL)
|
||||||
ctrl_ifname = wpa_cli_get_default_ifname();
|
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();
|
wpa_cli_interactive();
|
||||||
} else {
|
} else {
|
||||||
if (!global &&
|
if (!global &&
|
||||||
|
|
Loading…
Add table
Reference in a new issue