Fixed joining open wireless networks (untested)

This commit is contained in:
Pierre Pronchery 2014-01-15 22:21:53 -06:00
parent 0613ee8a1b
commit 250eaa07ed

View File

@ -1,5 +1,5 @@
/* $Id$ */ /* $Id$ */
/* Copyright (c) 2011-2013 Pierre Pronchery <khorben@defora.org> */ /* Copyright (c) 2011-2014 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Panel */ /* This file is part of DeforaOS Desktop Panel */
/* This program is free software: you can redistribute it and/or modify /* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -79,6 +79,7 @@ typedef struct _WPAEntry
size_t buf_cnt; size_t buf_cnt;
/* for WC_ADD_NETWORK */ /* for WC_ADD_NETWORK */
char * ssid; char * ssid;
uint32_t flags;
} WPAEntry; } WPAEntry;
typedef struct _WPAChannel typedef struct _WPAChannel
@ -169,7 +170,7 @@ static void _wpa_set_status(WPA * wpa, gboolean connected, gboolean associated,
/* useful */ /* useful */
static int _wpa_error(WPA * wpa, char const * message, int ret); static int _wpa_error(WPA * wpa, char const * message, int ret);
static void _wpa_connect(WPA * wpa, char const * ssid); static void _wpa_connect(WPA * wpa, char const * ssid, uint32_t flags);
static void _wpa_connect_network(WPA * wpa, WPANetwork * network); static void _wpa_connect_network(WPA * wpa, WPANetwork * network);
static void _wpa_disconnect(WPA * wpa); static void _wpa_disconnect(WPA * wpa);
static void _wpa_rescan(WPA * wpa); static void _wpa_rescan(WPA * wpa);
@ -451,7 +452,7 @@ static void _wpa_ask_password(WPA * wpa, WPANetwork * network)
/* wpa_connect */ /* wpa_connect */
static void _wpa_connect(WPA * wpa, char const * ssid) static void _wpa_connect(WPA * wpa, char const * ssid, uint32_t flags)
{ {
WPAChannel * channel = &wpa->channel[0]; WPAChannel * channel = &wpa->channel[0];
size_t i; size_t i;
@ -465,7 +466,7 @@ static void _wpa_connect(WPA * wpa, char const * ssid)
_wpa_connect_network(wpa, &wpa->networks[i]); _wpa_connect_network(wpa, &wpa->networks[i]);
else else
/* add (and then select) this network */ /* add (and then select) this network */
_wpa_queue(wpa, channel, WC_ADD_NETWORK, ssid); _wpa_queue(wpa, channel, WC_ADD_NETWORK, ssid, flags);
} }
@ -529,6 +530,7 @@ static int _wpa_queue(WPA * wpa, WPAChannel * channel, WPACommand command, ...)
char * cmd = NULL; char * cmd = NULL;
WPAEntry * p; WPAEntry * p;
char const * ssid = NULL; char const * ssid = NULL;
uint32_t flags = 0;
char const * s; char const * s;
char const * t; char const * t;
@ -543,6 +545,7 @@ static int _wpa_queue(WPA * wpa, WPAChannel * channel, WPACommand command, ...)
case WC_ADD_NETWORK: case WC_ADD_NETWORK:
cmd = g_strdup_printf("ADD_NETWORK"); cmd = g_strdup_printf("ADD_NETWORK");
ssid = va_arg(ap, char const *); ssid = va_arg(ap, char const *);
flags = va_arg(ap, uint32_t);
break; break;
case WC_ATTACH: case WC_ATTACH:
cmd = strdup("ATTACH"); cmd = strdup("ATTACH");
@ -616,6 +619,7 @@ static int _wpa_queue(WPA * wpa, WPAChannel * channel, WPACommand command, ...)
p->buf_cnt = strlen(cmd); p->buf_cnt = strlen(cmd);
/* XXX may fail */ /* XXX may fail */
p->ssid = (ssid != NULL) ? strdup(ssid) : NULL; p->ssid = (ssid != NULL) ? strdup(ssid) : NULL;
p->flags = flags;
if(channel->queue_cnt++ == 0) if(channel->queue_cnt++ == 0)
channel->wr_source = g_io_add_watch(channel->channel, G_IO_OUT, channel->wr_source = g_io_add_watch(channel->channel, G_IO_OUT,
_on_watch_can_write, wpa); _on_watch_can_write, wpa);
@ -997,11 +1001,12 @@ static void _clicked_network_view(WPA * wpa, GtkWidget * menu)
guint frequency; guint frequency;
guint level; guint level;
guint flags; guint flags;
gchar * ssid;
gchar * dssid; gchar * dssid;
#if GTK_CHECK_VERSION(2, 12, 0) #if GTK_CHECK_VERSION(2, 12, 0)
gchar * tooltip; gchar * tooltip;
#endif #endif
GtkTreePath * path;
GtkTreeRowReference * row;
if((valid = gtk_tree_model_get_iter_first(model, &iter)) == FALSE) if((valid = gtk_tree_model_get_iter_first(model, &iter)) == FALSE)
return; return;
@ -1011,8 +1016,7 @@ static void _clicked_network_view(WPA * wpa, GtkWidget * menu)
{ {
gtk_tree_model_get(model, &iter, WSR_ICON, &pixbuf, gtk_tree_model_get(model, &iter, WSR_ICON, &pixbuf,
WSR_FREQUENCY, &frequency, WSR_LEVEL, &level, WSR_FREQUENCY, &frequency, WSR_LEVEL, &level,
WSR_FLAGS, &flags, WSR_SSID, &ssid, WSR_FLAGS, &flags, WSR_SSID_DISPLAY, &dssid,
WSR_SSID_DISPLAY, &dssid,
#if GTK_CHECK_VERSION(2, 12, 0) #if GTK_CHECK_VERSION(2, 12, 0)
WSR_TOOLTIP, &tooltip, WSR_TOOLTIP, &tooltip,
#endif #endif
@ -1022,8 +1026,10 @@ static void _clicked_network_view(WPA * wpa, GtkWidget * menu)
gtk_widget_set_tooltip_text(menuitem, tooltip); gtk_widget_set_tooltip_text(menuitem, tooltip);
g_free(tooltip); g_free(tooltip);
#endif #endif
if(ssid != NULL) path = gtk_tree_model_get_path(model, &iter);
g_object_set_data(G_OBJECT(menuitem), "ssid", ssid); row = gtk_tree_row_reference_new(model, path);
gtk_tree_path_free(path);
g_object_set_data(G_OBJECT(menuitem), "row", row);
image = gtk_image_new_from_pixbuf(pixbuf); image = gtk_image_new_from_pixbuf(pixbuf);
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem),
image); image);
@ -1032,7 +1038,7 @@ static void _clicked_network_view(WPA * wpa, GtkWidget * menu)
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
g_free(dssid); g_free(dssid);
#if 0 /* XXX memory leak (for g_object_set_data() above) */ #if 0 /* XXX memory leak (for g_object_set_data() above) */
g_free(ssid); gtk_tree_row_reference_free(treeref);
#endif #endif
} }
} }
@ -1058,17 +1064,30 @@ static void _clicked_on_disconnect(gpointer data)
static void _clicked_on_network_activated(GtkWidget * widget, gpointer data) static void _clicked_on_network_activated(GtkWidget * widget, gpointer data)
{ {
WPA * wpa = data; WPA * wpa = data;
GtkTreeRowReference * row;
GtkTreeModel * model = GTK_TREE_MODEL(wpa->store);
GtkTreePath * path;
GtkTreeIter iter;
gchar * ssid; gchar * ssid;
guint f;
if((ssid = g_object_get_data(G_OBJECT(widget), "ssid")) == NULL) if((row = g_object_get_data(G_OBJECT(widget), "row")) == NULL)
/* FIXME implement */ /* FIXME implement */
return; return;
if((path = gtk_tree_row_reference_get_path(row)) == NULL
|| gtk_tree_model_get_iter(model, &iter, path) != TRUE)
{
gtk_tree_row_reference_free(row);
return;
}
gtk_tree_model_get(model, &iter, WSR_SSID, &ssid, WSR_FLAGS, &f, -1);
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, ssid); fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, ssid);
#endif #endif
_wpa_connect(wpa, ssid); _wpa_connect(wpa, ssid, f);
#if 1 /* XXX partly remediate memory leak (see above) */
g_free(ssid); g_free(ssid);
#if 1 /* XXX partly remediate memory leak (see above) */
gtk_tree_row_reference_free(row);
#endif #endif
} }
@ -1146,7 +1165,7 @@ static gboolean _on_timeout(gpointer data)
/* on_watch_can_read */ /* on_watch_can_read */
static void _read_add_network(WPA * wpa, WPAChannel * channel, char const * buf, static void _read_add_network(WPA * wpa, WPAChannel * channel, char const * buf,
size_t cnt, char const * ssid); size_t cnt, char const * ssid, uint32_t flags);
static void _read_list_networks(WPA * wpa, char const * buf, size_t cnt); static void _read_list_networks(WPA * wpa, char const * buf, size_t cnt);
static void _read_scan_results(WPA * wpa, char const * buf, size_t cnt); static void _read_scan_results(WPA * wpa, char const * buf, size_t cnt);
static void _read_scan_results_cleanup(WPA * wpa, GtkTreeModel * model); static void _read_scan_results_cleanup(WPA * wpa, GtkTreeModel * model);
@ -1210,7 +1229,7 @@ static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
} }
if(entry->command == WC_ADD_NETWORK) if(entry->command == WC_ADD_NETWORK)
_read_add_network(wpa, channel, buf, cnt, _read_add_network(wpa, channel, buf, cnt,
entry->ssid); entry->ssid, entry->flags);
else if(entry->command == WC_LIST_NETWORKS) else if(entry->command == WC_LIST_NETWORKS)
_read_list_networks(wpa, buf, cnt); _read_list_networks(wpa, buf, cnt);
else if(entry->command == WC_SCAN_RESULTS) else if(entry->command == WC_SCAN_RESULTS)
@ -1240,7 +1259,7 @@ static gboolean _on_watch_can_read(GIOChannel * source, GIOCondition condition,
} }
static void _read_add_network(WPA * wpa, WPAChannel * channel, char const * buf, static void _read_add_network(WPA * wpa, WPAChannel * channel, char const * buf,
size_t cnt, char const * ssid) size_t cnt, char const * ssid, uint32_t flags)
{ {
unsigned int id; unsigned int id;
@ -1257,6 +1276,10 @@ static void _read_add_network(WPA * wpa, WPAChannel * channel, char const * buf,
fprintf(stderr, "DEBUG: %s() %u \"%s\"\n", __func__, id, ssid); fprintf(stderr, "DEBUG: %s() %u \"%s\"\n", __func__, id, ssid);
#endif #endif
_wpa_queue(wpa, channel, WC_SET_NETWORK, id, "ssid", ssid); _wpa_queue(wpa, channel, WC_SET_NETWORK, id, "ssid", ssid);
if((flags & (WSRF_WPA | WSRF_WPA2)) == 0)
/* required to be able to connect to open or WEP networks */
_wpa_queue(wpa, channel, WC_SET_NETWORK, id, "key_mgmt",
"NONE");
/* XXX make this optional */ /* XXX make this optional */
_wpa_queue(wpa, channel, WC_SELECT_NETWORK, id); _wpa_queue(wpa, channel, WC_SELECT_NETWORK, id);
_wpa_queue(wpa, channel, WC_LIST_NETWORKS); _wpa_queue(wpa, channel, WC_LIST_NETWORKS);