summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-11-08 18:22:17 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-11-08 18:22:17 +0000
commitee8c7e7f6d6ad14e111ca15d5df1a385563cd1b6 (patch)
tree68296d44e15bb612eb9093b9e9d100750d4f96af
parent135151c382018639cd3fce5f67bb53eb621b528e (diff)
Cleanup: checking service register/unregister return value
-rw-r--r--hcid/dbus-manager.c13
-rw-r--r--hcid/dbus-service.c14
2 files changed, 22 insertions, 5 deletions
diff --git a/hcid/dbus-manager.c b/hcid/dbus-manager.c
index 30c8874a..53095769 100644
--- a/hcid/dbus-manager.c
+++ b/hcid/dbus-manager.c
@@ -277,8 +277,12 @@ static DBusHandlerResult register_service(DBusConnection *conn,
reg_err = register_service_agent(conn, dbus_message_get_sender(msg),
path, name, description);
- if (reg_err < 0)
+ if (reg_err < 0) {
+ if (reg_err == -EADDRNOTAVAIL)
+ return error_service_already_exists(conn, msg);
+
return error_failed(conn, msg, -reg_err);
+ }
/* Report that a new service was registered */
message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
@@ -337,8 +341,13 @@ static DBusHandlerResult unregister_service(DBusConnection *conn,
unreg_err = unregister_service_agent(conn,
dbus_message_get_sender(msg), path);
- if (unreg_err < 0)
+ if (unreg_err < 0) {
+ /* Only the owner can unregister it */
+ if (unreg_err == -EPERM)
+ return error_not_authorized(conn, msg);
+
return error_failed(conn, msg, -unreg_err);
+ }
/* Report that the service was unregistered */
message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c
index 00693439..34602846 100644
--- a/hcid/dbus-service.c
+++ b/hcid/dbus-service.c
@@ -727,6 +727,7 @@ int register_service_agent(DBusConnection *conn, const char *sender,
const char *path, const char *name, const char *description)
{
struct service_agent *agent;
+ struct slist *l;
debug("Registering service object: %s", path);
@@ -735,14 +736,17 @@ int register_service_agent(DBusConnection *conn, const char *sender,
if (!agent)
return -ENOMEM;
+ l = slist_find(services, path, (cmp_func_t) strcmp);
+ if (l)
+ return -EADDRNOTAVAIL;
+
if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) {
free(agent);
- return -1;
+ return -ENOMEM;
}
services = slist_append(services, strdup(path));
- /* FIXME: only one listener per sender */
name_listener_add(conn, sender, (name_cb_t) service_agent_exit, conn);
return 0;
@@ -756,6 +760,10 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha
debug("Unregistering service object: %s", path);
if (dbus_connection_get_object_path_data(conn, path, (void *) &agent)) {
+ /* No data assigned to this path or it is not the owner */
+ if (!agent || strcmp(sender, agent->id))
+ return -EPERM;
+
if (agent->records)
unregister_agent_records(agent->records);
@@ -763,7 +771,7 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha
}
if (!dbus_connection_unregister_object_path(conn, path))
- return -1;
+ return -ENOMEM;
l = slist_find(services, path, (cmp_func_t) strcmp);
if (l) {