diff options
Diffstat (limited to 'network')
| -rw-r--r-- | network/bridge.c | 17 | ||||
| -rw-r--r-- | network/bridge.h | 1 | ||||
| -rw-r--r-- | network/server.c | 16 | 
3 files changed, 30 insertions, 4 deletions
| diff --git a/network/bridge.c b/network/bridge.c index 76c2a507..a6930194 100644 --- a/network/bridge.c +++ b/network/bridge.c @@ -74,3 +74,20 @@ int bridge_remove(const char *name)  	return 0;  } + +int bridge_add_interface(const char *bridge, const char *dev) +{ +	struct ifreq ifr; +	int ifindex = if_nametoindex(dev); + +	if (ifindex == 0)  +		return -ENODEV; + +	strncpy(ifr.ifr_name, bridge, IFNAMSIZ); +	ifr.ifr_ifindex = ifindex; + +	if (ioctl(bridge_socket, SIOCBRADDIF, &ifr) < 0) +		return -errno; + +	return 0; +} diff --git a/network/bridge.h b/network/bridge.h index 45e744d3..2630b892 100644 --- a/network/bridge.h +++ b/network/bridge.h @@ -26,3 +26,4 @@ void bridge_cleanup(void);  int bridge_create(const char *name);  int bridge_remove(const char *name); +int bridge_add_interface(const char *bridge, const char *dev); diff --git a/network/server.c b/network/server.c index 1e1bede0..5ae7c634 100644 --- a/network/server.c +++ b/network/server.c @@ -47,6 +47,7 @@  #define NETWORK_SERVER_INTERFACE "org.bluez.network.Server" +#include "bridge.h"  #include "common.h"  #include "server.h" @@ -264,6 +265,8 @@ static void authorization_callback(DBusPendingCall *pcall, void *data)  		return;  	} +	sk = g_io_channel_unix_get_fd(ns->pauth->io); +  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) {  		error("Access denied: %s", derr.message); @@ -279,8 +282,6 @@ static void authorization_callback(DBusPendingCall *pcall, void *data)  	memset(devname, 0, 16);  	strncpy(devname, netdev, 16); -	/* FIXME: Is it the correct order? */ -	sk = g_io_channel_unix_get_fd(ns->pauth->io);  	if (bnep_connadd(sk, ns->id, devname) < 0) {  		response = BNEP_CONN_NOT_ALLOWED;  		goto failed; @@ -289,6 +290,13 @@ static void authorization_callback(DBusPendingCall *pcall, void *data)  	info("Authorization succedded. New connection: %s", devname);  	response = BNEP_SUCCESS; +	if (bridge_add_interface("pan0", devname) < 0) { +		error("Can't add %s to the bridge: %s(%d)", +				devname, strerror(errno), errno); +		response = BNEP_CONN_NOT_ALLOWED; +		goto failed; +	} +  	/* FIXME: Enable routing if applied */  	/* FIXME: send the D-Bus message to notify the new bnep iface */ @@ -299,6 +307,8 @@ failed:  	pending_auth_free(ns->pauth);  	ns->pauth = NULL; +	close(sk); +  	dbus_message_unref(reply);  	dbus_pending_call_unref(pcall);  } @@ -678,8 +688,6 @@ static DBusHandlerResult enable(DBusConnection *conn,  		return err_failed(conn, msg, "Unable to register the service record");  	} -	/* FIXME: Check security */ -  	err = l2cap_listen(ns);  	if (err < 0)   		return err_failed(conn, msg, strerror(-err)); | 
