summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-06-20 20:23:35 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-06-20 20:23:35 +0000
commit3a653f915b0e7de28e111665ba40b69ae6d6a235 (patch)
tree7865b048eae5fa79af6a344c042b15b255d8e420
parentfbba4be5b162fdffe8e12e3b1e0fa11629436600 (diff)
Remove CreateServer and RemoveServer, servers are always create.
-rw-r--r--network/manager.c110
-rw-r--r--network/manager.h3
-rw-r--r--network/server.c104
-rw-r--r--network/server.h3
4 files changed, 99 insertions, 121 deletions
diff --git a/network/manager.c b/network/manager.c
index c27d01c5..148dd444 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -45,7 +45,6 @@
#include "logging.h"
#include "textfile.h"
-#define NETWORK_PATH "/org/bluez/network"
#define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager"
#include "error.h"
@@ -55,8 +54,6 @@
#include "connection.h"
#include "common.h"
-#define MAX_PATH_LENGTH 64 /* D-Bus path */
-
struct pending_reply {
DBusConnection *conn;
DBusMessage *msg;
@@ -197,8 +194,6 @@ static DBusHandlerResult remove_path(DBusConnection *conn,
connection_store(conn, dpath, TRUE);
}
}
- else
- server_remove_stored(conn, path);
g_free(l->data);
*list = g_slist_remove(*list, l->data);
@@ -407,57 +402,6 @@ static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,
return list_paths(conn, msg, server_paths);
}
-static DBusHandlerResult create_server(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- char path[MAX_PATH_LENGTH];
- DBusError derr;
- const char *str;
- bdaddr_t src;
- uint16_t id;
- int dev_id;
-
- dbus_error_init(&derr);
- if (!dbus_message_get_args(msg, &derr,
- DBUS_TYPE_STRING, &str,
- DBUS_TYPE_INVALID)) {
- err_invalid_args(conn, msg, derr.message);
- dbus_error_free(&derr);
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- id = bnep_service_id(str);
- if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP))
- return err_invalid_args(conn, msg, "Not supported");
-
- snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s%d",
- bnep_name(id), net_uid++);
-
- if (g_slist_find_custom(server_paths, path,
- (GCompareFunc) strcmp)) {
- err_already_exists(conn, msg, "Server Already exists");
- return DBUS_HANDLER_RESULT_HANDLED;
- }
-
- bacpy(&src, BDADDR_ANY);
-
- dev_id = hci_get_route(NULL);
-
- if (dev_id >= 0)
- hci_devba(dev_id, &src);
-
- if (server_register(conn, path, &src, id) < 0)
- return err_failed(conn, msg,
- "D-Bus path registration failed");
-
- if (bacmp(&src, BDADDR_ANY) != 0)
- server_store(conn, path);
-
- server_paths = g_slist_append(server_paths, g_strdup(path));
-
- return create_path(conn, msg, path, "ServerCreated");
-}
-
static DBusHandlerResult find_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -497,12 +441,6 @@ static DBusHandlerResult find_server(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
-static DBusHandlerResult remove_server(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- return remove_path(conn, msg, &server_paths, "ServerRemoved");
-}
-
static DBusHandlerResult list_connections(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -867,6 +805,34 @@ static void register_connections_stored(const char *adapter)
}
}
+static void register_server(uint16_t id)
+{
+ char path[MAX_PATH_LENGTH];
+ bdaddr_t src;
+ int dev_id;
+
+ snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(id));
+
+ if (g_slist_find_custom(server_paths, path,
+ (GCompareFunc) strcmp))
+ return;
+
+ bacpy(&src, BDADDR_ANY);
+
+ dev_id = hci_get_route(NULL);
+
+ if (dev_id >= 0)
+ hci_devba(dev_id, &src);
+
+ if (server_register(connection, path, &src, id) < 0)
+ return;
+
+ if (bacmp(&src, BDADDR_ANY) != 0)
+ server_store(connection, path);
+
+ server_paths = g_slist_append(server_paths, g_strdup(path));
+}
+
static void register_servers_stored(const char *adapter, const char *profile)
{
char filename[PATH_MAX + 1];
@@ -877,8 +843,10 @@ static void register_servers_stored(const char *adapter, const char *profile)
if (strcmp(profile, "nap") == 0)
id = BNEP_SVC_NAP;
- else
+ else if (strcmp(profile, "gn") == 0)
id = BNEP_SVC_GN;
+ else
+ id = BNEP_SVC_PANU;
create_name(filename, PATH_MAX, STORAGEDIR, adapter, profile);
@@ -886,7 +854,7 @@ static void register_servers_stored(const char *adapter, const char *profile)
if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) {
snprintf(path, MAX_PATH_LENGTH,
- NETWORK_PATH"/%s%d", profile, net_uid++);
+ NETWORK_PATH"/%s", profile);
if (server_register_from_file(connection, path,
&src, id, filename) == 0) {
server_paths = g_slist_append(server_paths,
@@ -919,6 +887,9 @@ static void register_stored(void)
/* GN objects */
register_servers_stored(de->d_name, "gn");
+
+ /* PANU objects */
+ register_servers_stored(de->d_name, "panu");
}
closedir(dir);
@@ -926,9 +897,7 @@ static void register_stored(void)
static DBusMethodVTable manager_methods[] = {
{ "ListServers", list_servers, "", "as" },
- { "CreateServer", create_server, "s", "s" },
{ "FindServer", find_server, "s", "s" },
- { "RemoveServer", remove_server, "s", "" },
{ "ListConnections", list_connections, "", "as" },
{ "FindConnection", find_connection, "s", "s" },
{ "CreateConnection", create_connection, "ss", "s" },
@@ -985,6 +954,15 @@ int network_init(DBusConnection *conn)
register_stored();
+ /* PAN user server */
+ register_server(BNEP_SVC_PANU);
+
+ /* Group Network server */
+ register_server(BNEP_SVC_GN);
+
+ /* Network Access Point server */
+ register_server(BNEP_SVC_NAP);
+
return 0;
}
diff --git a/network/manager.h b/network/manager.h
index d20b8dbd..9ad1009e 100644
--- a/network/manager.h
+++ b/network/manager.h
@@ -21,6 +21,9 @@
*
*/
+#define MAX_PATH_LENGTH 64 /* D-Bus path */
+#define NETWORK_PATH "/org/bluez/network"
+
int network_init(DBusConnection *conn);
void network_exit(void);
diff --git a/network/server.c b/network/server.c
index 8abbc592..22ddda8d 100644
--- a/network/server.c
+++ b/network/server.c
@@ -59,11 +59,13 @@
#include "manager.h"
#include "server.h"
+static GIOChannel *bnep_io;
+
/* Pending Authorization */
struct pending_auth {
- char *addr; /* Bluetooth Address */
- GIOChannel *io; /* BNEP connection setup io channel */
- int attempts; /* BNEP setup conn requests counter */
+ char *addr; /* Bluetooth Address */
+ GIOChannel *io; /* BNEP connection setup io channel */
+ int attempts; /* BNEP setup conn requests counter */
};
/* Main server structure */
@@ -72,12 +74,12 @@ struct network_server {
char *iface; /* Routing interface */
char *name; /* Server service name */
char *range; /* IP Address range */
- char *path; /* D-Bus path */
- dbus_bool_t secure;
+ char *path; /* D-Bus path */
+ gboolean enable; /* Enable flag*/
+ gboolean secure; /* Security flag*/
uint32_t record_id; /* Service record id */
uint16_t id; /* Service class identifier */
- GIOChannel *io; /* GIOChannel when listening */
- DBusConnection *conn; /* D-Bus connection */
+ DBusConnection *conn; /* D-Bus connection */
struct pending_auth *pauth; /* Pending incomming connection/authorization */
};
@@ -92,8 +94,10 @@ static int store_property(bdaddr_t *src, uint16_t id,
ba2str(src, addr);
if (id == BNEP_SVC_NAP)
create_name(filename, PATH_MAX, STORAGEDIR, addr, "nap");
- else
+ else if (id == BNEP_SVC_GN)
create_name(filename, PATH_MAX, STORAGEDIR, addr, "gn");
+ else if (id == BNEP_SVC_PANU)
+ create_name(filename, PATH_MAX, STORAGEDIR, addr, "panu");
return textfile_put(filename, key, value);
}
@@ -380,7 +384,9 @@ static int authorize_connection(struct network_server *ns)
static gboolean connect_setup_event(GIOChannel *chan,
GIOCondition cond, gpointer data)
{
- struct network_server *ns = data;
+ DBusConnection *conn = data;
+ struct network_server *ns;
+ char path[MAX_PATH_LENGTH];
struct bnep_setup_conn_req *req;
unsigned char pkt[BNEP_MTU];
gsize n;
@@ -437,7 +443,10 @@ static gboolean connect_setup_event(GIOChannel *chan,
/* Getting source service: considering 2 bytes size */
role = ntohs(bt_get_unaligned((uint16_t *) pservice));
- if (role != BNEP_SVC_PANU) {
+ snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/%s", bnep_name(role));
+ dbus_connection_get_object_user_data(conn, path, (void *) &ns);
+
+ if (ns == NULL || ns->enable == FALSE) {
response = BNEP_CONN_INVALID_SRC;
goto reply;
}
@@ -532,7 +541,7 @@ static gboolean connect_event(GIOChannel *chan,
return TRUE;
}
-static int l2cap_listen(struct network_server *ns)
+int server_init(DBusConnection *conn, gboolean secure)
{
struct l2cap_options l2o;
struct sockaddr_l2 l2a;
@@ -578,7 +587,7 @@ static int l2cap_listen(struct network_server *ns)
}
/* Set link mode */
- lm = (ns->secure ? L2CAP_LM_SECURE : 0);
+ lm = (secure ? L2CAP_LM_SECURE : 0);
if (lm && setsockopt(sk, SOL_L2CAP, L2CAP_LM, &lm, sizeof(lm)) < 0) {
err = errno;
error("Failed to set link mode. %s(%d)",
@@ -592,11 +601,11 @@ static int l2cap_listen(struct network_server *ns)
goto fail;
}
- ns->io = g_io_channel_unix_new(sk);
- g_io_channel_set_close_on_unref(ns->io, FALSE);
+ bnep_io = g_io_channel_unix_new(sk);
+ g_io_channel_set_close_on_unref(bnep_io, FALSE);
- g_io_add_watch(ns->io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- connect_event, ns);
+ g_io_add_watch(bnep_io, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+ connect_event, conn);
return 0;
fail:
@@ -762,8 +771,7 @@ static int record_and_listen(struct network_server *ns)
return -EIO;
}
- err = l2cap_listen(ns);
- if (err < 0)
+ if (bnep_io == NULL && (err = server_init(ns->conn, ns->secure)) < 0)
return -err;
return 0;
@@ -776,7 +784,7 @@ static DBusHandlerResult enable(DBusConnection *conn,
DBusMessage *reply;
int err;
- if (ns->io)
+ if (ns->enable)
return err_already_exists(conn, msg, "Server already enabled");
if (bacmp(&ns->src, BDADDR_ANY) == 0) {
@@ -816,7 +824,7 @@ static DBusHandlerResult disable(DBusConnection *conn,
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- if (!ns->io)
+ if (!ns->enable)
return err_failed(conn, msg, "Not enabled");
/* Remove the service record */
@@ -825,9 +833,7 @@ static DBusHandlerResult disable(DBusConnection *conn,
ns->record_id = 0;
}
- g_io_channel_close(ns->io);
- g_io_channel_unref(ns->io);
- ns->io = NULL;
+ ns->enable = FALSE;
store_property(&ns->src, ns->id, "enabled", "0");
@@ -865,7 +871,7 @@ static DBusHandlerResult set_name(DBusConnection *conn,
g_free(ns->name);
ns->name = g_strdup(name);
- if (ns->io) {
+ if (ns->enable) {
if (update_server_record(ns) < 0) {
dbus_message_unref(reply);
return err_failed(conn, msg,
@@ -873,6 +879,8 @@ static DBusHandlerResult set_name(DBusConnection *conn,
}
}
+ store_property(&ns->src, ns->id, "name", ns->name);
+
return send_message_and_unref(conn, reply);
}
@@ -955,7 +963,7 @@ static DBusHandlerResult set_security(DBusConnection *conn,
}
ns->secure = secure;
- if (ns->io) {
+ if (ns->enable) {
if (update_server_record(ns) < 0) {
dbus_message_unref(reply);
return err_failed(conn, msg,
@@ -963,6 +971,8 @@ static DBusHandlerResult set_security(DBusConnection *conn,
}
}
+ store_property(&ns->src, ns->id, "secure", "1");
+
return send_message_and_unref(conn, reply);
}
@@ -1039,11 +1049,6 @@ static void server_free(struct network_server *ns)
if (ns->conn)
dbus_connection_unref(ns->conn);
- if (ns->io) {
- g_io_channel_close(ns->io);
- g_io_channel_unref(ns->io);
- }
-
g_free(ns);
}
@@ -1054,6 +1059,12 @@ static void server_unregister(DBusConnection *conn, void *data)
info("Unregistered server path:%s", ns->path);
server_free(ns);
+
+ if (bnep_io != NULL) {
+ g_io_channel_close(bnep_io);
+ g_io_channel_unref(bnep_io);
+ bnep_io = NULL;
+ }
}
static DBusMethodVTable server_methods[] = {
@@ -1081,10 +1092,7 @@ int server_register(DBusConnection *conn, const char *path,
{
struct network_server *ns;
- if (!conn)
- return -EINVAL;
-
- if (!path)
+ if (!conn || !path)
return -EINVAL;
ns = g_new0(struct network_server, 1);
@@ -1109,8 +1117,10 @@ int server_register(DBusConnection *conn, const char *path,
/* Setting a default name */
if (id == BNEP_SVC_NAP)
ns->name = g_strdup("BlueZ NAP service");
- else
+ else if (id == BNEP_SVC_GN)
ns->name = g_strdup("BlueZ GN service");
+ else
+ ns->name = g_strdup("BlueZ PANU service");
ns->path = g_strdup(path);
ns->id = id;
@@ -1193,8 +1203,10 @@ int server_store(DBusConnection *conn, const char *path)
ba2str(&ns->src, addr);
if (ns->id == BNEP_SVC_NAP)
create_name(filename, PATH_MAX, STORAGEDIR, addr, "nap");
- else
+ else if (ns->id == BNEP_SVC_GN)
create_name(filename, PATH_MAX, STORAGEDIR, addr, "gn");
+ else
+ create_name(filename, PATH_MAX, STORAGEDIR, addr, "panu");
create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
@@ -1208,25 +1220,9 @@ int server_store(DBusConnection *conn, const char *path)
textfile_put(filename, "secure", ns->secure ? "1": "0");
- return 0;
-}
+ textfile_put(filename, "enabled", ns->enable ? "1": "0");
-int server_remove_stored(DBusConnection *conn, const char *path)
-{
- struct network_server *ns;
- char filename[PATH_MAX + 1];
- char addr[18];
-
- if (!dbus_connection_get_object_user_data(conn, path, (void *) &ns))
- return -ENOENT;
-
- ba2str(&ns->src, addr);
- if (ns->id == BNEP_SVC_NAP)
- create_name(filename, PATH_MAX, STORAGEDIR, addr, "nap");
- else
- create_name(filename, PATH_MAX, STORAGEDIR, addr, "gn");
-
- return remove(filename);
+ return 0;
}
int server_find_data(DBusConnection *conn,
diff --git a/network/server.h b/network/server.h
index ff754711..fb6debdf 100644
--- a/network/server.h
+++ b/network/server.h
@@ -21,12 +21,13 @@
*
*/
+
int server_register(DBusConnection *conn, const char *path,
bdaddr_t *src, uint16_t id);
int server_register_from_file(DBusConnection *conn, const char *path,
const bdaddr_t *src, uint16_t id, const char *filename);
int server_store(DBusConnection *conn, const char *path);
-int server_remove_stored(DBusConnection *conn, const char *path);
+
int server_find_data(DBusConnection *conn, const char *path,
const char *pattern);