diff options
-rw-r--r-- | network/manager.c | 41 | ||||
-rw-r--r-- | network/server.c | 45 | ||||
-rw-r--r-- | network/server.h | 6 |
3 files changed, 71 insertions, 21 deletions
diff --git a/network/manager.c b/network/manager.c index 43bc9b71..15209592 100644 --- a/network/manager.c +++ b/network/manager.c @@ -739,18 +739,15 @@ static void parse_stored_connection(char *key, char *value, void *data) if (++ptr == NULL) return; - if (strcasecmp("nap", ptr) == 0) { + if (strcasecmp("nap", ptr) == 0) id = BNEP_SVC_NAP; - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/nap%d", net_uid++); - } else if (strcasecmp("gn", ptr) == 0) { + else if (strcasecmp("gn", ptr) == 0) id = BNEP_SVC_GN; - snprintf(path, MAX_PATH_LENGTH, - NETWORK_PATH"/server/gn%d", net_uid++); - } else { - /* Invalid role */ + else return; - } + + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/connection%d", net_uid++); /* Parsing the value: name and description */ ptr = strchr(value, ':'); @@ -778,8 +775,10 @@ static void register_stored(void) { char dirname[PATH_MAX + 1]; char filename[PATH_MAX + 1]; + char path[MAX_PATH_LENGTH]; struct dirent *de; DIR *dir; + struct stat s; bdaddr_t src; snprintf(dirname, PATH_MAX, "%s", STORAGEDIR); @@ -797,17 +796,27 @@ static void register_stored(void) de->d_name, "network"); str2ba(de->d_name, &src); - textfile_foreach(filename, parse_stored_connection, &src); + + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) + textfile_foreach(filename, parse_stored_connection, &src); /* NAP objects */ - create_name(filename, PATH_MAX, STORAGEDIR, - de->d_name, "nap"); - register_nap_from_file(&src, filename); + create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "nap"); + + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/nap%d", net_uid++); + register_nap_from_file(connection, path, &src, filename); + } /* GN objects */ - create_name(filename, PATH_MAX, STORAGEDIR, - de->d_name, "gn"); - register_gn_from_file(&src, filename); + create_name(filename, PATH_MAX, STORAGEDIR, de->d_name, "gn"); + if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) { + snprintf(path, MAX_PATH_LENGTH, + NETWORK_PATH"/server/gn%d", net_uid++); + register_gn_from_file(connection, path, &src, filename); + } } closedir(dir); diff --git a/network/server.c b/network/server.c index c6215b8a..be6316a1 100644 --- a/network/server.c +++ b/network/server.c @@ -44,6 +44,7 @@ #include "logging.h" #include "dbus.h" #include "error.h" +#include "textfile.h" #define NETWORK_SERVER_INTERFACE "org.bluez.network.Server" @@ -64,6 +65,7 @@ struct network_server { bdaddr_t src; /* Bluetooth Local Address */ char *iface; /* Routing interface */ char *name; /* Server service name */ + char *range; /* IP Address range */ char *path; /* D-Bus path */ dbus_bool_t secure; uint32_t record_id; /* Service record id */ @@ -947,6 +949,9 @@ static void server_free(struct network_server *ns) if (ns->name) g_free(ns->name); + if (ns->range) + g_free(ns->range); + if (ns->path) g_free(ns->path); @@ -1015,13 +1020,47 @@ fail: return -1; } -int register_nap_from_file(const bdaddr_t *src, const char *filename) +int register_nap_from_file(DBusConnection *conn, const char *path, + const bdaddr_t *src, const char *filename) { - /* FIXME: extract name, description, secure, enabled, address range, routing ...*/ + struct network_server *ns; + char *str; + + ns = g_new0(struct network_server, 1); + + ns->id = BNEP_SVC_NAP; + ns->name = textfile_get(filename, "name"); + if (ns->name) { + /* Name is mandatory */ + server_free(ns); + return -1; + } + ns->secure = FALSE; + str = textfile_get(filename, "secure"); + if (str) { + if (strcmp("1", str) == 0) + ns->secure = TRUE; + g_free(str); + } + + ns->range = textfile_get(filename, "address_range"); + ns->iface = textfile_get(filename, "routing"); + + /* Register path */ + if (!dbus_connection_register_object_path(conn, path, + &server_table, ns)) { + error("D-Bus failed to register %s path", path); + server_free(ns); + return -1; + } + + /* FIXME: Missing enabled the server(if applied) */ + return 0; } -int register_gn_from_file(const bdaddr_t *src, const char *filename) +int register_gn_from_file(DBusConnection *conn, const char *path, + const bdaddr_t *src, const char *filename) { /* FIXME: extract name, description, secure, enabled, address range ...*/ return 0; diff --git a/network/server.h b/network/server.h index 23ebe772..d96873b3 100644 --- a/network/server.h +++ b/network/server.h @@ -23,6 +23,8 @@ int server_register(DBusConnection *conn, const char *addr, const char *path, uint16_t id); -int register_nap_from_file(const bdaddr_t *src, const char *filename); -int register_gn_from_file(const bdaddr_t *src, const char *filename); +int register_nap_from_file(DBusConnection *conn, const char *path, + const bdaddr_t *src, const char *filename); +int register_gn_from_file(DBusConnection *conn, const char *path, + const bdaddr_t *src, const char *filename); int read_server_uuid(bdaddr_t *src, uint16_t uuid, gboolean *enable); |