summaryrefslogtreecommitdiffstats
path: root/network/server.c
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 /network/server.c
parentfbba4be5b162fdffe8e12e3b1e0fa11629436600 (diff)
Remove CreateServer and RemoveServer, servers are always create.
Diffstat (limited to 'network/server.c')
-rw-r--r--network/server.c104
1 files changed, 50 insertions, 54 deletions
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,