chiark / gitweb /
bus: also add error parameter to object find and enumerator callbacks
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Nov 2013 00:14:57 +0000 (01:14 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 22 Nov 2013 00:42:15 +0000 (01:42 +0100)
Just in order to bring things inline with the method and property
callbacks.

14 files changed:
TODO
src/core/dbus.c
src/libsystemd-bus/bus-objects.c
src/libsystemd-bus/test-bus-objects.c
src/login/logind-seat-dbus.c
src/login/logind-seat.h
src/login/logind-session-dbus.c
src/login/logind-session.h
src/login/logind-user-dbus.c
src/login/logind-user.h
src/machine/machine-dbus.c
src/machine/machine.h
src/machine/machined.h
src/systemd/sd-bus.h

diff --git a/TODO b/TODO
index 6805fd6d1f19e4a1be4e369ba0ed855d1152bc45..8acc87966756dd24ce48640374cfae56ce6cec4f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -43,6 +43,8 @@ CGroup Rework Completion:
 
 Features:
 
 
 Features:
 
+* bus: translate all EIO, EINVAL, .. errors into dbus error 1:1 and back.
+
 * add API to clone sd_bus_message objects
 
 * sd-bus: synthesized messages should get serial number (uint32_t) -1
 * add API to clone sd_bus_message objects
 
 * sd-bus: synthesized messages should get serial number (uint32_t) -1
index 1cb4d0fa7dd37d09b82e3bb06c9d495afaf77dc2..d130e0974e92d30a15dc11d5a81defda8b8a9dd6 100644 (file)
@@ -272,7 +272,7 @@ static int selinux_filter(sd_bus *bus, sd_bus_message *message, void *userdata,
         return 0;
 }
 
         return 0;
 }
 
-static int bus_job_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_job_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Job *j;
         int r;
         Manager *m = userdata;
         Job *j;
         int r;
@@ -291,7 +291,7 @@ static int bus_job_find(sd_bus *bus, const char *path, const char *interface, vo
         return 1;
 }
 
         return 1;
 }
 
-static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) {
+static int find_unit(Manager *m, sd_bus *bus, const char *path, Unit **unit, sd_bus_error *error) {
         Unit *u;
         int r;
 
         Unit *u;
         int r;
 
@@ -305,25 +305,28 @@ static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) {
 
                 message = sd_bus_get_current(bus);
                 if (!message)
 
                 message = sd_bus_get_current(bus);
                 if (!message)
-                        return NULL;
+                        return 0;
 
                 r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
                 if (r < 0)
 
                 r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
                 if (r < 0)
-                        return NULL;
+                        return 0;
 
                 u = manager_get_unit_by_pid(m, pid);
         } else {
 
                 u = manager_get_unit_by_pid(m, pid);
         } else {
-                r = manager_load_unit_from_dbus_path(m, path, NULL, &u);
+                r = manager_load_unit_from_dbus_path(m, path, error, &u);
                 if (r < 0)
                 if (r < 0)
-                        return NULL;
+                        return 0;
         }
 
         }
 
-        return u;
+        if (!u)
+                return 0;
+
+        *unit = u;
+        return 1;
 }
 
 }
 
-static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Manager *m = userdata;
-        Unit *u;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -331,17 +334,13 @@ static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, v
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
-
-        *found = u;
-        return 1;
+        return find_unit(m, bus, path, (Unit**) found, error);
 }
 
 }
 
-static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Unit *u;
         Manager *m = userdata;
         Unit *u;
+        int r;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -349,9 +348,9 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
+        r = find_unit(m, bus, path, &u, error);
+        if (r <= 0)
+                return r;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
@@ -360,9 +359,10 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
         return 1;
 }
 
         return 1;
 }
 
-static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Unit *u;
         Manager *m = userdata;
         Unit *u;
+        int r;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -370,9 +370,9 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
+        r = find_unit(m, bus, path, &u, error);
+        if (r <= 0)
+                return r;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
@@ -384,10 +384,11 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter
         return 1;
 }
 
         return 1;
 }
 
-static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         CGroupContext *c;
         Unit *u;
         Manager *m = userdata;
         CGroupContext *c;
         Unit *u;
+        int r;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -395,9 +396,9 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
+        r = find_unit(m, bus, path, &u, error);
+        if (r <= 0)
+                return r;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
@@ -410,10 +411,11 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in
         return 1;
 }
 
         return 1;
 }
 
-static int bus_exec_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_exec_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         ExecContext *c;
         Unit *u;
         Manager *m = userdata;
         ExecContext *c;
         Unit *u;
+        int r;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -421,9 +423,9 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
+        r = find_unit(m, bus, path, &u, error);
+        if (r <= 0)
+                return r;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
@@ -436,10 +438,11 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte
         return 1;
 }
 
         return 1;
 }
 
-static int bus_kill_context_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+static int bus_kill_context_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         KillContext *c;
         Unit *u;
         Manager *m = userdata;
         KillContext *c;
         Unit *u;
+        int r;
 
         assert(bus);
         assert(path);
 
         assert(bus);
         assert(path);
@@ -447,9 +450,9 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
         assert(found);
         assert(m);
 
         assert(found);
         assert(m);
 
-        u = find_unit(m, bus, path);
-        if (!u)
-                return 0;
+        r = find_unit(m, bus, path, &u, error);
+        if (r <= 0)
+                return r;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
 
         if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
                 return 0;
@@ -462,7 +465,7 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
         return 1;
 }
 
         return 1;
 }
 
-static int bus_job_enumerate(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+static int bus_job_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
         _cleanup_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
@@ -489,7 +492,7 @@ static int bus_job_enumerate(sd_bus *bus, const char *path, char ***nodes, void
         return k;
 }
 
         return k;
 }
 
-static int bus_unit_enumerate(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+static int bus_unit_enumerate(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
         _cleanup_free_ char **l = NULL;
         Manager *m = userdata;
         unsigned k = 0;
index 06be5ed7d8ff9ea935fe22b3164f4d9a9621d51c..7c8a774e73f7cd8ed46936f09e6bf2c3da91eed9 100644 (file)
@@ -33,7 +33,8 @@ static int node_vtable_get_userdata(
                 sd_bus *bus,
                 const char *path,
                 struct node_vtable *c,
                 sd_bus *bus,
                 const char *path,
                 struct node_vtable *c,
-                void **userdata) {
+                void **userdata,
+                sd_bus_error *error) {
 
         void *u;
         int r;
 
         void *u;
         int r;
@@ -44,8 +45,12 @@ static int node_vtable_get_userdata(
 
         u = c->userdata;
         if (c->find) {
 
         u = c->userdata;
         if (c->find) {
-                r = c->find(bus, path, c->interface, &u, u);
-                if (r <= 0)
+                r = c->find(bus, path, c->interface, u, &u, error);
+                if (r < 0)
+                        return r;
+                if (sd_bus_error_is_set(error))
+                        return sd_bus_error_get_errno(error);
+                if (r == 0)
                         return r;
         }
 
                         return r;
         }
 
@@ -65,7 +70,8 @@ static int vtable_property_get_userdata(
                 sd_bus *bus,
                 const char *path,
                 struct vtable_member *p,
                 sd_bus *bus,
                 const char *path,
                 struct vtable_member *p,
-                void **userdata) {
+                void **userdata,
+                sd_bus_error *error) {
 
         void *u;
         int r;
 
         void *u;
         int r;
@@ -75,7 +81,7 @@ static int vtable_property_get_userdata(
         assert(p);
         assert(userdata);
 
         assert(p);
         assert(userdata);
 
-        r = node_vtable_get_userdata(bus, path, p->parent, &u);
+        r = node_vtable_get_userdata(bus, path, p->parent, &u, error);
         if (r <= 0)
                 return r;
         if (bus->nodes_modified)
         if (r <= 0)
                 return r;
         if (bus->nodes_modified)
@@ -89,7 +95,8 @@ static int add_enumerated_to_set(
                 sd_bus *bus,
                 const char *prefix,
                 struct node_enumerator *first,
                 sd_bus *bus,
                 const char *prefix,
                 struct node_enumerator *first,
-                Set *s) {
+                Set *s,
+                sd_bus_error *error) {
 
         struct node_enumerator *c;
         int r;
 
         struct node_enumerator *c;
         int r;
@@ -104,9 +111,11 @@ static int add_enumerated_to_set(
                 if (bus->nodes_modified)
                         return 0;
 
                 if (bus->nodes_modified)
                         return 0;
 
-                r = c->callback(bus, prefix, &children, c->userdata);
+                r = c->callback(bus, prefix, c->userdata, &children, error);
                 if (r < 0)
                         return r;
                 if (r < 0)
                         return r;
+                if (sd_bus_error_is_set(error))
+                        return sd_bus_error_get_errno(error);
 
                 STRV_FOREACH(k, children) {
                         if (r < 0) {
 
                 STRV_FOREACH(k, children) {
                         if (r < 0) {
@@ -140,7 +149,8 @@ static int add_subtree_to_set(
                 sd_bus *bus,
                 const char *prefix,
                 struct node *n,
                 sd_bus *bus,
                 const char *prefix,
                 struct node *n,
-                Set *s) {
+                Set *s,
+                sd_bus_error *error) {
 
         struct node *i;
         int r;
 
         struct node *i;
         int r;
@@ -150,7 +160,7 @@ static int add_subtree_to_set(
         assert(n);
         assert(s);
 
         assert(n);
         assert(s);
 
-        r = add_enumerated_to_set(bus, prefix, n->enumerators, s);
+        r = add_enumerated_to_set(bus, prefix, n->enumerators, s, error);
         if (r < 0)
                 return r;
         if (bus->nodes_modified)
         if (r < 0)
                 return r;
         if (bus->nodes_modified)
@@ -170,7 +180,7 @@ static int add_subtree_to_set(
                 if (r < 0 && r != -EEXIST)
                         return r;
 
                 if (r < 0 && r != -EEXIST)
                         return r;
 
-                r = add_subtree_to_set(bus, prefix, i, s);
+                r = add_subtree_to_set(bus, prefix, i, s, error);
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
@@ -184,7 +194,8 @@ static int get_child_nodes(
                 sd_bus *bus,
                 const char *prefix,
                 struct node *n,
                 sd_bus *bus,
                 const char *prefix,
                 struct node *n,
-                Set **_s) {
+                Set **_s,
+                sd_bus_error *error) {
 
         Set *s = NULL;
         int r;
 
         Set *s = NULL;
         int r;
@@ -198,7 +209,7 @@ static int get_child_nodes(
         if (!s)
                 return -ENOMEM;
 
         if (!s)
                 return -ENOMEM;
 
-        r = add_subtree_to_set(bus, prefix, n, s);
+        r = add_subtree_to_set(bus, prefix, n, s, error);
         if (r < 0) {
                 set_free_free(s);
                 return r;
         if (r < 0) {
                 set_free_free(s);
                 return r;
@@ -258,6 +269,7 @@ static int method_callbacks_run(
                 bool require_fallback,
                 bool *found_object) {
 
                 bool require_fallback,
                 bool *found_object) {
 
+        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         const char *signature;
         void *u;
         int r;
         const char *signature;
         void *u;
         int r;
@@ -270,9 +282,9 @@ static int method_callbacks_run(
         if (require_fallback && !c->parent->is_fallback)
                 return 0;
 
         if (require_fallback && !c->parent->is_fallback)
                 return 0;
 
-        r = node_vtable_get_userdata(bus, m->path, c->parent, &u);
+        r = node_vtable_get_userdata(bus, m->path, c->parent, &u, &error);
         if (r <= 0)
         if (r <= 0)
-                return r;
+                return bus_maybe_reply_error(m, r, &error);
         if (bus->nodes_modified)
                 return 0;
 
         if (bus->nodes_modified)
                 return 0;
 
@@ -291,20 +303,16 @@ static int method_callbacks_run(
         if (!signature)
                 return -EINVAL;
 
         if (!signature)
                 return -EINVAL;
 
-        if (!streq(strempty(c->vtable->x.method.signature), signature)) {
+        if (!streq(strempty(c->vtable->x.method.signature), signature))
                 return sd_bus_reply_method_errorf(
                                 m,
                                 SD_BUS_ERROR_INVALID_ARGS,
                                 "Invalid arguments '%s' to call %s.%s(), expecting '%s'.",
                                 signature, c->interface, c->member, strempty(c->vtable->x.method.signature));
                 return sd_bus_reply_method_errorf(
                                 m,
                                 SD_BUS_ERROR_INVALID_ARGS,
                                 "Invalid arguments '%s' to call %s.%s(), expecting '%s'.",
                                 signature, c->interface, c->member, strempty(c->vtable->x.method.signature));
-        }
 
         if (c->vtable->x.method.handler) {
 
         if (c->vtable->x.method.handler) {
-                _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
-
-                r = c->vtable->x.method.handler(bus, m, u, &error_buffer);
-
-                return bus_maybe_reply_error(m, r, &error_buffer);
+                r = c->vtable->x.method.handler(bus, m, u, &error);
+                return bus_maybe_reply_error(m, r, &error);
         }
 
         /* If the method callback is NULL, make this a successful NOP */
         }
 
         /* If the method callback is NULL, make this a successful NOP */
@@ -326,6 +334,7 @@ static int invoke_property_get(
                 sd_bus_error *error) {
 
         const void *p;
                 sd_bus_error *error) {
 
         const void *p;
+        int r;
 
         assert(bus);
         assert(v);
 
         assert(bus);
         assert(v);
@@ -334,8 +343,14 @@ static int invoke_property_get(
         assert(property);
         assert(reply);
 
         assert(property);
         assert(reply);
 
-        if (v->x.property.get)
-                return v->x.property.get(bus, path, interface, property, reply, userdata, error);
+        if (v->x.property.get) {
+                r = v->x.property.get(bus, path, interface, property, reply, userdata, error);
+                if (r < 0)
+                        return r;
+                if (sd_bus_error_is_set(error))
+                        return sd_bus_error_get_errno(error);
+                return r;
+        }
 
         /* Automatic handling if no callback is defined. */
 
 
         /* Automatic handling if no callback is defined. */
 
@@ -384,8 +399,14 @@ static int invoke_property_set(
         assert(property);
         assert(value);
 
         assert(property);
         assert(value);
 
-        if (v->x.property.set)
-                return v->x.property.set(bus, path, interface, property, value, userdata, error);
+        if (v->x.property.set) {
+                r = v->x.property.set(bus, path, interface, property, value, userdata, error);
+                if (r < 0)
+                        return r;
+                if (sd_bus_error_is_set(error))
+                        return sd_bus_error_get_errno(error);
+                return r;
+        }
 
         /*  Automatic handling if no callback is defined. */
 
 
         /*  Automatic handling if no callback is defined. */
 
@@ -446,9 +467,9 @@ static int property_get_set_callbacks_run(
         if (require_fallback && !c->parent->is_fallback)
                 return 0;
 
         if (require_fallback && !c->parent->is_fallback)
                 return 0;
 
-        r = vtable_property_get_userdata(bus, m->path, c, &u);
+        r = vtable_property_get_userdata(bus, m->path, c, &u, &error);
         if (r <= 0)
         if (r <= 0)
-                return r;
+                return bus_maybe_reply_error(m, r, &error);
         if (bus->nodes_modified)
                 return 0;
 
         if (bus->nodes_modified)
                 return 0;
 
@@ -472,9 +493,7 @@ static int property_get_set_callbacks_run(
 
                 r = invoke_property_get(bus, c->vtable, m->path, c->interface, c->member, reply, u, &error);
                 if (r < 0)
 
                 r = invoke_property_get(bus, c->vtable, m->path, c->interface, c->member, reply, u, &error);
                 if (r < 0)
-                        return sd_bus_reply_method_errno(m, r, &error);
-                if (sd_bus_error_is_set(&error))
-                        return sd_bus_reply_method_error(m, &error);
+                        return bus_maybe_reply_error(m, r, &error);
 
                 if (bus->nodes_modified)
                         return 0;
 
                 if (bus->nodes_modified)
                         return 0;
@@ -501,9 +520,7 @@ static int property_get_set_callbacks_run(
 
                 r = invoke_property_set(bus, c->vtable, m->path, c->interface, c->member, m, u, &error);
                 if (r < 0)
 
                 r = invoke_property_set(bus, c->vtable, m->path, c->interface, c->member, m, u, &error);
                 if (r < 0)
-                        return sd_bus_reply_method_errno(m, r, &error);
-                if (sd_bus_error_is_set(&error))
-                        return sd_bus_reply_method_error(m, &error);
+                        return bus_maybe_reply_error(m, r, &error);
 
                 if (bus->nodes_modified)
                         return 0;
 
                 if (bus->nodes_modified)
                         return 0;
@@ -553,12 +570,8 @@ static int vtable_append_all_properties(
                         return r;
 
                 r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, vtable_property_convert_userdata(v, userdata), error);
                         return r;
 
                 r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, vtable_property_convert_userdata(v, userdata), error);
-                if (sd_bus_error_is_set(error))
-                        return 0;
-                if (r < 0) {
-                        sd_bus_error_set_errno(error, r);
-                        return 0;
-                }
+                if (r < 0)
+                        return r;
                 if (bus->nodes_modified)
                         return 0;
 
                 if (bus->nodes_modified)
                         return 0;
 
@@ -611,9 +624,9 @@ static int property_get_all_callbacks_run(
                 if (require_fallback && !c->is_fallback)
                         continue;
 
                 if (require_fallback && !c->is_fallback)
                         continue;
 
-                r = node_vtable_get_userdata(bus, m->path, c, &u);
+                r = node_vtable_get_userdata(bus, m->path, c, &u, &error);
                 if (r < 0)
                 if (r < 0)
-                        return r;
+                        return bus_maybe_reply_error(m, r, &error);
                 if (bus->nodes_modified)
                         return 0;
                 if (r == 0)
                 if (bus->nodes_modified)
                         return 0;
                 if (r == 0)
@@ -627,15 +640,7 @@ static int property_get_all_callbacks_run(
 
                 r = vtable_append_all_properties(bus, reply, m->path, c, u, &error);
                 if (r < 0)
 
                 r = vtable_append_all_properties(bus, reply, m->path, c, u, &error);
                 if (r < 0)
-                        return r;
-
-                if (sd_bus_error_is_set(&error)) {
-                        r = sd_bus_reply_method_error(m, &error);
-                        if (r < 0)
-                                return r;
-
-                        return 1;
-                }
+                        return bus_maybe_reply_error(m, r, &error);
                 if (bus->nodes_modified)
                         return 0;
         }
                 if (bus->nodes_modified)
                         return 0;
         }
@@ -699,11 +704,12 @@ static bool bus_node_exists(
         }
 
         LIST_FOREACH(vtables, c, n->vtables) {
         }
 
         LIST_FOREACH(vtables, c, n->vtables) {
+                _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
 
                 if (require_fallback && !c->is_fallback)
                         continue;
 
 
                 if (require_fallback && !c->is_fallback)
                         continue;
 
-                if (node_vtable_get_userdata(bus, path, c, NULL) > 0)
+                if (node_vtable_get_userdata(bus, path, c, NULL, &error) > 0)
                         return true;
                 if (bus->nodes_modified)
                         return false;
                         return true;
                 if (bus->nodes_modified)
                         return false;
@@ -719,6 +725,7 @@ static int process_introspect(
                 bool require_fallback,
                 bool *found_object) {
 
                 bool require_fallback,
                 bool *found_object) {
 
+        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_set_free_free_ Set *s = NULL;
         const char *previous_interface = NULL;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_set_free_free_ Set *s = NULL;
         const char *previous_interface = NULL;
@@ -732,9 +739,9 @@ static int process_introspect(
         assert(n);
         assert(found_object);
 
         assert(n);
         assert(found_object);
 
-        r = get_child_nodes(bus, m->path, n, &s);
+        r = get_child_nodes(bus, m->path, n, &s, &error);
         if (r < 0)
         if (r < 0)
-                return r;
+                return bus_maybe_reply_error(m, r, &error);
         if (bus->nodes_modified)
                 return 0;
 
         if (bus->nodes_modified)
                 return 0;
 
@@ -752,11 +759,15 @@ static int process_introspect(
                 if (require_fallback && !c->is_fallback)
                         continue;
 
                 if (require_fallback && !c->is_fallback)
                         continue;
 
-                r = node_vtable_get_userdata(bus, m->path, c, NULL);
-                if (r < 0)
-                        return r;
-                if (bus->nodes_modified)
-                        return 0;
+                r = node_vtable_get_userdata(bus, m->path, c, NULL, &error);
+                if (r < 0) {
+                        r = bus_maybe_reply_error(m, r, &error);
+                        goto finish;
+                }
+                if (bus->nodes_modified) {
+                        r = 0;
+                        goto finish;
+                }
                 if (r == 0)
                         continue;
 
                 if (r == 0)
                         continue;
 
@@ -843,7 +854,7 @@ static int object_manager_serialize_path(
                 if (require_fallback && !i->is_fallback)
                         continue;
 
                 if (require_fallback && !i->is_fallback)
                         continue;
 
-                r = node_vtable_get_userdata(bus, path, i, &u);
+                r = node_vtable_get_userdata(bus, path, i, &u, error);
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
@@ -902,8 +913,6 @@ static int object_manager_serialize_path(
                 r = vtable_append_all_properties(bus, reply, path, i, u, error);
                 if (r < 0)
                         return r;
                 r = vtable_append_all_properties(bus, reply, path, i, u, error);
                 if (r < 0)
                         return r;
-                if (sd_bus_error_is_set(error))
-                        return 0;
                 if (bus->nodes_modified)
                         return 0;
 
                 if (bus->nodes_modified)
                         return 0;
 
@@ -951,8 +960,6 @@ static int object_manager_serialize_path_and_fallbacks(
         r = object_manager_serialize_path(bus, reply, path, path, false, error);
         if (r < 0)
                 return r;
         r = object_manager_serialize_path(bus, reply, path, path, false, error);
         if (r < 0)
                 return r;
-        if (sd_bus_error_is_set(error))
-                return 0;
         if (bus->nodes_modified)
                 return 0;
 
         if (bus->nodes_modified)
                 return 0;
 
@@ -962,8 +969,6 @@ static int object_manager_serialize_path_and_fallbacks(
                 r = object_manager_serialize_path(bus, reply, prefix, path, true, error);
                 if (r < 0)
                         return r;
                 r = object_manager_serialize_path(bus, reply, prefix, path, true, error);
                 if (r < 0)
                         return r;
-                if (sd_bus_error_is_set(error))
-                        return 0;
                 if (bus->nodes_modified)
                         return 0;
         }
                 if (bus->nodes_modified)
                         return 0;
         }
@@ -978,6 +983,7 @@ static int process_get_managed_objects(
                 bool require_fallback,
                 bool *found_object) {
 
                 bool require_fallback,
                 bool *found_object) {
 
+        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_set_free_free_ Set *s = NULL;
         bool empty;
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_set_free_free_ Set *s = NULL;
         bool empty;
@@ -991,7 +997,7 @@ static int process_get_managed_objects(
         if (!bus_node_with_object_manager(bus, n))
                 return 0;
 
         if (!bus_node_with_object_manager(bus, n))
                 return 0;
 
-        r = get_child_nodes(bus, m->path, n, &s);
+        r = get_child_nodes(bus, m->path, n, &s, &error);
         if (r < 0)
                 return r;
         if (bus->nodes_modified)
         if (r < 0)
                 return r;
         if (bus->nodes_modified)
@@ -1034,19 +1040,9 @@ static int process_get_managed_objects(
                 char *path;
 
                 SET_FOREACH(path, s, i) {
                 char *path;
 
                 SET_FOREACH(path, s, i) {
-                        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
-
                         r = object_manager_serialize_path_and_fallbacks(bus, reply, path, &error);
                         if (r < 0)
                         r = object_manager_serialize_path_and_fallbacks(bus, reply, path, &error);
                         if (r < 0)
-                                return -ENOMEM;
-
-                        if (sd_bus_error_is_set(&error)) {
-                                r = sd_bus_reply_method_error(m, &error);
-                                if (r < 0)
-                                        return r;
-
-                                return 1;
-                        }
+                                return r;
 
                         if (bus->nodes_modified)
                                 return 0;
 
                         if (bus->nodes_modified)
                                 return 0;
@@ -1851,6 +1847,7 @@ static int emit_properties_changed_on_interface(
                 bool require_fallback,
                 char **names) {
 
                 bool require_fallback,
                 char **names) {
 
+        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
         bool has_invalidating = false, has_changing = false;
         struct vtable_member key = {};
         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
         bool has_invalidating = false, has_changing = false;
         struct vtable_member key = {};
@@ -1891,7 +1888,7 @@ static int emit_properties_changed_on_interface(
                 if (!streq(c->interface, interface))
                         continue;
 
                 if (!streq(c->interface, interface))
                         continue;
 
-                r = node_vtable_get_userdata(bus, path, c, &u);
+                r = node_vtable_get_userdata(bus, path, c, &u, &error);
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
@@ -1900,7 +1897,6 @@ static int emit_properties_changed_on_interface(
                         continue;
 
                 STRV_FOREACH(property, names) {
                         continue;
 
                 STRV_FOREACH(property, names) {
-                        _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
                         struct vtable_member *v;
 
                         assert_return(member_name_is_valid(*property), -EINVAL);
                         struct vtable_member *v;
 
                         assert_return(member_name_is_valid(*property), -EINVAL);
@@ -1940,8 +1936,6 @@ static int emit_properties_changed_on_interface(
                         r = invoke_property_get(bus, v->vtable, m->path, interface, *property, m, vtable_property_convert_userdata(v->vtable, u), &error);
                         if (r < 0)
                                 return r;
                         r = invoke_property_get(bus, v->vtable, m->path, interface, *property, m, vtable_property_convert_userdata(v->vtable, u), &error);
                         if (r < 0)
                                 return r;
-                        if (sd_bus_error_is_set(&error))
-                                return sd_bus_error_get_errno(&error);
                         if (bus->nodes_modified)
                                 return 0;
 
                         if (bus->nodes_modified)
                                 return 0;
 
@@ -1974,7 +1968,7 @@ static int emit_properties_changed_on_interface(
                         if (!streq(c->interface, interface))
                                 continue;
 
                         if (!streq(c->interface, interface))
                                 continue;
 
-                        r = node_vtable_get_userdata(bus, path, c, &u);
+                        r = node_vtable_get_userdata(bus, path, c, &u, &error);
                         if (r < 0)
                                 return r;
                         if (bus->nodes_modified)
                         if (r < 0)
                                 return r;
                         if (bus->nodes_modified)
@@ -2106,7 +2100,7 @@ static int interfaces_added_append_one_prefix(
                 if (!streq(c->interface, interface))
                         continue;
 
                 if (!streq(c->interface, interface))
                         continue;
 
-                r = node_vtable_get_userdata(bus, path, c, &u);
+                r = node_vtable_get_userdata(bus, path, c, &u, &error);
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
                 if (r < 0)
                         return r;
                 if (bus->nodes_modified)
index 043aa90b3c82d01e0ff47ef4edb5173380cec095..95278e36e3ee56ff9b69c7fd767a5ed80dc11541 100644 (file)
@@ -182,7 +182,7 @@ static const sd_bus_vtable vtable2[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-static int enumerator_callback(sd_bus *b, const char *path, char ***nodes, void *userdata) {
+static int enumerator_callback(sd_bus *b, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
 
         if (object_path_startswith("/value", path))
                 assert_se(*nodes = strv_new("/value/a", "/value/b", "/value/c", NULL));
 
         if (object_path_startswith("/value", path))
                 assert_se(*nodes = strv_new("/value/a", "/value/b", "/value/c", NULL));
index 488d007c7eaf0c59185c0cff81b2683da42d4cfd..f274c0d6396f47f804235788af7c166d79968bcd 100644 (file)
@@ -254,7 +254,7 @@ const sd_bus_vtable seat_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-int seat_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+int seat_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Seat *seat;
         int r;
         Manager *m = userdata;
         Seat *seat;
         int r;
@@ -319,7 +319,7 @@ char *seat_bus_path(Seat *s) {
         return strappend("/org/freedesktop/login1/seat/", t);
 }
 
         return strappend("/org/freedesktop/login1/seat/", t);
 }
 
-int seat_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+int seat_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         Seat *seat;
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         Seat *seat;
index 0547dec0723d6c4d2978976b01ce82018326fae1..80c6b8bd92f8343062ff928a4d7e2e120dbfe36d 100644 (file)
@@ -82,8 +82,8 @@ bool seat_name_is_valid(const char *name);
 
 extern const sd_bus_vtable seat_vtable[];
 
 
 extern const sd_bus_vtable seat_vtable[];
 
-int seat_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata);
-int seat_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *seatdata);
+int seat_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
+int seat_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
 char *seat_bus_path(Seat *s);
 
 int seat_send_signal(Seat *s, bool new_seat);
 char *seat_bus_path(Seat *s);
 
 int seat_send_signal(Seat *s, bool new_seat);
index d2e2364fc2b0431a20273010fa02d3dd79a2189e..9f3217baf5041b0642080526c0624833e60036ed 100644 (file)
@@ -465,7 +465,7 @@ const sd_bus_vtable session_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-int session_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+int session_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Session *session;
         int r;
         Manager *m = userdata;
         Session *session;
         int r;
@@ -524,7 +524,7 @@ char *session_bus_path(Session *s) {
         return strappend("/org/freedesktop/login1/session/", t);
 }
 
         return strappend("/org/freedesktop/login1/session/", t);
 }
 
-int session_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+int session_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         Session *session;
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         Session *session;
index bcbd4e56250931202d96b87b23f357212e62efd9..f7a9dbc24932c77dff1724e26fc38a7afa8f528c 100644 (file)
@@ -139,8 +139,8 @@ int session_kill(Session *s, KillWho who, int signo);
 SessionState session_get_state(Session *u);
 
 extern const sd_bus_vtable session_vtable[];
 SessionState session_get_state(Session *u);
 
 extern const sd_bus_vtable session_vtable[];
-int session_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata);
-int session_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata);
+int session_node_enumerator(sd_bus *bus, const char *path,void *userdata, char ***nodes, sd_bus_error *error);
+int session_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
 char *session_bus_path(Session *s);
 
 int session_send_signal(Session *s, bool new_session);
 char *session_bus_path(Session *s);
 
 int session_send_signal(Session *s, bool new_session);
index 3942fa9beccf57ffcb6614da2b6f7cb8a7dcdc92..6a77e33eeae453ad3f2915ad573e5c7e7aa6551c 100644 (file)
@@ -235,7 +235,7 @@ const sd_bus_vtable user_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-int user_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+int user_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         User *user;
         int r;
         Manager *m = userdata;
         User *user;
         int r;
@@ -293,7 +293,7 @@ char *user_bus_path(User *u) {
         return s;
 }
 
         return s;
 }
 
-int user_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+int user_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         User *user;
         _cleanup_strv_free_ char **l = NULL;
         Manager *m = userdata;
         User *user;
index 8d396c681d471916f22b29bc85ccd4fb73c0d04c..8d5f119e66f6c198a6f7d7b4abdfb675c01f2594 100644 (file)
@@ -82,8 +82,8 @@ int user_kill(User *u, int signo);
 int user_check_linger_file(User *u);
 
 extern const sd_bus_vtable user_vtable[];
 int user_check_linger_file(User *u);
 
 extern const sd_bus_vtable user_vtable[];
-int user_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata);
-int user_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata);
+int user_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
+int user_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
 char *user_bus_path(User *s);
 
 int user_send_signal(User *u, bool new_user);
 char *user_bus_path(User *s);
 
 int user_send_signal(User *u, bool new_user);
index 2c7f3a798e239f07900a042ff3b4450915119b4d..c6a794b5e838f483b1ca5cade04ef48d1ebaa814 100644 (file)
@@ -142,7 +142,7 @@ const sd_bus_vtable machine_vtable[] = {
         SD_BUS_VTABLE_END
 };
 
         SD_BUS_VTABLE_END
 };
 
-int machine_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
+int machine_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
         Manager *m = userdata;
         Machine *machine;
         int r;
         Manager *m = userdata;
         Machine *machine;
         int r;
@@ -201,7 +201,7 @@ char *machine_bus_path(Machine *m) {
         return strappend("/org/freedesktop/machine1/machine/", e);
 }
 
         return strappend("/org/freedesktop/machine1/machine/", e);
 }
 
-int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) {
+int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) {
         _cleanup_strv_free_ char **l = NULL;
         Machine *machine = NULL;
         Manager *m = userdata;
         _cleanup_strv_free_ char **l = NULL;
         Machine *machine = NULL;
         Manager *m = userdata;
index 99ee25888e70aab82133696ca518fff6430de325..62e4b2b340204b1235700274b1f1b0816aa43b79 100644 (file)
@@ -93,7 +93,8 @@ MachineState machine_get_state(Machine *u);
 extern const sd_bus_vtable machine_vtable[];
 
 char *machine_bus_path(Machine *s);
 extern const sd_bus_vtable machine_vtable[];
 
 char *machine_bus_path(Machine *s);
-int machine_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata);
+int machine_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error);
+int machine_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error);
 
 int machine_send_signal(Machine *m, bool new_machine);
 int machine_send_create_reply(Machine *m, sd_bus_error *error);
 
 int machine_send_signal(Machine *m, bool new_machine);
 int machine_send_create_reply(Machine *m, sd_bus_error *error);
index 0b074c4e8a34ac1fa2adcbce438aed0969e5a67e..d4b581be7a9c4ed3c83de4e85e89ce8ce9c9f51c 100644 (file)
@@ -60,8 +60,6 @@ int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine);
 
 extern const sd_bus_vtable manager_vtable[];
 
 
 extern const sd_bus_vtable manager_vtable[];
 
-int machine_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata);
-
 int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
 int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
 int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
 int match_reloading(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
 int match_unit_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
 int match_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);
index 582720815a0c2b904d4b2da671c45b7be0c27d09..8954e38791f473e67110b98594121819d5ec9a3d 100644 (file)
@@ -49,8 +49,8 @@ typedef struct {
 typedef int (*sd_bus_message_handler_t)(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error);
 typedef int (*sd_bus_property_get_t) (sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *ret_error);
 typedef int (*sd_bus_property_set_t) (sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *ret_error);
 typedef int (*sd_bus_message_handler_t)(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error);
 typedef int (*sd_bus_property_get_t) (sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *reply, void *userdata, sd_bus_error *ret_error);
 typedef int (*sd_bus_property_set_t) (sd_bus *bus, const char *path, const char *interface, const char *property, sd_bus_message *value, void *userdata, sd_bus_error *ret_error);
-typedef int (*sd_bus_object_find_t) (sd_bus *bus, const char *path, const char *interface, void **found, void *userdata);
-typedef int (*sd_bus_node_enumerator_t) (sd_bus *bus, const char *path, char ***nodes, void *userdata);
+typedef int (*sd_bus_object_find_t) (sd_bus *bus, const char *path, const char *interface, void *userdata, void **ret_found, sd_bus_error *ret_error);
+typedef int (*sd_bus_node_enumerator_t) (sd_bus *bus, const char *path, void *userdata, char ***ret_nodes, sd_bus_error *ret_error);
 
 #include "sd-bus-protocol.h"
 #include "sd-bus-vtable.h"
 
 #include "sd-bus-protocol.h"
 #include "sd-bus-vtable.h"