diff options
| -rw-r--r-- | network/main.c | 2 | ||||
| -rw-r--r-- | network/manager.c | 73 | ||||
| -rw-r--r-- | network/manager.h | 3 | ||||
| -rw-r--r-- | network/server.c | 73 | 
4 files changed, 70 insertions, 81 deletions
| diff --git a/network/main.c b/network/main.c index 74675184..2d9d44b6 100644 --- a/network/main.c +++ b/network/main.c @@ -33,6 +33,8 @@  #include <signal.h>  #include <glib.h> +#include <bluetooth/bluetooth.h> +  #include "dbus.h"  #include "logging.h" diff --git a/network/manager.c b/network/manager.c index d2b627db..c09cbc8b 100644 --- a/network/manager.c +++ b/network/manager.c @@ -28,6 +28,8 @@  #include <ctype.h>  #include <dirent.h> +#include <sys/stat.h> +  #include <bluetooth/bluetooth.h>  #include <bluetooth/hci.h>  #include <bluetooth/hci_lib.h> @@ -53,9 +55,6 @@  #define MAX_PATH_LENGTH		64 /* D-Bus path */ -static GSList *server_paths = NULL;	/* Network registered servers paths */ -static GSList *connection_paths = NULL;	/* Network registered connections paths */ -  struct pending_reply {  	DBusConnection	*conn;  	DBusMessage	*msg; @@ -65,8 +64,13 @@ struct pending_reply {  	uint16_t	id;  }; +static GSList *server_paths	= NULL;	/* Network registered servers paths */ +static GSList *connection_paths	= NULL;	/* Network registered connections paths */ +  static DBusConnection *connection = NULL; +static int net_uid = 0;	/* Network objects identifier */ +  static void pending_reply_free(struct pending_reply *pr)  {  	if (pr->addr) @@ -342,6 +346,7 @@ static void get_address_reply(DBusPendingCall *call, void *data)  	DBusMessage *reply = dbus_pending_call_steal_reply(call);  	DBusError derr;  	const char *address; +	bdaddr_t src;  	dbus_error_init(&derr);  	if (dbus_set_error_from_message(&derr, reply)) { @@ -361,6 +366,9 @@ static void get_address_reply(DBusPendingCall *call, void *data)  		goto fail;  	} +	str2ba(address, &src); +	network_store_info(&src, pr->id, FALSE); +  	server_paths = g_slist_append(server_paths, g_strdup(pr->path));  	create_path(pr->conn, pr->msg, pr->path, "ServerCreated"); @@ -490,7 +498,8 @@ static DBusHandlerResult create_server(DBusConnection *conn,  	pr->addr = NULL;  	pr->id = id;  	pr->path = g_new0(char, MAX_PATH_LENGTH); -	snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/server/%s", bnep_name(id)); +	snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", +							bnep_name(id), net_uid++);  	if (g_slist_find_custom(server_paths, pr->path,  				(GCompareFunc) strcmp)) { @@ -510,6 +519,7 @@ static DBusHandlerResult create_server(DBusConnection *conn,  static DBusHandlerResult remove_server(DBusConnection *conn,  					DBusMessage *msg, void *data)  { +	/* FIXME: Remove from the storage */  	return remove_path(conn, msg, &server_paths, "ServerRemoved");  } @@ -562,7 +572,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct pending_reply *pr; -	static int uid = 0;  	DBusError derr;  	const char *addr;  	const char *str; @@ -588,7 +597,8 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  	pr->addr = g_strdup(addr);  	pr->id = id;  	pr->path = g_new0(char, MAX_PATH_LENGTH); -	snprintf(pr->path, MAX_PATH_LENGTH, NETWORK_PATH "/connection%d", uid++); +	snprintf(pr->path, MAX_PATH_LENGTH, +			NETWORK_PATH"/connection%d", net_uid++);  	if (get_default_adapter(pr, default_adapter_reply) < 0) {  		err_failed(conn, msg, "D-Bus path registration failed"); @@ -601,6 +611,7 @@ static DBusHandlerResult create_connection(DBusConnection *conn,  static DBusHandlerResult remove_connection(DBusConnection *conn,  						DBusMessage *msg, void *data)  { +	/* FIXME: Remove from the storage */  	return remove_path(conn, msg, &connection_paths, "ConnectionRemoved");  } @@ -677,14 +688,12 @@ static void stored_server(char *key, char *value, void *data)  	const bdaddr_t *src = data;   	uint16_t id; -	/* FIXME: we need change the path to support multiple sources */ -  	ba2str(src, addr);  	id = bnep_service_id(key); -	snprintf(path, MAX_PATH_LENGTH, "%s/server/%s", NETWORK_PATH, bnep_name(id)); +	snprintf(path, MAX_PATH_LENGTH, NETWORK_PATH"/server/%s%d", +						bnep_name(id), net_uid++); -	if (server_register(connection, addr, path, id) < 0) -		error("Register (%s, %s) path failed", addr, path); +	server_register(connection, addr, path, id);  }  static void register_stored_servers(void) @@ -766,3 +775,45 @@ void network_exit(void)  	bnep_cleanup();  	bridge_cleanup();  } + +static inline int create_filename(char *buf, size_t size, +					bdaddr_t *bdaddr, const char *name) +{ +	char addr[18]; + +	ba2str(bdaddr, addr); + +	return create_name(buf, size, STORAGEDIR, addr, name); +} + +int network_del_stored_info(bdaddr_t *src, uint16_t uuid) +{ +	char filename[PATH_MAX + 1]; +	const char *str; +	int err; + +	create_filename(filename, PATH_MAX, src, "network"); + +	str = bnep_uuid(uuid); + +	err = textfile_del(filename, str); + +	return err; +} + +int network_store_info(bdaddr_t *src, uint16_t uuid, gboolean enable) +{ +	char filename[PATH_MAX + 1]; +	const char *str; +	int err; + +	create_filename(filename, PATH_MAX, src, "network"); + +	str = bnep_uuid(uuid); + +	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + +	err = textfile_put(filename, str, enable ? "1" : "0"); + +	return err; +} diff --git a/network/manager.h b/network/manager.h index d37ca3cd..d20b8dbd 100644 --- a/network/manager.h +++ b/network/manager.h @@ -23,3 +23,6 @@  int network_init(DBusConnection *conn);  void network_exit(void); + +int network_del_stored_info(bdaddr_t *src, uint16_t uuid); +int network_store_info(bdaddr_t *src, uint16_t uuid, gboolean enable); diff --git a/network/server.c b/network/server.c index 2a3961ca..e1e27341 100644 --- a/network/server.c +++ b/network/server.c @@ -30,8 +30,6 @@  #include <stdlib.h>  #include <errno.h>  #include <sys/socket.h> -#include <sys/file.h> -#include <sys/stat.h>  #include <bluetooth/bluetooth.h>  #include <bluetooth/bnep.h> @@ -51,8 +49,8 @@  #include "bridge.h"  #include "common.h" +#include "manager.h"  #include "server.h" -#include "textfile.h"  /* Pending Authorization */  struct pending_auth { @@ -77,48 +75,6 @@ struct network_server {  static char netdev[16] = "bnep%d"; -static inline int create_filename(char *buf, size_t size, -					bdaddr_t *bdaddr, const char *name) -{ -	char addr[18]; - -	ba2str(bdaddr, addr); - -	return create_name(buf, size, STORAGEDIR, addr, name); -} - -static int del_stored_server_info(bdaddr_t *src, uint16_t uuid) -{ -	char filename[PATH_MAX + 1]; -	const char *str; -	int err; - -	create_filename(filename, PATH_MAX, src, "network"); - -	str = bnep_uuid(uuid); - -	err = textfile_del(filename, str); - -	return err; -} - -static int store_server_info(bdaddr_t *src, uint16_t uuid, gboolean enable) -{ -	char filename[PATH_MAX + 1]; -	const char *str; -	int err; - -	create_filename(filename, PATH_MAX, src, "network"); - -	str = bnep_uuid(uuid); - -	create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - -	err = textfile_put(filename, str, enable ? "1" : "0"); - -	return err; -} -  static void pending_auth_free(struct pending_auth *pauth)  {  	if (!pauth) @@ -753,7 +709,7 @@ static DBusHandlerResult enable(DBusConnection *conn,  	if (err < 0)   		return err_failed(conn, msg, strerror(-err)); -	store_server_info(&ns->src, ns->id, TRUE); +	network_store_info(&ns->src, ns->id, TRUE);  	return send_message_and_unref(conn, reply);  } @@ -781,7 +737,7 @@ static DBusHandlerResult disable(DBusConnection *conn,  	g_io_channel_unref(ns->io);  	ns->io = NULL; -	store_server_info(&ns->src, ns->id, FALSE); +	network_store_info(&ns->src, ns->id, FALSE);  	return send_message_and_unref(conn, reply);  } @@ -1002,8 +958,6 @@ static void server_free(struct network_server *ns)  		g_io_channel_unref(ns->io);  	} -	del_stored_server_info(&ns->src, ns->id); -  	g_free(ns);  } @@ -1055,29 +1009,8 @@ int server_register(DBusConnection *conn, const char *addr, const char *path,  	info("Registered server path:%s", ns->path); -	store_server_info(&ns->src, ns->id, FALSE); -  	return 0;  fail:  	server_free(ns);  	return -1;  } - -int read_server_uuid(bdaddr_t *src, uint16_t uuid, gboolean *enable) -{ -	char filename[PATH_MAX + 1], *buff; -	const char *str; - -	create_filename(filename, PATH_MAX, src, "network"); - -	str = bnep_uuid(uuid); -	buff = textfile_get(filename, str); -	if (!buff) -		return -ENOENT; - -	*enable = (strtol(buff, NULL, 10)) ? TRUE : FALSE; - -	g_free(buff); - -	return 0; -} | 
