dbus-scope.c revision 4afd3348c7506dd1d36305b7bcb9feb8952b9d6b
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering This file is part of systemd.
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering Copyright 2013 Lennart Poettering
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering systemd is free software; you can redistribute it and/or modify it
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering under the terms of the GNU Lesser General Public License as published by
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering (at your option) any later version.
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering systemd is distributed in the hope that it will be useful, but
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering Lesser General Public License for more details.
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering You should have received a copy of the GNU Lesser General Public License
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poetteringstatic int bus_scope_abandon(sd_bus_message *message, void *userdata, sd_bus_error *error) {
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering r = mac_selinux_unit_access_check(UNIT(s), message, "stop", error);
4f5dd3943bef8a04be7e3b838b822bb9a7ad6cb3Lennart Poettering r = bus_verify_manage_units_async(UNIT(s)->manager, message, error);
7ccbd1ae843d77275f2c542582a9a80e5e058a70Lennart Poettering return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering return sd_bus_error_setf(error, BUS_ERROR_SCOPE_NOT_RUNNING, "Scope %s is not running, cannot abandon.", UNIT(s)->id);
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering return sd_bus_reply_method_return(message, NULL);
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poetteringstatic BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, scope_result, ScopeResult);
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poetteringconst sd_bus_vtable bus_scope_vtable[] = {
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering SD_BUS_PROPERTY("Controller", "s", NULL, offsetof(Scope, controller), SD_BUS_VTABLE_PROPERTY_CONST),
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering SD_BUS_PROPERTY("TimeoutStopUSec", "t", bus_property_get_usec, offsetof(Scope, timeout_stop_usec), SD_BUS_VTABLE_PROPERTY_CONST),
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Scope, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering SD_BUS_METHOD("Abandon", NULL, NULL, bus_scope_abandon, SD_BUS_VTABLE_UNPRIVILEGED),
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poetteringstatic int bus_scope_set_transient_property(
f9a810bedacf1da7c505c1786a2416d592665926Lennart Poettering unsigned n = 0;
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = sd_bus_message_enter_container(message, 'a', "u");
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering while ((r = sd_bus_message_read(message, "u", &pid)) > 0) {
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (r < 0 && r != -EEXIST)
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = sd_bus_message_exit_container(message);
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = sd_bus_message_read(message, "s", &controller);
13790add4bf648fed816361794d8277a75253410Lennart Poettering if (!isempty(controller) && !service_name_is_valid(controller))
13790add4bf648fed816361794d8277a75253410Lennart Poettering return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Controller '%s' is not a valid bus name.", controller);
13790add4bf648fed816361794d8277a75253410Lennart Poettering } else if (streq(name, "TimeoutStopUSec")) {
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = sd_bus_message_read(message, "t", &s->timeout_stop_usec);
13790add4bf648fed816361794d8277a75253410Lennart Poettering unit_write_drop_in_format(UNIT(s), mode, name, "[Scope]\nTimeoutStopSec="USEC_FMT"us\n", s->timeout_stop_usec);
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = bus_cgroup_set_property(u, &s->cgroup_context, name, message, mode, error);
13790add4bf648fed816361794d8277a75253410Lennart Poettering /* While we are created we still accept PIDs */
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = bus_scope_set_transient_property(s, name, message, mode, error);
13790add4bf648fed816361794d8277a75253410Lennart Poettering r = bus_kill_context_set_transient_property(u, &s->kill_context, name, message, mode, error);
13790add4bf648fed816361794d8277a75253410Lennart Poetteringint bus_scope_commit_properties(Unit *u) {
13790add4bf648fed816361794d8277a75253410Lennart Poetteringint bus_scope_send_request_stop(Scope *s) {
e22aa3d3284709234f086ebebc13a905a295b7a7Lennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
13790add4bf648fed816361794d8277a75253410Lennart Poettering "RequestStop");
a45b9fca6b91a767dcd9060cfcb30617dad234c7Lennart Poettering return sd_bus_send_to(UNIT(s)->manager->api_bus, m, /* s->controller */ NULL, NULL);