diff options
Diffstat (limited to 'network/server.c')
| -rw-r--r-- | network/server.c | 106 | 
1 files changed, 15 insertions, 91 deletions
| diff --git a/network/server.c b/network/server.c index 71b45b22..5d493e5f 100644 --- a/network/server.c +++ b/network/server.c @@ -50,6 +50,7 @@  #include "textfile.h"  #include "dbus-service.h"  #include "sdpd.h" +#include "glib-helper.h"  #define NETWORK_SERVER_INTERFACE "org.bluez.network.Server"  #define SETUP_TIMEOUT		1000 @@ -632,37 +633,17 @@ static gboolean timeout_cb(void *user_data)  	return FALSE;  } -static gboolean connect_event(GIOChannel *chan, -				GIOCondition cond, gpointer user_data) +static void connect_event(GIOChannel *chan, int err, const bdaddr_t *src, +				const bdaddr_t *dst, gpointer user_data)  { -	struct sockaddr_l2 addr;  	struct timeout *to; -	GIOChannel *io; -	socklen_t addrlen; -	int sk, nsk; -	if (cond & G_IO_NVAL) -		return FALSE; - -	if (cond & (G_IO_ERR | G_IO_HUP)) { -		error("Hangup or error on L2CAP socket PSM 15"); -		g_io_channel_close(chan); -		return FALSE; -	} - -	sk = g_io_channel_unix_get_fd(chan); - -	memset(&addr, 0, sizeof(addr)); -	addrlen = sizeof(addr); - -	nsk = accept(sk, (struct sockaddr *) &addr, &addrlen); -	if (nsk < 0) { +	if (err < 0) {  		error("accept(): %s(%d)", strerror(errno), errno); -		return TRUE; +		return;  	} -	io = g_io_channel_unix_new(nsk); -	g_io_channel_set_close_on_unref(io, TRUE); +	g_io_channel_set_close_on_unref(chan, TRUE);  	/*  	 * BNEP_SETUP_CONNECTION_REQUEST_MSG shall be received and @@ -671,92 +652,35 @@ static gboolean connect_event(GIOChannel *chan,  	 */  	to = g_malloc0(sizeof(struct timeout));  	to->id = g_timeout_add(SETUP_TIMEOUT, timeout_cb, to); -	to->watch = g_io_add_watch_full(io, G_PRIORITY_DEFAULT, +	to->watch = g_io_add_watch_full(chan, G_PRIORITY_DEFAULT,  				G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,  				bnep_setup, to, setup_destroy); -	g_io_channel_unref(io); +	g_io_channel_unref(chan); -	return TRUE; +	return;  }  int server_init(DBusConnection *conn, const char *iface_prefix,  		gboolean secure)  { -	struct l2cap_options l2o; -	struct sockaddr_l2 l2a; -	socklen_t olen; -	int sk, lm, err; - -	/* Create L2CAP socket and bind it to PSM BNEP */ -	sk = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); -	if (sk < 0) { -		err = errno; -		error("Cannot create L2CAP socket. %s(%d)", -					strerror(err), err); -		return -err; -	} - -	memset(&l2a, 0, sizeof(l2a)); -	l2a.l2_family = AF_BLUETOOTH; -	bacpy(&l2a.l2_bdaddr, BDADDR_ANY); -	l2a.l2_psm = htobs(BNEP_PSM); - -	if (bind(sk, (struct sockaddr *) &l2a, sizeof(l2a))) { -		err = errno; -		error("Bind failed. %s(%d)", strerror(err), err); -		goto fail; -	} - -	/* Setup L2CAP options according to BNEP spec */ -	memset(&l2o, 0, sizeof(l2o)); -	olen = sizeof(l2o); -	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen) < 0) { -		err = errno; -		error("Failed to get L2CAP options. %s(%d)", -					strerror(err), err); -		goto fail; -	} - -	l2o.imtu = l2o.omtu = BNEP_MTU; -	if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) { -		err = errno; -		error("Failed to set L2CAP options. %s(%d)", -					strerror(err), err); -		goto fail; -	} +	int lm;  	lm = secure ? L2CAP_LM_SECURE : 0; -	if (lm && setsockopt(sk, SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm)) < 0) { -		err = errno; -		error("Failed to set link mode. %s(%d)", -					strerror(err), err); -		goto fail; -	} -	security = secure; - -	if (listen(sk, 1) < 0) { -		err = errno; -		error("Listen failed. %s(%d)", strerror(err), err); -		goto fail; -	} +	security = secure;  	connection = dbus_connection_ref(conn);  	prefix = iface_prefix; -	bnep_io = g_io_channel_unix_new(sk); +	bnep_io = bt_l2cap_listen(BDADDR_ANY, BNEP_PSM, BNEP_MTU, lm, +			connect_event, NULL); +	if (!bnep_io) +		return -1;  	g_io_channel_set_close_on_unref(bnep_io, FALSE); -	g_io_add_watch(bnep_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, -							connect_event, NULL);  	if (bridge_create(BNEP_SVC_GN) < 0)  		error("Can't create GN bridge");  	return 0; -fail: - -	close(sk); -	errno = err; -	return -err;  }  void server_exit() | 
