This email list is read-only. Emails sent to this list will be discarded
----------------------------------
plugins/bluetooth.c | 79 ++++++++++++++++++++++++++++++++++++++++++
plugins/wifi.c | 11 +++++-
src/connman.conf | 4 ++
src/connman.h | 4 ++
src/element.c | 94 ++++++++++++++++++++++++++++++++++----------------
src/error.c | 6 +++
src/main.c | 12 +++---
src/storage.c | 18 +++++++++-
8 files changed, 189 insertions(+), 39 deletions(-)
New commits:
commit 9703f77e6f49cf5bcf318c1f2d315a6250ae773d
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 22:11:51 2008 +0100
Add generic failure reply
commit afc80b971146277e4befc173ef61cfcb375a3b0f
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 22:07:26 2008 +0100
Track global connection state
commit 9a190718628f120e6a3469a7d128795c70fc1ad0
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:53:42 2008 +0100
Don't store the enable status of an element
commit d58d6a1fc8aea4ac47f815d3217e3f6a19be378a
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:52:06 2008 +0100
Load policy configuration from storage
commit fca9b70ed3be7b479c5949bf001d0a071802fca2
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:47:21 2008 +0100
Store the policy setting
commit f7afbae29f9cb5a933890e12c16771de5bfd642f
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:42:10 2008 +0100
Don't store fake or network device elements
commit 7bb1bc293ccdb0d8fb95ae8ef25080ab13656769
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:39:16 2008 +0100
Do policy based enabling/disabling of devices
commit e7f9a5e40c71f267015af90cacb009eea3ee323a
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 21:03:59 2008 +0100
Add deny policy to D-Bus access configuration
commit c4f2302710ca4e779555759418bac3babc2d953e
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 20:21:08 2008 +0100
Fix cleanup and unregistration procedures
commit 54bdbc71afb639449aa3d64f1fd61a057c79189c
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 20:14:47 2008 +0100
Send signal for changed device and connection lists
commit cf87ef5c131af32de16b51d47ecd55f26d2b991c
Author: Marcel Holtmann <[EMAIL PROTECTED]>
Date: Fri Dec 5 13:59:25 2008 +0100
Fix detection of Bluetooth devices
Diff in this email is a maximum of 400 lines.
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index 6b0b69a..978f257 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -33,6 +33,8 @@
#define BLUEZ_SERVICE "org.bluez"
+#define TIMEOUT 5000
+
static int bluetooth_probe(struct connman_device *device)
{
DBG("device %p", device);
@@ -52,14 +54,91 @@ static struct connman_device_driver bluetooth_driver = {
.remove = bluetooth_remove,
};
+static GSList *device_list = NULL;
+
+static void adapters_reply(DBusPendingCall *call, void *user_data)
+{
+ DBusMessage *reply;
+ DBusError error;
+ char **adapters;
+ int i, num_adapters;
+
+ DBG("");
+
+ reply = dbus_pending_call_steal_reply(call);
+
+ dbus_error_init(&error);
+
+ if (dbus_message_get_args(reply, &error,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
+ &adapters, &num_adapters,
+ DBUS_TYPE_INVALID) == FALSE) {
+ if (dbus_error_is_set(&error) == TRUE) {
+ connman_error("%s", error.message);
+ dbus_error_free(&error);
+ } else
+ connman_error("Wrong arguments for adapter list");
+ goto done;
+ }
+
+ for (i = 0; i < num_adapters; i++) {
+ struct connman_element *device;
+
+ device = connman_element_create(NULL);
+ device->type = CONNMAN_ELEMENT_TYPE_DEVICE;
+ device->subtype = CONNMAN_ELEMENT_SUBTYPE_BLUETOOTH;
+
+ device->name = g_path_get_basename(adapters[i]);
+
+ connman_element_register(device, NULL);
+ device_list = g_slist_append(device_list, device);
+ }
+
+ g_strfreev(adapters);
+
+done:
+ dbus_message_unref(reply);
+}
+
static void bluetooth_connect(DBusConnection *connection, void *user_data)
{
+ DBusMessage *message;
+ DBusPendingCall *call;
+
DBG("connection %p", connection);
+
+ message = dbus_message_new_method_call(BLUEZ_SERVICE, "/",
+ "org.bluez.Manager", "ListAdapters");
+ if (message == NULL)
+ return;
+
+ if (dbus_connection_send_with_reply(connection, message,
+ &call, TIMEOUT) == FALSE) {
+ connman_error("Failed to get Bluetooth adapters");
+ dbus_message_unref(message);
+ return;
+ }
+
+ dbus_pending_call_set_notify(call, adapters_reply, NULL, NULL);
+
+ dbus_message_unref(message);
}
static void bluetooth_disconnect(DBusConnection *connection, void *user_data)
{
+ GSList *list;
+
DBG("connection %p", connection);
+
+ for (list = device_list; list; list = list->next) {
+ struct connman_element *device = list->data;
+
+ connman_element_unregister(device);
+ connman_element_unref(device);
+ }
+
+ g_slist_free(device_list);
+ device_list = NULL;
}
static DBusConnection *connection;
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 5104586..0ae20f5 100644
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -44,6 +44,7 @@
struct wifi_data {
GSList *list;
gchar *identifier;
+ gboolean connected;
};
static int network_probe(struct connman_element *element)
@@ -77,6 +78,9 @@ static int network_enable(struct connman_element *element)
if (element->parent != NULL) {
struct wifi_data *data =
connman_element_get_data(element->parent);
+ if (data->connected == TRUE)
+ return -EBUSY;
+
if (data != NULL) {
g_free(data->identifier);
data->identifier = g_strdup(identifier);
@@ -154,13 +158,16 @@ static void state_change(struct connman_element *parent,
if (state == STATE_COMPLETED) {
struct connman_element *dhcp;
+ data->connected = TRUE;
+
dhcp = connman_element_create(NULL);
dhcp->type = CONNMAN_ELEMENT_TYPE_DHCP;
dhcp->index = element->index;
connman_element_register(dhcp, element);
- }
+ } else if (state == STATE_DISCONNECTED || state == STATE_INACTIVE)
+ data->connected = FALSE;
}
static void scan_result(struct connman_element *parent,
@@ -262,6 +269,8 @@ static int wifi_probe(struct connman_element *element)
if (data == NULL)
return -ENOMEM;
+ data->connected = FALSE;
+
connman_element_set_data(element, data);
return 0;
diff --git a/src/connman.conf b/src/connman.conf
index f9da151..b8846a5 100644
--- a/src/connman.conf
+++ b/src/connman.conf
@@ -10,4 +10,8 @@
<allow send_destination="org.moblin.connman"/>
<allow send_interface="org.moblin.connman"/>
</policy>
+ <policy context="default">
+ <deny send_destination="org.moblin.connman"/>
+ <deny send_interface="org.moblin.connman"/>
+ </policy>
</busconfig>
diff --git a/src/connman.h b/src/connman.h
index d7124d2..9f7c4c1 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -27,6 +27,7 @@
#define NM_PATH "/org/freedesktop/NetworkManager"
#define NM_INTERFACE NM_SERVICE
+DBusMessage *__connman_error_failed(DBusMessage *msg);
DBusMessage *__connman_error_invalid_arguments(DBusMessage *msg);
DBusMessage *__connman_error_permission_denied(DBusMessage *msg);
@@ -79,6 +80,9 @@ int __connman_element_count(enum connman_element_type type);
const char *__connman_element_type2string(enum connman_element_type type);
const char *__connman_element_subtype2string(enum connman_element_subtype
type);
+const char *__connman_element_policy2string(enum connman_element_policy
policy);
+enum connman_element_policy __connman_element_string2policy(const char
*policy);
+
int __connman_element_load(struct connman_element *element);
int __connman_element_store(struct connman_element *element);
diff --git a/src/element.c b/src/element.c
index 72b0467..0f7cecc 100644
--- a/src/element.c
+++ b/src/element.c
@@ -148,7 +148,7 @@ static const char *subtype2string(enum
connman_element_subtype type)
return NULL;
}
-static const char *policy2string(enum connman_element_policy policy)
+const char *__connman_element_policy2string(enum connman_element_policy policy)
{
switch (policy) {
case CONNMAN_ELEMENT_POLICY_UNKNOWN:
@@ -166,6 +166,20 @@ static const char *policy2string(enum
connman_element_policy policy)
return NULL;
}
+enum connman_element_policy __connman_element_string2policy(const char *policy)
+{
+ if (strcasecmp(policy, "off") == 0)
+ return CONNMAN_ELEMENT_POLICY_OFF;
+ else if (strcasecmp(policy, "ignore") == 0)
+ return CONNMAN_ELEMENT_POLICY_IGNORE;
+ else if (strcasecmp(policy, "auto") == 0)
+ return CONNMAN_ELEMENT_POLICY_AUTO;
+ else if (strcasecmp(policy, "ask") == 0)
+ return CONNMAN_ELEMENT_POLICY_ASK;
+ else
+ return CONNMAN_ELEMENT_POLICY_UNKNOWN;
+}
+
static void append_property(DBusMessageIter *dict,
struct connman_property *property)
{
@@ -274,11 +288,13 @@ static DBusMessage *do_update(DBusConnection *conn,
DBG("conn %p", conn);
if (element->enabled == FALSE)
- return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ return __connman_error_failed(msg);
if (element->driver && element->driver->update) {
DBG("Calling update callback");
- element->driver->update(element);
+ if (element->driver->update(element) < 0)
+ return __connman_error_failed(msg);
+
}
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
@@ -292,12 +308,12 @@ static DBusMessage *do_enable(DBusConnection *conn,
DBG("conn %p", conn);
if (element->enabled == TRUE)
- return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ return __connman_error_failed(msg);
if (element->driver && element->driver->enable) {
DBG("Calling enable callback");
if (element->driver->enable(element) < 0)
- return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ return __connman_error_failed(msg);
}
element->enabled = TRUE;
@@ -320,12 +336,12 @@ static DBusMessage *do_disable(DBusConnection *conn,
DBG("conn %p", conn);
if (element->enabled == FALSE)
- return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ return __connman_error_failed(msg);
if (element->driver && element->driver->disable) {
DBG("Calling disable callback");
if (element->driver->disable(element) < 0)
- return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+ return __connman_error_failed(msg);
}
element->enabled = FALSE;
@@ -392,7 +408,7 @@ static DBusMessage *get_device_properties(DBusConnection
*conn,
connman_dbus_dict_append_variant(&dict, "Type",
DBUS_TYPE_STRING, &str);
- str = policy2string(element->policy);
+ str = __connman_element_policy2string(element->policy);
if (str != NULL)
connman_dbus_dict_append_variant(&dict, "Policy",
DBUS_TYPE_STRING, &str);
@@ -467,7 +483,7 @@ static DBusMessage *get_network_properties(DBusConnection
*conn,
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
- str = policy2string(element->policy);
+ str = __connman_element_policy2string(element->policy);
if (str != NULL)
connman_dbus_dict_append_variant(&dict, "Policy",
DBUS_TYPE_STRING, &str);
@@ -795,6 +811,20 @@ static gboolean match_driver(struct connman_element
*element,
return FALSE;
}
+static void enable_element(struct connman_element *element)
+{
+ if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
+ return;
+
+ if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+ return;
+
+ if (element->driver && element->driver->enable) {
+ if (element->driver->enable(element) == 0)
+ element->enabled = TRUE;
+ }
+}
+
static gboolean probe_driver(GNode *node, gpointer data)
{
struct connman_element *element = node->data;
@@ -809,6 +839,8 @@ static gboolean probe_driver(GNode *node, gpointer data)
__connman_element_lock(element);
element->driver = driver;
__connman_element_unlock(element);
+
+ enable_element(element);
}
return FALSE;
@@ -862,6 +894,20 @@ int connman_driver_register(struct connman_driver *driver)
return 0;
}
+static void disable_element(struct connman_element *element)
+{
+ if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+ return;
+
+ if (element->enabled == FALSE)
+ return;
+
+ if (element->driver && element->driver->disable) {
+ if (element->driver->disable(element) == 0)
+ element->enabled = FALSE;
+ }
+}
+
static gboolean remove_driver(GNode *node, gpointer data)
{
struct connman_element *element = node->data;
@@ -870,6 +916,8 @@ static gboolean remove_driver(GNode *node, gpointer data)
DBG("element %p name %s", element, element->name);
if (element->driver == driver) {
+ disable_element(element);
+
if (driver->remove)
driver->remove(element);
@@ -1458,7 +1506,7 @@ static void append_devices(DBusMessageIter *entry)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- //__connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
+ __connman_element_list(CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -1498,7 +1546,7 @@ static void append_connections(DBusMessageIter *entry)
dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
- //__connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
+ __connman_element_list(CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
dbus_message_iter_close_container(&value, &iter);
@@ -1662,6 +1710,8 @@ static void register_element(gpointer data, gpointer
user_data)
__connman_element_lock(element);
element->driver = driver;
__connman_element_unlock(element);
+
+ enable_element(element);
break;
}
}
@@ -1775,9 +1825,8 @@ static gboolean remove_element(GNode *node, gpointer
user_data)
return FALSE;
}
-static void unregister_element(gpointer data, gpointer user_data)
+void connman_element_unregister(struct connman_element *element)
{
- struct connman_element *element = data;
GNode *node;
DBG("element %p name %s", element, element->name);
@@ -1793,16 +1842,8 @@ static void unregister_element(gpointer data, gpointer
user_data)
g_static_rw_lock_writer_unlock(&element_lock);
}
-void connman_element_unregister(struct connman_element *element)
-{
- DBG("element %p name %s", element, element->name);
-
- unregister_element(element, NULL);
-}
-
-static void unregister_children(gpointer data, gpointer user_data)
+void connman_element_unregister_children(struct connman_element *element)
{
- struct connman_element *element = data;
_______________________________________________
Commits mailing list
[email protected]
https://lists.moblin.org/mailman/listinfo/commits