summaryrefslogtreecommitdiffstats
path: root/network/server.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-06-03 12:31:42 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-06-03 12:31:42 +0000
commit4698b260ee4b278884ef3160e4990e5090373092 (patch)
tree70ed6ddd242c50b37e77876e0b1e755733651976 /network/server.c
parentb09d55b2f1177ca1f8e9926a95f8eb34f6fbe0ed (diff)
Fixes missing parts of network which didn't use libgdbus.
Diffstat (limited to 'network/server.c')
-rw-r--r--network/server.c202
1 files changed, 100 insertions, 102 deletions
diff --git a/network/server.c b/network/server.c
index ade50a7a..b306242b 100644
--- a/network/server.c
+++ b/network/server.c
@@ -95,6 +95,14 @@ static GSList *servers = NULL;
static const char *prefix = NULL;
static gboolean security = TRUE;
+gint find_server(gconstpointer a, gconstpointer b)
+{
+ const struct network_server *ns = a;
+ const char *path = b;
+
+ return strcmp(ns->path, path);
+}
+
static struct setup_session *setup_session_new(gchar *address,
uint16_t dst_role, uint16_t src_role, int nsk, guint watch)
{
@@ -720,8 +728,8 @@ static uint32_t register_server_record(struct network_server *ns)
return record->handle;
}
-static DBusHandlerResult get_uuid(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusMessage *get_uuid(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
@@ -729,31 +737,46 @@ static DBusHandlerResult get_uuid(DBusConnection *conn,
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
uuid = bnep_uuid(ns->id);
dbus_message_append_args(reply,
DBUS_TYPE_STRING, &uuid,
DBUS_TYPE_INVALID);
- return send_message_and_unref(conn, reply);
+ return reply;
}
-static DBusHandlerResult enable(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static inline DBusMessage *failed(DBusMessage *msg, const char *description)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
+ description);
+}
+
+static inline DBusMessage *invalid_arguments(DBusMessage *msg,
+ const char *description)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
+ description);
+}
+
+static DBusMessage *enable(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
if (ns->enable)
- return error_already_exists(conn, msg, "Server already enabled");
+ return g_dbus_create_error(msg, ERROR_INTERFACE
+ ".AlreadyExist",
+ "Server already enabled");
if (bacmp(&ns->src, BDADDR_ANY) == 0) {
int dev_id;
dev_id = hci_get_route(&ns->src);
if ((dev_id < 0) || (hci_devba(dev_id, &ns->src) < 0))
- return error_failed(conn, msg, "Adapter not available");
+ return failed(msg, "Adapter not available");
/* Store the server info */
server_store(ns->path);
@@ -761,14 +784,13 @@ static DBusHandlerResult enable(DBusConnection *conn,
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
/* Add the service record */
ns->record_id = register_server_record(ns);
if (!ns->record_id) {
dbus_message_unref(reply);
- return error_failed(conn, msg,
- "service record registration failed");
+ return failed(msg, "Service record registration failed");
}
ns->enable = TRUE;
@@ -778,7 +800,7 @@ static DBusHandlerResult enable(DBusConnection *conn,
dbus_connection_emit_signal(conn, ns->path, NETWORK_SERVER_INTERFACE,
"Enabled", DBUS_TYPE_INVALID);
- return send_message_and_unref(conn, reply);
+ return reply;
}
static void kill_connection(void *data, void *udata)
@@ -790,18 +812,18 @@ static void kill_connection(void *data, void *udata)
bnep_kill_connection(&dst);
}
-static DBusHandlerResult disable(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusMessage *disable(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
if (!ns->enable)
- return error_failed(conn, msg, "Not enabled");
+ return failed(msg, "Not enabled");
/* Remove the service record */
if (ns->record_id) {
@@ -818,48 +840,43 @@ static DBusHandlerResult disable(DBusConnection *conn,
dbus_connection_emit_signal(conn, ns->path, NETWORK_SERVER_INTERFACE,
"Disabled", DBUS_TYPE_INVALID);
- return send_message_and_unref(conn, reply);
+ return reply;
}
-static DBusHandlerResult is_enabled(DBusConnection *conn, DBusMessage *msg,
- void *data)
+static DBusMessage *is_enabled(DBusConnection *conn, DBusMessage *msg,
+ void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &ns->enable,
DBUS_TYPE_INVALID);
- return send_message_and_unref(conn, reply);
+ return reply;
}
-static DBusHandlerResult set_name(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusMessage *set_name(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
- DBusError derr;
const char *name;
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
- dbus_error_init(&derr);
- if (!dbus_message_get_args(msg, &derr,
+ if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_STRING, &name,
- DBUS_TYPE_INVALID)) {
- error_invalid_arguments(conn, msg, derr.message);
- dbus_error_free(&derr);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
+ DBUS_TYPE_INVALID))
+ return NULL;
if (!name || (strlen(name) == 0))
- return error_invalid_arguments(conn, msg, "Invalid name");
+ return invalid_arguments(msg, "Invalid name");
if (ns->name)
g_free(ns->name);
@@ -869,7 +886,7 @@ static DBusHandlerResult set_name(DBusConnection *conn,
uint32_t handle = register_server_record(ns);
if (!handle) {
dbus_message_unref(reply);
- return error_failed(conn, msg,
+ return failed(msg,
"Service record attribute update failed");
}
@@ -879,11 +896,11 @@ static DBusHandlerResult set_name(DBusConnection *conn,
store_property(&ns->src, ns->id, "name", ns->name);
- return send_message_and_unref(conn, reply);
+ return reply;
}
-static DBusHandlerResult get_name(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusMessage *get_name(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
char name[] = "";
@@ -892,55 +909,45 @@ static DBusHandlerResult get_name(DBusConnection *conn,
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
dbus_message_append_args(reply,
DBUS_TYPE_STRING, &pname,
DBUS_TYPE_INVALID);
- return send_message_and_unref(conn, reply);
+ return reply;
}
-static DBusHandlerResult set_address_range(DBusConnection *conn,
+static DBusMessage *set_address_range(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ return NULL;
}
-static DBusHandlerResult set_routing(DBusConnection *conn, DBusMessage *msg,
+static DBusMessage *set_routing(DBusConnection *conn, DBusMessage *msg,
void *data)
{
struct network_server *ns = data;
- DBusMessage *reply;
- DBusError derr;
const char *iface;
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
- dbus_error_init(&derr);
- if (!dbus_message_get_args(msg, &derr,
+ if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_STRING, &iface,
- DBUS_TYPE_INVALID)) {
- error_invalid_arguments(conn, msg, derr.message);
- dbus_error_free(&derr);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
+ DBUS_TYPE_INVALID))
+ return NULL;
/* FIXME: Check if the interface is valid/UP */
if (!iface || (strlen(iface) == 0))
- return error_invalid_arguments(conn, msg, "Invalid interface");
+ return invalid_arguments(msg, "Invalid interface");
if (ns->iface)
g_free(ns->iface);
ns->iface = g_strdup(iface);
- return send_message_and_unref(conn, reply);
+ return dbus_message_new_method_return(msg);
}
-static DBusHandlerResult get_info(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusMessage *get_info(DBusConnection *conn,
+ DBusMessage *msg, void *data)
{
struct network_server *ns = data;
DBusMessage *reply;
@@ -950,7 +957,7 @@ static DBusHandlerResult get_info(DBusConnection *conn,
reply = dbus_message_new_method_return(msg);
if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ return NULL;
dbus_message_iter_init_append(reply, &iter);
@@ -968,7 +975,7 @@ static DBusHandlerResult get_info(DBusConnection *conn,
dbus_message_iter_close_container(&iter, &dict);
- return send_message_and_unref(conn, reply);
+ return reply;
}
static void server_free(struct network_server *ns)
@@ -1000,7 +1007,7 @@ static void server_free(struct network_server *ns)
g_free(ns);
}
-static void server_unregister(DBusConnection *conn, void *data)
+static void server_unregister(void *data)
{
struct network_server *ns = data;
@@ -1010,23 +1017,23 @@ static void server_unregister(DBusConnection *conn, void *data)
server_free(ns);
}
-static DBusMethodVTable server_methods[] = {
- { "GetUUID", get_uuid, "", "s" },
- { "Enable", enable, "", "" },
- { "Disable", disable, "", "" },
- { "IsEnabled", is_enabled, "", "b" },
- { "SetName", set_name, "s", "" },
- { "GetName", get_name, "", "s" },
- { "SetAddressRange", set_address_range, "ss", "" },
- { "SetRouting", set_routing, "s", "" },
- { "GetInfo", get_info, "", "a{sv}" },
- { NULL, NULL, NULL, NULL }
+static GDBusMethodTable server_methods[] = {
+ { "GetUUID", "", "s", get_uuid },
+ { "Enable", "", "", enable },
+ { "Disable", "", "", disable },
+ { "IsEnabled", "", "b", is_enabled },
+ { "SetName", "s", "", set_name },
+ { "GetName", "", "s", get_name },
+ { "SetAddressRange", "ss", "", set_address_range },
+ { "SetRouting", "s", "", set_routing },
+ { "GetInfo", "", "a{sv}",get_info },
+ { }
};
-static DBusSignalVTable server_signals[] = {
+static GDBusSignalTable server_signals[] = {
{ "Enabled", "" },
{ "Disabled", "" },
- { NULL, NULL }
+ { }
};
int server_register(const char *path, bdaddr_t *src, uint16_t id)
@@ -1038,20 +1045,13 @@ int server_register(const char *path, bdaddr_t *src, uint16_t id)
ns = g_new0(struct network_server, 1);
- if (!dbus_connection_create_object_path(connection, path, ns,
- server_unregister)) {
- error("D-Bus failed to register %s path", path);
- server_free(ns);
- return -1;
- }
-
- if (!dbus_connection_register_interface(connection, path,
- NETWORK_SERVER_INTERFACE,
- server_methods,
- server_signals, NULL)) {
+ if (!g_dbus_register_interface(connection, path,
+ NETWORK_SERVER_INTERFACE,
+ server_methods, server_signals, NULL,
+ ns, server_unregister)) {
error("D-Bus failed to register %s interface",
NETWORK_SERVER_INTERFACE);
- dbus_connection_destroy_object_path(connection, path);
+ server_free(ns);
return -1;
}
@@ -1107,20 +1107,13 @@ int server_register_from_file(const char *path, const bdaddr_t *src,
g_free(str);
}
- if (!dbus_connection_create_object_path(connection, path, ns,
- server_unregister)) {
- error("D-Bus failed to register %s path", path);
- server_free(ns);
- return -1;
- }
-
- if (!dbus_connection_register_interface(connection, path,
- NETWORK_SERVER_INTERFACE,
- server_methods,
- server_signals, NULL)) {
+ if (!g_dbus_register_interface(connection, path,
+ NETWORK_SERVER_INTERFACE,
+ server_methods, server_signals, NULL,
+ ns, server_unregister)) {
error("D-Bus failed to register %s interface",
NETWORK_SERVER_INTERFACE);
- dbus_connection_destroy_object_path(connection, path);
+ server_free(ns);
return -1;
}
@@ -1136,13 +1129,15 @@ int server_store(const char *path)
struct network_server *ns;
char filename[PATH_MAX + 1];
char addr[18];
+ GSList *l;
- if (!dbus_connection_get_object_user_data(connection,
- path, (void *) &ns)) {
+ l = g_slist_find_custom(servers, path, find_server);
+ if (!l) {
error("Unable to salve %s on storage", path);
return -ENOENT;
}
+ ns = l->data;
ba2str(&ns->src, addr);
if (ns->id == BNEP_SVC_NAP)
create_name(filename, PATH_MAX, STORAGEDIR, addr, "nap");
@@ -1170,10 +1165,13 @@ int server_find_data(const char *path, const char *pattern)
{
struct network_server *ns;
const char *uuid;
+ GSList *l;
- if (!dbus_connection_get_object_user_data(connection, path, (void *) &ns))
+ l = g_slist_find_custom(servers, path, find_server);
+ if (!l)
return -1;
+ ns = l->data;
if (ns->name && strcasecmp(pattern, ns->name) == 0)
return 0;