diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2008-05-15 03:26:35 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2008-05-15 03:26:35 +0000 | 
| commit | c478f8907398cf742b00a4e3043f72efbb7d0801 (patch) | |
| tree | 001e0bfff0ff3527bee00ab6748834908cf16745 | |
| parent | 2a3cf9a57e3e6f4a56d309c794999356ab73439c (diff) | |
Add IO channel for handling netlink messages
| -rw-r--r-- | plugins/netlink.c | 41 | 
1 files changed, 41 insertions, 0 deletions
| diff --git a/plugins/netlink.c b/plugins/netlink.c index 51301bfb..887b51ea 100644 --- a/plugins/netlink.c +++ b/plugins/netlink.c @@ -34,6 +34,8 @@  #include <bluetooth/bluetooth.h> +#include <glib.h> +  #include "plugin.h"  #include "logging.h" @@ -41,6 +43,35 @@ static struct nl_handle *handle;  static struct nl_cache *cache;  static struct genl_family *family; +static GIOChannel *channel; + +static gboolean channel_callback(GIOChannel *chan, +					GIOCondition cond, void *user_data) +{ +	int err; + +	if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) +		return FALSE; + +	debug("Message available on netlink channel"); + +	err = nl_recvmsgs_default(handle); + +	return TRUE; +} + +static int create_channel(int fd) +{ +	channel = g_io_channel_unix_new(fd); +	if (channel == NULL) +		return -ENOMEM; + +	g_io_add_watch(channel, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL, +						channel_callback, NULL); + +	return 0; +} +  static int netlink_init(void)  {  	info("Starting experimental netlink support"); @@ -72,11 +103,21 @@ static int netlink_init(void)  		return -ENOENT;  	} +	if (create_channel(nl_socket_get_fd(handle)) < 0)  { +		error("Failed to create netlink IO channel"); +		genl_family_put(family); +		nl_cache_free(cache); +		nl_handle_destroy(handle); +		return -ENOMEM; +	} +  	return 0;  }  static void netlink_exit(void)  { +	g_io_channel_unref(channel); +  	genl_family_put(family);  	nl_cache_free(cache);  	nl_handle_destroy(handle); | 
