diff options
author | Stefan Schmidt <stefan@datenfreihafen.org> | 2008-08-27 20:38:47 +0000 |
---|---|---|
committer | Stefan Schmidt <stefan@datenfreihafen.org> | 2008-08-27 20:38:47 +0000 |
commit | 446bedbb17699e0e84e8ff2d8950fe55612efaea (patch) | |
tree | 34377045010e0295e7f837da878ceb64a43c395b /packages/connman | |
parent | c0cd7eb79473bc0dd7f6b5535f434610e0185fcb (diff) |
connman: Connection manager from moblin. Recipe from OM git.
Diffstat (limited to 'packages/connman')
-rw-r--r-- | packages/connman/.mtn2git_empty | 0 | ||||
-rw-r--r-- | packages/connman/connman_git.bb | 49 | ||||
-rw-r--r-- | packages/connman/files/.mtn2git_empty | 0 | ||||
-rwxr-xr-x | packages/connman/files/connman | 42 | ||||
-rw-r--r-- | packages/connman/files/connman-build-and-work.patch | 286 |
5 files changed, 377 insertions, 0 deletions
diff --git a/packages/connman/.mtn2git_empty b/packages/connman/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/connman/.mtn2git_empty diff --git a/packages/connman/connman_git.bb b/packages/connman/connman_git.bb new file mode 100644 index 0000000000..afe28a0e19 --- /dev/null +++ b/packages/connman/connman_git.bb @@ -0,0 +1,49 @@ +HOMEPAGE = "http://www.moblin.org/projects/projects_connman.php" +SUMMARY = "Moblin Connection Manager" +PV = "0.0+git${SRCREV}" +PR = "r4" +S = "${WORKDIR}/git" +LICENSE = "GPL" + +DEPENDS = "libgdbus dbus glib-2.0 hal" +RDEPENDS = "dhcp-client wpa-supplicant resolvconf" + +EXTRA_OECONF += " \ + ac_cv_path_WPASUPPLICANT=/usr/sbin/wpa_supplicant \ + ac_cv_path_DHCLIENT=/sbin/dhclient " + +SRC_URI = "git://moblin.org/repos/projects/connman.git;proto=http \ + file://connman-build-and-work.patch;patch=1 \ + file://connman " + +INITSCRIPT_NAME = "connman" +INITSCRIPT_PARAMS = "defaults 22" + +inherit autotools pkgconfig update-rc.d + +do_install_append() { + install -m 0755 ${WORKDIR}/connman ${D}${sysconfdir}/init.d/connman +} + +PACKAGES_DYNAMIC = "${PN}-plugin-*" +PACKAGES += "${PN}-script-dhclient" +FILES_${PN} = "${bindir}/* ${sbindir}/* ${libexecdir}/* ${libdir}/lib*.so.* \ + ${sysconfdir} ${sharedstatedir} ${localstatedir} \ + ${base_bindir}/* ${base_sbindir}/* ${base_libdir}/*.so* ${datadir}/${PN} \ + ${datadir}/pixmaps ${datadir}/applications \ + ${datadir}/idl ${datadir}/omf ${datadir}/sounds \ + ${libdir}/bonobo/servers \ + ${datadir}/dbus-1/system-services/*" +FILES_${PN}-script-dhclient += "${libdir}/connman/scripts/dhclient*" +FILES_${PN}-dbg += "${libdir}/connman/plugins/.debug \ + ${libdir}/connman/scripts/.debug" + +python populate_packages_prepend() { + plugin_dir = bb.data.expand('${libdir}/connman/plugins/', d) + plugin_name = bb.data.expand('${PN}-plugin-%s', d) + do_split_packages(d, plugin_dir, '^lib(.*).so$', plugin_name, '${PN} plugin for %s', extra_depends='' ) +} + +do_stage() { + autotools_stage_all +} diff --git a/packages/connman/files/.mtn2git_empty b/packages/connman/files/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/connman/files/.mtn2git_empty diff --git a/packages/connman/files/connman b/packages/connman/files/connman new file mode 100755 index 0000000000..5e0f90e8cc --- /dev/null +++ b/packages/connman/files/connman @@ -0,0 +1,42 @@ +#!/bin/sh + +DAEMON=/usr/sbin/connmand +PIDFILE=/var/run/connmand.pid +DESC="Connection Manager" + +if [ -f /etc/default/connman ] ; then + . /etc/default/connman +fi + +set -e + +do_start() { + connmand +} + +do_stop() { + start-stop-daemon --stop --name connmand --quiet +} + +case "$1" in + start) + echo "Starting $DESC" + do_start + ;; + stop) + echo "Stopping $DESC" + do_stop + ;; + restart|force-reload) + echo "Restarting $DESC" + do_stop + sleep 1 + do_start + ;; + *) + echo "Usage: $0 {start|stop|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/packages/connman/files/connman-build-and-work.patch b/packages/connman/files/connman-build-and-work.patch new file mode 100644 index 0000000000..482e7a5e1b --- /dev/null +++ b/packages/connman/files/connman-build-and-work.patch @@ -0,0 +1,286 @@ +diff --git a/include/iface.h b/include/iface.h +index 3530f23..24f0a9a 100644 +--- a/include/iface.h ++++ b/include/iface.h +@@ -161,7 +161,7 @@ extern void connman_iface_indicate_carrier_off(struct connman_iface *iface); + extern void connman_iface_indicate_configured(struct connman_iface *iface); + + extern void connman_iface_indicate_station(struct connman_iface *iface, +- const char *name, int strength, int security); ++ const char *bssid, const char *name, int strength, int security); + + extern int connman_iface_get_ipv4(struct connman_iface *iface, + struct connman_ipv4 *ipv4); +diff --git a/plugins/supplicant.c b/plugins/supplicant.c +index cba93cd..a8a46ed 100644 +--- a/plugins/supplicant.c ++++ b/plugins/supplicant.c +@@ -66,7 +66,9 @@ static GSList *tasks = NULL; + + struct supplicant_ap { + gchar *identifier; ++ gchar *bssid; + GByteArray *ssid; ++ guint quality; + guint capabilities; + gboolean has_wep; + gboolean has_wpa; +@@ -618,6 +620,24 @@ static void extract_ssid(struct supplicant_ap *ap, DBusMessageIter *value) + ap->identifier = g_strdup((char *) ssid); + } + ++static void extract_bssid(struct supplicant_ap *ap, DBusMessageIter *value) ++{ ++ DBusMessageIter array; ++ unsigned char *bssid; ++ int bssid_len; ++ char buf[20]; ++ ++ dbus_message_iter_recurse(value, &array); ++ dbus_message_iter_get_fixed_array(&array, &bssid, &bssid_len); ++ if (bssid_len >= 6) { ++ g_snprintf((char *)buf, sizeof(buf), ++ "%02x:%02x:%02x:%02x:%02x:%02x", ++ (int)bssid[0], (int)bssid[1], (int)bssid[2], ++ (int)bssid[3], (int)bssid[4], (int)bssid[5]); ++ ap->bssid = g_strdup((char *) buf); ++ } ++} ++ + static void extract_wpaie(struct supplicant_ap *ap, DBusMessageIter *value) + { + DBusMessageIter array; +@@ -657,6 +677,16 @@ static void extract_capabilites(struct supplicant_ap *ap, + ap->has_wep = TRUE; + } + ++static void extract_quality(struct supplicant_ap *ap, ++ DBusMessageIter *value) ++{ ++ guint quality; ++ ++ dbus_message_iter_get_basic(value, &quality); ++ ++ ap->quality = quality; ++} ++ + static int parse_network_properties(struct supplicant_task *task, + DBusMessage *message) + { +@@ -688,12 +718,16 @@ static int parse_network_properties(struct supplicant_task *task, + + if (g_str_equal(key, "ssid") == TRUE) + extract_ssid(ap, &value); ++ else if (g_str_equal(key, "bssid") == TRUE) ++ extract_bssid(ap, &value); + else if (g_str_equal(key, "wpaie") == TRUE) + extract_wpaie(ap, &value); + else if (g_str_equal(key, "rsnie") == TRUE) + extract_rsnie(ap, &value); + else if (g_str_equal(key, "capabilities") == TRUE) + extract_capabilites(ap, &value); ++ else if (g_str_equal(key, "quality") == TRUE) ++ extract_quality(ap, &value); + + dbus_message_iter_next(&dict); + } +@@ -706,7 +740,8 @@ static int parse_network_properties(struct supplicant_task *task, + security |= 0x04; + + connman_iface_indicate_station(task->iface, +- ap->identifier, 25, security); ++ ap->bssid, ap->identifier, ap->quality, ++ security); + + g_free(ap); + +diff --git a/src/iface-inet.c b/src/iface-inet.c +index 82a1e8c..f780452 100644 +--- a/src/iface-inet.c ++++ b/src/iface-inet.c +@@ -275,6 +275,10 @@ int __connman_iface_connect(struct connman_iface *iface, + + iface->flags |= CONNMAN_IFACE_FLAG_RUNNING; + ++ /* This actually makes it do a dhcp request properly when connections ++ * are estabished - it doesnt seem to otherwise */ ++ iface->state = CONNMAN_IFACE_STATE_ENABLED; ++ + return 0; + } + +diff --git a/src/iface.c b/src/iface.c +index b2fd6d1..c70b25c 100644 +--- a/src/iface.c ++++ b/src/iface.c +@@ -332,11 +332,13 @@ void connman_iface_indicate_configured(struct connman_iface *iface) + } + } + +-static void append_station(DBusMessage *reply, const char *name, ++static void append_station(DBusMessage *reply, const char *bssid, const char *name, + int signal, int security) + { + DBusMessageIter array, dict; ++ const char *wep = "WEP"; + const char *wpa = "WPA"; ++ const char *rsn = "RSN"; + + dbus_message_iter_init_append(reply, &array); + +@@ -345,25 +347,36 @@ static void append_station(DBusMessage *reply, const char *name, + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); + +- append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name); ++ if (bssid) append_entry(&dict, "BSSID", DBUS_TYPE_STRING, &bssid); ++ if (name) append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name); + append_entry(&dict, "Signal", DBUS_TYPE_UINT16, &signal); + +- if (security > 0) +- append_entry(&dict, "Security", DBUS_TYPE_STRING, &wpa); ++ if (security > 0) { ++ const char *sec = NULL; ++ ++ if (security & 0x4) ++ sec = rsn; ++ else if (security & 0x2) ++ sec = wpa; ++ else if (security & 0x1) ++ sec = wep; ++ if (sec) ++ append_entry(&dict, "Security", DBUS_TYPE_STRING, &sec); ++ } + + dbus_message_iter_close_container(&array, &dict); + } + + void connman_iface_indicate_station(struct connman_iface *iface, +- const char *name, int strength, int security) ++ const char *bssid, const char *name, int strength, int security) + { + DBusMessage *signal; +- char *ssid, *passphrase; ++ char *ssid = NULL, *passphrase; + int len; + +- DBG("iface %p security %d name %s", iface, security, name); ++ DBG("iface %p security %d name %s bssid %s", iface, security, name, bssid); + +- if (name == NULL || strlen(name) == 0) ++ if (bssid == NULL || strlen(bssid) == 0) + return; + + signal = dbus_message_new_signal(iface->path, +@@ -371,7 +384,7 @@ void connman_iface_indicate_station(struct connman_iface *iface, + if (signal == NULL) + return; + +- append_station(signal, name, strength, security); ++ append_station(signal, bssid, name, strength, security); + + dbus_connection_send(connection, signal, NULL); + dbus_message_unref(signal); +@@ -386,17 +399,21 @@ void connman_iface_indicate_station(struct connman_iface *iface, + default: + break; + } +- +- len = strlen(name); +- ssid = strdup(name); +- if (ssid == NULL) ++ ++ passphrase = __connman_iface_find_passphrase(iface, bssid); ++ ++ if (!passphrase && name) { ++ len = strlen(name); ++ ssid = strdup(name); ++ /* The D-Link access points return a 0x05 at the end of the SSID */ ++ if (len > 0 && ssid[len - 1] == '\05') ++ ssid[len - 1] = '\0'; ++ } ++ ++ if (!passphrase && ssid == NULL) + return; +- +- /* The D-Link access points return a 0x05 at the end of the SSID */ +- if (ssid[len - 1] == '\05') +- ssid[len - 1] = '\0'; +- +- passphrase = __connman_iface_find_passphrase(iface, ssid); ++ if (!passphrase) ++ passphrase = __connman_iface_find_passphrase(iface, ssid); + if (passphrase != NULL) { + DBG("network %s passphrase %s", ssid, passphrase); + +@@ -1154,7 +1171,7 @@ static GDBusMethodTable iface_methods[] = { + { "GetNetwork", "", "a{sv}", get_network }, + { "SetNetwork", "a{sv}", "", set_network }, + { "ListNetworks", "", "ao", list_networks }, +- { "CreateNetwork", "a{av}", "o", create_network }, ++ { "CreateNetwork", "a{sv}", "o", create_network }, + { "RemoveNetwork", "o", "", remove_network }, + { "SelectNetwork", "o", "", select_network }, + { "GetIPv4", "", "a{sv}", get_ipv4 }, +@@ -1301,7 +1318,7 @@ static int probe_device(LibHalContext *ctx, + + conn = libhal_ctx_get_dbus_connection(ctx); + +- g_dbus_register_object(conn, iface->path, iface, device_free); ++ g_dbus_register_object(conn, iface->path); + + interfaces = g_slist_append(interfaces, iface); + +@@ -1313,7 +1330,7 @@ static int probe_device(LibHalContext *ctx, + + g_dbus_register_interface(conn, iface->path, + CONNMAN_IFACE_INTERFACE, +- iface_methods, iface_signals, NULL); ++ iface_methods, iface_signals, NULL, iface, device_free); + + DBG("iface %p identifier %s", iface, iface->identifier); + +diff --git a/src/manager.c b/src/manager.c +index 9d14cd7..78b017f 100644 +--- a/src/manager.c ++++ b/src/manager.c +@@ -218,18 +218,18 @@ int __connman_manager_init(DBusConnection *conn, gboolean compat) + if (connection == NULL) + return -1; + +- g_dbus_register_object(connection, CONNMAN_MANAGER_PATH, NULL, NULL); ++ g_dbus_register_object(connection, CONNMAN_MANAGER_PATH); + + g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH, + CONNMAN_MANAGER_INTERFACE, + manager_methods, +- manager_signals, NULL); ++ manager_signals, NULL, NULL, NULL); + + if (compat == TRUE) { +- g_dbus_register_object(connection, NM_PATH, NULL, NULL); ++ g_dbus_register_object(connection, NM_PATH); + + g_dbus_register_interface(connection, NM_PATH, NM_INTERFACE, +- nm_methods, NULL, NULL); ++ nm_methods, NULL, NULL, NULL, NULL); + + nm_compat = TRUE; + } +diff --git a/src/network.c b/src/network.c +index 9da8fea..a5ec2b9 100644 +--- a/src/network.c ++++ b/src/network.c +@@ -157,10 +157,10 @@ const char *__connman_iface_add_network(struct connman_iface *iface, + + networks = g_slist_append(networks, network); + +- g_dbus_register_object(connection, path, network, network_free); ++ g_dbus_register_object(connection, path); + + g_dbus_register_interface(connection, path, CONNMAN_NETWORK_INTERFACE, +- network_methods, NULL, NULL); ++ network_methods, NULL, NULL, network, network_free); + + return path; + } |