+++ /dev/null
-LIBTOOL=libtool
-
-CFLAGS += -Wall -O2 -DDEBUG -DOSSOLOG_STDERR -shared
-LDFLAGS += -shared -module
-
-# Library flags
-PKG_CFLAGS := $(shell pkg-config --cflags glib-2.0 gconf-2.0 dbus-1 dbus-glib-1 osso-ic)
-PKG_LDFLAGS := $(shell pkg-config --libs glib-2.0 gconf-2.0 dbus-1 dbus-glib-1)
-CFLAGS += $(PKG_CFLAGS)
-LDFLAGS += $(PKG_LDFLAGS)
-
-LTFLAGS = -shared
-
-BINARY = libicd_network_wpa.so
-OBJS = icd.o wlan.o networks.o gconf.o \
- dbus.o dbus-helper.o dbus-handler.o supp.o
-
-all: $(BINARY)
-
-$(BINARY): $(OBJS)
- $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $^
-
-%.o: %.c
- $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c $< -o $@
-
-clean:
- $(LIBTOOL) --mode=clean $(RM) libicd_network_wpa.so *.o
-
-install: $(BINARY)
- $(LIBTOOL) --mode=install install -c --strip --mode=644 \
- $(BINARY) $(DESTDIR)/usr/lib/icd2/
- $(LIBTOOL) --mode=finish $(DESTDIR)/usr/lib/icd2/
-
-
-.PHONY: all clean install
-
+++ /dev/null
-/**
- @file common.h
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _COMMON_H_
-#define _COMMON_H_
-
-#define WPA_IFACE "wlan0"
-
-#define WPA_NETWORK_TYPE "WLAN_WPA"
-
-#define WPA_GCONF_NETWORK_TYPE "/type"
-#define WPA_GCONF_NETWORK_TYPE_VALUE WPA_NETWORK_TYPE
-
-#define WPA_GCONF_SSID "/wpa_ssid"
-
-#define WPA_GCONF_SETTING_PREFIX "wpa_"
-#define WPA_GCONF_SETTING_PREFIX_LEN 4
-
-#define SEARCH_CONTINUE 0
-#define SEARCH_FINISHED 1
-#define SEARCH_STOPPED 2
-
-#endif
+++ /dev/null
-/**
- @file dbus-helper.c
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Janne Ylalehto <janne.ylalehto@nokia.com>
- @author Johan Hedberg <johan.hedberg@nokia.com>
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-#include <glib.h>
-
-#include <wlancond-dbus.h>
-
-#include "dbus-helper.h"
-#include "dbus-handler.h"
-#include "wlan.h"
-#include "supp.h"
-#include "log.h"
-
-static DBusHandlerResult wlancond_scan_results_handler(DBusMessage *message) {
- DBusMessageIter iter;
- gint32 number_of_results, i;
-
- if (!wlan_is_scanning()) {
- DLOG_DEBUG("Received scan results we didn't ask for");
- // TODO: Somehow use them
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- }
-
- dbus_message_iter_init(message, &iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32)
- goto param_err;
-
- dbus_message_iter_get_basic(&iter, &number_of_results);
-
- dbus_message_iter_next(&iter);
-
- for (i = 0; i < number_of_results; i++) {
- DBusMessageIter array_iter;
- gint32 ssid_len, bssid_len;
- gchar * ssid, * bssid;
- gint32 rssi;
- guint32 channel, cap_bits;
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
- dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_BYTE) {
-
- goto param_err;
- }
-
- dbus_message_iter_recurse(&iter, &array_iter);
- dbus_message_iter_get_fixed_array(&array_iter, &ssid, &ssid_len);
- dbus_message_iter_next(&iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
- dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_BYTE) {
-
- goto param_err;
- }
-
- dbus_message_iter_recurse(&iter, &array_iter);
- dbus_message_iter_get_fixed_array(&array_iter, &bssid, &bssid_len);
- dbus_message_iter_next(&iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32)
- goto param_err;
- dbus_message_iter_get_basic(&iter, &rssi);
- dbus_message_iter_next(&iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
- goto param_err;
- dbus_message_iter_get_basic(&iter, &channel);
- dbus_message_iter_next(&iter);
-
- if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32)
- goto param_err;
- dbus_message_iter_get_basic(&iter, &cap_bits);
- dbus_message_iter_next(&iter);
-
- DLOG_INFO("Scan result with %s.", ssid);
- wlan_notify_ap(ssid, bssid,
- rssi, channel, cap_bits);
- }
-
- DLOG_DEBUG("Handled scan result, results=%ld.",
- (long) number_of_results);
-
- wlan_notify_end_of_search();
-
- return DBUS_HANDLER_RESULT_HANDLED;
-param_err:
- DLOG_WARN("Parameter error in scan request");
-
- wlan_notify_end_of_search();
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult supp_state_change_handler(DBusMessage *message) {
- gchar *old_state, *new_state;
-
- if (!dbus_message_get_args(
- message, NULL,
- DBUS_TYPE_STRING, &new_state,
- DBUS_TYPE_STRING, &old_state,
- DBUS_TYPE_INVALID))
- {
- DLOG_WARN("Supplicant StateChange signal format error");
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- supp_handle_signal(old_state, new_state);
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult wlancond_sig_handler(DBusConnection *connection,
- DBusMessage *message,
- void *user_data) {
- if (dbus_message_is_signal(message,
- WLANCOND_SIG_INTERFACE,
- WLANCOND_SCAN_RESULTS_SIG))
- return wlancond_scan_results_handler(message);
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-static DBusHandlerResult supp_sig_handler(DBusConnection *connection,
- DBusMessage *message,
- void *user_data) {
- if (dbus_message_is_signal(message,
- WPAS_DBUS_IFACE_INTERFACE,
- WPAS_STATE_CHANGE_SIG))
- return supp_state_change_handler(message);
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-/**
- Create bindings for D-BUS handlers.
- @param connection DBUS connection.
-*/
-void init_dbus_handlers(DBusConnection *connection) {
- gboolean ret;
- /*dbus_bool_t ret;
- ret = dbus_connection_register_object_path(connection,
- WLANCOND_REQ_PATH,
- &wlancond_req_vtable,
- NULL);
- if (ret == FALSE) {
- DLOG_ERR("dbus_connection_register_object_path failed");
- }*/
-
- dbus_bus_add_match(connection,
- "interface=" WLANCOND_SIG_INTERFACE
- ",member=" WLANCOND_SCAN_RESULTS_SIG, NULL);
-
- ret = dbus_connection_add_filter(connection,
- (DBusHandleMessageFunction)wlancond_sig_handler, NULL, NULL);
-
- if (!ret) {
- DLOG_ERR("dbus_connection_add_filter failed");
- }
-
- dbus_bus_add_match(connection,
- "interface=" WPAS_DBUS_IFACE_INTERFACE
- ",member=" WPAS_STATE_CHANGE_SIG, NULL);
-
- ret = dbus_connection_add_filter(connection,
- (DBusHandleMessageFunction)supp_sig_handler, NULL, NULL);
-
- if (!ret) {
- DLOG_ERR("dbus_connection_add_filter failed");
- }
-}
-
-/**
- Destroy D-BUS handlers.
- @param connection DBUS connection.
-*/
-void destroy_dbus_handlers(DBusConnection *connection) {
- //dbus_connection_unregister_object_path(connection, WLANCOND_REQ_PATH);
-}
+++ /dev/null
-/**
- @file dbus-helper.c
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- @author Janne Ylalehto <janne.ylalehto@nokia.com>
- @author Johan Hedberg <johan.hedberg@nokia.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _DBUS_HANDLER_H_
-#define _DBUS_HANDLER_H_
-
-#ifndef DBUS_API_SUBJECT_TO_CHANGE
-# define DBUS_API_SUBJECT_TO_CHANGE
-# include <dbus/dbus.h>
-#endif
-
-/** Bind functions to corresponding D-Bus messages
- * @param connection D-Bus connection
- */
-void init_dbus_handlers(DBusConnection *connection);
-
-/** Free memory allocated to handlers
- * @param connection D-Bus connection
- */
-void destroy_dbus_handlers(DBusConnection *connection);
-
-#endif /* _DBUS_HANDLER_H_ */
+++ /dev/null
-/**
- @file dbus-helper.c
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
- Copyright (C) 2003-2009, Jouni Malinen <j@w1.fi> and contributors.
- Copyright (C) 2009 Javier S. Pedro
-
- @author Janne Ylalehto <janne.ylalehto@nokia.com>
- @author Johan Hedberg <johan.hedberg@nokia.com>
- @author Jouni Malinen <j@w1.fi> and contributors
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <glib.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
-#include "log.h"
-#include "dbus-helper.h"
-
-DBusMessage *new_dbus_signal(const char *path,
- const char *interface,
- const char *name,
- const char *destination) {
- DBusMessage *signal;
-
- signal = dbus_message_new_signal(path, interface, name);
- if (signal == NULL) {
- die("Out of memory during dbus_message_new_error()");
- }
-
- if (destination) {
- if (!dbus_message_set_destination(signal, destination)) {
- die("Out of memory during dbus_message_set_destination()");
- }
- }
-
- dbus_message_set_no_reply(signal, TRUE);
-
- return signal;
-}
-
-DBusMessage *new_dbus_method_call(const char *service,
- const char *path,
- const char *interface,
- const char *method) {
- DBusMessage *message;
-
- message = dbus_message_new_method_call(service, path, interface, method);
- if (message == NULL) {
- die("Out of memory during dbus_message_new_method_call()");
- }
-
- return message;
-}
-
-DBusMessage *new_dbus_method_return(DBusMessage *message) {
- DBusMessage *reply;
-
- reply = dbus_message_new_method_return(message);
- if (reply == NULL) {
- die("Out of memory during dbus_message_new_method_return()");
- }
-
- return reply;
-}
-
-DBusMessage *new_dbus_error(DBusMessage *message, const char *name) {
- DBusMessage *error;
-
- error = dbus_message_new_error(message, name, NULL);
- if (error == NULL) {
- die("Out of memory during dbus_message_new_error()");
- }
-
- return error;
-}
-
-int send_and_unref(DBusConnection *connection, DBusMessage *message) {
- if (!dbus_connection_send(connection, message, NULL)) {
- dbus_message_unref(message);
- return -1;
- }
-
- dbus_connection_flush(connection);
- dbus_message_unref(message);
-
- return 0;
-}
-
-int send_invalid_args(DBusConnection *connection, DBusMessage *message) {
- DBusMessage *reply;
-
- reply = new_dbus_error(message, DBUS_ERROR_INVALID_ARGS);
-
- return send_and_unref(connection, reply);
-}
-
-void append_dbus_args(DBusMessage *message, int first_arg_type, ...) {
- dbus_bool_t ret;
- va_list ap;
-
- va_start(ap, first_arg_type);
- ret = dbus_message_append_args_valist(message, first_arg_type, ap);
- va_end(ap);
-
- if (ret == FALSE) {
- die("dbus_message_append_args failed");
- }
-}
-
-/**
- * Start a dict in a dbus message. Should be paired with a call to
- * {@link wpa_dbus_dict_close_write}.
- *
- * @param iter A valid dbus message iterator
- * @param iter_dict (out) A dict iterator to pass to further dict functions
- * @return 0 on success, -1 on failure
- *
- */
-int dbus_dict_open_write(DBusMessageIter *iter,
- DBusMessageIter *iter_dict)
-{
- dbus_bool_t result;
-
- if (!iter || !iter_dict)
- return FALSE;
-
- result = dbus_message_iter_open_container(
- iter,
- DBUS_TYPE_ARRAY,
- DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
- DBUS_TYPE_STRING_AS_STRING
- DBUS_TYPE_VARIANT_AS_STRING
- DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
- iter_dict);
-
- return (result ? 0 : -1);
-}
-
-/**
- * End a dict element in a dbus message. Should be paired with
- * a call to {@link wpa_dbus_dict_open_write}.
- *
- * @param iter valid dbus message iterator, same as passed to
- * wpa_dbus_dict_open_write()
- * @param iter_dict a dbus dict iterator returned from
- * {@link wpa_dbus_dict_open_write}
- * @return 0 on success, -1 on failure
- *
- */
-int dbus_dict_close_write(DBusMessageIter *iter,
- DBusMessageIter *iter_dict)
-{
- if (!iter || !iter_dict)
- return FALSE;
-
- return dbus_message_iter_close_container(iter, iter_dict) ? 0 : -1;
-}
-
-static const char * _get_type_as_string_from_type(const int type)
-{
- switch(type) {
- case DBUS_TYPE_BYTE:
- return DBUS_TYPE_BYTE_AS_STRING;
- case DBUS_TYPE_BOOLEAN:
- return DBUS_TYPE_BOOLEAN_AS_STRING;
- case DBUS_TYPE_INT16:
- return DBUS_TYPE_INT16_AS_STRING;
- case DBUS_TYPE_UINT16:
- return DBUS_TYPE_UINT16_AS_STRING;
- case DBUS_TYPE_INT32:
- return DBUS_TYPE_INT32_AS_STRING;
- case DBUS_TYPE_UINT32:
- return DBUS_TYPE_UINT32_AS_STRING;
- case DBUS_TYPE_INT64:
- return DBUS_TYPE_INT64_AS_STRING;
- case DBUS_TYPE_UINT64:
- return DBUS_TYPE_UINT64_AS_STRING;
- case DBUS_TYPE_DOUBLE:
- return DBUS_TYPE_DOUBLE_AS_STRING;
- case DBUS_TYPE_STRING:
- return DBUS_TYPE_STRING_AS_STRING;
- case DBUS_TYPE_OBJECT_PATH:
- return DBUS_TYPE_OBJECT_PATH_AS_STRING;
- case DBUS_TYPE_ARRAY:
- return DBUS_TYPE_ARRAY_AS_STRING;
- default:
- return NULL;
- }
-}
-
-static int _dbus_add_dict_entry_start(
- DBusMessageIter *iter_dict, DBusMessageIter *iter_dict_entry,
- const char *key, const int value_type)
-{
- if (!dbus_message_iter_open_container(iter_dict,
- DBUS_TYPE_DICT_ENTRY, NULL,
- iter_dict_entry))
- return FALSE;
-
- if (!dbus_message_iter_append_basic(iter_dict_entry, DBUS_TYPE_STRING,
- &key))
- return FALSE;
-
- return TRUE;
-}
-
-
-static dbus_bool_t _dbus_add_dict_entry_end(
- DBusMessageIter *iter_dict, DBusMessageIter *iter_dict_entry,
- DBusMessageIter *iter_dict_val)
-{
- if (!dbus_message_iter_close_container(iter_dict_entry, iter_dict_val))
- return FALSE;
- if (!dbus_message_iter_close_container(iter_dict, iter_dict_entry))
- return FALSE;
-
- return TRUE;
-}
-
-static dbus_bool_t _dbus_add_dict_entry_basic(DBusMessageIter *iter_dict,
- const char *key,
- const int value_type,
- const void *value)
-{
- DBusMessageIter iter_dict_entry, iter_dict_val;
- const char *type_as_string = NULL;
-
- type_as_string = _get_type_as_string_from_type(value_type);
- if (!type_as_string)
- return FALSE;
-
- if (!_dbus_add_dict_entry_start(iter_dict, &iter_dict_entry,
- key, value_type))
- return FALSE;
-
- if (!dbus_message_iter_open_container(&iter_dict_entry,
- DBUS_TYPE_VARIANT,
- type_as_string, &iter_dict_val))
- return FALSE;
-
- if (!dbus_message_iter_append_basic(&iter_dict_val, value_type, value))
- return FALSE;
-
- if (!_dbus_add_dict_entry_end(iter_dict, &iter_dict_entry,
- &iter_dict_val))
- return FALSE;
-
- return TRUE;
-}
-
-/**
- * Add a string entry to the dict.
- *
- * @param iter_dict A valid DBusMessageIter returned from
- * {@link wpa_dbus_dict_open_write}
- * @param key The key of the dict item
- * @param value The string value
- * @return TRUE on success, FALSE on failure
- *
- */
-int dbus_dict_append_string(DBusMessageIter *iter_dict,
- const char *key, const char *value)
-{
- if (!key || !value)
- return FALSE;
- return _dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_STRING,
- &value) ? 0 : -1;
-}
-
-/**
- * Add a 32-bit signed integer to the dict.
- *
- * @param iter_dict A valid DBusMessageIter returned from
- * {@link wpa_dbus_dict_open_write}
- * @param key The key of the dict item
- * @param value The 32-bit signed integer value
- * @return TRUE on success, FALSE on failure
- *
- */
-int dbus_dict_append_int32(DBusMessageIter *iter_dict,
- const char *key,
- const dbus_int32_t value)
-{
- if (!key)
- return FALSE;
- return _dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_INT32,
- &value) ? 0 : -1;
-}
-
+++ /dev/null
-/**
- @file dbus-helper.h
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- @author Janne Ylälehto <janne.ylalehto@nokia.com>
- @author Jouni Malinen <j@w1.fi> and contributors
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-#ifndef _DBUS_HELPER_H_
-#define _DBUS_HELPER_H_
-
-#ifndef DBUS_API_SUBJECT_TO_CHANGE
-# define DBUS_API_SUBJECT_TO_CHANGE
-# include <dbus/dbus.h>
-#endif
-
-void append_dbus_args(DBusMessage *message, int first_arg_type, ...);
-
-int send_and_unref(DBusConnection *connection, DBusMessage *message);
-
-int send_invalid_args(DBusConnection *connection, DBusMessage *message);
-
-DBusMessage *new_dbus_signal(const char *path,
- const char *interface,
- const char *name,
- const char *destination);
-
-DBusMessage *new_dbus_method_call(const char *service,
- const char *path,
- const char *interface,
- const char *method);
-
-DBusMessage *new_dbus_method_return(DBusMessage *message);
-
-DBusMessage *new_dbus_error(DBusMessage *message, const char *name);
-
-int dbus_dict_open_write(DBusMessageIter *iter,
- DBusMessageIter *iter_dict);
-int dbus_dict_close_write(DBusMessageIter *iter,
- DBusMessageIter *iter_dict);
-
-int dbus_dict_append_string(DBusMessageIter *iter_dict,
- const char *key, const char *value);
-
-int dbus_dict_append_int32(DBusMessageIter *iter_dict,
- const char *key,
- const dbus_int32_t value);
-
-#endif /* _DBUD_HELPER_H_ */
+++ /dev/null
-/**
- @file dbus.c
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- @author Johan Hedberg <johan.hedberg@nokia.com>
- @author Janne Ylälehto <janne.ylalehto@nokia.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <glib.h>
-
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include "log.h"
-#include "dbus.h"
-
-static DBusConnection *_dbus_connection = NULL;
-
-DBusConnection *get_dbus_connection(void) {
- return _dbus_connection;
-}
-
-int setup_dbus_connection(const char *service,
- void (*handler_init)(DBusConnection *connection)) {
- DBusError derror;
-
- g_assert(_dbus_connection == NULL);
-
- dbus_error_init(&derror);
- _dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &derror);
- if (_dbus_connection == NULL) {
- DLOG_ERR("System DBus connection failed: %s", derror.message);
- dbus_error_free(&derror);
- return -1;
- }
- dbus_connection_setup_with_g_main(_dbus_connection, NULL);
-
- if (service) {
- int ret = dbus_bus_request_name(_dbus_connection, service, 0,
- &derror);
- if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
- DLOG_ERR("Could not aquire D-BUS name '%s' (ret: %d)",
- service, ret);
- if (dbus_error_is_set(&derror)) {
- DLOG_DEBUG("%s", derror.message);
- dbus_error_free(&derror);
- }
- return -1;
- }
- }
-
- if (handler_init)
- handler_init(_dbus_connection);
-
- return 0;
-}
-
-void close_dbus_connection(void) {
- g_assert(_dbus_connection != NULL);
- dbus_connection_unref(_dbus_connection);
- _dbus_connection = NULL;
-}
+++ /dev/null
-/**
- @file dbus.h
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- @author Johan Hedberg <johan.hedberg@nokia.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-#ifndef _DBUS_H_
-#define _DBUS_H_
-
-#ifndef DBUS_API_SUBJECT_TO_CHANGE
-# define DBUS_API_SUBJECT_TO_CHANGE
-# include <dbus/dbus.h>
-#endif
-
-/** Connect to the system D-Bus
- * @returns 0 on success, -1 on failure
- */
-int setup_dbus_connection(const char *service,
- void (*handler_init)(DBusConnection *connection));
-
-/** Disconnect from the system D-Bus */
-void close_dbus_connection(void);
-
-DBusConnection *get_dbus_connection(void);
-
-#endif /* _DBUS_H_ */
+++ /dev/null
-/**
- @file gconf.c
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#include <string.h>
-
-#include <glib.h>
-#include <gconf/gconf-client.h>
-
-#include "log.h"
-
-gchar * gconf_get_string(GConfClient *client, gchar * path)
-{
- GError *error = NULL;
- gchar *value = gconf_client_get_string(client, path, &error);
-
- if (error) {
- DLOG_ERR("Could not get setting:%s, error:%s", path,
- error->message);
-
- g_clear_error(&error);
- value = NULL;
- } else if (!value) {
- DLOG_ERR("Could not get setting:%s", path);
- }
-
- g_free(path);
-
- return value;
-}
+++ /dev/null
-/**
- @file gconf.h
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _GCONF_H_
-#define _GCONF_H_
-
-gchar * gconf_get_string(GConfClient *client, gchar * path);
-
-#endif
+++ /dev/null
-/**
- @file icd.c
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#include <glib.h>
-
-#include <network_api.h>
-#include <osso-ic-dbus.h>
-
-#include "common.h"
-#include "dbus.h"
-#include "dbus-handler.h"
-#include "log.h"
-#include "supp.h"
-#include "networks.h"
-#include "icd.h"
-
-/** time in seconds a found network is kept cached by icd2 */
-#define ICD_SEARCH_LIFETIME (5 * 60)
-/** time in seconds after which a new network scan is to be triggered */
-#define ICD_SEARCH_INTERVAL (2 * 60)
-
-/** time (in milliseconds) to wait after a wpa_supplicant disconnected event
- * before calling it a day and shutting down the interface */
-#define ICD_DISCONNECTED_TIMEOUT (60 * 1000)
-
-/** icd flags to use */
-#define ICD_WPA_FLAGS (ICD_NW_ATTR_AUTOCONNECT | ICD_NW_ATTR_IAPNAME)
-
-
-/** equivalent to signal level 0 */
-#define RSSI_MIN (-85)
-/** equivalent to signal level max */
-#define RSSI_MAX (-30)
-/* guaranteed to be random, chosen by fair dice roll :) */
-
-
-static icd_nw_watch_pid_fn icd_watch_fn;
-static gpointer icd_watch_token;
-static icd_nw_close_fn icd_close_fn;
-static icd_nw_status_change_fn icd_status_change_fn;
-static icd_nw_renew_fn icd_renew_fn;
-
-static gchar * cur_network_id = NULL;
-
-/** @see ICD_DISCONNECTED_TIMEOUT */
-static guint connect_timeout = 0;
-
-static inline gint rssi_to_signal(gint rssi)
-{
- gint signal = rssi - RSSI_MIN + ICD_NW_LEVEL_NONE;
- signal *= ICD_NW_LEVEL_10;
- signal /= (RSSI_MAX - RSSI_MIN);
-
- if (signal < ICD_NW_LEVEL_NONE) return ICD_NW_LEVEL_NONE;
- else if (signal > ICD_NW_LEVEL_10) return ICD_NW_LEVEL_10;
- else return signal;
-}
-
-static gboolean disconnected_timeout_cb(gpointer data)
-{
- // If connect_timeout is 0, we have been disabled.
- if (!connect_timeout) return FALSE;
-
- // Disconnected for too long
- DLOG_DEBUG("Disconnected for way too long");
- icd_close(ICD_NW_ERROR, ICD_DBUS_ERROR_NETWORK_ERROR);
- connect_timeout = 0;
- return FALSE;
-}
-
-/** Supplicant callback while fully connected */
-static void icd_supp_cb(enum supp_status status, const char * error_str,
- gpointer user_data)
-{
- DLOG_DEBUG("%s: %d", __func__, status);
-
- switch (status) {
- case SUPP_STATUS_ERROR:
- DLOG_WARN_L("Unexpected supplicant error");
-
- // Fall through
- case SUPP_STATUS_KILLED:
- // Close connection
- icd_close(ICD_NW_ERROR, ICD_DBUS_ERROR_SYSTEM_ERROR);
-
- break;
- case SUPP_STATUS_DISCONNECTED:
- if (!connect_timeout) {
- DLOG_DEBUG("Disconnected, starting timeout");
- connect_timeout = g_timeout_add(
- ICD_DISCONNECTED_TIMEOUT,
- disconnected_timeout_cb,
- NULL
- );
- }
- break;
- case SUPP_STATUS_CONNECTED:
- if (connect_timeout) {
- DLOG_DEBUG("Connected, removing timeout");
- g_source_remove(connect_timeout);
- connect_timeout = 0;
- }
- break;
- }
-
- // TODO Disable PSM while roaming (dis/asociating)?
-}
-
-struct pre_down_data {
- icd_nw_link_pre_down_cb_fn link_pre_down_cb;
- gpointer link_pre_down_cb_token;
-};
-
-/** Supplicant callback in link_pre_down mode */
-static void icd_down_supp_cb(enum supp_status status, const char * error_str,
- gpointer user_data)
-{
- struct pre_down_data *data = (struct pre_down_data *) user_data;
- DLOG_DEBUG("%s: %d", __func__, status);
-
- if (status == SUPP_STATUS_KILLED) {
- // Everything was fine
- supp_set_callback(NULL, NULL);
- data->link_pre_down_cb(ICD_NW_SUCCESS,
- data->link_pre_down_cb_token);
- }
-}
-
-static void
-icd_pre_down (const gchar *network_type,
- const guint network_attrs,
- const gchar *network_id,
- const gchar *interface_name,
- icd_nw_link_pre_down_cb_fn link_pre_down_cb,
- const gpointer link_pre_down_cb_token,
- gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
-
- struct pre_down_data *data = g_new(struct pre_down_data, 1);
- data->link_pre_down_cb = link_pre_down_cb;
- data->link_pre_down_cb_token = link_pre_down_cb_token;
-
- if (supp_is_active()) {
- supp_set_callback(icd_down_supp_cb, data);
-
- // Kill the supplicant,
- supp_disable();
- // but wait for the "child exit" event.
- } else {
- // Supplicant is already dead, no need to wait.
- supp_set_callback(NULL, NULL);
- supp_disable(); // Clears status info
-
- link_pre_down_cb(ICD_NW_SUCCESS, link_pre_down_cb_token);
- }
-}
-
-struct post_up_data {
- icd_nw_link_post_up_cb_fn link_post_up_cb;
- gpointer link_post_up_cb_token;
-};
-
-/** Supplicant callback in link_post_up status */
-static void icd_up_supp_cb(enum supp_status status, const char * error_str,
- gpointer user_data)
-{
- struct post_up_data *data = (struct post_up_data *) user_data;
- DLOG_DEBUG("%s: %d", __func__, status);
-
- switch (status) {
- case SUPP_STATUS_CONNECTED:
- data->link_post_up_cb(ICD_NW_SUCCESS_NEXT_LAYER,
- NULL,
- data->link_post_up_cb_token, NULL);
-
- supp_set_callback(icd_supp_cb, NULL);
- g_free(data);
- break;
- case SUPP_STATUS_DISCONNECTED:
- error_str = ICD_DBUS_ERROR_WLAN_AUTH_FAILED;
-
- // Fall through
- case SUPP_STATUS_ERROR:
-
- // An error happened
- // kill the supplicant before everything crashes.
- supp_set_callback(NULL, NULL);
- supp_disable();
-
- // Fall through
- case SUPP_STATUS_KILLED:
- data->link_post_up_cb(ICD_NW_ERROR,
- error_str,
- data->link_post_up_cb_token, NULL);
-
- g_free(data);
- break;
-
- }
-}
-
-static void icd_post_up(const gchar *network_type,
- const guint network_attrs,
- const gchar *network_id,
- const gchar *interface_name,
- icd_nw_link_post_up_cb_fn link_post_up_cb,
- const gpointer link_post_up_cb_token,
- gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- struct post_up_data *data = g_new(struct post_up_data, 1);
- data->link_post_up_cb = link_post_up_cb;
- data->link_post_up_cb_token = link_post_up_cb_token;
-
- supp_set_callback(icd_up_supp_cb, data);
-
- if (supp_enable() != 0)
- {
- icd_up_supp_cb(-1, ICD_DBUS_ERROR_SYSTEM_ERROR, data);
- }
-
- supp_set_interface(interface_name);
- supp_set_network_id(network_id);
-}
-
-static void icd_link_down(const gchar *network_type,
- const guint network_attrs,
- const gchar *network_id,
- const gchar *interface_name,
- icd_nw_link_down_cb_fn link_down_cb,
- const gpointer link_down_cb_token,
- gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- networks_disconnect(network_id);
-
- g_free(cur_network_id);
- cur_network_id = NULL;
-
- // TODO: Maybe wait for wlancond->disconnect callback?
-
- link_down_cb(ICD_NW_SUCCESS, link_down_cb_token);
-}
-
-struct link_up_data {
- icd_nw_link_up_cb_fn link_up_cb;
- gpointer link_up_cb_token;
-};
-
-static void icd_link_up_done(int status, const char *error, gpointer user_data)
-{
- DLOG_DEBUG("%s: %d", __func__, status);
-
- struct link_up_data *data = (struct link_up_data *) user_data;
-
- if (status) {
- g_free(cur_network_id);
- cur_network_id = NULL;
- data->link_up_cb(ICD_NW_ERROR,
- error,
- WPA_IFACE, data->link_up_cb_token,
- NULL);
-
- } else {
- data->link_up_cb(ICD_NW_SUCCESS_NEXT_LAYER,
- NULL,
- WPA_IFACE, data->link_up_cb_token,
- NULL);
- }
-
- g_free(data);
-}
-
-static void icd_link_up(const gchar *network_type,
- const guint network_attrs,
- const gchar *network_id,
- icd_nw_link_up_cb_fn link_up_cb,
- const gpointer link_up_cb_token,
- gpointer *private)
-{
- DLOG_DEBUG("%s: %s", __func__, network_id);
-
- struct link_up_data *data = g_new(struct link_up_data, 1);
- data->link_up_cb = link_up_cb;
- data->link_up_cb_token = link_up_cb_token;
-
- if (cur_network_id) {
- DLOG_WARN_L("Double link up");
-
- data->link_up_cb(ICD_NW_TOO_MANY_CONNECTIONS,
- NULL,
- WPA_IFACE, data->link_up_cb_token,
- NULL);
-
- return;
- }
- cur_network_id = g_strdup(network_id);
-
- networks_connect(network_id, icd_link_up_done, data);
-}
-
-struct stats_data {
- icd_nw_link_stats_cb_fn cb;
- gpointer token;
-};
-
-static void icd_link_stats_done
- (int status, const char * strdata, int rssi, gpointer user_data)
-{
- DLOG_DEBUG("%s: %d", __func__, status);
-
- struct stats_data * data = (struct stats_data *) user_data;
-
- gint signal = rssi_to_signal(rssi);
-
- DLOG_DEBUG("status: rssi=%d, signal=%d", rssi, signal);
-
- data->cb(data->token,
- WPA_NETWORK_TYPE,
- ICD_WPA_FLAGS,
- cur_network_id,
- /*time_active*/ 0,
- /*signal*/ signal,
- /*station_id*/ NULL,
- /*dB*/ rssi,
- /*tx*/0,
- /*rx*/0);
-
- // IPv[46] module will fill time_active, rx & tx values.
- // TODO station_id
-
- g_free(data);
-}
-
-static void icd_link_stats(const gchar *network_type,
- const guint network_attrs,
- const gchar *network_id,
- gpointer *private,
- icd_nw_link_stats_cb_fn cb,
- const gpointer link_stats_cb_token)
-{
- DLOG_DEBUG("%s", __func__);
-
- struct stats_data *data = g_new(struct stats_data, 1);
- data->cb = cb;
- data->token = link_stats_cb_token;
-
- networks_status(icd_link_stats_done, data);
-}
-
-struct search_data {
- icd_nw_search_cb_fn search_cb;
- gpointer search_cb_token;
-};
-
-static void icd_send_search_result(int status, const char * id,
- const char * ssid, const char * ap, int rssi, gpointer user_data)
-{
- DLOG_DEBUG("%s: %d", __func__, status);
-
- struct search_data * data = (struct search_data *) user_data;
- gint signal;
-
- switch (status) {
- case SEARCH_CONTINUE:
- signal = rssi_to_signal(rssi);
-
- data->search_cb(ICD_NW_SEARCH_CONTINUE,
- (gchar *) ssid,
- WPA_NETWORK_TYPE,
- ICD_WPA_FLAGS,
- (gchar *) id,
- signal,
- /*ap*/"ap",
- signal,
- data->search_cb_token);
- break;
- case SEARCH_FINISHED:
- data->search_cb(ICD_NW_SEARCH_COMPLETE,
- NULL,
- WPA_NETWORK_TYPE,
- 0,
- NULL,
- ICD_NW_LEVEL_NONE,
- NULL,
- 0,
- data->search_cb_token);
- // Fall through
- case SEARCH_STOPPED:
- g_free(user_data);
- break;
- }
-}
-
-static void icd_start_search(const gchar *network_type,
- guint search_scope,
- icd_nw_search_cb_fn search_cb,
- const gpointer search_cb_token,
- gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- struct search_data *data = g_new(struct search_data, 1);
- data->search_cb = search_cb;
- data->search_cb_token = search_cb_token;
-
- networks_search_start(icd_send_search_result, data);
-}
-
-static void icd_stop_search(gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- // Never seen this called.
-
- networks_search_stop();
-}
-
-static void icd_child_exit(const pid_t pid,
- const gint exit_value,
- gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- /*// Supplicant crashed/exited!
- if (killed_supp_cb) {
- // We have killed it, notify auth layer is now down.
-
- g_free(killed_supp_cb);
- killed_supp_cb = 0;
- } else {
- DLOG_WARN("Supplicant exited, but we didn't expect it");
- icd_close(ICD_NW_ERROR, ICD_DBUS_ERROR_SYSTEM_ERROR);
- }*/
- supp_handle_killed();
-}
-
-static void icd_network_destruct(gpointer *private)
-{
- DLOG_DEBUG(__func__);
-
- // Fortunately, icd kills the supplicant for us.
-
- close_dbus_connection();
- networks_free();
-}
-
-gboolean icd_nw_init (
- struct icd_nw_api *network_api,
- icd_nw_watch_pid_fn watch_fn,
- gpointer watch_fn_token,
- icd_nw_close_fn close_fn,
- icd_nw_status_change_fn status_change_fn,
- icd_nw_renew_fn renew_fn )
-{
- network_api->version = ICD_NW_MODULE_VERSION;
- network_api->private = NULL;
-
- network_api->link_pre_down = icd_pre_down;
- network_api->link_post_up = icd_post_up;
-
- network_api->link_down = icd_link_down;
- network_api->link_up = icd_link_up;
- network_api->link_stats = icd_link_stats;
-
- network_api->search_lifetime = ICD_SEARCH_LIFETIME;
- network_api->search_interval = ICD_SEARCH_INTERVAL;
-
- network_api->start_search = icd_start_search;
- network_api->stop_search = icd_stop_search;
-
- network_api->child_exit = icd_child_exit;
-
- network_api->network_destruct = icd_network_destruct;
-
- icd_watch_fn = watch_fn;
- icd_watch_token = watch_fn_token;
- icd_close_fn = close_fn;
- icd_status_change_fn = status_change_fn;
- icd_renew_fn = renew_fn;
-
- if (networks_initialize() != 0) {
- DLOG_ERR_L("Network list failed!");
- return FALSE;
- }
-
- if (setup_dbus_connection(NULL, init_dbus_handlers) != 0) {
- DLOG_ERR_L("D-BUS connection setup failed!");
- return FALSE;
- }
-
- return TRUE;
-}
-
-void icd_watch_pid(const pid_t pid)
-{
- icd_watch_fn(pid, icd_watch_token);
-}
-
-void icd_close(enum icd_nw_status status,
- const gchar *err_str)
-{
- icd_close_fn(status, err_str, WPA_NETWORK_TYPE, ICD_WPA_FLAGS, cur_network_id);
-}
-
+++ /dev/null
-/**
- @file icd.h
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _ICD_H_
-#define _ICD_H_
-
-#include <network_api.h>
-
-void icd_watch_pid(const pid_t pid);
-
-void icd_close(enum icd_nw_status status,
- const gchar *err_str);
-
-#endif
+++ /dev/null
-/**
- @file log.h
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- @author Johan Hedberg <johan.hedberg@nokia.com>
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-#ifndef _LOG_H_
-#define _LOG_H_
-
-#include <stdlib.h>
-#include <osso-log.h>
-
-/** Print error message and exit */
-#define die(...) do { \
- DLOG_ERR(__VA_ARGS__); \
- exit(EXIT_FAILURE); \
-} while (0)
-
-#endif /* _LOG_H_ */
+++ /dev/null
-/**
- @file networks.c
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#include <libgen.h>
-#include <string.h>
-
-#include <glib.h>
-#include <gconf/gconf-client.h>
-
-#include <icd/osso-ic-gconf.h>
-#include <icd/osso-ic-dbus.h>
-
-#include "common.h"
-#include "log.h"
-#include "wlan.h"
-#include "networks.h"
-#include "gconf.h"
-
-#define FAILED_SCAN_RETRY_WAIT 3 * 1000
-#define FAILED_SCAN_RETRY_TRIES 10
-
-#define GCONF_NETWORK_TYPE "/type"
-
-static GSList *net_list = NULL;
-
-int networks_initialize()
-{
- DLOG_DEBUG(__func__);
- GConfClient *client = gconf_client_get_default();
- GError *error = NULL;
-
- net_list = NULL;
-
- if (!client) {
- DLOG_ERR("Cannot get gconf client");
- return -1;
- }
-
- net_list = gconf_client_all_dirs(client, ICD_GCONF_PATH, &error);
- if (error) {
- DLOG_ERR("Could not get setting:%s, error:%s", ICD_GCONF_PATH,
- error->message);
- g_clear_error(&error);
- g_object_unref(client);
- return -1;
- }
-
- // Now, filter networks
- GSList *prev = NULL;
- GSList *cur = net_list;
- while (cur) {
- gchar* path = g_strconcat(cur->data, WPA_GCONF_NETWORK_TYPE, NULL);
- gchar* type = gconf_client_get_string(client, path, &error);
-
- g_free(path);
-
- if (error) {
- DLOG_ERR("Could not get setting:%s, error:%s", path,
- error->message);
- g_clear_error(&error);
-
- goto initialize_error;
- } else if (!type) {
- DLOG_ERR("Could not get setting:%s", path);
-
- goto initialize_error;
- }
-
- if (strcmp(type, WPA_GCONF_NETWORK_TYPE_VALUE) != 0) {
- // Remove this network from the list
- DLOG_DEBUG("Ignoring %s from IAP (type is %s)",
- (gchar*)cur->data, type);
- g_free(cur->data);
- if (prev) {
- GSList *del = cur;
- cur = g_slist_next(cur);
- g_slist_free1(del);
- prev->next = cur;
- } else {
- net_list = g_slist_next(cur);
- g_slist_free1(cur);
- cur = net_list;
- }
- } else {
- DLOG_DEBUG("Added network %s from IAP", (gchar*)cur->data);
-
- prev = cur;
- cur = g_slist_next(cur);
- }
-
- g_free(type);
- }
-
- return 0;
-
-initialize_error:
- g_object_unref(client);
- networks_free();
-
- return -1;
-}
-
-static void free_list_item(gpointer data, gpointer user_data)
-{
- g_free(data);
-}
-
-void networks_free()
-{
- DLOG_DEBUG(__func__);
- if (!net_list) return;
-
- g_slist_foreach(net_list, free_list_item, NULL);
-
- g_slist_free(net_list);
- net_list = NULL;
-}
-
-
-/* Scanning networks */
-
-static GSList *scan_cur_net = NULL;
-static gchar *scan_cur_ssid = NULL;
-static int scan_tries = 0;
-static guint scan_retry_timer = 0;
-static networks_search_found scan_found_cb = NULL;
-static gpointer scan_found_cb_data = NULL;
-
-static void networks_search_iteration();
-
-static void networks_search_finished()
-{
- DLOG_DEBUG(__func__);
-
- scan_found_cb(SEARCH_FINISHED, NULL,
- NULL, NULL, 0, scan_found_cb_data);
- scan_cur_net = NULL;
-
- scan_found_cb = NULL;
- scan_found_cb_data = NULL;
- // Usually a new network_search will not happen on the FINISED cb,
- // but if you do, you'll have to take care of the pseudorace here.
-
- networks_search_stop();
-}
-
-static void networks_search_scan_ap_found(int status,
- const char * ssid, const char * ap, int dB)
-{
- DLOG_DEBUG(__func__);
-
- if (!scan_cur_net) return;
- if (scan_retry_timer) return; // Interface was already scanning
-
- if (status == SEARCH_FINISHED) {
- DLOG_DEBUG("Searching for %s done, iterating", scan_cur_ssid);
- // Go to next network
- scan_cur_net = g_slist_next(scan_cur_net);
- if (scan_cur_net) {
- g_free(scan_cur_ssid);
- scan_cur_ssid = NULL;
- scan_tries = 0;
- networks_search_iteration();
- } else {
- // No more networks to search
- networks_search_finished();
- }
- } else if (status == SEARCH_CONTINUE) {
- DLOG_DEBUG("Found ssid %s", ssid);
- if (strcmp(ssid, scan_cur_ssid) == 0)
- {
- // This is our man
- gchar *full_name = g_strdup(scan_cur_net->data);
-
- gchar *base_name = g_strdup(basename(full_name));
-
- DLOG_INFO("%s (%s) was found",
- base_name, ssid);
-
- scan_found_cb(SEARCH_CONTINUE, base_name,
- ssid, ap, dB, scan_found_cb_data);
-
- g_free(base_name);
- g_free(full_name);
- }
- }
-}
-
-static gboolean networks_search_retry(gpointer data)
-{
- DLOG_DEBUG(__func__);
-
- scan_retry_timer = 0;
- if (scan_cur_net) networks_search_iteration();
- // Always disable this timeout,
- // _search_iteration() will put a newer one if needed
- return FALSE;
-}
-
-static void networks_search_iteration()
-{
- DLOG_DEBUG(__func__);
-
- GConfClient *client = gconf_client_get_default();
- GError *error = NULL;
-
- if (!client) {
- DLOG_ERR("Cannot get gconf client");
- goto get_gconf_error;
- }
-
- DLOG_DEBUG("Test if %s is active", (gchar*)scan_cur_net->data);
-
- gchar *path = g_strconcat(scan_cur_net->data, WPA_GCONF_SSID, NULL);
- scan_cur_ssid = gconf_client_get_string(client, path, &error);
-
- g_object_unref(client);
-
- if (error) {
- DLOG_ERR("Could not get setting:%s, error:%s", path,
- error->message);
- g_clear_error(&error);
-
- goto get_ssid_error;
- }
- else if (!scan_cur_ssid) {
- DLOG_ERR("Could not get setting:%s", path);
-
- goto get_ssid_error;
- }
-
- scan_retry_timer = 0;
-
- int result = wlan_scan(scan_cur_ssid, networks_search_scan_ap_found);
-
- if (result != 0) {
- // Something went wront scanning this network, set timeout and
- // try again
- scan_tries++;
- if (scan_tries >= FAILED_SCAN_RETRY_TRIES) {
- // Give up
- goto scan_error;
- } else {
- scan_retry_timer = g_timeout_add(FAILED_SCAN_RETRY_WAIT,
- networks_search_retry,
- NULL);
- }
- }
-
- return;
-get_ssid_error:
- g_free(path);
-
-get_gconf_error:
-scan_error:
- networks_search_finished();
-}
-
-void networks_search_start(networks_search_found found_cb, gpointer user_data)
-{
- DLOG_DEBUG(__func__);
-
- if (scan_cur_net)
- return; // Already active
-
- scan_cur_net = net_list;
- scan_tries = 0;
- scan_found_cb = found_cb;
- scan_found_cb_data = user_data;
-
- if (scan_cur_net)
- networks_search_iteration();
- else // No networks to scan?
- networks_search_finished();
-}
-
-void networks_search_stop()
-{
- DLOG_DEBUG(__func__);
-
- if (scan_found_cb)
- scan_found_cb(SEARCH_STOPPED,
- NULL, NULL, NULL, 0, scan_found_cb_data);
- scan_cur_net = NULL;
-
- scan_found_cb = NULL;
- scan_found_cb_data = NULL;
-
- g_free(scan_cur_ssid);
- scan_cur_ssid = NULL;
-
- DLOG_DEBUG("Search stopped");
-}
-
-/* Connecting to networks */
-
-static networks_connect_result connect_result_cb = NULL;
-static gpointer connect_result_cb_data = NULL;
-
-static void networks_connected(int status, const char *error)
-{
- DLOG_DEBUG("%s: %d", __func__, status);
-
- if (!connect_result_cb) return;
-
- if (status) {
- connect_result_cb(status, ICD_DBUS_ERROR_NETWORK_ERROR,
- connect_result_cb_data);
- } else {
- connect_result_cb(0, NULL,
- connect_result_cb_data);
- }
-
- connect_result_cb = NULL;
-}
-
-void networks_connect(const char * id,
- networks_connect_result result_cb, gpointer user_data)
-{
- DLOG_DEBUG("%s: %s", __func__, id);
- GConfClient *client = gconf_client_get_default();
-
- connect_result_cb = result_cb;
- connect_result_cb_data = user_data;
-
- gchar *net = g_strconcat(ICD_GCONF_PATH, "/", id, NULL);
- gchar *path, *value;
-
- // Get ICD network type
- path = g_strconcat(net, WPA_GCONF_NETWORK_TYPE, NULL);
- value = gconf_get_string(client, path);
-
- if (!value || strcmp(value, WPA_GCONF_NETWORK_TYPE_VALUE) != 0) {
- result_cb(-1, ICD_DBUS_ERROR_INVALID_IAP, user_data);
- goto connect_error;
- }
-
- g_free(value);
-
- path = g_strconcat(net, WPA_GCONF_SSID, NULL);
- value = gconf_get_string(client, path);
-
- if (!value) {
- result_cb(-1, ICD_DBUS_ERROR_INVALID_IAP, user_data);
- goto connect_error;
- }
-
- wlan_connect(value, networks_connected);
-
-connect_error:
- if (value) g_free(value);
-}
-
-void networks_disconnect(const char * id)
-{
- wlan_disconnect();
-}
-
-/* -- STATUS -- */
-
-static networks_status_result status_result_cb = NULL;
-static gpointer status_result_cb_data = NULL;
-
-static void networks_status_reply(int status,
- const char * essid, int essid_len,
- const char * bssid, int bssid_len,
- int qual, int channel, unsigned long security, unsigned long capability,
- const char * data)
-{
- if (!status_result_cb) return;
-
- if (status == 0) {
- status_result_cb(status, essid, qual, status_result_cb_data);
- } else {
- status_result_cb(status, data, 0, status_result_cb_data);
- }
-}
-
-void networks_status(networks_status_result result_cb, gpointer user_data)
-{
- status_result_cb = result_cb;
- status_result_cb_data = user_data;
-
- wlan_get_status(networks_status_reply);
-}
-
+++ /dev/null
-/**
- @file networks.h
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _NETWORKS_H_
-#define _NETWORKS_H_
-
-int networks_initialize();
-void networks_free();
-
-// NULL, NULL, 0 if search ended
-typedef void (*networks_search_found)
- (int status, const char * id,
- const char * ssid, const char * ap, int dB, gpointer user_data);
-
-void networks_search_start(networks_search_found found_cb, gpointer user_data);
-void networks_search_stop();
-
-typedef void (*networks_connect_result)
- (int status, const char * error, gpointer user_data);
-void networks_connect(const char * id,
- networks_connect_result result_cb, gpointer user_data);
-void networks_disconnect(const char * id);
-
-typedef void (*networks_status_result)
- (int status, const char * data, int rssi, gpointer user_data);
-void networks_status(networks_status_result result_cb, gpointer user_data);
-
-#endif
+++ /dev/null
-/**
- @file supp.c
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#include <signal.h>
-#include <string.h>
-
-#include <glib.h>
-#include <dbus/dbus.h>
-#include <gconf/gconf-client.h>
-
-#include <osso-ic-dbus.h>
-#include <osso-ic-gconf.h>
-
-#include "log.h"
-#include "common.h"
-#include "icd.h"
-#include "dbus.h"
-#include "dbus-helper.h"
-#include "supp.h"
-
-/* Errors */
-#define WPAS_ERROR_INVALID_NETWORK \
- WPAS_DBUS_IFACE_INTERFACE ".InvalidNetwork"
-#define WPAS_ERROR_INVALID_BSSID \
- WPAS_DBUS_IFACE_INTERFACE ".InvalidBSSID"
-
-#define WPAS_ERROR_INVALID_OPTS \
- WPAS_DBUS_INTERFACE ".InvalidOptions"
-#define WPAS_ERROR_INVALID_IFACE \
- WPAS_DBUS_INTERFACE ".InvalidInterface"
-
-#define WPAS_ERROR_ADD_ERROR \
- WPAS_DBUS_INTERFACE ".AddError"
-#define WPAS_ERROR_EXISTS_ERROR \
- WPAS_DBUS_INTERFACE ".ExistsError"
-#define WPAS_ERROR_REMOVE_ERROR \
- WPAS_DBUS_INTERFACE ".RemoveError"
-
-#define WPAS_ERROR_SCAN_ERROR \
- WPAS_DBUS_IFACE_INTERFACE ".ScanError"
-#define WPAS_ERROR_ADD_NETWORK_ERROR \
- WPAS_DBUS_IFACE_INTERFACE ".AddNetworkError"
-#define WPAS_ERROR_INTERNAL_ERROR \
- WPAS_DBUS_IFACE_INTERFACE ".InternalError"
-#define WPAS_ERROR_REMOVE_NETWORK_ERROR \
- WPAS_DBUS_IFACE_INTERFACE ".RemoveNetworkError"
-
-#define WPAS_DBUS_BSSID_FORMAT "%02x%02x%02x%02x%02x%02x"
-
-static pid_t supp_pid = 0;
-static int supp_activation_tries = 0;
-
-static gchar* supp_iface = NULL;
-static gchar* supp_iface_path = NULL;
-
-static gchar* supp_network_id = NULL;
-static gchar* supp_config_path = NULL;
-
-static gboolean supp_configured = FALSE; // Unused right now
-
-/* Callback for supplicant events */
-static supp_cb_fn supp_cb = NULL;
-static gpointer supp_cb_data = NULL;
-
-static void supp_configure();
-
-void supp_set_callback(supp_cb_fn cb, gpointer user_data)
-{
- supp_cb = cb;
- supp_cb_data = user_data;
-}
-
-static inline void supp_callback(int result, const char * message)
-{
- if (supp_cb) supp_cb(result, message, supp_cb_data);
-}
-
-static gboolean supp_set_interface_retry(gpointer data)
-{
- DLOG_DEBUG(__func__);
-
- if (supp_pid && supp_iface) supp_set_interface(supp_iface);
- return FALSE;
-}
-
-static void add_iface_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("%s", __func__);
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
- DLOG_WARN_L("Error in %s:%s", __func__, error.name);
-
- if (strcmp(DBUS_ERROR_SERVICE_UNKNOWN, error.name) == 0)
- {
- // Supplicant not (yet) active? Try later
- DLOG_DEBUG("Still waiting for supplicant");
- supp_activation_tries++;
- if (supp_activation_tries >= 3) {
- supp_callback(-1, error.name);
- } else {
- g_timeout_add(1000,
- supp_set_interface_retry,
- NULL);
- }
- } else {
- supp_callback(-1, error.name);
- }
-
- dbus_error_free(&error);
- } else if (reply) {
- // Move on to next step
- gchar* path;
- if (!dbus_message_get_args(
- reply, NULL,
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_INVALID))
- {
- supp_callback(-1, error.name);
- goto iface_reply_error;
- }
-
- supp_iface_path = g_strdup(path);
- DLOG_DEBUG("Got interface path: %s", supp_iface_path);
- if (supp_network_id && !supp_config_path) {
- supp_set_network_id(supp_network_id);
- } else if (supp_config_path && !supp_configured) {
- supp_configure();
- }
- }
-
-iface_reply_error:
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-void supp_unset_interface()
-{
- // TODO
- // mostly uneeded, since we're killing the supplicant instead
- g_free(supp_iface_path);
- supp_iface_path = NULL;
- g_free(supp_iface);
- supp_iface = NULL;
-}
-
-void supp_set_interface(const char * iface)
-{
- DBusMessage *msg;
- DBusPendingCall *pending;
-
- DLOG_DEBUG("%s: %s", __func__, iface);
-
- if (supp_iface_path) {
- supp_unset_interface();
- }
-
- if (iface != supp_iface) {
- if (supp_iface) {
- g_free(supp_iface);
- }
-
- supp_iface = g_strdup(iface);
- }
-
- msg = new_dbus_method_call(
- WPAS_DBUS_SERVICE,
- WPAS_DBUS_PATH,
- WPAS_DBUS_INTERFACE,
- "addInterface");
-
- append_dbus_args(
- msg,
- DBUS_TYPE_STRING, &iface,
- DBUS_TYPE_INVALID);
-
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- msg, &pending, -1))
- die("Out of memory");
-
- if (!dbus_pending_call_set_notify(pending,
- add_iface_reply_cb, NULL, NULL))
- die("Out of memory");
-
- dbus_message_unref(msg);
-}
-
-static void add_network_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("%s", __func__);
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
- DLOG_WARN_L("Error in %s:%s", __func__, error.name);
-
- supp_callback(-1, error.name);
- dbus_error_free(&error);
- } else if (reply) {
- // Move on to next step
- gchar* path;
- if (!dbus_message_get_args(
- reply, NULL,
- DBUS_TYPE_OBJECT_PATH, &path,
- DBUS_TYPE_INVALID))
- {
- supp_callback(-1, error.name);
- goto net_reply_error;
- }
-
- supp_config_path = g_strdup(path);
- DLOG_DEBUG("Got network path: %s", supp_iface_path);
- if (supp_iface_path && !supp_configured) {
- supp_configure();
- }
- }
-
-net_reply_error:
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-void supp_unset_network_id()
-{
- g_free(supp_config_path);
- supp_config_path = NULL;
- g_free(supp_network_id);
- supp_network_id = NULL;
- // TODO
-}
-
-void supp_set_network_id(const char * network_id)
-{
- DBusMessage *msg;
- DBusPendingCall *pending;
-
- DLOG_DEBUG("%s: %s", __func__, network_id);
-
- if (supp_config_path) {
- supp_unset_network_id();
- }
-
- if (network_id != supp_network_id) {
- if (supp_network_id) {
- g_free(supp_network_id);
- }
-
- supp_network_id = g_strdup(network_id);
- }
-
- if (!supp_iface_path) {
- DLOG_DEBUG("Deferring network creation");
- return;
- }
-
- msg = new_dbus_method_call(
- WPAS_DBUS_SERVICE,
- supp_iface_path,
- WPAS_DBUS_IFACE_INTERFACE,
- "addNetwork");
-
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- msg, &pending, -1))
- die("Out of memory");
-
- if (!dbus_pending_call_set_notify(pending,
- add_network_reply_cb, NULL, NULL))
- die("Out of memory");
-
- dbus_message_unref(msg);
-}
-
-static gchar * wpas_params[3] = { "/sbin/wpa_supplicant", "-u", NULL };
-
-int supp_enable()
-{
- DLOG_DEBUG("%s", __func__);
-
- supp_activation_tries = 0;
-
- GError* error;
- GPid pid;
- if (!g_spawn_async(NULL, wpas_params, NULL,
- G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL, &pid, &error)) {
- DLOG_ERR("Couldn't spawn supplicant: %s", error->message);
- return -1;
- }
-
- supp_pid = pid;
-
- DLOG_INFO("Spawned %s , pid %d", wpas_params[0], pid);
-
- icd_watch_pid(supp_pid);
-
- return 0;
-}
-
-void supp_disable(void)
-{
- if (supp_pid) {
- DLOG_INFO("Killing supplicant (pid %d)", supp_pid);
- kill(supp_pid, SIGTERM);
- }
-
- // Consider everything as deconfigured
- g_free(supp_iface);
- supp_iface = NULL;
- g_free(supp_iface_path);
- supp_iface_path = NULL;
- g_free(supp_network_id);
- supp_network_id = NULL;
- g_free(supp_config_path);
- supp_config_path = NULL;
-
- supp_configured = FALSE;
-}
-
-int supp_is_active(void)
-{
- return supp_pid ? TRUE : FALSE;
-}
-
-void supp_handle_signal(gchar* old_state, gchar* new_state)
-{
- DLOG_DEBUG("Supplicant StateChange %s -> %s", old_state, new_state);
-
- if (strcmp(new_state, "COMPLETED") == 0)
- {
- supp_callback(SUPP_STATUS_CONNECTED, new_state);
- } else if (strcmp(new_state, "DISCONNECTED") == 0) {
- supp_callback(SUPP_STATUS_DISCONNECTED, new_state);
- }
-}
-
-void supp_handle_killed(void)
-{
- DLOG_DEBUG("%s", __func__);
-
- g_spawn_close_pid(supp_pid);
- supp_pid = 0;
-
- supp_disable();
-
- supp_callback(SUPP_STATUS_KILLED, NULL);
-}
-
-static void free_settings_item(gpointer data, gpointer user_data)
-{
- gconf_entry_free(data);
-}
-
-static void enable_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("%s", __func__);
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
- DLOG_WARN_L("Error in %s:%s", __func__, error.name);
-
- supp_callback(SUPP_STATUS_ERROR, error.name);
- dbus_error_free(&error);
- }
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-static void supp_enable_network()
-{
- DBusMessage* message; //The full mesage we are going to send.
- DBusPendingCall *pending;
-
- message = dbus_message_new_method_call(
- WPAS_DBUS_SERVICE,
- supp_config_path,
- WPAS_DBUS_IFACE_NETWORK,
- WPAS_ENABLE_NETWORK_METHOD
- );
- if (!message) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- return;
- }
-
- // Send message
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- message, &pending, -1)) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto send_error;
- }
-
- if (!dbus_pending_call_set_notify(pending,
- enable_reply_cb, NULL, NULL)) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- }
-
- // Fall through
-send_error:
- dbus_message_unref(message);
-}
-
-static void configure_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("%s", __func__);
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
- DLOG_WARN_L("Error in %s:%s", __func__, error.name);
-
- supp_callback(-1, error.name);
- dbus_error_free(&error);
- } else if (reply) {
- supp_enable_network();
- }
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-static void supp_configure()
-{
- // This is going to be long
- DLOG_DEBUG("%s: %s", __func__, supp_network_id);
- GConfClient *client = gconf_client_get_default();
- GError *error = NULL;
-
- DBusMessage* message; //The full mesage we are going to send.
- DBusMessageIter iter, iter_dict;
- DBusPendingCall *pending;
-
- if (!client) {
- DLOG_ERR("Cannot get gconf client");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- return;
- }
-
- gchar * settings_path = g_strconcat(ICD_GCONF_PATH,
- "/", supp_network_id, NULL);
-
- GSList * settings = gconf_client_all_entries(client,
- settings_path, &error);
- if (error) {
- DLOG_ERR("Could not get setting:%s, error:%s", settings_path,
- error->message);
- g_free(settings_path);
- g_clear_error(&error);
- g_object_unref(client);
- supp_callback(-1, error->message);
- return;
- }
-
- message = dbus_message_new_method_call(
- WPAS_DBUS_SERVICE,
- supp_config_path,
- WPAS_DBUS_IFACE_NETWORK,
- WPAS_SET_NETWORK_METHOD
- );
- if (!message) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto msg_init_error;
- }
-
- dbus_message_iter_init_append(message, &iter);
- if (dbus_dict_open_write(&iter, &iter_dict) != 0) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto dict_init_error;
- }
-
- DLOG_DEBUG("Preparing to send %d settings", g_slist_length(settings));
-
- GSList* i;
- for (i = settings; i; i = g_slist_next(i)) {
- GConfEntry* entry = i->data;
- gchar * key = g_path_get_basename(gconf_entry_get_key(entry));
- GConfValue* value = gconf_entry_get_value(entry);
-
- if (g_ascii_strncasecmp(key,
- WPA_GCONF_SETTING_PREFIX,
- WPA_GCONF_SETTING_PREFIX_LEN)) {
- g_free(key);
- continue;
- }
-
- // Skip prefix
- key += WPA_GCONF_SETTING_PREFIX_LEN;
-
- switch (value->type) {
- case GCONF_VALUE_STRING:
- DLOG_DEBUG("Setting string %s = %s",
- key, gconf_value_get_string(value));
- dbus_dict_append_string(&iter_dict,
- key, gconf_value_get_string(value));
- break;
-
- case GCONF_VALUE_INT:
- DLOG_DEBUG("Setting int32 %s = %d",
- key, gconf_value_get_int(value));
- dbus_dict_append_int32(&iter_dict,
- key, gconf_value_get_int(value));
- break;
- default:
- DLOG_DEBUG("Unknown setting type for %s",
- key);
- break;
- }
-
- key -= WPA_GCONF_SETTING_PREFIX_LEN;
- g_free(key);
- }
-
- if (dbus_dict_close_write(&iter, &iter_dict) != 0) {
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto dict_close_error;
- }
-
- // Send message
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- message, &pending, -1)) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto send_error;
- }
-
- if (!dbus_pending_call_set_notify(pending,
- configure_reply_cb, NULL, NULL)) {
- DLOG_CRIT_L("Out of memory");
- supp_callback(-1, ICD_DBUS_ERROR_SYSTEM_ERROR);
- goto send_error;
- }
-
- // Fall through
-send_error:
-dict_close_error:
-dict_init_error:
- dbus_message_unref(message);
-msg_init_error:
- g_free(settings_path);
-
- g_slist_foreach(settings, free_settings_item, NULL);
- g_slist_free(settings);
-
- g_object_unref(client);
-}
-
+++ /dev/null
-#ifndef _SUPP_H_
-#define _SUPP_H_
-
-int supp_enable();
-void supp_disable();
-
-#define WPAS_DBUS_OBJECT_PATH_MAX 150
-
-#define WPAS_DBUS_SERVICE "fi.epitest.hostap.WPASupplicant"
-#define WPAS_DBUS_PATH "/fi/epitest/hostap/WPASupplicant"
-#define WPAS_DBUS_INTERFACE "fi.epitest.hostap.WPASupplicant"
-
-#define WPAS_STATE_CHANGE_SIG "StateChange"
-
-#define WPAS_DBUS_PATH_INTERFACES WPAS_DBUS_PATH "/Interfaces"
-#define WPAS_DBUS_IFACE_INTERFACE WPAS_DBUS_INTERFACE ".Interface"
-
-#define WPAS_DBUS_NETWORKS_PART "Networks"
-#define WPAS_DBUS_IFACE_NETWORK WPAS_DBUS_INTERFACE ".Network"
-
-#define WPAS_DBUS_BSSIDS_PART "BSSIDs"
-#define WPAS_DBUS_IFACE_BSSID WPAS_DBUS_INTERFACE ".BSSID"
-
-#define WPAS_SET_NETWORK_METHOD "set"
-#define WPAS_ENABLE_NETWORK_METHOD "enable"
-
-enum supp_status {
- SUPP_STATUS_KILLED = -2,
- SUPP_STATUS_ERROR = -1,
- SUPP_STATUS_DISCONNECTED = 0,
- SUPP_STATUS_CONNECTED
-};
-
-typedef void (*supp_cb_fn)(enum supp_status status, const char * data,
- gpointer user_data);
-
-void supp_set_callback(supp_cb_fn cb, gpointer user_data);
-void supp_set_interface(const char * iface);
-void supp_set_network_id(const char * network_id);
-
-void supp_unset_interface(void);
-void supp_unset_network_id(void);
-
-int supp_is_active(void);
-
-void supp_handle_signal(gchar* old_state, gchar* new_state);
-void supp_handle_killed(void);
-
-#endif
+++ /dev/null
-/**
- @file wlan.c
-
- Copyright (C) 2004 Nokia Corporation. All rights reserved.
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Janne Ylalehto <janne.ylalehto@nokia.com>
- @author Johan Hedberg <johan.hedberg@nokia.com>
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#include <string.h>
-
-#include <glib.h>
-#include <dbus/dbus.h>
-
-#include <wlancond.h>
-#include <wlancond-dbus.h>
-#include <wlancond-supp.h>
-
-#include "common.h"
-#include "dbus.h"
-#include "dbus-helper.h"
-#include "wlan.h"
-#include "log.h"
-
-/* -- SCANNING -- */
-
-static wlan_found_ap found_ap_cb = NULL;
-
-int wlan_scan(const char * ssid, wlan_found_ap new_found_ap_cb)
-{
- DBusMessage *msg, *reply;
- DBusError error;
-
- DLOG_DEBUG("%s: %s (active)", __func__, ssid);
-
- dbus_error_init(&error);
-
- found_ap_cb = new_found_ap_cb;
-
- msg = new_dbus_method_call(
- WLANCOND_SERVICE,
- WLANCOND_REQ_PATH,
- WLANCOND_REQ_INTERFACE,
- WLANCOND_SCAN_REQ);
-
- gint32 power_level = WLANCOND_TX_POWER100;
- guint32 flags = 0;
-
- append_dbus_args(
- msg,
- DBUS_TYPE_INT32, &power_level,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &ssid, strlen(ssid) + 1,
- DBUS_TYPE_UINT32, &flags,
-
- DBUS_TYPE_INVALID);
-
- reply = dbus_connection_send_with_reply_and_block(get_dbus_connection(),
- msg, -1, &error);
-
- dbus_message_unref(msg);
-
- if (reply) {
- DLOG_DEBUG("Scan reply OK");
- dbus_message_unref(reply);
-
- return 0;
- } else if (dbus_error_is_set(&error)) {
- DLOG_INFO("Scan pending call result:%s", error.name);
- dbus_error_free(&error);
- found_ap_cb = NULL;
- return -1;
- } else {
- DLOG_WARN("Scan without reply");
- found_ap_cb = NULL;
- return -1;
- }
-}
-
-gboolean wlan_is_scanning()
-{
- return found_ap_cb ? TRUE : FALSE;
-}
-
-void wlan_notify_ap(const char *ssid, const char *bssid,
- int rssi, unsigned int channel, unsigned int cap_bits)
-{
- if (found_ap_cb)
- found_ap_cb(SEARCH_CONTINUE, ssid, bssid, rssi / 2 - 110);
-}
-
-void wlan_notify_end_of_search()
-{
- wlan_found_ap prev_found_ap_cb = found_ap_cb;
- found_ap_cb = NULL;
-
- // A new search may be started right after calling this callback
-
- if (prev_found_ap_cb)
- prev_found_ap_cb(SEARCH_FINISHED, NULL, NULL, 0);
-}
-
-/* - CONNECTING - */
-
-static wlan_connected connected_cb;
-
-static void connect_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("Connect reply callback");
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
-
- DLOG_DEBUG("Connect pending call result:%s", error.name);
-
- connected_cb(-1, error.name);
- dbus_error_free(&error);
- } else if (reply) {
- connected_cb(0, NULL);
- }
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-void wlan_connect(const char * ssid, wlan_connected _connected_cb)
-{
- DBusMessage *msg;
- DBusPendingCall *pending;
-
- DLOG_DEBUG("%s: %s", __func__, ssid);
-
- connected_cb = _connected_cb;
-
- msg = new_dbus_method_call(
- WLANCOND_SERVICE,
- WLANCOND_REQ_PATH,
- WLANCOND_REQ_INTERFACE,
- WLANCOND_SETTINGS_AND_CONNECT_REQ);
-
- guint32 dummy = 0;
- guint32 *dummyP = &dummy;
-
- gint32 power_level, mode, encryption, default_key;
- guint32 adhoc_channel, flags;
-
- power_level = WLANCOND_TX_POWER100;
- mode = WLANCOND_INFRA;
- encryption = 0;
- default_key = 0;
- adhoc_channel = 0;
- flags = WLANCOND_USE_SUPPLICANT;
-
- append_dbus_args(
- msg,
- DBUS_TYPE_INT32, &power_level,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &ssid, strlen(ssid),
- DBUS_TYPE_INT32, &mode,
- DBUS_TYPE_INT32, &encryption,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &dummyP, 0,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &dummyP, 0,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &dummyP, 0,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &dummyP, 0,
- DBUS_TYPE_INT32, &default_key,
- DBUS_TYPE_UINT32, &adhoc_channel,
- DBUS_TYPE_UINT32, &flags,
- DBUS_TYPE_INVALID);
-
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- msg, &pending, -1))
- die("Out of memory");
-
- if (!dbus_pending_call_set_notify(pending, connect_reply_cb, NULL, NULL))
- die("Out of memory");
-
- dbus_message_unref(msg);
-}
-
-static void disconnect_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("Disconnect reply callback");
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
-
- DLOG_DEBUG("Disconnect pending call result:%s", error.name);
-
- dbus_error_free(&error);
- }
-
- // No need to notify, wpa_supplicant will signal that for us
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-void wlan_disconnect()
-{
- DBusMessage *msg;
- DBusPendingCall *pending;
-
- DLOG_DEBUG("%s", __func__);
-
- msg = new_dbus_method_call(
- WLANCOND_SERVICE,
- WLANCOND_REQ_PATH,
- WLANCOND_REQ_INTERFACE,
- WLANCOND_DISCONNECT_REQ);
-
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- msg, &pending, -1))
- die("Out of memory");
-
- if (!dbus_pending_call_set_notify(pending, disconnect_reply_cb, NULL, NULL))
- die("Out of memory");
-
- dbus_message_unref(msg);
-}
-
-/* -- STATUS -- */
-
-static wlan_status_reply status_cb;
-
-static void status_reply_cb(DBusPendingCall *pending, void *user_data)
-{
- DBusMessage *reply;
- DBusError error;
-
- DLOG_DEBUG("%s", __func__);
-
- dbus_error_init(&error);
-
- reply = dbus_pending_call_steal_reply(pending);
-
- if (dbus_set_error_from_message(&error, reply)) {
-
- DLOG_DEBUG("%s error: %s", __func__, error.name);
- goto dbus_error;
- } else if (reply) {
- char *essid, *bssid, *ifname;
- int essid_len, bssid_len;
- unsigned long sens, channel, capability, security;
-
- if (!dbus_message_get_args(
- reply, &error,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &essid, &essid_len,
- DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &bssid, &bssid_len,
- DBUS_TYPE_UINT32, &sens,
- DBUS_TYPE_UINT32, &channel,
- DBUS_TYPE_UINT32, &capability,
- DBUS_TYPE_UINT32, &security,
- DBUS_TYPE_STRING, &ifname,
- DBUS_TYPE_INVALID))
- {
- DLOG_DEBUG("%s parse reply error: %s", __func__,
- error.name);
- goto dbus_error;
- }
-
- status_cb(0, essid, essid_len, bssid, bssid_len,
- sens, channel, capability, security,
- ifname);
- }
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-
- return;
-dbus_error:
- status_cb(-1, NULL, 0, NULL, 0,
- 0, 0, 0, 0,
- error.name);
- dbus_error_free(&error);
-
- if (reply)
- dbus_message_unref(reply);
- dbus_pending_call_unref(pending);
-}
-
-void wlan_get_status(wlan_status_reply reply_cb)
-{
- DBusMessage *msg;
- DBusPendingCall *pending;
-
- DLOG_DEBUG("%s", __func__);
-
- status_cb = reply_cb;
-
- msg = new_dbus_method_call(
- WLANCOND_SERVICE,
- WLANCOND_REQ_PATH,
- WLANCOND_REQ_INTERFACE,
- WLANCOND_STATUS_REQ);
-
- if (!dbus_connection_send_with_reply(get_dbus_connection(),
- msg, &pending, -1))
- die("Out of memory");
-
- if (!dbus_pending_call_set_notify(pending, status_reply_cb, NULL, NULL))
- die("Out of memory");
-
- dbus_message_unref(msg);
-}
-
+++ /dev/null
-/**
- @file wlan.h
-
- Copyright (C) 2009 Javier S. Pedro
-
- @author Javier S. Pedro <javispedro@javispedro.com>
-
- This file is part of libicd-network-wpa.
-
- 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 the
- Free Software Foundation; either version 2 of the License, or (at your
- option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-#ifndef _WLAN_H_
-#define _WLAN_H_
-
-typedef void (*wlan_found_ap)(int status,
- const char * ssid, const char * ap, int dB);
-int wlan_scan(const char * ssid, wlan_found_ap found_ap_cb);
-
-gboolean wlan_is_scanning();
-void wlan_notify_ap(const char *ssid, const char *bssid,
- int rssi, unsigned int channel, unsigned int cap_bits);
-void wlan_notify_end_of_search();
-
-
-typedef void (*wlan_connected)(int status, const char *error);
-void wlan_connect(const char *ssid, wlan_connected connected_cb);
-
-void wlan_disconnect();
-
-typedef void (*wlan_status_reply)(int status,
- const char * essid, int essid_len,
- const char * bssid, int bssid_len,
- int qual, int channel, unsigned long security, unsigned long capability,
- const char * data);
-void wlan_get_status(wlan_status_reply reply_cb);
-
-
-#endif