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

This commit is contained in:
Daniel Mierswa 2009-02-15 14:13:27 +02:00 committed by Jouni Malinen
parent 2cfcd014f4
commit 6301cc5d38
3 changed files with 30 additions and 2 deletions

View file

@ -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

View file

@ -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 */,

View file

@ -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;
} }
} }