1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

bus: also add error parameter to object find and enumerator callbacks

Just in order to bring things inline with the method and property
callbacks.
This commit is contained in:
Lennart Poettering 2013-11-22 01:14:57 +01:00
parent 969987ea93
commit f00c31213a
14 changed files with 145 additions and 147 deletions

2
TODO
View File

@ -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 * add API to clone sd_bus_message objects
* sd-bus: synthesized messages should get serial number (uint32_t) -1 * sd-bus: synthesized messages should get serial number (uint32_t) -1

View 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; Manager *m = userdata;
Job *j; Job *j;
int r; 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; Unit *u;
int r; int r;
@ -305,43 +305,28 @@ static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) {
message = sd_bus_get_current(bus); message = sd_bus_get_current(bus);
if (!message) if (!message)
return NULL; return 0;
r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
if (r < 0) if (r < 0)
return NULL; return 0;
u = manager_get_unit_by_pid(m, pid); u = manager_get_unit_by_pid(m, pid);
} else { } 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;
}
static int bus_unit_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) {
Manager *m = userdata;
Unit *u;
assert(bus);
assert(path);
assert(interface);
assert(found);
assert(m);
u = find_unit(m, bus, path);
if (!u) if (!u)
return 0; return 0;
*found = u; *unit = u;
return 1; return 1;
} }
static int bus_unit_interface_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(bus);
assert(path); assert(path);
@ -349,9 +334,23 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
assert(found); assert(found);
assert(m); assert(m);
u = find_unit(m, bus, path); return find_unit(m, bus, path, (Unit**) found, error);
if (!u) }
return 0;
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;
int r;
assert(bus);
assert(path);
assert(interface);
assert(found);
assert(m);
r = find_unit(m, bus, path, &u, error);
if (r <= 0)
return r;
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
return 0; 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; Manager *m = userdata;
Unit *u; Unit *u;
int r;
assert(bus); assert(bus);
assert(path); assert(path);
@ -370,9 +370,9 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter
assert(found); assert(found);
assert(m); assert(m);
u = find_unit(m, bus, path); r = find_unit(m, bus, path, &u, error);
if (!u) if (r <= 0)
return 0; return r;
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
return 0; 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; Manager *m = userdata;
CGroupContext *c; CGroupContext *c;
Unit *u; Unit *u;
int r;
assert(bus); assert(bus);
assert(path); assert(path);
@ -395,9 +396,9 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in
assert(found); assert(found);
assert(m); assert(m);
u = find_unit(m, bus, path); r = find_unit(m, bus, path, &u, error);
if (!u) if (r <= 0)
return 0; return r;
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
return 0; 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; Manager *m = userdata;
ExecContext *c; ExecContext *c;
Unit *u; Unit *u;
int r;
assert(bus); assert(bus);
assert(path); assert(path);
@ -421,9 +423,9 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte
assert(found); assert(found);
assert(m); assert(m);
u = find_unit(m, bus, path); r = find_unit(m, bus, path, &u, error);
if (!u) if (r <= 0)
return 0; return r;
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
return 0; 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; Manager *m = userdata;
KillContext *c; KillContext *c;
Unit *u; Unit *u;
int r;
assert(bus); assert(bus);
assert(path); assert(path);
@ -447,9 +450,9 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
assert(found); assert(found);
assert(m); assert(m);
u = find_unit(m, bus, path); r = find_unit(m, bus, path, &u, error);
if (!u) if (r <= 0)
return 0; return r;
if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface)) if (!streq_ptr(interface, UNIT_VTABLE(u)->bus_interface))
return 0; 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; _cleanup_free_ char **l = NULL;
Manager *m = userdata; Manager *m = userdata;
unsigned k = 0; 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; _cleanup_free_ char **l = NULL;
Manager *m = userdata; Manager *m = userdata;
unsigned k = 0; unsigned k = 0;

View File

@ -33,7 +33,8 @@ static int node_vtable_get_userdata(
sd_bus *bus, sd_bus *bus,
const char *path, const char *path,
struct node_vtable *c, struct node_vtable *c,
void **userdata) { void **userdata,
sd_bus_error *error) {
void *u; void *u;
int r; int r;
@ -44,8 +45,12 @@ static int node_vtable_get_userdata(
u = c->userdata; u = c->userdata;
if (c->find) { if (c->find) {
r = c->find(bus, path, c->interface, &u, u); r = c->find(bus, path, c->interface, u, &u, error);
if (r <= 0) 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, sd_bus *bus,
const char *path, const char *path,
struct vtable_member *p, struct vtable_member *p,
void **userdata) { void **userdata,
sd_bus_error *error) {
void *u; void *u;
int r; int r;
@ -75,7 +81,7 @@ static int vtable_property_get_userdata(
assert(p); assert(p);
assert(userdata); 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) if (r <= 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -89,7 +95,8 @@ static int add_enumerated_to_set(
sd_bus *bus, sd_bus *bus,
const char *prefix, const char *prefix,
struct node_enumerator *first, struct node_enumerator *first,
Set *s) { Set *s,
sd_bus_error *error) {
struct node_enumerator *c; struct node_enumerator *c;
int r; int r;
@ -104,9 +111,11 @@ static int add_enumerated_to_set(
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
r = c->callback(bus, prefix, &children, c->userdata); r = c->callback(bus, prefix, c->userdata, &children, error);
if (r < 0) if (r < 0)
return r; return r;
if (sd_bus_error_is_set(error))
return sd_bus_error_get_errno(error);
STRV_FOREACH(k, children) { STRV_FOREACH(k, children) {
if (r < 0) { if (r < 0) {
@ -140,7 +149,8 @@ static int add_subtree_to_set(
sd_bus *bus, sd_bus *bus,
const char *prefix, const char *prefix,
struct node *n, struct node *n,
Set *s) { Set *s,
sd_bus_error *error) {
struct node *i; struct node *i;
int r; int r;
@ -150,7 +160,7 @@ static int add_subtree_to_set(
assert(n); assert(n);
assert(s); 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) if (r < 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -170,7 +180,7 @@ static int add_subtree_to_set(
if (r < 0 && r != -EEXIST) if (r < 0 && r != -EEXIST)
return r; return r;
r = add_subtree_to_set(bus, prefix, i, s); r = add_subtree_to_set(bus, prefix, i, s, error);
if (r < 0) if (r < 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -184,7 +194,8 @@ static int get_child_nodes(
sd_bus *bus, sd_bus *bus,
const char *prefix, const char *prefix,
struct node *n, struct node *n,
Set **_s) { Set **_s,
sd_bus_error *error) {
Set *s = NULL; Set *s = NULL;
int r; int r;
@ -198,7 +209,7 @@ static int get_child_nodes(
if (!s) if (!s)
return -ENOMEM; return -ENOMEM;
r = add_subtree_to_set(bus, prefix, n, s); r = add_subtree_to_set(bus, prefix, n, s, error);
if (r < 0) { if (r < 0) {
set_free_free(s); set_free_free(s);
return r; return r;
@ -258,6 +269,7 @@ static int method_callbacks_run(
bool require_fallback, bool require_fallback,
bool *found_object) { bool *found_object) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
const char *signature; const char *signature;
void *u; void *u;
int r; int r;
@ -270,9 +282,9 @@ static int method_callbacks_run(
if (require_fallback && !c->parent->is_fallback) if (require_fallback && !c->parent->is_fallback)
return 0; 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) if (bus->nodes_modified)
return 0; return 0;
@ -291,20 +303,16 @@ static int method_callbacks_run(
if (!signature) if (!signature)
return -EINVAL; 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( return sd_bus_reply_method_errorf(
m, m,
SD_BUS_ERROR_INVALID_ARGS, SD_BUS_ERROR_INVALID_ARGS,
"Invalid arguments '%s' to call %s.%s(), expecting '%s'.", "Invalid arguments '%s' to call %s.%s(), expecting '%s'.",
signature, c->interface, c->member, strempty(c->vtable->x.method.signature)); 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);
return bus_maybe_reply_error(m, r, &error);
r = c->vtable->x.method.handler(bus, m, u, &error_buffer);
return bus_maybe_reply_error(m, r, &error_buffer);
} }
/* 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) { sd_bus_error *error) {
const void *p; const void *p;
int r;
assert(bus); assert(bus);
assert(v); assert(v);
@ -334,8 +343,14 @@ static int invoke_property_get(
assert(property); assert(property);
assert(reply); assert(reply);
if (v->x.property.get) if (v->x.property.get) {
return v->x.property.get(bus, path, interface, property, reply, userdata, error); 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(property);
assert(value); assert(value);
if (v->x.property.set) if (v->x.property.set) {
return v->x.property.set(bus, path, interface, property, value, userdata, error); 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) if (require_fallback && !c->parent->is_fallback)
return 0; 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) if (bus->nodes_modified)
return 0; 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); r = invoke_property_get(bus, c->vtable, m->path, c->interface, c->member, reply, u, &error);
if (r < 0) if (r < 0)
return sd_bus_reply_method_errno(m, r, &error); return bus_maybe_reply_error(m, r, &error);
if (sd_bus_error_is_set(&error))
return sd_bus_reply_method_error(m, &error);
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; 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); r = invoke_property_set(bus, c->vtable, m->path, c->interface, c->member, m, u, &error);
if (r < 0) if (r < 0)
return sd_bus_reply_method_errno(m, r, &error); return bus_maybe_reply_error(m, r, &error);
if (sd_bus_error_is_set(&error))
return sd_bus_reply_method_error(m, &error);
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
@ -553,12 +570,8 @@ static int vtable_append_all_properties(
return r; return r;
r = invoke_property_get(bus, v, path, c->interface, v->x.property.member, reply, vtable_property_convert_userdata(v, userdata), error); 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)) if (r < 0)
return 0; return r;
if (r < 0) {
sd_bus_error_set_errno(error, r);
return 0;
}
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
@ -611,9 +624,9 @@ static int property_get_all_callbacks_run(
if (require_fallback && !c->is_fallback) if (require_fallback && !c->is_fallback)
continue; 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) if (bus->nodes_modified)
return 0; return 0;
if (r == 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); r = vtable_append_all_properties(bus, reply, m->path, c, u, &error);
if (r < 0) if (r < 0)
return r; return bus_maybe_reply_error(m, r, &error);
if (sd_bus_error_is_set(&error)) {
r = sd_bus_reply_method_error(m, &error);
if (r < 0)
return r;
return 1;
}
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; 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) if (require_fallback && !c->is_fallback)
continue; continue;
if (node_vtable_get_userdata(bus, path, c, NULL) > 0) if (node_vtable_get_userdata(bus, path, c, NULL, &error) > 0)
return true; return true;
if (bus->nodes_modified) if (bus->nodes_modified)
return false; return false;
@ -719,6 +725,7 @@ static int process_introspect(
bool require_fallback, bool require_fallback,
bool *found_object) { 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_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_set_free_free_ Set *s = NULL; _cleanup_set_free_free_ Set *s = NULL;
const char *previous_interface = NULL; const char *previous_interface = NULL;
@ -732,9 +739,9 @@ static int process_introspect(
assert(n); assert(n);
assert(found_object); 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) if (bus->nodes_modified)
return 0; return 0;
@ -752,11 +759,15 @@ static int process_introspect(
if (require_fallback && !c->is_fallback) if (require_fallback && !c->is_fallback)
continue; continue;
r = node_vtable_get_userdata(bus, m->path, c, NULL); r = node_vtable_get_userdata(bus, m->path, c, NULL, &error);
if (r < 0) if (r < 0) {
return r; r = bus_maybe_reply_error(m, r, &error);
if (bus->nodes_modified) goto finish;
return 0; }
if (bus->nodes_modified) {
r = 0;
goto finish;
}
if (r == 0) if (r == 0)
continue; continue;
@ -843,7 +854,7 @@ static int object_manager_serialize_path(
if (require_fallback && !i->is_fallback) if (require_fallback && !i->is_fallback)
continue; continue;
r = node_vtable_get_userdata(bus, path, i, &u); r = node_vtable_get_userdata(bus, path, i, &u, error);
if (r < 0) if (r < 0)
return r; return r;
if (bus->nodes_modified) 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); r = vtable_append_all_properties(bus, reply, path, i, u, error);
if (r < 0) if (r < 0)
return r; return r;
if (sd_bus_error_is_set(error))
return 0;
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; 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); r = object_manager_serialize_path(bus, reply, path, path, false, error);
if (r < 0) if (r < 0)
return r; return r;
if (sd_bus_error_is_set(error))
return 0;
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; 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); r = object_manager_serialize_path(bus, reply, prefix, path, true, error);
if (r < 0) if (r < 0)
return r; return r;
if (sd_bus_error_is_set(error))
return 0;
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
} }
@ -978,6 +983,7 @@ static int process_get_managed_objects(
bool require_fallback, bool require_fallback,
bool *found_object) { 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_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_set_free_free_ Set *s = NULL; _cleanup_set_free_free_ Set *s = NULL;
bool empty; bool empty;
@ -991,7 +997,7 @@ static int process_get_managed_objects(
if (!bus_node_with_object_manager(bus, n)) if (!bus_node_with_object_manager(bus, n))
return 0; return 0;
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 r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -1034,19 +1040,9 @@ static int process_get_managed_objects(
char *path; char *path;
SET_FOREACH(path, s, i) { 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); r = object_manager_serialize_path_and_fallbacks(bus, reply, path, &error);
if (r < 0) if (r < 0)
return -ENOMEM; return r;
if (sd_bus_error_is_set(&error)) {
r = sd_bus_reply_method_error(m, &error);
if (r < 0)
return r;
return 1;
}
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
@ -1851,6 +1847,7 @@ static int emit_properties_changed_on_interface(
bool require_fallback, bool require_fallback,
char **names) { char **names) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *m = NULL; _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
bool has_invalidating = false, has_changing = false; bool has_invalidating = false, has_changing = false;
struct vtable_member key = {}; struct vtable_member key = {};
@ -1891,7 +1888,7 @@ static int emit_properties_changed_on_interface(
if (!streq(c->interface, interface)) if (!streq(c->interface, interface))
continue; continue;
r = node_vtable_get_userdata(bus, path, c, &u); r = node_vtable_get_userdata(bus, path, c, &u, &error);
if (r < 0) if (r < 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -1900,7 +1897,6 @@ static int emit_properties_changed_on_interface(
continue; continue;
STRV_FOREACH(property, names) { STRV_FOREACH(property, names) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
struct vtable_member *v; struct vtable_member *v;
assert_return(member_name_is_valid(*property), -EINVAL); 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); r = invoke_property_get(bus, v->vtable, m->path, interface, *property, m, vtable_property_convert_userdata(v->vtable, u), &error);
if (r < 0) if (r < 0)
return r; return r;
if (sd_bus_error_is_set(&error))
return sd_bus_error_get_errno(&error);
if (bus->nodes_modified) if (bus->nodes_modified)
return 0; return 0;
@ -1974,7 +1968,7 @@ static int emit_properties_changed_on_interface(
if (!streq(c->interface, interface)) if (!streq(c->interface, interface))
continue; continue;
r = node_vtable_get_userdata(bus, path, c, &u); r = node_vtable_get_userdata(bus, path, c, &u, &error);
if (r < 0) if (r < 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)
@ -2106,7 +2100,7 @@ static int interfaces_added_append_one_prefix(
if (!streq(c->interface, interface)) if (!streq(c->interface, interface))
continue; continue;
r = node_vtable_get_userdata(bus, path, c, &u); r = node_vtable_get_userdata(bus, path, c, &u, &error);
if (r < 0) if (r < 0)
return r; return r;
if (bus->nodes_modified) if (bus->nodes_modified)

View 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)) if (object_path_startswith("/value", path))
assert_se(*nodes = strv_new("/value/a", "/value/b", "/value/c", NULL)); assert_se(*nodes = strv_new("/value/a", "/value/b", "/value/c", NULL));

View 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; Manager *m = userdata;
Seat *seat; Seat *seat;
int r; 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; _cleanup_strv_free_ char **l = NULL;
Manager *m = userdata; Manager *m = userdata;
Seat *seat; Seat *seat;

View 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_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 **found, void *seatdata); 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); char *seat_bus_path(Seat *s);
int seat_send_signal(Seat *s, bool new_seat); int seat_send_signal(Seat *s, bool new_seat);

View 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; Manager *m = userdata;
Session *session; Session *session;
int r; 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; _cleanup_strv_free_ char **l = NULL;
Manager *m = userdata; Manager *m = userdata;
Session *session; Session *session;

View File

@ -139,8 +139,8 @@ int session_kill(Session *s, KillWho who, int signo);
SessionState session_get_state(Session *u); SessionState session_get_state(Session *u);
extern const sd_bus_vtable session_vtable[]; extern const sd_bus_vtable session_vtable[];
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);
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);
char *session_bus_path(Session *s); char *session_bus_path(Session *s);
int session_send_signal(Session *s, bool new_session); int session_send_signal(Session *s, bool new_session);

View 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; Manager *m = userdata;
User *user; User *user;
int r; 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; _cleanup_strv_free_ char **l = NULL;
Manager *m = userdata; Manager *m = userdata;
User *user; User *user;

View File

@ -82,8 +82,8 @@ int user_kill(User *u, int signo);
int user_check_linger_file(User *u); int user_check_linger_file(User *u);
extern const sd_bus_vtable user_vtable[]; extern const sd_bus_vtable user_vtable[];
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);
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);
char *user_bus_path(User *s); char *user_bus_path(User *s);
int user_send_signal(User *u, bool new_user); int user_send_signal(User *u, bool new_user);

View 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; Manager *m = userdata;
Machine *machine; Machine *machine;
int r; 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; _cleanup_strv_free_ char **l = NULL;
Machine *machine = NULL; Machine *machine = NULL;
Manager *m = userdata; Manager *m = userdata;

View File

@ -93,7 +93,8 @@ MachineState machine_get_state(Machine *u);
extern const sd_bus_vtable machine_vtable[]; extern const sd_bus_vtable machine_vtable[];
char *machine_bus_path(Machine *s); 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_signal(Machine *m, bool new_machine);
int machine_send_create_reply(Machine *m, sd_bus_error *error); int machine_send_create_reply(Machine *m, sd_bus_error *error);

View 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_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_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_properties_changed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error);

View 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_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_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_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_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, char ***nodes, void *userdata); 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-protocol.h"
#include "sd-bus-vtable.h" #include "sd-bus-vtable.h"