All of lore.kernel.org
 help / color / mirror / Atom feed
From: Claudio Takahasi <cktakahasi@gmail.com>
To: bluez-devel@lists.sourceforge.net
Subject: Re: [Bluez-devel] DBUS service support - Initial library
Date: Fri, 20 May 2005 18:04:41 -0300	[thread overview]
Message-ID: <e1effdeb0505201404d05e818@mail.gmail.com> (raw)
In-Reply-To: <Pine.LNX.4.33.0505121821020.3523-100000@redbean.intranet.gw-instruments.de>

[-- Attachment #1: Type: text/plain, Size: 3074 bytes --]

Hi Marcel,

I am sending a initial skeleton of pand DBUS support. I was not able to
access BlueZ CVS due firewall permissions.

The path is based on bluez-utils-2.17.

The Makefile.am file was changed. Run aclocal, automake and autoconf tools.

The BLUEZ DBUS PAN service uses the system bus. Check the following
items before run the sample client:
1. checking dbus-daemon
   type: $ps -ef | grep dbus
   "dbus-daemon --system"  should be displayed
   If not, install dbus-1 package

2. check dbus service configuration file
   The file bluez.conf must be located at: /etc/dbus-1/system.d/
   See Appendix 1 of DBUS.TXT file located in pand directory
  After copy bluez.conf file I suggest restart dbus-daemon

3. running the bluez pan daemon (requires root permission)
   type $pand --dbus or pand -b --nodetach
   check if the pand process is running: $ps -ef | grep pand
   if not, read the system log: $tail /var/log/syslog

4. extract the client  (doesn't require root permission)
   The client calls basic functions. This is a usage sample
   for gamming, UPnP, ... A library can be developed to
   hide D-Bus functions.

Suggestions and comments are welcome!

Regarding dbus-0.33 support, I decided implement using a compatible
version(0.23). When a stable version become available we can think
on move to the new version.

Claudio.



On 5/12/05, Peter Wippich <pewi@gw-instruments.de> wrote:
> 
> Thank you Marcel !
> 
> Ciao,
> 
> Peter
> 
> On Thu, 12 May 2005, Marcel Holtmann wrote:
> 
> > Hi Peter,
> >
> > > sorry for asking a possible dump question, but:
> > > can anybody point me to a source what this D-BUS stuff is ???
> >
> > look at http://www.freedesktop.org/Software/dbus
> >
> > Regards
> >
> > Marcel
> >
> >
> >
> >
> > -------------------------------------------------------
> > This SF.Net email is sponsored by Oracle Space Sweepstakes
> > Want to be the first software developer in space?
> > Enter now for the Oracle Space Sweepstakes!
> > http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click
> > _______________________________________________
> > Bluez-devel mailing list
> > Bluez-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/bluez-devel
> >
> 
> |       Peter Wippich                   Voice: +49 30 46776411          |
> |       G&W Instruments GmbH            fax:   +49 30 46776419          |
> |       Gustav-Meyer-Allee 25, Geb. 12  Email: pewi@gw-instruments.de   |
> |       D-13355 Berlin  / Germany                                       |
> 
> 
> 
> 
> -------------------------------------------------------
> This SF.Net email is sponsored by Oracle Space Sweepstakes
> Want to be the first software developer in space?
> Enter now for the Oracle Space Sweepstakes!
> http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click
> _______________________________________________
> Bluez-devel mailing list
> Bluez-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/bluez-devel
>

[-- Attachment #2: pand_dbus_client.tar.gz --]
[-- Type: application/x-gzip, Size: 79879 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: bluez-2.17-dbus.diff --]
[-- Type: text/x-patch; name="bluez-2.17-dbus.diff", Size: 52865 bytes --]

diff -urNaw bluez-utils-2.17.orig/pand/dbus_services.h bluez-utils-2.17-dbus/pand/dbus_services.h
--- bluez-utils-2.17.orig/pand/dbus_services.h	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/dbus_services.h	2005-05-20 16:39:06.407796864 -0300
@@ -0,0 +1,206 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus_services.h,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+#ifndef __H_PAND_DBUS_SERVICES_H__ 
+#define __H_PAND_DBUS_SERVICES_H__
+
+#include <stdlib.h>
+#include <stdint.h>
+
+#define ORG_BLUEZ_DBUS_NAME "org.bluez"
+
+#define ORG_BLUEZ_PAND_DBUS_IFACE "org.bluez.pandIface"
+#define ORG_BLUEZ_HCI_DBUS_IFACE  "org.bluez.hciIface"
+
+#define ORG_BLUEZ_PAND_OBJ "/org/bluez/pand"
+#define ORG_BLUEZ_HCI_OBJ  "/org/bluez/hci"
+
+
+// See pand_dbus_conn_req_t, used by actions attribute
+#define PAND_CREATE_BRIDGE_MASK   0x01
+#define PAND_LLA_MASK             0x02
+
+
+// status of request operations
+#define PAND_RESULT_SUCCESS      0x00
+#define PAND_RESULT_FAILED       0x01
+
+// see pand_dev_info_t
+#define PAND_DEV_STATE_READY           0x01
+#define PAND_DEV_STATE_CONNECTED       0x02
+
+
+typedef enum __attribute__((packed))
+{
+	PAND_DBUS_INVALID_TYPE,
+	PAND_DBUS_CHANGE_ROLE_REQ_TYPE,
+	PAND_DBUS_CHANGE_ROLE_REQ_CNF_TYPE,
+	PAND_DBUS_CONN_REQ_TYPE,
+	PAND_DBUS_CONN_REQ_CNF_TYPE,
+	PAND_DBUS_DISCONN_REQ_TYPE,
+	PAND_DBUS_DISCONN_REQ_CNF_TYPE,
+	PAND_DBUS_DISCONN_ALL_REQ_TYPE,
+	PAND_DBUS_DISCONN_ALL_REQ_CNF_TYPE,
+	PAND_DBUS_GET_ACTIVE_CONN_REQ_TYPE,
+	PAND_DBUS_GET_ACTIVE_CONN_REQ_CNF_TYPE,
+	PAND_DBUS_SEARCH_REQ_TYPE,   /* request search for a PAN service */
+	PAND_DBUS_SEARCH_REQ_CNF_TYPE,
+	PAND_DBUS_GET_DEV_INFO_REQ_TYPE,  /* request local bluetooth devices */
+	PAND_DBUS_GET_DEV_INFO_CNF_TYPE,
+	PAND_DBUS_LISTEN_REQ_TYPE,
+	PAND_DBUS_LISTEN_REQ_CNF_TYPE,
+	PAND_DBUS_LISTEN_STOP_REQ_TYPE,
+	PAND_DBUS_LISTEN_STOP_REQ_CNF_TYPE
+}PAND_MESSAGE_TYPE;
+
+
+typedef enum __attribute__((packed))
+{
+	DISABLE_BRIDGE,
+	ENABLE_BRIDGE
+}BRIDGE_MODE;
+
+typedef enum __attribute__((packed))
+{
+	PAND_STATUS_BUSY,
+	PAND_STATUS_CONNECTED,
+	PAND_STATUS_LISTENNING,
+	PAND_STATUS_IDLE
+}PAND_DBUS_STATUS;
+
+
+typedef struct __attribute__((packed))
+{
+	PAND_MESSAGE_TYPE   type;
+	void     *data;
+}pand_dbus_message_format_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t dev_id; /* for address more than one device */
+	uint16_t role;
+	uint16_t service;
+	char     actions;
+	char     bdaddr[18];
+}pand_dbus_conn_req_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t dev_id; /* for address more than one device */
+	char     bdaddr[18];
+}pand_dbus_disconn_req_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t dev_id; /* for address more than one device */
+}pand_dbus_disconn_all_req_t,pand_dbus_get_active_conn_req_t;
+
+/* Generic confirmation result */
+typedef struct __attribute__((packed))
+{
+	PAND_MESSAGE_TYPE     type;
+	char     	      result;
+	char                  data[0];
+}pand_dbus_req_cnf_t;
+
+
+typedef struct __attribute__((packed))
+{
+	uint16_t	dev_id; /* for address more than one device */
+	uint16_t	role;
+	BRIDGE_MODE     bridge_mode;
+	char		master;
+	char		secure;
+	char		encrypt;
+	char		ipv4[16];
+	char		ipv4subnet[16]; 
+}pand_dbus_listen_req_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t	dev_id; /* for address more than one device */
+}pand_dbus_listen_stop_req_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t	dev_id; /* for address more than one device */
+	uint16_t	role;   /* new role*/
+	char     	bdaddr[18];
+}pand_dbus_change_role_req_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t dev_id; /* for address more than one device */
+	uint16_t service;
+}pand_dbus_search_req_t;
+
+typedef struct __attribute__((packed))
+{
+	char status; /* 0-success 1-failed */
+	char *ip; /* ip address if lla was requested */
+}pand_dbus_conn_req_cnf_t;
+
+typedef struct __attribute__((packed))
+{
+	char status;
+	/* device list ???*/	
+}pand_dbus_search_cnf_t;
+
+typedef struct __attribute__((packed))
+{
+	uint16_t dev_id;
+	char     name[8];
+	char     bdaddr[18];
+	uint16_t state; /* see PAND_DEV_STATE_XXXX    TODO  */
+}pand_dev_info_t;
+
+/* Addressing more than one bluetooth device */
+typedef struct __attribute__((packed))
+{
+	//TODO add support for more than one device
+	char num_dev;
+	pand_dev_info_t devices[0];
+}pand_dbus_get_dev_cnf_t;
+
+typedef struct __attribute__((packed))
+{
+	char bdaddr[18];
+	char link_type;
+	char handle;
+	char state;
+	char master;
+}pand_active_conn_t;
+typedef struct __attribute__((packed))
+{
+	//TODO add support for more than one device
+	char num_conn;
+	pand_active_conn_t conn[0];
+}pand_dbus_get_active_conn_cnf_t;
+
+
+#endif /* __H_PAND_DBUS_SERVICES_H__*/
diff -urNaw bluez-utils-2.17.orig/pand/DBUS.TXT bluez-utils-2.17-dbus/pand/DBUS.TXT
--- bluez-utils-2.17.orig/pand/DBUS.TXT	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/DBUS.TXT	2005-05-20 11:48:59.000000000 -0300
@@ -0,0 +1,65 @@
+
+HOWTO setup DBUS environment
+
+The BLUEZ DBUS PAN service uses the system bus. In order
+to run the 
+
+1. checking dbus-daemon
+   type: $ps -ef | grep dbus
+   "dbus-daemon --system"  should be displayed
+   
+2. check dbus service configuration file
+   The file bluez.conf must be located at: /etc/dbus-1/system.d/
+   See Appendix 1.
+   
+
+3. running the bluez pan daemon (requires root permission)
+   type $pand --dbus or pand -b
+   check if the pand process is running: $ps -ef | grep pand
+   if not, read the system log: $tail /var/log/syslog
+   
+4. calling bluez dbus service(user mode app)
+   See call examples in the file:xxxx   
+   Now, any user mode app(games, UPnP, ...) is able to control
+   Bluetooth connections.
+
+****** Appendix 1:   
+   
+   
+<!-- This configuration file specifies the required security policies
+     for bluez-pand to work. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+  <!-- ../system.conf have denied everything, so we just punch some holes -->
+
+  <policy context="default">
+    <allow own="org.bluez"/>
+
+    <allow send_destination="org.bluez.pand"/>
+    <allow receive_sender="org.bluez.pand"/>
+
+    <allow send_path="/org/bluez/pand"/>
+  </policy>
+
+</busconfig>
+
+****** Appendix 2:
+
+Advantages:
+
+ * user mode app are able to control BT connections
+ * security: the configuration file can be used to specify permissions
+ 
+Disadvantages:
+ * D-BUS is not stable
+ * programming using D-BUS is not trivial 
+   
+****** TODO
+ -add search service
+ -add bridge control
+ - Notify D-BUS connected client regarding incomming conn
+ -add bt device functions: see hcitoool
+ -add local link address support: zeroconf
diff -urNaw bluez-utils-2.17.orig/pand/main.c bluez-utils-2.17-dbus/pand/main.c
--- bluez-utils-2.17.orig/pand/main.c	2005-05-09 15:33:24.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/main.c	2005-05-18 19:08:33.000000000 -0300
@@ -54,6 +54,10 @@
 
 #include "pand.h"
 
+#ifdef ENABLE_DBUS
+#include "pand_dbus.h"
+#endif
+
 static uint16_t role = BNEP_SVC_PANU;	/* Local role (ie service) */
 static uint16_t service = BNEP_SVC_NAP;	/* Remote service */
 
@@ -88,7 +92,10 @@
 	SHOW,
 	LISTEN,
 	CONNECT,
-	KILL
+	KILL,
+#ifdef ENABLE_DBUS
+	DBUS,
+#endif
 } modes;
 
 static void run_devup(char *dev, char *dst, int sk, int nsk)
@@ -417,6 +424,9 @@
 void sig_term(int sig)
 {
 	terminate = 1;
+#ifdef ENABLE_DBUS
+	pand_dbus_stop();
+#endif
 }
 
 int write_pidfile(void)
@@ -488,6 +498,9 @@
 	{ "help",     0, 0, 'h' },
 	{ "listen",   0, 0, 's' },
 	{ "connect",  1, 0, 'c' },
+#ifdef ENABLE_DBUS
+	{ "dbus",     0, 0, 'b' },
+#endif
 	{ "search",   2, 0, 'Q' },
 	{ "kill",     1, 0, 'k' },
 	{ "killall",  0, 0, 'K' },
@@ -510,7 +523,7 @@
 	{ 0, 0, 0, 0 }
 };
 
-static char main_sopts[] = "hsc:k:Kr:e:i:lnp::DQ::AESMC::P:z";
+static char main_sopts[] = "hsc:bk:Kr:e:i:lnp::DQ::AESMC::P:z";
 
 static char main_help[] = 
 	"Bluetooth PAN daemon version " VERSION " \n"
@@ -520,6 +533,9 @@
 	"\t--show --list -l          Show active PAN connections\n"
 	"\t--listen -s               Listen for PAN connections\n"
 	"\t--connect -c <bdaddr>     Create PAN connection\n"
+#ifdef ENABLE_DBUS
+	"\t--dbus    -b              Enable dbus service\n"
+#endif
 	"\t--autozap -z              Disconnect automatically on exit\n"
 	"\t--search -Q[duration]     Search and connect\n"
 	"\t--kill -k <bdaddr>        Kill PAN connection\n"
@@ -560,7 +576,11 @@
 			mode = CONNECT;
 			dst  = strdup(optarg);
 			break;
-
+#ifdef ENABLE_DBUS
+		case 'b':
+			mode = DBUS;
+			break;
+#endif
 		case 'Q':
 			mode = CONNECT;
 			if (optarg)
@@ -729,8 +749,12 @@
 	case LISTEN:
 		do_listen();
 		break;
+#ifdef ENABLE_DBUS
+	case DBUS:
+		pand_dbus_start();
+		break;
+#endif
 	}
-
 	if (pidfile)
 		unlink(pidfile);
 
diff -urNaw bluez-utils-2.17.orig/pand/Makefile.am bluez-utils-2.17-dbus/pand/Makefile.am
--- bluez-utils-2.17.orig/pand/Makefile.am	2005-05-09 15:33:24.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/Makefile.am	2005-05-18 19:00:45.000000000 -0300
@@ -2,12 +2,31 @@
 #  $Id: Makefile.am,v 1.5 2005/04/21 21:34:10 holtmann Exp $
 #
 
+if DBUS
+    pand_dbus_inc_hdr = dbus_services.h
+    pand_dbus_sources = pand_dbus.c pand_dbus_util.c pand_dbus_commands.c
+    pand_dbus_libs    = @DBUS_LIBS@ -ldbus-glib-1 -lbridge -lpthread
+    pand_dbus_cflags  = -DENABLE_DBUS -DDBUS_API_SUBJECT_TO_CHANGE
+    pand_dbus_inc     = -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/local/include
+else
+    pand_dbus_inc_hdr =
+    pand_dbus_sources =
+    pand_dbus_libs    =
+    pand_dbus_cflags  =
+    pand_dbus_inc     =
+endif
+
+
+
 bin_PROGRAMS = pand
 
-pand_SOURCES = main.c pand.h bnep.c sdp.c
-pand_LDADD = @BLUEZ_LIBS@
+pand_SOURCES = main.c pand.h bnep.c sdp.c $(pand_dbus_sources)
+pand_LDADD = @BLUEZ_LIBS@ $(pand_dbus_libs)
+INCLUDES = $(pand_dbus_inc)
+includedir = @includedir@/bluetooth
+include_HEADERS = $(pand_dbus_inc_hdr)
 
-AM_CFLAGS = @BLUEZ_CFLAGS@
+AM_CFLAGS = @BLUEZ_CFLAGS@ $(pand_dbus_cflags)
 
 man_MANS = pand.1
 

diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus.c bluez-utils-2.17-dbus/pand/pand_dbus.c
--- bluez-utils-2.17.orig/pand/pand_dbus.c	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus.c	2005-05-20 16:43:53.590138512 -0300
@@ -0,0 +1,721 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus.c,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+
+
+#include <string.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+
+
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <dbus/dbus-protocol.h>
+#include <glib.h>
+
+#include <sys/syslog.h>
+#include <sys/socket.h>
+#include <sys/poll.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+#include <bluetooth/l2cap.h>
+#include <bluetooth/bnep.h>
+
+
+
+#include "pand_dbus.h"
+#include "dbus_services.h"
+#include "pand_dbus_util.h"
+#include "pand_dbus_commands.h"
+
+
+
+static void pand_dbus_unregistered_func (DBusConnection *dbus_conn, 
+		gpointer user_data);
+
+static DBusHandlerResult pand_dbus_msg_func (DBusConnection *dbus_conn, 
+		DBusMessage *msg, gpointer user_data);
+
+static DBusObjectPathVTable pand_vtable = {
+	pand_dbus_unregistered_func,
+        pand_dbus_msg_func,
+	NULL,
+	NULL,
+	NULL,
+	NULL
+};
+
+
+typedef DBusHandlerResult (*pand_services_handler)(DBusConnection *, DBusMessage *, void *);
+
+
+static DBusHandlerResult handle_change_role_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_connect_req(DBusConnection *dbus_conn, DBusMessage *msg, void* data);
+static DBusHandlerResult handle_disconnect_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_disconnect_all_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_get_active_conn_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_get_devices_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_listen_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_listen_stop_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+static DBusHandlerResult handle_search_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data);
+
+
+typedef struct 
+{
+	char *name;
+	pand_services_handler  handle_func;
+}pand_services_data_t;
+
+
+static pand_services_data_t pand_services[] = {
+    {"ChangeRoleReq", handle_change_role_req      },
+    {"ConnectReq", handle_connect_req      },
+    {"DisconnectReq", handle_disconnect_req},
+    {"DisconnectAllReq", handle_disconnect_all_req},
+    {"GetActiveConnectionsReq", handle_get_active_conn_req},
+    {"GetDevicesReq", handle_get_devices_req},
+    {"ListenReq", handle_listen_req},
+    {"ListenStopReq", handle_listen_stop_req},
+    {"SearchReq", handle_search_req},
+    {NULL, NULL}
+};
+
+static DBusConnection *dbus_conn;
+static GMainLoop *main_loop = NULL ;
+
+/**
+ *  Initialize D-BUS connection
+ *  @param  
+ *  @return
+ */
+int 
+pand_dbus_start()
+{
+	
+	DBusError dbus_error;
+	//TODO pthread_t  thread_id;
+	int result = 0;
+
+	/* TODO check for other pand instance running
+	 * Only one instance is allowed!
+	 */
+			   
+	
+	dbus_error_init(&dbus_error);
+	dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error);
+
+        if (!dbus_conn) {
+                syslog(LOG_ERR, "Failed to open connection to system message bus: %s\n",
+                                                        dbus_error.message);
+                dbus_error_free(&dbus_error);
+                return -1;
+        }
+#ifdef DBUS_033
+	if(!dbus_bus_request_name(dbus_conn, ORG_BLUEZ_DBUS_NAME, 0, &dbus_error)) {
+#else	
+	if(!dbus_bus_acquire_service(dbus_conn, ORG_BLUEZ_DBUS_NAME, 0, &dbus_error)) {
+#endif
+		syslog(LOG_ERR,"DBUS acquire service error: %s\n", dbus_error.message);
+		dbus_error_free (&dbus_error);
+		result = -1;
+		goto skip_label;
+	}
+	
+	if (!dbus_connection_register_object_path (dbus_conn, ORG_BLUEZ_PAND_OBJ,
+	     &pand_vtable, NULL)) {
+		     syslog(LOG_ERR,"DBUS failed to register org/bluez/pand object\n");
+		     result = -1;
+		     goto skip_label;
+	}
+
+	main_loop = g_main_loop_new (NULL, FALSE);
+	
+	dbus_connection_setup_with_g_main (dbus_conn, NULL) ;
+	
+	g_main_loop_run (main_loop) ;
+	
+
+skip_label:
+        return result;
+}
+
+/**
+ *  Close D-BUS connection and the main loop
+ *  @param  
+ *  @return
+ */
+int 
+pand_dbus_stop()
+{
+	if(main_loop){
+		g_main_loop_quit(main_loop);
+	}
+	if (dbus_conn) {
+		dbus_connection_disconnect(dbus_conn);
+		dbus_conn = NULL;
+	}
+	return 0;
+}
+
+
+/**
+ *  TODO method not implemented
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_change_role_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_change_role_req_t  req;
+	pand_dbus_req_cnf_t      cnf_result;
+	int ret_val = 0, size;
+	
+	syslog(LOG_INFO, "%s line:%d - method not implemented", __PRETTY_FUNCTION__, __LINE__);
+	
+	memset(&req, 0, sizeof(pand_dbus_change_role_req_t));
+	
+	cnf_result.type = PAND_DBUS_CHANGE_ROLE_REQ_CNF_TYPE;
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_CHANGE_ROLE_REQ_TYPE, sizeof(pand_dbus_change_role_req_t),&req)){
+		
+		//TODO check current daemon status
+		//ret_val = cmd_change_role(&req);	
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);
+	} else {
+		cnf_result.result = PAND_RESULT_FAILED;
+	}	
+		
+		
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+		
+
+	//TODO check iter results
+		
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+			__PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+		
+skip_label:	
+		return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_connect_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	int ret_val, size;
+	pand_dbus_conn_req_t    req;
+	pand_dbus_req_cnf_t	cnf_result;
+	
+	memset(&req, 0, sizeof(pand_dbus_conn_req_t));
+	
+	cnf_result.type = PAND_DBUS_CONN_REQ_CNF_TYPE;
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_CONN_REQ_TYPE, sizeof(pand_dbus_conn_req_t), &req)){
+		
+		//TODO check the current daemon status
+		//check role, if is connected. scatternet are not allowed
+		ret_val = cmd_connect(req.bdaddr, req.role, req.service);
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);
+	} else {
+		cnf_result.result = PAND_RESULT_FAILED;
+		
+	}	  
+				
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+			__PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+		
+skip_label:
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_disconnect_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_disconn_req_t  req;
+	pand_dbus_req_cnf_t      cnf_result;
+	int ret_val, size;
+	
+	memset(&req, 0, sizeof(pand_dbus_disconn_req_t));
+
+	cnf_result.type = PAND_DBUS_DISCONN_REQ_CNF_TYPE;
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_DISCONN_REQ_TYPE, sizeof(pand_dbus_disconn_req_t),&req)){
+		
+		//TODO check current daemon status
+		ret_val = cmd_disconnect(&req);	
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);
+		
+	} else {
+		cnf_result.result = PAND_RESULT_FAILED;
+	}
+	
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+		
+
+	//TODO check iter results
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+			__PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+	
+skip_label:	
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_disconnect_all_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_disconn_all_req_t  req;
+	pand_dbus_req_cnf_t      cnf_result;
+	int ret_val, size;
+
+	memset(&req, 0, sizeof(pand_dbus_disconn_all_req_t));
+	
+	//HOW address when the dbus client app send data?
+	// suggestion: pass the wanted size:P
+	
+	cnf_result.type = PAND_DBUS_DISCONN_ALL_REQ_CNF_TYPE;
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_DISCONN_ALL_REQ_TYPE, sizeof(pand_dbus_disconn_all_req_t),&req)){
+		
+		//TODO check current daemon status
+		ret_val = cmd_disconnect(NULL);	
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);
+	} else {
+		cnf_result.result = PAND_RESULT_FAILED;
+	}
+	
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+
+	//TODO check iter results
+	
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		  syslog(LOG_ERR, "fatal error at %s:%d\n",
+			 __PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+		
+skip_label:	
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+		
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_get_active_conn_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_get_active_conn_req_t	req;
+	pand_dbus_get_active_conn_cnf_t *cnf_data = NULL;
+	pand_dbus_req_cnf_t      *cnf_result = NULL;
+	int ret_val = -1;
+	int cnf_res_size = 0;
+	int data_size = 0;
+	
+	
+		
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_GET_ACTIVE_CONN_REQ_TYPE, sizeof(pand_dbus_get_active_conn_req_t),&req)){
+		
+		//TODO check current daemon status
+		ret_val = cmd_get_active_conn(&req, &cnf_data);	
+	} 
+	
+	cnf_res_size = sizeof(pand_dbus_req_cnf_t);
+	
+	if(!ret_val) {
+		
+		data_size = (cnf_data->num_conn )* sizeof(pand_active_conn_t) + sizeof(pand_dbus_get_active_conn_cnf_t);
+		cnf_result = (pand_dbus_req_cnf_t*)malloc(cnf_res_size + data_size);
+		cnf_result -> type = PAND_DBUS_GET_ACTIVE_CONN_REQ_CNF_TYPE;
+		cnf_result -> result = PAND_RESULT_SUCCESS;
+		memcpy(cnf_result->data, cnf_data,data_size);
+		cnf_res_size += data_size;
+	} else {
+		cnf_result = (pand_dbus_req_cnf_t*)malloc(cnf_res_size);
+		cnf_result -> type = PAND_DBUS_GET_ACTIVE_CONN_REQ_CNF_TYPE;
+		cnf_result -> result = PAND_RESULT_FAILED;
+	}
+	
+	ptr = (const unsigned char*)cnf_result;
+	reply = dbus_message_new_method_return(msg);	
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, cnf_res_size);
+
+	//TODO check iter results
+		
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+			__PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+	
+skip_label:
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	
+	if(cnf_result) {
+		free(cnf_result);
+	}
+	
+	if(cnf_data) {
+		free(cnf_data);
+	}
+		
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_get_devices_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	char  req;
+	pand_dbus_req_cnf_t      *cnf_result = NULL;
+	pand_dbus_get_dev_cnf_t  *cnf_data = NULL;
+	int ret_val = -1;
+	int cnf_res_size, data_size;
+	
+		
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_GET_DEV_INFO_REQ_TYPE, 0, &req)){
+		
+		ret_val = cmd_get_devices(&cnf_data);
+		
+	}
+	
+	cnf_res_size = sizeof(pand_dbus_req_cnf_t);
+	
+	if(!ret_val) {
+		data_size = (cnf_data->num_dev )* sizeof(pand_dev_info_t) + sizeof(pand_dbus_get_dev_cnf_t);
+		cnf_result = (pand_dbus_req_cnf_t*)malloc(cnf_res_size + data_size);
+		cnf_result->type = PAND_DBUS_GET_DEV_INFO_CNF_TYPE;
+		cnf_result->result = PAND_RESULT_SUCCESS;
+		memcpy(cnf_result->data, cnf_data,data_size);
+		cnf_res_size += data_size;
+	} else {
+		cnf_result = (pand_dbus_req_cnf_t*)malloc(cnf_res_size);
+		cnf_result->type = PAND_DBUS_GET_DEV_INFO_CNF_TYPE;
+		cnf_result->result = PAND_RESULT_FAILED;
+	}
+	
+	ptr = (const unsigned char*)cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);	
+	
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, cnf_res_size);
+
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+			__PRETTY_FUNCTION__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+	
+skip_label:
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	if(cnf_result) {
+		free(cnf_result);
+	}
+	
+	if(cnf_data) {
+		free(cnf_data);
+	}
+		
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult 
+handle_listen_req(DBusConnection *dbus_conn, DBusMessage *msg, void* data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_listen_req_t    req;
+	pand_dbus_req_cnf_t	cnf_result;
+	int ret_val, size;
+	
+
+	memset(&req, 0, sizeof(pand_dbus_listen_req_t));
+	
+	cnf_result.type = PAND_DBUS_LISTEN_REQ_CNF_TYPE;
+	
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_LISTEN_REQ_TYPE, sizeof(pand_dbus_listen_req_t),&req)){
+		ret_val = cmd_listen(&req);
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);	
+	}else{
+		cnf_result.result = PAND_RESULT_FAILED;
+	}
+		
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);		
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+
+	
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+		       __FILE__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+	
+skip_label:		
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult 
+handle_listen_stop_req(DBusConnection *dbus_conn, DBusMessage *msg, void* data)
+{
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter;
+	const unsigned char *ptr;
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+	pand_dbus_listen_stop_req_t    req;
+	pand_dbus_req_cnf_t	cnf_result;
+	int ret_val, size;
+
+	memset(&req, 0, sizeof(pand_dbus_listen_stop_req_t));
+	
+	cnf_result.type = PAND_DBUS_LISTEN_STOP_REQ_CNF_TYPE;
+	
+	if(!pand_util_get_req_attr(msg, PAND_DBUS_LISTEN_STOP_REQ_TYPE, sizeof(pand_dbus_listen_stop_req_t),&req)){
+		ret_val = cmd_listen_stop(&req);
+		cnf_result.result = (!ret_val?PAND_RESULT_SUCCESS:PAND_RESULT_FAILED);	
+	}else{
+		cnf_result.result = PAND_RESULT_FAILED;
+	}
+	
+	size = sizeof(pand_dbus_req_cnf_t);
+	ptr = (const unsigned char*)&cnf_result;
+	
+	reply = dbus_message_new_method_return(msg);
+	dbus_message_iter_init(reply, &iter);
+	dbus_message_append_iter_init(reply, &iter);
+	dbus_message_iter_append_byte_array(&iter, ptr, size);
+	
+	if (!dbus_connection_send (dbus_conn, reply, NULL)) {
+		syslog(LOG_ERR, "fatal error at %s:%d\n",
+		       __FILE__, __LINE__) ;
+		result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+		goto skip_label;
+	}
+skip_label:		
+	if (reply) {
+		dbus_message_unref (reply) ;
+		reply = NULL ;
+	}
+	return result;
+}
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult
+handle_search_req(DBusConnection *dbus_conn, DBusMessage *msg, void *data)
+{
+	DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+	syslog(LOG_INFO, "%s - line: %d\n", __PRETTY_FUNCTION__, __LINE__);
+	
+	return result;
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static void 
+pand_dbus_unregistered_func (DBusConnection *dbus_conn, 
+	gpointer        user_data)
+{
+	return;
+
+}
+
+/**
+ *  TODO
+ *  @param  
+ *  @return
+ */
+static DBusHandlerResult 
+pand_dbus_msg_func (DBusConnection *dbus_conn, DBusMessage *msg, gpointer user_data) 
+{
+	pand_services_data_t *ptr_handlers =  pand_services;
+        DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+        const char *method;
+        const char *path;
+
+        method = dbus_message_get_member (msg);
+	path = dbus_message_get_path (msg);
+
+	for (;ptr_handlers->name; ptr_handlers++) {
+		if(dbus_message_is_method_call(msg , ORG_BLUEZ_PAND_DBUS_IFACE, ptr_handlers->name))
+		{
+			result = (ptr_handlers->handle_func)(dbus_conn, msg, user_data);
+			
+			if(result == DBUS_HANDLER_RESULT_HANDLED) {
+				dbus_message_unref (msg) ;
+				msg = NULL ;
+			}
+			break;
+		}
+	}
+	return result;
+
+}
diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus_commands.c bluez-utils-2.17-dbus/pand/pand_dbus_commands.c
--- bluez-utils-2.17.orig/pand/pand_dbus_commands.c	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus_commands.c	2005-05-20 16:38:43.628259880 -0300
@@ -0,0 +1,514 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus_commands.c,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <sys/syslog.h>
+#include <sys/socket.h>
+#include <sys/poll.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+#include <bluetooth/l2cap.h>
+#include <bluetooth/bnep.h>
+
+#include <libbridge.h>
+
+#include "pand_dbus_commands.h"
+#include "pand.h"
+
+
+//TODO
+static char netdev[16] = "bnep%d"; 
+extern int terminate;
+static pthread_t threadid = 0;
+
+typedef struct {
+	int role;
+	int sk;
+	struct sockaddr_l2 *l2a;
+}listen_args_t;
+
+
+/**
+ *  Get list of connected devices
+ *  @param  
+ *  @return
+ */
+static int get_conn_list(int s, int dev_id, pand_dbus_get_active_conn_cnf_t **preq_cnf)
+{
+	struct hci_conn_list_req *cl;
+	struct hci_conn_info *ci;
+	pand_active_conn_t conn;
+	int i;
+	int ret_val = -1;
+
+	if (dev_id < 0)
+		return -1;
+
+	if (!(cl = malloc(10 * sizeof(*ci) + sizeof(*cl)))) {
+		syslog(LOG_ERR,"Can't allocate memory");
+		return -1;
+	}
+	cl->dev_id = dev_id;
+	cl->conn_num = 10;
+	ci = cl->conn_info;
+
+	if (ioctl(s, HCIGETCONNLIST, (void *) cl)) {
+		syslog(LOG_ERR,"Can't get connection list");
+		goto cleanup;
+	}
+
+	*preq_cnf = (pand_dbus_get_active_conn_cnf_t*) malloc(sizeof(pand_dbus_get_active_conn_cnf_t));
+	(*preq_cnf)->num_conn = 0;
+	
+	
+	for (i = 0; i < cl->conn_num; i++, ci++) {
+		char addr[18];
+		ba2str(&ci->bdaddr, addr);
+		memset(&conn, 0, sizeof(pand_active_conn_t));
+		strcpy(conn.bdaddr, addr);
+		conn.link_type = ci->type;
+		conn.handle = ci->handle;
+		conn.state = ci->state;
+		conn.master = ci->link_mode;
+		
+		*preq_cnf = (pand_dbus_get_active_conn_cnf_t*)realloc  \
+				(*preq_cnf, ((*preq_cnf)->num_conn + 1) * \
+				sizeof(pand_active_conn_t) +          \
+				sizeof(pand_dbus_get_active_conn_cnf_t));
+		
+		memcpy((*preq_cnf)->conn + (*preq_cnf)->num_conn, &conn, sizeof(pand_active_conn_t));
+		
+		(*preq_cnf)->num_conn++;
+	}
+	ret_val = 0;
+cleanup:
+	return ret_val;
+}
+
+/**
+ *  Dealocate thread parameters
+ *  @param  
+ *  @return
+ */
+static 
+void deallocate_thread_param(void* param) 
+{ 
+	listen_args_t *p = (listen_args_t*)param;
+	
+	close(p->sk);
+	free (p->l2a); 
+	free (p); 
+}
+
+/**
+ *  Listen thread function
+ *  @param  
+ *  @return
+ */
+void *listen_thread (void *param) 
+{
+	listen_args_t *p = (listen_args_t*)param;
+	
+	
+	pthread_cleanup_push (deallocate_thread_param, p);
+	while (!terminate) {
+		int alen = sizeof(struct sockaddr_l2);
+		int nsk;
+
+		nsk = accept(p->sk, (struct sockaddr *) p->l2a, &alen);
+		
+		if (nsk < 0) {
+			syslog(LOG_ERR, "Accept failed. %s(%d)\n", strerror(errno), errno);
+			continue;
+		}
+
+		switch (fork()) {
+			case 0:
+				break;
+			case -1:
+				syslog(LOG_ERR, "Fork failed. %s(%d)\n", strerror(errno), errno);
+			default:
+				close(nsk);
+				continue;
+		}
+
+		if (!bnep_accept_connection(nsk, p->role, netdev)) {
+			char str[40];
+			ba2str(&(p->l2a->l2_bdaddr), str);
+
+			syslog(LOG_INFO, "New connection from %s %s\n", str, netdev);
+			/* TODO for GN and NAP add the new device to the bridge */
+			/* TODO notify all dbus connected clients               */
+		} else {
+			syslog(LOG_ERR, "Connection failed. %s(%d)\n",
+			       strerror(errno), errno);
+		}
+
+		close(nsk);
+		syslog(LOG_INFO,"%s line:%d", __PRETTY_FUNCTION__, __LINE__);
+		exit(0);
+	}
+	close(p->sk);
+	pthread_cleanup_pop(1);
+	bnep_sdp_unregister();
+	
+	return NULL;
+}
+
+		   
+		   
+/**
+ * Connect and initiate BNEP session
+ * @param
+ * @return
+ *   -1 - critical error (exit persist mode)
+ *   1  - non critical error
+ *   0  - success
+ */
+int cmd_connect(char *dst, uint16_t role, uint16_t service)
+{
+	struct l2cap_options l2o;
+	struct sockaddr_l2 l2a;
+	bdaddr_t src_addr = *BDADDR_ANY;
+	int sk, olen, ret_val = 0;
+
+	syslog(LOG_INFO, "Connecting to %s\n", dst);
+
+	sk = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
+	if (sk < 0) {
+		syslog(LOG_ERR, "Cannot create L2CAP socket. %s(%d)",
+		       strerror(errno), errno);
+		return -1;
+	}
+
+	/* Setup L2CAP options according to BNEP spec */
+	memset(&l2o, 0, sizeof(l2o));
+	olen = sizeof(l2o);
+	getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen);
+	l2o.imtu = l2o.omtu = BNEP_MTU;
+	setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o));
+
+	memset(&l2a, 0, sizeof(l2a));
+	l2a.l2_family = AF_BLUETOOTH;
+	bacpy(&l2a.l2_bdaddr, &src_addr);
+
+	if (bind(sk, (struct sockaddr *) &l2a, sizeof(l2a)))
+		syslog(LOG_ERR, "Bind failed. %s(%d)", 
+		       strerror(errno), errno);
+
+	memset(&l2a, 0, sizeof(l2a));
+	l2a.l2_family = AF_BLUETOOTH;
+	//bacpy(&l2a.l2_bdaddr, bdaddr);
+	str2ba(dst, &l2a.l2_bdaddr);
+	l2a.l2_psm = htobs(BNEP_PSM);
+
+	if (!connect(sk, (struct sockaddr *) &l2a, sizeof(l2a)) && 
+		    !bnep_create_connection(sk, role, service, netdev)) {
+
+		syslog(LOG_INFO, "%s connected", netdev);
+		//run_devup(netdev, dst, sk, -1);
+		ret_val = 0;
+	} else {
+		syslog(LOG_ERR, "Connect to %s failed. %s(%d)",
+			dst, strerror(errno), errno);
+		ret_val = 1;
+	}
+
+	close(sk);
+	return ret_val;
+}
+
+/**
+ *  Disconnect from one or all connected devices
+ *  @param  
+ *  @return
+ */
+int cmd_disconnect (pand_dbus_disconn_req_t *pdc)
+{
+	int ret_val = -1;
+	bdaddr_t *dst;
+	
+	
+	if(pdc) {
+		if(pdc->bdaddr[0] != 0) {
+			dst = strtoba(pdc->bdaddr);
+			ret_val = bnep_kill_connection((uint8_t*)dst);
+		}
+		
+	}else
+	{
+		ret_val = bnep_kill_all_connections();
+	}
+	return ret_val;
+}
+
+/**
+ *  Returns active connections
+ *  @param  
+ *  @return
+ */
+int cmd_get_active_conn(pand_dbus_get_active_conn_req_t *preq, pand_dbus_get_active_conn_cnf_t **preq_cnf)
+{
+	int ret_val = -1;
+	
+	struct hci_dev_list_req *dl = NULL;
+	struct hci_dev_req *dr = NULL;
+	int i, sk;
+
+	if(!preq || !preq_cnf) {
+		return -1;
+	}
+		
+	memset(preq_cnf,0,sizeof(pand_dbus_get_active_conn_cnf_t));
+	
+	sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+	if (sk < 0)
+		return -1;
+
+	if(preq->dev_id != 0) {
+		get_conn_list(sk, preq->dev_id, preq_cnf);
+	}else {
+		dl = malloc(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
+		if (!dl) {
+			goto cleanup;
+		}
+	
+		dl->dev_num = HCI_MAX_DEV;
+		dr = dl->dev_req;
+	
+		if (ioctl(sk, HCIGETDEVLIST, (void *) dl))
+			goto cleanup;
+	
+		for (i = 0; i < dl->dev_num; i++, dr++) {
+			if (hci_test_bit(HCI_UP, &dr->dev_opt))
+				ret_val = get_conn_list(sk, dr->dev_id, preq_cnf);
+		}
+	}
+
+cleanup:
+	close(sk);
+	if(dl) {
+		free(dl);
+	}
+		
+	return ret_val;
+}
+
+/**
+ *  Gets local Bluetooth devices
+ *  @param  
+ *  @return
+ */
+int cmd_get_devices(pand_dbus_get_dev_cnf_t **preq_cnf)
+{
+	struct hci_dev_list_req *dl = NULL;
+	struct hci_dev_req *dr = NULL;
+	pand_dev_info_t *pdev = NULL;
+	struct hci_dev_info di;
+	int i, sk, size;
+	char addr[18];
+	int ret_val = 0;
+
+	if(!preq_cnf) {
+		return -1;
+	}
+		
+	sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+	if (sk < 0)
+		return -1;
+
+	dl = malloc(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl));
+	
+	if (!dl) {
+		ret_val = -1;
+		goto cleanup;
+	}
+
+	dl->dev_num = HCI_MAX_DEV;
+	dr = dl->dev_req;
+
+	if (ioctl(sk, HCIGETDEVLIST, (void *) dl)) {
+		ret_val = -1;
+		goto cleanup;
+	}
+
+	size = sizeof(pand_dbus_get_dev_cnf_t);
+	*preq_cnf = (pand_dbus_get_dev_cnf_t*)realloc(*preq_cnf, size);
+	(*preq_cnf)->num_dev = 0;
+		
+	for (i = 0; i < dl->dev_num; i++, dr++) {
+		if (hci_test_bit(HCI_UP, &dr->dev_opt)) {
+			memset(&di, 0 , sizeof(struct hci_dev_info));
+			di.dev_id = dr->dev_id;
+			if (!ioctl(sk, HCIGETDEVINFO, (void *) &di)) {
+				size = ((*preq_cnf)->num_dev +1)* sizeof(pand_dev_info_t)+ sizeof(pand_dbus_get_dev_cnf_t);
+				*preq_cnf = (pand_dbus_get_dev_cnf_t*)realloc(*preq_cnf, size);
+				pdev = ((pand_dev_info_t*)(*preq_cnf)->devices);
+				pdev = pdev + (*preq_cnf)->num_dev;
+				pdev->dev_id = di.dev_id;
+				strcpy(pdev->name, di.name);
+				ba2str(&di.bdaddr, addr);
+				strcpy(pdev->bdaddr, addr);
+				(*preq_cnf)->num_dev++;
+			}
+		}
+	}
+
+cleanup:
+	close(sk);
+	if(dl) {
+		free(dl);
+	}
+		
+	return ret_val;
+}
+
+/**
+ *  Listen for incomming connections
+ *  @param  
+ *  @return
+ */
+int 
+cmd_listen(pand_dbus_listen_req_t *preq) {
+
+	struct l2cap_options l2o;
+	struct sockaddr_l2 *pl2a = NULL;
+	listen_args_t *listen_arguments;
+	bdaddr_t src_addr = *BDADDR_ANY;
+	//pthread_t threadid;
+	int sk, olen, lm;
+	
+	/* TODO Check if the thread is running */
+	
+	/* TODO Create the bridge */
+	if(preq->role != BNEP_SVC_PANU) {
+		if(preq->bridge_mode == ENABLE_BRIDGE) {
+			
+		}
+	}
+
+	//TODO validate parameters
+	if(bnep_sdp_register(preq->role))
+	{
+		syslog(LOG_ERR, "BNEP register failed. %s(%d)",
+		     strerror(errno), errno);
+		return -1;
+	}        
+
+	/* Create L2CAP socket and bind it to PSM BNEP */
+	sk = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
+	if (sk < 0) {
+		syslog(LOG_ERR, "Cannot create L2CAP socket. %s(%d)",
+		     strerror(errno), errno);
+		return -1; 
+	}
+
+	pl2a = (struct sockaddr_l2*)malloc(sizeof(struct sockaddr_l2));
+	memset(pl2a, 0, sizeof(struct sockaddr_l2));
+	pl2a->l2_family = AF_BLUETOOTH;
+	bacpy(&(pl2a->l2_bdaddr), &src_addr);
+	pl2a->l2_psm = htobs(BNEP_PSM);
+
+	if (bind(sk, (struct sockaddr *) pl2a, sizeof(struct sockaddr_l2))) {
+		syslog(LOG_ERR, "Bind failed. %s(%d)", strerror(errno), errno);
+		return -1;
+	}
+
+      /* Setup L2CAP options according to BNEP spec */
+	memset(&l2o, 0, sizeof(l2o));
+	olen = sizeof(l2o);
+	if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &olen) < 0) {
+		syslog(LOG_ERR, "Failed to get L2CAP options. %s(%d)",
+		     strerror(errno), errno);
+		return -1;
+	}
+
+	l2o.imtu = l2o.omtu = BNEP_MTU;
+	if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) {
+		syslog(LOG_ERR, "Failed to set L2CAP options. %s(%d)",
+		strerror(errno), errno);
+		return -1;
+	}
+
+	/* Set link mode */
+	lm = 0;
+	if (preq->master)
+		lm |= L2CAP_LM_MASTER;
+	if (preq->encrypt)
+		lm |= L2CAP_LM_ENCRYPT;
+	if (preq->secure)
+		lm |= L2CAP_LM_SECURE;
+
+	if (lm && setsockopt(sk, SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm)) < 0) {
+		syslog(LOG_ERR, "Failed to set link mode. %s(%d)", strerror(errno), errno);
+		return -1;
+	}
+	listen(sk, 10);
+
+	listen_arguments = (listen_args_t*)malloc(sizeof(listen_args_t));
+	listen_arguments->role = preq->role;
+	listen_arguments->sk = sk;
+	listen_arguments->l2a = pl2a;
+
+	terminate = 0;
+	
+	return pthread_create (&threadid, NULL, &listen_thread, listen_arguments);
+}
+/**
+ *  Cancel listen thread
+ *  @param  
+ *  @return
+ */
+int 
+cmd_listen_stop(pand_dbus_listen_stop_req_t *preq) 
+{
+	int ret_val = -1;
+	terminate = 1;
+	if(threadid) {
+		pthread_cancel(threadid);   
+		threadid = 0;
+		ret_val = 0;
+	}
+	return ret_val;
+	
+}
+
diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus_commands.h bluez-utils-2.17-dbus/pand/pand_dbus_commands.h
--- bluez-utils-2.17.orig/pand/pand_dbus_commands.h	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus_commands.h	2005-05-20 16:38:43.667253952 -0300
@@ -0,0 +1,45 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus_commands.h,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+
+#ifndef __H_PAND_DBUS_COMMANDS_H__ 
+#define __H_PAND_DBUS_COMMANDS_H__
+
+#include "dbus_services.h"
+
+#define PAND_SIGNAL_STOP         0x01
+
+int cmd_connect(char *dst, uint16_t role, uint16_t service);
+int cmd_disconnect (pand_dbus_disconn_req_t *pdc);
+int cmd_listen(pand_dbus_listen_req_t *preq);
+int cmd_listen_stop(pand_dbus_listen_stop_req_t *preq); 
+int cmd_get_active_conn(pand_dbus_get_active_conn_req_t *preq, pand_dbus_get_active_conn_cnf_t**preq_cnf);
+int cmd_get_devices(pand_dbus_get_dev_cnf_t **preq_cnf);
+
+
+#endif
diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus.h bluez-utils-2.17-dbus/pand/pand_dbus.h
--- bluez-utils-2.17.orig/pand/pand_dbus.h	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus.h	2005-05-20 17:12:06.456783664 -0300
@@ -0,0 +1,41 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus.h,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+#ifndef __H_PAND_DBUS_H__ 
+#define __H_PAND_DBUS_H__
+
+#include <stdlib.h>
+
+
+
+
+
+int pand_dbus_start();
+int pand_dbus_stop();
+
+#endif /* __H_PAND_DBUS_H__*/
diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus_util.c bluez-utils-2.17-dbus/pand/pand_dbus_util.c
--- bluez-utils-2.17.orig/pand/pand_dbus_util.c	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus_util.c	2005-05-20 16:32:46.420563704 -0300
@@ -0,0 +1,102 @@
+
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus_util.c,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+
+#include <string.h>  
+#include <sys/syslog.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <dbus/dbus-protocol.h>
+
+#include "pand_dbus_util.h"
+#include "dbus_services.h"
+
+/**
+ *  Get message type
+ *  @param  
+ *  @return
+ */
+PAND_MESSAGE_TYPE 
+pand_util_get_msg_type(DBusMessage * msg)
+{
+	PAND_MESSAGE_TYPE ret_type = PAND_DBUS_INVALID_TYPE;
+	DBusError error;
+	uint8_t type;
+	
+	dbus_error_init(&error);
+	
+	if(dbus_message_get_args (msg,&error,DBUS_TYPE_BYTE, &type, DBUS_TYPE_INVALID))	{
+		ret_type = type;
+	}
+	
+	dbus_error_free(&error);
+	
+	return ret_type;
+}
+
+/**
+ *  Get message attributes
+ *  @param  
+ *  @return
+ */
+int pand_util_get_req_attr(DBusMessage *msg, PAND_MESSAGE_TYPE type, int size, void *preq_attr)
+{
+	const unsigned char *ptr;
+	DBusMessageIter iter;
+	int n, ret_val = -1;
+	PAND_MESSAGE_TYPE msg_type;
+	
+	if(msg) {
+		dbus_message_iter_init(msg, &iter);
+		//Get the fisrt byte in order to check the code
+		msg_type = dbus_message_iter_get_byte(&iter);
+		
+		if(msg_type == type) {
+			/* check wanted size to avoid memory access violation */
+			if(size > 0) {
+				if(dbus_message_iter_next(&iter)) {
+					//TODO check return result
+					dbus_message_iter_get_byte_array(&iter,(void*) &ptr, &n);
+					if(n == size) {
+						memcpy(preq_attr, ptr, n);
+						ret_val = 0;
+					}
+				}else {
+					preq_attr = NULL;	
+				}
+			}else if(size == 0) {
+				/* if the request doesn't have data, just return true */
+				ret_val = 0;
+			}
+		}
+	}
+	return ret_val;
+}
+
+
diff -urNaw bluez-utils-2.17.orig/pand/pand_dbus_util.h bluez-utils-2.17-dbus/pand/pand_dbus_util.h
--- bluez-utils-2.17.orig/pand/pand_dbus_util.h	1969-12-31 21:00:00.000000000 -0300
+++ bluez-utils-2.17-dbus/pand/pand_dbus_util.h	2005-05-18 18:56:26.000000000 -0300
@@ -0,0 +1,55 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2005       Claudio Takahasi <claudio.takahasi@indt.org>
+ *  Copyright (C) 2002-2004  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 version 2 as
+ *  published by the Free Software Foundation;
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ *  SOFTWARE IS DISCLAIMED.
+ *
+ *
+ *  $Id: pand_dbus_util.h,v 1.12 2005/05/22 13:00:00 holtmann Exp $
+ */
+#ifndef __H_PAND_DBUS_UTIL_H__ 
+#define __H_PAND_DBUS_UTIL_H__
+
+#include "dbus_services.h" 
+
+
+/**
+ * 
+ * 
+ * 
+ */
+PAND_MESSAGE_TYPE pand_util_get_msg_type(DBusMessage *);
+/**
+ * 
+ * 
+ * size: wanted body size
+ */
+int pand_util_get_req_attr(DBusMessage *msg, PAND_MESSAGE_TYPE type, int size, void *preq_attr);
+/**
+ * 
+ * 
+ * 
+ */
+int pand_util_get_conn_req_attr(DBusMessage *, pand_dbus_conn_req_t*);
+
+
+#endif /* __H_PAND_DBUS_UTIL_H__ */ 

  reply	other threads:[~2005-05-20 21:04 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-28 20:00 [Bluez-devel] DBUS service support - Initial library Claudio Takahasi
2005-04-29  9:47 ` Marcel Holtmann
2005-04-29 12:26   ` Claudio Takahasi
2005-04-29 12:43     ` Marcel Holtmann
2005-04-29 22:20       ` Claudio Takahasi
2005-04-30  0:04         ` Marcel Holtmann
2005-05-01 21:16           ` Claudio Takahasi
2005-05-01 23:18             ` Marcel Holtmann
2005-05-02 15:32               ` Claudio Takahasi
2005-05-02 16:24                 ` Marcel Holtmann
2005-05-09 21:31                   ` Claudio Takahasi
2005-05-11 18:27                     ` Marcel Holtmann
2005-05-12  9:00                       ` Peter Wippich
2005-05-12 12:41                         ` Marcel Holtmann
2005-05-12 16:21                           ` Peter Wippich
2005-05-20 21:04                             ` Claudio Takahasi [this message]
2005-05-23 10:27                               ` Marcel Holtmann
2005-05-23 15:02                                 ` Claudio Takahasi
2005-05-24  9:07                                   ` Marcel Holtmann
2005-05-25 22:20                                     ` Claudio Takahasi
2005-05-26  9:08                                       ` Marcel Holtmann
2005-05-26 21:22                                         ` Claudio Takahasi
2005-05-26 21:40                                           ` Marcel Holtmann
2005-05-30 22:42                                             ` Claudio Takahasi
2005-05-30 23:05                                               ` Marcel Holtmann
2005-06-03 20:34                                                 ` [Bluez-devel] DBUS service support - poll patch Claudio Takahasi
2005-06-03 20:38                                                   ` Marcel Holtmann
2005-06-03 21:31                                                     ` Claudio Takahasi
2005-06-03 22:10                                                   ` Marcel Holtmann
2005-06-06 13:18                                                     ` Claudio Takahasi
2005-06-14 11:37                                                       ` Claudio Takahasi
2005-06-17 21:59                                                         ` Claudio Takahasi
2005-06-18 23:28                                                           ` Marcel Holtmann
2005-05-12 12:45                         ` [Bluez-devel] DBUS service support - Initial library Claudio Takahasi
2005-05-12 16:23                           ` Peter Wippich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e1effdeb0505201404d05e818@mail.gmail.com \
    --to=cktakahasi@gmail.com \
    --cc=bluez-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.