diff --git a/profiles/network/server.c b/profiles/network/server.c
index 7b4460d..7e5e653 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
/* Main server structure */
struct network_server {
bdaddr_t src; /* Bluetooth Local Address */
- char *iface; /* DBus interface */
char *name; /* Server service name */
char *bridge; /* Bridge name */
uint32_t record_id; /* Service record id */
return NULL;
}
+static struct network_server *find_server_by_uuid(GSList *list,
+ const char *uuid)
+{
+ for (; list; list = list->next) {
+ struct network_server *ns = list->data;
+
+ if (strcasecmp(uuid, bnep_uuid(ns->id)) == 0)
+ return ns;
+
+ if (strcasecmp(uuid, bnep_name(ns->id)) == 0)
+ return ns;
+ }
+
+ return NULL;
+}
+
static sdp_record_t *server_record_new(const char *name, uint16_t id)
{
sdp_list_t *svclass, *pfseq, *apseq, *root, *aproto;
static DBusMessage *register_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- struct network_server *ns = data;
+ struct network_adapter *na = data;
+ struct network_server *ns;
DBusMessage *reply;
const char *uuid, *bridge;
DBUS_TYPE_STRING, &bridge, DBUS_TYPE_INVALID))
return btd_error_invalid_args(msg);
- if (g_strcmp0(uuid, "nap"))
+ ns = find_server_by_uuid(na->servers, uuid);
+ if (ns == NULL)
return btd_error_failed(msg, "Invalid UUID");
if (ns->record_id)
g_free(na);
}
-static void server_free(struct network_server *ns)
+static void server_free(void *data)
{
+ struct network_server *ns = data;
+
if (!ns)
return;
if (ns->record_id)
remove_record_from_server(ns->record_id);
- g_free(ns->iface);
g_free(ns->name);
g_free(ns->bridge);
static void path_unregister(void *data)
{
- struct network_server *ns = data;
- struct network_adapter *na = ns->na;
+ struct network_adapter *na = data;
DBG("Unregistered interface %s on path %s",
- ns->iface, adapter_get_path(na->adapter));
-
- na->servers = g_slist_remove(na->servers, ns);
- server_free(ns);
+ NETWORK_SERVER_INTERFACE, adapter_get_path(na->adapter));
- if (na->servers)
- return;
+ g_slist_free_full(na->servers, server_free);
adapters = g_slist_remove(adapters, na);
adapter_free(na);
ns = g_new0(struct network_server, 1);
- ns->iface = g_strdup(NETWORK_SERVER_INTERFACE);
ns->name = g_strdup("Network service");
path = adapter_get_path(adapter);
+ if (g_slist_length(na->servers) > 0)
+ goto done;
+
if (!g_dbus_register_interface(btd_get_dbus_connection(),
- path, ns->iface,
+ path, NETWORK_SERVER_INTERFACE,
server_methods, NULL, NULL,
- ns, path_unregister)) {
+ na, path_unregister)) {
error("D-Bus failed to register %s interface",
- ns->iface);
+ NETWORK_SERVER_INTERFACE);
server_free(ns);
return -1;
}
+ DBG("Registered interface %s on path %s", NETWORK_SERVER_INTERFACE,
+ path);
+
+done:
bacpy(&ns->src, adapter_get_address(adapter));
ns->id = id;
ns->na = na;
ns->record_id = 0;
na->servers = g_slist_append(na->servers, ns);
- DBG("Registered interface %s on path %s", ns->iface, path);
-
return 0;
}
if (!ns)
return -EINVAL;
+ na->servers = g_slist_remove(na->servers, ns);
+ server_free(ns);
+
+ if (g_slist_length(na->servers) > 0)
+ return 0;
+
g_dbus_unregister_interface(btd_get_dbus_connection(),
- adapter_get_path(adapter), ns->iface);
+ adapter_get_path(adapter),
+ NETWORK_SERVER_INTERFACE);
return 0;
}