diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2007-06-22 01:36:06 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2007-06-22 01:36:06 +0000 | 
| commit | b8020a613062f229b737174e934e75d96ba607d2 (patch) | |
| tree | 65a1b45cde427d8e5a9e3e83044a696dc301a715 | |
| parent | 1a2e7943da42619730e442d1ff6ab08b9c2c621d (diff) | |
Improve local connection handling
| -rw-r--r-- | daemon/echo.c | 18 | ||||
| -rw-r--r-- | hcid/dbus-database.c | 21 | ||||
| -rw-r--r-- | hcid/dbus-database.h | 8 | ||||
| -rw-r--r-- | hcid/server.c | 38 | 
4 files changed, 73 insertions, 12 deletions
| diff --git a/daemon/echo.c b/daemon/echo.c index 65d521a9..5813e1c0 100644 --- a/daemon/echo.c +++ b/daemon/echo.c @@ -239,6 +239,7 @@ static GIOChannel *setup_rfcomm(DBusConnection *conn, uint8_t channel)  static int setup_sdp(DBusConnection *conn, uint8_t channel)  {  	DBusMessage *msg, *reply; +	DBusError err;  	sdp_record_t *record;  	sdp_buf_t buf;  	sdp_list_t *svclass, *pfseq, *apseq, *root, *aproto; @@ -308,7 +309,9 @@ static int setup_sdp(DBusConnection *conn, uint8_t channel)  	dbus_message_append_args(msg, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,  				&buf.data, buf.data_size, DBUS_TYPE_INVALID); -	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, NULL); +	dbus_error_init(&err); + +	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);  	dbus_message_unref(msg); @@ -316,6 +319,8 @@ static int setup_sdp(DBusConnection *conn, uint8_t channel)  	if (!reply) {  		error("Registration of service record failed"); +		error("%s", err.message); +		dbus_error_free(&err);  		return -1;  	} @@ -329,6 +334,7 @@ static int setup_sdp(DBusConnection *conn, uint8_t channel)  static int register_standalone(DBusConnection *conn)  {  	DBusMessage *msg, *reply; +	DBusError err;  	const char *ident = "echo", *name = "Echo service", *desc = "";  	info("Registering service"); @@ -344,12 +350,16 @@ static int register_standalone(DBusConnection *conn)  				DBUS_TYPE_STRING, &name,  				DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); -	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, NULL); +	dbus_error_init(&err); + +	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);  	dbus_message_unref(msg);  	if (!reply) {  		error("Registration of service failed"); +		error("%s", err.message); +		dbus_error_free(&err);  		return -1;  	} @@ -389,6 +399,10 @@ int main(int argc, char *argv[])  	enable_debug();  	addr = getenv("BLUETOOTHD_ADDRESS"); +	if (!addr) { +		error("No D-Bus server address available"); +		exit(1); +	}  	debug("Bluetooth daemon at %s", addr); diff --git a/hcid/dbus-database.c b/hcid/dbus-database.c index 8ee04c36..2f904956 100644 --- a/hcid/dbus-database.c +++ b/hcid/dbus-database.c @@ -461,6 +461,27 @@ dbus_bool_t database_init(DBusConnection *conn, const char *path)  							NULL, NULL);  } +DBusHandlerResult database_message(DBusConnection *conn, +						DBusMessage *msg, void *data) +{ +	DBusMethodVTable *current; + +	for (current = database_methods; +			current->name && current->message_function; current++) { +		if (!dbus_message_is_method_call(msg, DATABASE_INTERFACE, +								current->name)) +			continue; + +		if (dbus_message_has_signature(msg, current->signature)) { +			debug("%s: %s.%s()", dbus_message_get_path(msg), +					DATABASE_INTERFACE, current->name); +			return current->message_function(conn, msg, data); +		} +	} + +	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} +  void set_sdp_server_enable(void)  {  	sdp_server_enable = 1; diff --git a/hcid/dbus-database.h b/hcid/dbus-database.h index 8feb1e59..3912e18e 100644 --- a/hcid/dbus-database.h +++ b/hcid/dbus-database.h @@ -21,13 +21,11 @@   *   */ -#ifndef __BLUEZ_DBUS_DATABASE_H -#define __BLUEZ_DBUS_DATABASE_H -  #define DATABASE_INTERFACE "org.bluez.Database"  dbus_bool_t database_init(DBusConnection *conn, const char *path); -void set_sdp_server_enable(void); +DBusHandlerResult database_message(DBusConnection *conn, +						DBusMessage *msg, void *data); -#endif /* __BLUEZ_DBUS_DATABSE_H */ +void set_sdp_server_enable(void); diff --git a/hcid/server.c b/hcid/server.c index 57241909..49f9ff54 100644 --- a/hcid/server.c +++ b/hcid/server.c @@ -25,17 +25,38 @@  #include <config.h>  #endif +#include <string.h>  #include <dbus.h> +#include "dbus-database.h" +  #include "logging.h"  #include "server.h" +static DBusHandlerResult filter_function(DBusConnection *conn, +						DBusMessage *msg, void *data) +{ +	if (dbus_message_is_signal(msg, DBUS_INTERFACE_LOCAL, "Disconnected") && +			strcmp(dbus_message_get_path(msg), DBUS_PATH_LOCAL) == 0) { +		debug("Received disconnected signal"); +		return DBUS_HANDLER_RESULT_HANDLED; +	} + +	name_listener_indicate_disconnect(conn); + +	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} +  static DBusHandlerResult message_handler(DBusConnection *conn,  						DBusMessage *msg, void *data)  { -	debug("Incoming message %p", conn); +	if (strcmp(dbus_message_get_interface(msg), DATABASE_INTERFACE) == 0) +		return database_message(conn, msg, data); + +	debug("%s -> %s.%s", dbus_message_get_path(msg), +		dbus_message_get_interface(msg), dbus_message_get_member(msg)); -	return DBUS_HANDLER_RESULT_HANDLED; +	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;  }  static void unregister_handler(DBusConnection *conn, void *data) @@ -50,9 +71,13 @@ static void handle_connection(DBusServer *server, DBusConnection *conn, void *da  	debug("New local connection %p", conn); -	//dbus_connection_add_filter(conn, filter_function, NULL, NULL); +	dbus_connection_add_filter(conn, filter_function, NULL, NULL); -	dbus_connection_register_fallback(conn, "/org/bluez", &vtable, NULL); +	if (dbus_connection_register_object_path(conn, "/org/bluez", +						&vtable, NULL) == FALSE) { +		error("Can't register local object path"); +		return; +	}  	dbus_connection_ref(conn); @@ -69,8 +94,9 @@ char *get_local_server_address(void)  void init_local_server(void)  { -	DBusError err; +	const char *ext_only[] = { "EXTERNAL", NULL };  	char *address; +	DBusError err;  	dbus_error_init(&err); @@ -92,6 +118,8 @@ void init_local_server(void)  	dbus_server_set_new_connection_function(server, handle_connection,  								NULL, NULL); + +	dbus_server_set_auth_mechanisms(server, ext_only);  }  void shutdown_local_server(void) | 
