Browse Source

Allow the privsep driver to pass the set_country to the real driver

Daniel Mierswa 16 years ago
parent
commit
6301cc5d38
3 changed files with 30 additions and 2 deletions
  1. 1 0
      src/common/privsep_commands.h
  2. 10 1
      src/drivers/driver_privsep.c
  3. 19 1
      wpa_supplicant/wpa_priv.c

+ 1 - 0
src/common/privsep_commands.h

@@ -31,6 +31,7 @@ enum privsep_cmd {
 	PRIVSEP_CMD_L2_NOTIFY_AUTH_START,
 	PRIVSEP_CMD_L2_NOTIFY_AUTH_START,
 	PRIVSEP_CMD_L2_SEND,
 	PRIVSEP_CMD_L2_SEND,
 	PRIVSEP_CMD_SET_MODE,
 	PRIVSEP_CMD_SET_MODE,
+	PRIVSEP_CMD_SET_COUNTRY,
 };
 };
 
 
 struct privsep_cmd_associate
 struct privsep_cmd_associate

+ 10 - 1
src/drivers/driver_privsep.c

@@ -756,6 +756,15 @@ static int wpa_driver_privsep_set_mode(void *priv, int mode)
 }
 }
 
 
 
 
+static int wpa_driver_privsep_set_country(void *priv, const char *alpha2)
+{
+	struct wpa_driver_privsep_data *drv = priv;
+	wpa_printf(MSG_DEBUG, "%s country='%s'", __func__, alpha2);
+	return wpa_priv_cmd(drv, PRIVSEP_CMD_SET_COUNTRY, alpha2,
+			    os_strlen(alpha2), NULL, NULL);
+}
+
+
 struct wpa_driver_ops wpa_driver_privsep_ops = {
 struct wpa_driver_ops wpa_driver_privsep_ops = {
 	"privsep",
 	"privsep",
 	"wpa_supplicant privilege separated driver",
 	"wpa_supplicant privilege separated driver",
@@ -796,7 +805,7 @@ struct wpa_driver_ops wpa_driver_privsep_ops = {
 	wpa_driver_privsep_get_scan_results2,
 	wpa_driver_privsep_get_scan_results2,
 	NULL /* set_probe_req_ie */,
 	NULL /* set_probe_req_ie */,
 	wpa_driver_privsep_set_mode,
 	wpa_driver_privsep_set_mode,
-	NULL /* set_country */,
+	wpa_driver_privsep_set_country,
 	NULL /* global_init */,
 	NULL /* global_init */,
 	NULL /* global_deinit */,
 	NULL /* global_deinit */,
 	NULL /* init2 */,
 	NULL /* init2 */,

+ 19 - 1
wpa_supplicant/wpa_priv.c

@@ -575,10 +575,21 @@ static void wpa_priv_cmd_set_mode(struct wpa_priv_interface *iface,
 }
 }
 
 
 
 
+static void wpa_priv_cmd_set_country(struct wpa_priv_interface *iface,
+				     char *buf)
+{
+	if (iface->drv_priv == NULL || iface->driver->set_country == NULL ||
+	    *buf == '\0')
+		return;
+
+	iface->driver->set_country(iface->drv_priv, buf);
+}
+
+
 static void wpa_priv_receive(int sock, void *eloop_ctx, void *sock_ctx)
 static void wpa_priv_receive(int sock, void *eloop_ctx, void *sock_ctx)
 {
 {
 	struct wpa_priv_interface *iface = eloop_ctx;
 	struct wpa_priv_interface *iface = eloop_ctx;
-	char buf[2000];
+	char buf[2000], *pos;
 	void *cmd_buf;
 	void *cmd_buf;
 	size_t cmd_len;
 	size_t cmd_len;
 	int res, cmd;
 	int res, cmd;
@@ -649,6 +660,13 @@ static void wpa_priv_receive(int sock, void *eloop_ctx, void *sock_ctx)
 	case PRIVSEP_CMD_SET_MODE:
 	case PRIVSEP_CMD_SET_MODE:
 		wpa_priv_cmd_set_mode(iface, cmd_buf, cmd_len);
 		wpa_priv_cmd_set_mode(iface, cmd_buf, cmd_len);
 		break;
 		break;
+	case PRIVSEP_CMD_SET_COUNTRY:
+		pos = cmd_buf;
+		if (pos + cmd_len >= buf + sizeof(buf))
+			break;
+		pos[cmd_len] = '\0';
+		wpa_priv_cmd_set_country(iface, pos);
+		break;
 	}
 	}
 }
 }