diff options
-rw-r--r-- | input/Makefile.am | 3 | ||||
-rw-r--r-- | input/main.c | 6 | ||||
-rw-r--r-- | input/server.c | 134 | ||||
-rw-r--r-- | input/server.h | 25 |
4 files changed, 166 insertions, 2 deletions
diff --git a/input/Makefile.am b/input/Makefile.am index 72f95dca..7716bec6 100644 --- a/input/Makefile.am +++ b/input/Makefile.am @@ -4,7 +4,8 @@ servicedir = $(libdir)/bluetooth noinst_PROGRAMS = bluetoothd-service-input bluetoothd_service_input_SOURCES = \ - main.c input-service.h input-service.c + main.c server.h server.c \ + input-service.h input-service.c LDADD = $(top_builddir)/common/libhelper.a \ @GLIB_LIBS@ @DBUS_LIBS@ @BLUEZ_LIBS@ diff --git a/input/main.c b/input/main.c index bc7eb8e7..82e3b1b6 100644 --- a/input/main.c +++ b/input/main.c @@ -2,7 +2,7 @@ * * BlueZ - Bluetooth protocol stack for Linux * - * Copyright (C) 2005-2006 Marcel Holtmann <marcel@holtmann.org> + * Copyright (C) 2004-2007 Marcel Holtmann <marcel@holtmann.org> * * * This program is free software; you can redistribute it and/or modify @@ -75,8 +75,12 @@ int main(int argc, char *argv[]) exit(1); } + server_start(); + g_main_loop_run(main_loop); + server_stop(); + input_dbus_exit(); g_main_loop_unref(main_loop); diff --git a/input/server.c b/input/server.c new file mode 100644 index 00000000..0725d0de --- /dev/null +++ b/input/server.c @@ -0,0 +1,134 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2007 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 <unistd.h> +#include <sys/socket.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/l2cap.h> + +#include <glib.h> + +#include "logging.h" +#include "server.h" + +static gboolean session_event(GIOChannel *chan, GIOCondition cond, gpointer data) +{ + if (cond & (G_IO_HUP | G_IO_ERR)) + return FALSE; + + debug("Incoming data session"); + + return FALSE; +} + +static gboolean connect_event(GIOChannel *chan, GIOCondition cond, gpointer data) +{ + GIOChannel *io; + struct sockaddr_l2 addr; + socklen_t optlen; + int sk, nsk; + + sk = g_io_channel_unix_get_fd(chan); + + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + nsk = accept(sk, (struct sockaddr *) &addr, &optlen); + if (nsk < 0) + return TRUE; + + io = g_io_channel_unix_new(nsk); + g_io_channel_set_close_on_unref(io, TRUE); + + g_io_add_watch(io, G_IO_IN | G_IO_HUP | G_IO_ERR, + session_event, NULL); + + g_io_channel_unref(io); + + return TRUE; +} + +static GIOChannel *setup_l2cap(unsigned int psm) +{ + GIOChannel *io; + struct sockaddr_l2 addr; + int sk; + + sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); + if (sk < 0) + return NULL; + + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + bacpy(&addr.l2_bdaddr, BDADDR_ANY); + addr.l2_psm = htobs(psm); + + if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + close(sk); + return NULL; + } + + if (listen(sk, 10) < 0) { + close(sk); + return NULL; + } + + io = g_io_channel_unix_new(sk); + g_io_channel_set_close_on_unref(io, TRUE); + + g_io_add_watch(io, G_IO_IN, connect_event, NULL); + + return io; +} + +static GIOChannel *ctrl_io = NULL; +static GIOChannel *intr_io = NULL; + +int server_start(void) +{ + ctrl_io = setup_l2cap(17); + if (!ctrl_io) + return -1; + + intr_io = setup_l2cap(19); + if (!intr_io) { + g_io_channel_unref(ctrl_io); + ctrl_io = NULL; + } + + return 0; +} + +void server_stop(void) +{ + if (intr_io) + g_io_channel_unref(intr_io); + + if (ctrl_io) + g_io_channel_unref(ctrl_io); +} diff --git a/input/server.h b/input/server.h new file mode 100644 index 00000000..f0237d4f --- /dev/null +++ b/input/server.h @@ -0,0 +1,25 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2007 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 server_start(void); +void server_stop(void); |