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:
parent
969987ea93
commit
f00c31213a
2
TODO
2
TODO
@ -43,6 +43,8 @@ CGroup Rework Completion:
|
||||
|
||||
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
|
||||
|
@ -272,7 +272,7 @@ static int selinux_filter(sd_bus *bus, sd_bus_message *message, void *userdata,
|
||||
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;
|
||||
@ -291,7 +291,7 @@ static int bus_job_find(sd_bus *bus, const char *path, const char *interface, vo
|
||||
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;
|
||||
|
||||
@ -305,43 +305,28 @@ static Unit *find_unit(Manager *m, sd_bus *bus, const char *path) {
|
||||
|
||||
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)
|
||||
return NULL;
|
||||
return 0;
|
||||
|
||||
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)
|
||||
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)
|
||||
return 0;
|
||||
|
||||
*found = u;
|
||||
*unit = u;
|
||||
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;
|
||||
Unit *u;
|
||||
|
||||
assert(bus);
|
||||
assert(path);
|
||||
@ -349,9 +334,23 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
|
||||
assert(found);
|
||||
assert(m);
|
||||
|
||||
u = find_unit(m, bus, path);
|
||||
if (!u)
|
||||
return 0;
|
||||
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 *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))
|
||||
return 0;
|
||||
@ -360,9 +359,10 @@ static int bus_unit_interface_find(sd_bus *bus, const char *path, const char *in
|
||||
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;
|
||||
int r;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -384,10 +384,11 @@ static int bus_unit_cgroup_find(sd_bus *bus, const char *path, const char *inter
|
||||
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;
|
||||
int r;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -410,10 +411,11 @@ static int bus_cgroup_context_find(sd_bus *bus, const char *path, const char *in
|
||||
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;
|
||||
int r;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -436,10 +438,11 @@ static int bus_exec_context_find(sd_bus *bus, const char *path, const char *inte
|
||||
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;
|
||||
int r;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -462,7 +465,7 @@ static int bus_kill_context_find(sd_bus *bus, const char *path, const char *inte
|
||||
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;
|
||||
@ -489,7 +492,7 @@ static int bus_job_enumerate(sd_bus *bus, const char *path, char ***nodes, void
|
||||
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;
|
||||
|
@ -33,7 +33,8 @@ static int node_vtable_get_userdata(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
struct node_vtable *c,
|
||||
void **userdata) {
|
||||
void **userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
void *u;
|
||||
int r;
|
||||
@ -44,8 +45,12 @@ static int node_vtable_get_userdata(
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -65,7 +70,8 @@ static int vtable_property_get_userdata(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
struct vtable_member *p,
|
||||
void **userdata) {
|
||||
void **userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
void *u;
|
||||
int r;
|
||||
@ -75,7 +81,7 @@ static int vtable_property_get_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)
|
||||
@ -89,7 +95,8 @@ static int add_enumerated_to_set(
|
||||
sd_bus *bus,
|
||||
const char *prefix,
|
||||
struct node_enumerator *first,
|
||||
Set *s) {
|
||||
Set *s,
|
||||
sd_bus_error *error) {
|
||||
|
||||
struct node_enumerator *c;
|
||||
int r;
|
||||
@ -104,9 +111,11 @@ static int add_enumerated_to_set(
|
||||
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 (sd_bus_error_is_set(error))
|
||||
return sd_bus_error_get_errno(error);
|
||||
|
||||
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,
|
||||
Set *s) {
|
||||
Set *s,
|
||||
sd_bus_error *error) {
|
||||
|
||||
struct node *i;
|
||||
int r;
|
||||
@ -150,7 +160,7 @@ static int add_subtree_to_set(
|
||||
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)
|
||||
@ -170,7 +180,7 @@ static int add_subtree_to_set(
|
||||
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)
|
||||
@ -184,7 +194,8 @@ static int get_child_nodes(
|
||||
sd_bus *bus,
|
||||
const char *prefix,
|
||||
struct node *n,
|
||||
Set **_s) {
|
||||
Set **_s,
|
||||
sd_bus_error *error) {
|
||||
|
||||
Set *s = NULL;
|
||||
int r;
|
||||
@ -198,7 +209,7 @@ static int get_child_nodes(
|
||||
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;
|
||||
@ -258,6 +269,7 @@ static int method_callbacks_run(
|
||||
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;
|
||||
@ -270,9 +282,9 @@ static int method_callbacks_run(
|
||||
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)
|
||||
return r;
|
||||
return bus_maybe_reply_error(m, r, &error);
|
||||
if (bus->nodes_modified)
|
||||
return 0;
|
||||
|
||||
@ -291,20 +303,16 @@ static int method_callbacks_run(
|
||||
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));
|
||||
}
|
||||
|
||||
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 */
|
||||
@ -326,6 +334,7 @@ static int invoke_property_get(
|
||||
sd_bus_error *error) {
|
||||
|
||||
const void *p;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(v);
|
||||
@ -334,8 +343,14 @@ static int invoke_property_get(
|
||||
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. */
|
||||
|
||||
@ -384,8 +399,14 @@ static int invoke_property_set(
|
||||
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. */
|
||||
|
||||
@ -446,9 +467,9 @@ static int property_get_set_callbacks_run(
|
||||
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)
|
||||
return r;
|
||||
return bus_maybe_reply_error(m, r, &error);
|
||||
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)
|
||||
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;
|
||||
@ -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)
|
||||
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;
|
||||
@ -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);
|
||||
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;
|
||||
|
||||
@ -611,9 +624,9 @@ static int property_get_all_callbacks_run(
|
||||
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)
|
||||
return r;
|
||||
return bus_maybe_reply_error(m, r, &error);
|
||||
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)
|
||||
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;
|
||||
}
|
||||
@ -699,11 +704,12 @@ static bool bus_node_exists(
|
||||
}
|
||||
|
||||
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 (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;
|
||||
@ -719,6 +725,7 @@ static int process_introspect(
|
||||
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;
|
||||
@ -732,9 +739,9 @@ static int process_introspect(
|
||||
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)
|
||||
return r;
|
||||
return bus_maybe_reply_error(m, r, &error);
|
||||
if (bus->nodes_modified)
|
||||
return 0;
|
||||
|
||||
@ -752,11 +759,15 @@ static int process_introspect(
|
||||
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;
|
||||
|
||||
@ -843,7 +854,7 @@ static int object_manager_serialize_path(
|
||||
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)
|
||||
@ -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;
|
||||
if (sd_bus_error_is_set(error))
|
||||
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;
|
||||
if (sd_bus_error_is_set(error))
|
||||
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;
|
||||
if (sd_bus_error_is_set(error))
|
||||
return 0;
|
||||
if (bus->nodes_modified)
|
||||
return 0;
|
||||
}
|
||||
@ -978,6 +983,7 @@ static int process_get_managed_objects(
|
||||
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;
|
||||
@ -991,7 +997,7 @@ static int process_get_managed_objects(
|
||||
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)
|
||||
@ -1034,19 +1040,9 @@ static int process_get_managed_objects(
|
||||
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)
|
||||
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;
|
||||
@ -1851,6 +1847,7 @@ static int emit_properties_changed_on_interface(
|
||||
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 = {};
|
||||
@ -1891,7 +1888,7 @@ static int emit_properties_changed_on_interface(
|
||||
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)
|
||||
@ -1900,7 +1897,6 @@ static int emit_properties_changed_on_interface(
|
||||
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);
|
||||
@ -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;
|
||||
if (sd_bus_error_is_set(&error))
|
||||
return sd_bus_error_get_errno(&error);
|
||||
if (bus->nodes_modified)
|
||||
return 0;
|
||||
|
||||
@ -1974,7 +1968,7 @@ static int emit_properties_changed_on_interface(
|
||||
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)
|
||||
@ -2106,7 +2100,7 @@ static int interfaces_added_append_one_prefix(
|
||||
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)
|
||||
|
@ -182,7 +182,7 @@ static const sd_bus_vtable vtable2[] = {
|
||||
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));
|
||||
|
@ -254,7 +254,7 @@ const sd_bus_vtable seat_vtable[] = {
|
||||
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;
|
||||
@ -319,7 +319,7 @@ char *seat_bus_path(Seat *s) {
|
||||
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;
|
||||
|
@ -82,8 +82,8 @@ bool seat_name_is_valid(const char *name);
|
||||
|
||||
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);
|
||||
|
@ -465,7 +465,7 @@ const sd_bus_vtable session_vtable[] = {
|
||||
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;
|
||||
@ -524,7 +524,7 @@ char *session_bus_path(Session *s) {
|
||||
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;
|
||||
|
@ -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[];
|
||||
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);
|
||||
|
@ -235,7 +235,7 @@ const sd_bus_vtable user_vtable[] = {
|
||||
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;
|
||||
@ -293,7 +293,7 @@ char *user_bus_path(User *u) {
|
||||
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;
|
||||
|
@ -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_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);
|
||||
|
@ -142,7 +142,7 @@ const sd_bus_vtable machine_vtable[] = {
|
||||
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;
|
||||
@ -201,7 +201,7 @@ char *machine_bus_path(Machine *m) {
|
||||
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;
|
||||
|
@ -93,7 +93,8 @@ MachineState machine_get_state(Machine *u);
|
||||
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);
|
||||
|
@ -60,8 +60,6 @@ int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine);
|
||||
|
||||
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);
|
||||
|
@ -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_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"
|
||||
|
Loading…
Reference in New Issue
Block a user