diff options
| -rw-r--r-- | hcid/Makefile.am | 5 | ||||
| -rw-r--r-- | hcid/main.c | 17 | ||||
| -rw-r--r-- | hcid/sdp.c | 114 | ||||
| -rw-r--r-- | hcid/sdp.h | 25 | 
4 files changed, 156 insertions, 5 deletions
| diff --git a/hcid/Makefile.am b/hcid/Makefile.am index 3b01cc6d..d92e8ab9 100644 --- a/hcid/Makefile.am +++ b/hcid/Makefile.am @@ -27,8 +27,9 @@ dbus_hcid_libs    =  dbus_hcid_cflags  =  endif -hcid_SOURCES = main.c security.c device.c storage.c hcid.h lib.c lib.h \ -		parser.h parser.y lexer.l kword.h kword.c $(dbus_hcid_sources) \ +hcid_SOURCES = main.c security.c device.c storage.c hcid.h \ +		sdp.c sdp.h lib.c lib.h kword.c kword.h \ +		parser.h parser.y lexer.l $(dbus_hcid_sources) \  		$(top_builddir)/tools/oui.h $(top_builddir)/tools/oui.c  hcid_LDADD = $(dbus_hcid_libs) @BLUEZ_LIBS@ \ diff --git a/hcid/main.c b/hcid/main.c index 7ea829af..30266ff7 100644 --- a/hcid/main.c +++ b/hcid/main.c @@ -48,6 +48,7 @@  #include "hcid.h"  #include "lib.h" +#include "sdp.h"  struct hcid_opts hcid;  struct device_opts default_device; @@ -537,13 +538,13 @@ extern char *optarg;  int main(int argc, char *argv[], char *env[])  { -	int daemon, dofork, opt, fd; +	int daemon, dofork, sdp, opt, fd;  	struct sockaddr_hci addr;  	struct hci_filter flt;  	struct sigaction sa;  	GIOChannel *ctl_io; -	daemon = 1; dofork = 1; +	daemon = 1; dofork = 1; sdp = 0;  	/* Default HCId settings */  	hcid.config_file = HCID_CONFIG_FILE; @@ -558,12 +559,16 @@ int main(int argc, char *argv[], char *env[])  	init_defaults(); -	while ((opt = getopt(argc, argv, "f:n")) != EOF) { +	while ((opt = getopt(argc, argv, "nsf:")) != EOF) {  		switch (opt) {  		case 'n':  			daemon = 0;  			break; +		case 's': +			sdp = 1; +			break; +  		case 'f':  			hcid.config_file = strdup(optarg);  			break; @@ -669,9 +674,15 @@ int main(int argc, char *argv[], char *env[])  	g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); +	if (sdp) +		start_sdp_server(); +  	/* Start event processor */  	g_main_run(event_loop); +	if (sdp) +		stop_sdp_server(); +  	free_device_opts();  #ifdef ENABLE_DBUS diff --git a/hcid/sdp.c b/hcid/sdp.c new file mode 100644 index 00000000..6d04d971 --- /dev/null +++ b/hcid/sdp.c @@ -0,0 +1,114 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2004-2006  Marcel Holtmann <marcel@holtmann.org> + * + * + *  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <syslog.h> +#include <sys/socket.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/l2cap.h> + +#include "glib-ectomy.h" + +#include "sdp.h" + +static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data) +{ +	int sk; + +	sk = g_io_channel_unix_get_fd(chan); + +	sleep(1); + +	close(sk); + +	return FALSE; +} + +static gboolean connect_event(GIOChannel *chan, GIOCondition cond, gpointer data) +{ +	GIOChannel *io; +	struct sockaddr_l2 addr; +	socklen_t len; +	int sk, nsk; + +	syslog(LOG_INFO, "Incoming SDP connection"); + +	sk = g_io_channel_unix_get_fd(chan); + +	len = sizeof(addr); + +	nsk = accept(sk, (struct sockaddr *) &addr, &len); + +	io = g_io_channel_unix_new(nsk); + +	g_io_add_watch(io, G_IO_IN, session_event, NULL); + +	return TRUE; +} + +int start_sdp_server(void) +{ +	GIOChannel *io; +	struct sockaddr_l2 addr; +	int sk; + +	syslog(LOG_INFO, "Starting SDP server"); + +	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); +	if (sk < 0) { +		syslog(LOG_ERR, "Can't open L2CAP socket: %s (%d)", +						strerror(errno), errno); +		return -errno; +	} + +	memset(&addr, 0, sizeof(addr)); +	addr.l2_family = AF_BLUETOOTH; +	bacpy(&addr.l2_bdaddr, BDADDR_ANY); +	addr.l2_psm = htobs(1); + +	if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { +		syslog(LOG_ERR, "Can't bind L2CAP socket: %s (%d)", +						strerror(errno), errno); +		return -errno; +	} + +	listen(sk, 5); + +	io = g_io_channel_unix_new(sk); + +	g_io_add_watch(io, G_IO_IN, connect_event, NULL); + +	return 0; +} + +void stop_sdp_server(void) +{ +	syslog(LOG_INFO, "Stopping SDP server"); +} diff --git a/hcid/sdp.h b/hcid/sdp.h new file mode 100644 index 00000000..08df8447 --- /dev/null +++ b/hcid/sdp.h @@ -0,0 +1,25 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2004-2006  Marcel Holtmann <marcel@holtmann.org> + * + * + *  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +int start_sdp_server(void); +void stop_sdp_server(void); | 
