wpa-cli: Support monitor mode without action file.

Message ID 1497464962-26237-1-git-send-email-greearb@candelatech.com
State New
Headers show

Commit Message

Ben Greear June 14, 2017, 6:29 p.m.
From: Ben Greear <greearb@candelatech.com>

I wanted a way to start wpa_cli, have it do the keep-alive ping,
and print events as they are received.  I do not want an action file,
and I do not need interactive mode, and I want to run
this in a way where stdin may not be open.

So, introduce '-m' monitor mode.

wpa_cli -m -g /var/run/wpa_supplicant_if_wiphy0

Signed-off-by: Ben Greear <greearb@candelatech.com>
---
 wpa_supplicant/wpa_cli.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

Patch

diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index 510f385..7edacac 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -54,6 +54,7 @@  static const char *pid_file = NULL;
 static const char *action_file = NULL;
 static int ping_interval = 5;
 static int interactive = 0;
+static int do_monitor = 0;
 static char *ifname_prefix = NULL;
 
 static DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
@@ -89,6 +90,7 @@  static void usage(void)
 	       "events from\n"
 	       "       wpa_supplicant\n"
 	       "  -B = run a daemon in the background\n"
+	       "  -m = Run in monitor mode, even if we don't have an action file.\n"
 	       "  default path: " CONFIG_CTRL_IFACE_DIR "\n"
 	       "  default interface: first interface found in socket path\n");
 	print_help(NULL);
@@ -123,7 +125,7 @@  static int wpa_cli_open_connection(const char *ifname, int attach)
 	if (ctrl_conn == NULL)
 		return -1;
 
-	if (attach && interactive)
+	if (attach && (interactive || do_monitor))
 		mon_conn = wpa_ctrl_open(ifname);
 	else
 		mon_conn = NULL;
@@ -168,7 +170,7 @@  static int wpa_cli_open_connection(const char *ifname, int attach)
 		return -1;
 	}
 
-	if (attach && interactive)
+	if (attach && (interactive || do_monitor))
 		mon_conn = wpa_ctrl_open2(cfile, client_socket_dir);
 	else
 		mon_conn = NULL;
@@ -178,7 +180,7 @@  static int wpa_cli_open_connection(const char *ifname, int attach)
 	if (mon_conn) {
 		if (wpa_ctrl_attach(mon_conn) == 0) {
 			wpa_cli_attached = 1;
-			if (interactive)
+			if (interactive || do_monitor)
 				eloop_register_read_sock(
 					wpa_ctrl_get_fd(mon_conn),
 					wpa_cli_mon_receive, NULL, NULL);
@@ -200,7 +202,7 @@  static void wpa_cli_close_connection(void)
 		return;
 
 	if (wpa_cli_attached) {
-		wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
+		wpa_ctrl_detach((interactive || do_monitor) ? mon_conn : ctrl_conn);
 		wpa_cli_attached = 0;
 	}
 	wpa_ctrl_close(ctrl_conn);
@@ -3682,6 +3684,9 @@  static void wpa_cli_action_process(const char *msg)
 	if (eloop_terminated())
 		return;
 
+	if (!action_file)
+		return;
+
 	pos = msg;
 	if (os_strncmp(pos, "IFNAME=", 7) == 0) {
 		const char *end;
@@ -3818,8 +3823,9 @@  static void wpa_cli_reconnect(void)
 			return;
 		}
 
-		if (interactive) {
-			update_ifnames(ctrl_conn);
+		if (interactive || do_monitor) {
+			if (interactive)
+				update_ifnames(ctrl_conn);
 			mon_conn = wpa_ctrl_open(global);
 			if (mon_conn) {
 				if (wpa_ctrl_attach(mon_conn) == 0) {
@@ -4269,6 +4275,7 @@  static void wpa_cli_action(struct wpa_ctrl *ctrl)
 	int fd;
 
 	fd = wpa_ctrl_get_fd(ctrl);
+
 	eloop_register_timeout(ping_interval, 0, wpa_cli_action_ping,
 			       ctrl, NULL);
 	eloop_register_read_sock(fd, wpa_cli_action_receive, ctrl, NULL);
@@ -4369,7 +4376,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:mp:P:s:v");
 		if (c < 0)
 			break;
 		switch (c) {
@@ -4391,6 +4398,9 @@  int main(int argc, char *argv[])
 		case 'v':
 			printf("%s\n", wpa_cli_version);
 			return 0;
+		case 'm':
+			do_monitor = 1;
+			break;
 		case 'i':
 			os_free(ctrl_ifname);
 			ctrl_ifname = os_strdup(optarg);
@@ -4415,7 +4425,7 @@  int main(int argc, char *argv[])
 	 */
 	setbuf(stdout, NULL);
 
-	interactive = (argc == optind) && (action_file == NULL);
+	interactive = (argc == optind) && (action_file == NULL) && !do_monitor;
 
 	if (interactive)
 		printf("%s\n\n%s\n\n", wpa_cli_version, cli_license);
@@ -4436,8 +4446,9 @@  int main(int argc, char *argv[])
 			return -1;
 		}
 
-		if (interactive) {
-			update_ifnames(ctrl_conn);
+		if (interactive || do_monitor) {
+			if (interactive)
+				update_ifnames(ctrl_conn);
 			mon_conn = wpa_ctrl_open(global);
 			if (mon_conn) {
 				if (wpa_ctrl_attach(mon_conn) == 0) {
@@ -4458,7 +4469,7 @@  int main(int argc, char *argv[])
 
 	eloop_register_signal_terminate(wpa_cli_terminate, NULL);
 
-	if (ctrl_ifname == NULL)
+	if (ctrl_ifname == NULL && !do_monitor)
 		ctrl_ifname = wpa_cli_get_default_ifname();
 
 	if (interactive) {
@@ -4473,7 +4484,7 @@  int main(int argc, char *argv[])
 			return -1;
 		}
 
-		if (action_file) {
+		if (action_file || do_monitor) {
 			if (wpa_ctrl_attach(ctrl_conn) == 0) {
 				wpa_cli_attached = 1;
 			} else {
@@ -4486,7 +4497,7 @@  int main(int argc, char *argv[])
 		if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
 			return -1;
 
-		if (action_file)
+		if (action_file || do_monitor)
 			wpa_cli_action(ctrl_conn);
 		else
 			ret = wpa_request(ctrl_conn, argc - optind,