summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/Makefile.am5
-rw-r--r--hcid/main.c17
-rw-r--r--hcid/sdp.c114
-rw-r--r--hcid/sdp.h25
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);