[PATCH 5/8] Initializing hciops plugin. Adding IO event handing.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Alok Barsode <alok.barsode@xxxxxxxxxx>

---
 plugins/hciops.c |  134 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/main.c       |  122 +------------------------------------------------
 2 files changed, 134 insertions(+), 122 deletions(-)

diff --git a/plugins/hciops.c b/plugins/hciops.c
index 4f56443..32f82d0 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -24,17 +24,149 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
 
+#include <glib.h>
+
+#include "hcid.h"
 #include "plugin.h"
 #include "logging.h"
 
-static int hciops_init(void)
+
+static int init_all_devices(int ctl)
 {
+	struct hci_dev_list_req *dl;
+	struct hci_dev_req *dr;
+	int i;
+
+	dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t));
+	if (!dl) {
+		info("Can't allocate devlist buffer: %s (%d)",
+							strerror(errno), errno);
+		return errno;
+	}
+
+	dl->dev_num = HCI_MAX_DEV;
+	dr = dl->dev_req;
+
+	if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) {
+		info("Can't get device list: %s (%d)",
+							strerror(errno), errno);
+		return errno;
+	}
+
+	for (i = 0; i < dl->dev_num; i++, dr++) {
+		gboolean devup;
+
+		device_event(HCI_DEV_REG, dr->dev_id);
+
+		devup = hci_test_bit(HCI_UP, &dr->dev_opt);
+		if (devup)
+			device_event(HCI_DEV_UP, dr->dev_id);
+	}
+
+	g_free(dl);
 	return 0;
 }
 
+static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond,
+								gpointer data)
+{
+	unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr;
+	evt_stack_internal *si;
+	evt_si_device *sd;
+	hci_event_hdr *eh;
+	int type;
+	size_t len;
+	GIOError err;
+
+	ptr = buf;
+
+	err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len);
+	if (err) {
+		if (err == G_IO_ERROR_AGAIN)
+			return TRUE;
+
+		error("Read from control socket failed: %s (%d)",
+							strerror(errno), errno);
+		return FALSE;
+	}
+
+	type = *ptr++;
+
+	if (type != HCI_EVENT_PKT)
+		return TRUE;
+
+	eh = (hci_event_hdr *) ptr;
+	if (eh->evt != EVT_STACK_INTERNAL)
+		return TRUE;
+
+	ptr += HCI_EVENT_HDR_SIZE;
+
+	si = (evt_stack_internal *) ptr;
+	switch (si->type) {
+	case EVT_SI_DEVICE:
+		sd = (void *) &si->data;
+		device_event(sd->event, sd->dev_id);
+		break;
+	}
+
+	return TRUE;
+}
+
+static int hciops_init(void)
+{
+	struct sockaddr_hci addr;
+	struct hci_filter flt;
+	GIOChannel *ctl_io;
+	int sock;
+
+	/* Create and bind HCI socket */
+	sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+	if (sock < 0) {
+		error("Can't open HCI socket: %s (%d)", strerror(errno),
+								errno);
+		return errno;
+	}
+
+	/* Set filter */
+	hci_filter_clear(&flt);
+	hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
+	hci_filter_set_event(EVT_STACK_INTERNAL, &flt);
+	if (setsockopt(sock, SOL_HCI, HCI_FILTER, &flt,
+							sizeof(flt)) < 0) {
+		error("Can't set filter: %s (%d)", strerror(errno), errno);
+		return errno;
+	}
+
+	memset(&addr, 0, sizeof(addr));
+	addr.hci_family = AF_BLUETOOTH;
+	addr.hci_dev = HCI_DEV_NONE;
+	if (bind(sock, (struct sockaddr *) &addr,
+							sizeof(addr)) < 0) {
+		error("Can't bind HCI socket: %s (%d)",
+							strerror(errno), errno);
+		return errno;
+	}
+
+	ctl_io = g_io_channel_unix_new(sock);
+	g_io_channel_set_close_on_unref(ctl_io, TRUE);
+
+	g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL);
+
+	g_io_channel_unref(ctl_io);
+
+	/* Initialize already connected devices */
+	return init_all_devices(sock);
+}
+
 static void hciops_exit(void)
 {
 }
diff --git a/src/main.c b/src/main.c
index 93dbf71..309d4bb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -506,41 +506,6 @@ static void device_devup_setup(int dev_id)
 		stop_security_manager(dev_id);
 }
 
-static void init_all_devices(int ctl)
-{
-	struct hci_dev_list_req *dl;
-	struct hci_dev_req *dr;
-	int i;
-
-	dl = g_try_malloc0(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t));
-	if (!dl) {
-		info("Can't allocate devlist buffer: %s (%d)",
-							strerror(errno), errno);
-		exit(1);
-	}
-
-	dl->dev_num = HCI_MAX_DEV;
-	dr = dl->dev_req;
-
-	if (ioctl(ctl, HCIGETDEVLIST, (void *) dl) < 0) {
-		info("Can't get device list: %s (%d)",
-							strerror(errno), errno);
-		exit(1);
-	}
-
-	for (i = 0; i < dl->dev_num; i++, dr++) {
-		gboolean devup;
-
-		device_event(HCI_DEV_REG, dr->dev_id);
-
-		devup = hci_test_bit(HCI_UP, &dr->dev_opt);
-		if (devup)
-			device_event(HCI_DEV_UP, dr->dev_id);
-	}
-
-	g_free(dl);
-}
-
 static void init_defaults(void)
 {
 	/* Default HCId settings */
@@ -582,51 +547,6 @@ void device_event(int event, int dev_id)
 	}
 }
 
-static gboolean io_stack_event(GIOChannel *chan, GIOCondition cond,
-								gpointer data)
-{
-	unsigned char buf[HCI_MAX_FRAME_SIZE], *ptr;
-	evt_stack_internal *si;
-	evt_si_device *sd;
-	hci_event_hdr *eh;
-	int type;
-	size_t len;
-	GIOError err;
-
-	ptr = buf;
-
-	err = g_io_channel_read(chan, (gchar *) buf, sizeof(buf), &len);
-	if (err) {
-		if (err == G_IO_ERROR_AGAIN)
-			return TRUE;
-
-		error("Read from control socket failed: %s (%d)",
-							strerror(errno), errno);
-		return FALSE;
-	}
-
-	type = *ptr++;
-
-	if (type != HCI_EVENT_PKT)
-		return TRUE;
-
-	eh = (hci_event_hdr *) ptr;
-	if (eh->evt != EVT_STACK_INTERNAL)
-		return TRUE;
-
-	ptr += HCI_EVENT_HDR_SIZE;
-
-	si = (evt_stack_internal *) ptr;
-	switch (si->type) {
-	case EVT_SI_DEVICE:
-		sd = (void *) &si->data;
-		device_event(sd->event, sd->dev_id);
-		break;
-	}
-
-	return TRUE;
-}
-
 static GMainLoop *event_loop;
 
 static void sig_term(int sig)
@@ -655,10 +575,8 @@ int main(int argc, char *argv[])
 {
 	GOptionContext *context;
 	GError *err = NULL;
-	struct sockaddr_hci addr;
-	struct hci_filter flt;
 	struct sigaction sa;
-	GIOChannel *ctl_io, *child_io;
+	GIOChannel *child_io;
 	uint16_t mtu = 0;
 	GKeyFile *config;
 
@@ -706,34 +624,6 @@ int main(int argc, char *argv[])
 		enable_debug();
 	}
 
-	/* Create and bind HCI socket */
-	main_opts.sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
-	if (main_opts.sock < 0) {
-		error("Can't open HCI socket: %s (%d)", strerror(errno),
-								errno);
-		exit(1);
-	}
-
-	/* Set filter */
-	hci_filter_clear(&flt);
-	hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
-	hci_filter_set_event(EVT_STACK_INTERNAL, &flt);
-	if (setsockopt(main_opts.sock, SOL_HCI, HCI_FILTER, &flt,
-							sizeof(flt)) < 0) {
-		error("Can't set filter: %s (%d)", strerror(errno), errno);
-		exit(1);
-	}
-
-	memset(&addr, 0, sizeof(addr));
-	addr.hci_family = AF_BLUETOOTH;
-	addr.hci_dev = HCI_DEV_NONE;
-	if (bind(main_opts.sock, (struct sockaddr *) &addr,
-							sizeof(addr)) < 0) {
-		error("Can't bind HCI socket: %s (%d)",
-							strerror(errno), errno);
-		exit(1);
-	}
-
 	config = load_config(CONFIGDIR "/main.conf");
 
 	parse_config(config);
@@ -768,16 +658,6 @@ int main(int argc, char *argv[])
 
 	event_loop = g_main_loop_new(NULL, FALSE);
 
-	ctl_io = g_io_channel_unix_new(main_opts.sock);
-	g_io_channel_set_close_on_unref(ctl_io, TRUE);
-
-	g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL);
-
-	g_io_channel_unref(ctl_io);
-
-	/* Initialize already connected devices */
-	init_all_devices(main_opts.sock);
-
 	starting = FALSE;
 
 	manager_startup_complete();
-- 
1.5.6.3

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux