summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--network/connection.c15
-rw-r--r--network/connection.h3
-rw-r--r--network/error.c8
-rw-r--r--network/error.h3
-rw-r--r--network/manager.c107
-rw-r--r--network/server.c2
6 files changed, 94 insertions, 44 deletions
diff --git a/network/connection.c b/network/connection.c
index e6d4d221..c1544b58 100644
--- a/network/connection.c
+++ b/network/connection.c
@@ -38,7 +38,10 @@
#include "connection.h"
struct network_conn {
+ char *raddr;
char *path;
+ char *uuid;
+ gboolean up;
};
static DBusHandlerResult get_address(DBusConnection *conn, DBusMessage *msg,
@@ -135,6 +138,9 @@ static void connection_free(struct network_conn *nc)
if (nc->path)
g_free(nc->path);
+ if (nc->uuid)
+ g_free(nc->uuid);
+
g_free(nc);
}
@@ -142,7 +148,7 @@ static void connection_unregister(DBusConnection *conn, void *data)
{
struct network_conn *nc = data;
- info("Unregistered connection path %s", nc->path);
+ info("Unregistered connection path:%s", nc->path);
connection_free(nc);
}
@@ -153,7 +159,8 @@ static const DBusObjectPathVTable connection_table = {
.unregister_function = connection_unregister,
};
-int connection_register(DBusConnection *conn, const char *path)
+int connection_register(DBusConnection *conn, const char *path,
+ const char *addr, const char *uuid)
{
struct network_conn *nc;
@@ -170,8 +177,10 @@ int connection_register(DBusConnection *conn, const char *path)
}
nc->path = g_strdup(path);
+ nc->raddr = g_strdup(addr);
+ nc->uuid = g_strdup(uuid);
+ nc->up = FALSE;
info("Registered connection path:%s", path);
-
return 0;
fail:
connection_free(nc);
diff --git a/network/connection.h b/network/connection.h
index b2dc2ab3..0726ec6c 100644
--- a/network/connection.h
+++ b/network/connection.h
@@ -20,4 +20,5 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
-int connection_register(DBusConnection *conn, const char *path);
+int connection_register(DBusConnection *conn, const char *path,
+ const char *addr, const char *uuid);
diff --git a/network/error.c b/network/error.c
index 50d33bc9..28bd54ae 100644
--- a/network/error.c
+++ b/network/error.c
@@ -52,3 +52,11 @@ DBusHandlerResult err_does_not_exist(DBusConnection *conn, DBusMessage *msg,
dbus_message_new_error(msg,
NETWORK_ERROR_INTERFACE ".DoesNotExist", str));
}
+
+DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg,
+ const char *str)
+{
+ return send_message_and_unref(conn,
+ dbus_message_new_error(msg,
+ NETWORK_ERROR_INTERFACE ".Failed", str));
+}
diff --git a/network/error.h b/network/error.h
index ad7ecfeb..63f6ffde 100644
--- a/network/error.h
+++ b/network/error.h
@@ -29,3 +29,6 @@ DBusHandlerResult err_generic(DBusConnection *conn, DBusMessage *msg,
const char *name, const char *str);
DBusHandlerResult err_does_not_exist(DBusConnection *conn, DBusMessage *msg,
const char *str);
+DBusHandlerResult err_failed(DBusConnection *conn, DBusMessage *msg,
+ const char *str);
+
diff --git a/network/manager.c b/network/manager.c
index 4d17bfc1..42853811 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -66,12 +66,10 @@ static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg,
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array_iter);
- if (g_slist_length(list)) {
- for (; list; list = list->next) {
- dbus_message_iter_append_basic(&array_iter,
- DBUS_TYPE_STRING,
- &list->data);
- }
+ for (; list; list = list->next) {
+ dbus_message_iter_append_basic(&array_iter,
+ DBUS_TYPE_STRING,
+ &list->data);
}
dbus_message_iter_close_container(&iter, &array_iter);
@@ -87,11 +85,39 @@ static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,
return list_paths(conn, msg, mgr->servers);
}
+static DBusHandlerResult create_path(DBusConnection *conn,
+ DBusMessage *msg, char *path,
+ const char *sname)
+{
+ DBusMessage *reply, *signal;
+
+ /* emit signal when it is a new path */
+ if (sname) {
+ signal = dbus_message_new_signal(NETWORK_PATH,
+ NETWORK_MANAGER_INTERFACE, sname);
+
+ dbus_message_append_args(signal,
+ DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID);
+
+ send_message_and_unref(conn, signal);
+ }
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID);
+
+ g_free(path);
+ return send_message_and_unref(conn, reply);
+}
+
static DBusHandlerResult create_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct manager *mgr = data;
- DBusMessage *reply;
DBusError derr;
const char *uuid;
char *path;
@@ -107,29 +133,28 @@ static DBusHandlerResult create_server(DBusConnection *conn,
path = g_new0(char, 32);
snprintf(path, 32, NETWORK_PATH "/server/%s", uuid);
- if (!g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) {
- if (server_register(conn, path) != -1) {
- mgr->servers = g_slist_append(mgr->servers,
- g_strdup(path));
- }
- }
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ /* Path already registered */
+ if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp))
+ return create_path(conn, msg, path, NULL);
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,
- DBUS_TYPE_INVALID);
+ if (server_register(conn, path) == -1) {
+ err_failed(conn, msg, "D-Bus path registration failed");
+ g_free(path);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
- g_free(path);
- return send_message_and_unref(connection, reply);
+ mgr->servers = g_slist_append(mgr->servers, g_strdup(path));
+
+ return create_path(conn, msg, path, "ServerCreated");
}
static DBusHandlerResult remove_path(DBusConnection *conn,
- DBusMessage *msg, GSList **list)
+ DBusMessage *msg, GSList **list,
+ const char *sname)
{
const char *path;
- DBusMessage *reply;
+ DBusMessage *reply, *signal;
DBusError derr;
GSList *l;
@@ -144,7 +169,7 @@ static DBusHandlerResult remove_path(DBusConnection *conn,
l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp);
if (!l)
- return err_does_not_exist(conn, msg, "Server doesn't exist");
+ return err_does_not_exist(conn, msg, "Path doesn't exist");
g_free(l->data);
*list = g_slist_remove(*list, l->data);
@@ -154,7 +179,16 @@ static DBusHandlerResult remove_path(DBusConnection *conn,
return DBUS_HANDLER_RESULT_NEED_MEMORY;
if (!dbus_connection_unregister_object_path(conn, path))
- error("Network server path unregister failed");
+ error("Network path unregister failed");
+
+ signal = dbus_message_new_signal(NETWORK_PATH,
+ NETWORK_MANAGER_INTERFACE, sname);
+
+ dbus_message_append_args(signal,
+ DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID);
+
+ send_message_and_unref(conn, signal);
return send_message_and_unref(conn, reply);
}
@@ -164,7 +198,7 @@ static DBusHandlerResult remove_server(DBusConnection *conn,
{
struct manager *mgr = data;
- return remove_path(conn, msg, &mgr->servers);
+ return remove_path(conn, msg, &mgr->servers, "ServerRemoved");
}
static DBusHandlerResult list_connections(DBusConnection *conn,
@@ -180,7 +214,6 @@ static DBusHandlerResult create_connection(DBusConnection *conn,
{
struct manager *mgr = data;
static int uid = 0;
- DBusMessage *reply;
DBusError derr;
const char *addr;
const char *uuid;
@@ -198,20 +231,16 @@ static DBusHandlerResult create_connection(DBusConnection *conn,
path = g_new0(char, 32);
snprintf(path, 32, NETWORK_PATH "/connection%d", uid++);
- if (connection_register(conn, path) != -1) {
- mgr->connections = g_slist_append(mgr->connections,
- g_strdup(path));
- }
- reply = dbus_message_new_method_return(msg);
- if (!reply)
- return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ if (connection_register(conn, path, addr, uuid) == -1) {
+ err_failed(conn, msg, "D-Bus path registration failed");
+ g_free(path);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,
- DBUS_TYPE_INVALID);
+ mgr->connections = g_slist_append(mgr->connections, g_strdup(path));
- g_free(path);
- return send_message_and_unref(connection, reply);
+ return create_path(conn, msg, path, "ConnectionCreated");
}
static DBusHandlerResult remove_connection(DBusConnection *conn,
@@ -219,7 +248,7 @@ static DBusHandlerResult remove_connection(DBusConnection *conn,
{
struct manager *mgr = data;
- return remove_path(conn, msg, &mgr->connections);
+ return remove_path(conn, msg, &mgr->connections, "ConnectionRemoved");
}
static DBusHandlerResult manager_message(DBusConnection *conn,
@@ -360,7 +389,7 @@ void internal_service(const char *identifier)
DBUS_TYPE_STRING, &name,
DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID);
- reply = dbus_connection_send_with_reply_and_block(connection, msg, -1,
+ reply = dbus_connection_send_with_reply_and_block(connection, msg, -1,
NULL);
if (!reply) {
error("Can't register service");
diff --git a/network/server.c b/network/server.c
index adc6517d..bce8e3b6 100644
--- a/network/server.c
+++ b/network/server.c
@@ -151,7 +151,7 @@ static void server_unregister(DBusConnection *conn, void *data)
{
struct network_server *ns = data;
- info("Unregistered server path %s", ns->path);
+ info("Unregistered server path:%s", ns->path);
server_free(ns);
}