]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/dbus-job.c
sd-bus: drop bus parameter from message callback prototype
[thirdparty/systemd.git] / src / core / dbus-job.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ea430986 2
a7334b09
LP
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
a7334b09 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
ea430986 22#include "log.h"
718db961 23#include "sd-bus.h"
cad45ba1 24#include "selinux-access.h"
718db961
LP
25#include "job.h"
26#include "dbus-job.h"
8f8f05a9 27#include "dbus.h"
718db961
LP
28
29static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_type, job_type, JobType);
30static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_state, job_state, JobState);
31
32static int property_get_unit(
33 sd_bus *bus,
34 const char *path,
35 const char *interface,
36 const char *property,
37 sd_bus_message *reply,
ebcf1f97
LP
38 void *userdata,
39 sd_bus_error *error) {
ea430986 40
68eda4bd 41 _cleanup_free_ char *p = NULL;
718db961 42 Job *j = userdata;
86fbf370 43
718db961
LP
44 assert(bus);
45 assert(reply);
86fbf370
LP
46 assert(j);
47
cad45ba1
LP
48 p = unit_dbus_path(j->unit);
49 if (!p)
86fbf370
LP
50 return -ENOMEM;
51
718db961 52 return sd_bus_message_append(reply, "(so)", j->unit->id, p);
86fbf370
LP
53}
54
19070062 55int bus_job_method_cancel(sd_bus_message *message, void *userdata, sd_bus_error *error) {
718db961 56 Job *j = userdata;
ebcf1f97 57 int r;
ea430986 58
ea430986 59 assert(message);
718db961 60 assert(j);
86fbf370 61
8a188de9 62 r = mac_selinux_unit_access_check(j->unit, message, "stop", error);
ebcf1f97
LP
63 if (r < 0)
64 return r;
65
1d22e906
LP
66 /* Access is granted to the job owner */
67 if (!sd_bus_track_contains(j->clients, sd_bus_message_get_sender(message))) {
68
69 /* And for everybody else consult PolicyKit */
70 r = bus_verify_manage_units_async(j->unit->manager, message, error);
71 if (r < 0)
72 return r;
73 if (r == 0)
74 return 1; /* No authorization for now, but the async polkit stuff will call us again when it has it */
75 }
76
718db961 77 job_finish_and_invalidate(j, JOB_CANCELED, true);
2cccbca4 78
df2d202e 79 return sd_bus_reply_method_return(message, NULL);
ea430986
LP
80}
81
718db961
LP
82const sd_bus_vtable bus_job_vtable[] = {
83 SD_BUS_VTABLE_START(0),
283868e1 84 SD_BUS_METHOD("Cancel", NULL, NULL, bus_job_method_cancel, SD_BUS_VTABLE_UNPRIVILEGED),
556089dc
LP
85 SD_BUS_PROPERTY("Id", "u", NULL, offsetof(Job, id), SD_BUS_VTABLE_PROPERTY_CONST),
86 SD_BUS_PROPERTY("Unit", "(so)", property_get_unit, 0, SD_BUS_VTABLE_PROPERTY_CONST),
87 SD_BUS_PROPERTY("JobType", "s", property_get_type, offsetof(Job, type), SD_BUS_VTABLE_PROPERTY_CONST),
718db961
LP
88 SD_BUS_PROPERTY("State", "s", property_get_state, offsetof(Job, state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
89 SD_BUS_VTABLE_END
ea430986 90};
c1e1601e 91
8f8f05a9 92static int send_new_signal(sd_bus *bus, void *userdata) {
718db961 93 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1508e858 94 _cleanup_free_ char *p = NULL;
8f8f05a9 95 Job *j = userdata;
718db961
LP
96 int r;
97
98 assert(bus);
99 assert(j);
c1e1601e 100
97e6a119
MS
101 p = job_dbus_path(j);
102 if (!p)
718db961 103 return -ENOMEM;
c1e1601e 104
718db961
LP
105 r = sd_bus_message_new_signal(
106 bus,
151b9b96 107 &m,
718db961
LP
108 "/org/freedesktop/systemd1",
109 "org.freedesktop.systemd1.Manager",
151b9b96 110 "JobNew");
718db961
LP
111 if (r < 0)
112 return r;
113
114 r = sd_bus_message_append(m, "uos", j->id, p, j->unit->id);
115 if (r < 0)
116 return r;
117
8f8f05a9 118 return sd_bus_send(bus, m, NULL);
c1e1601e
LP
119}
120
8f8f05a9 121static int send_changed_signal(sd_bus *bus, void *userdata) {
1508e858 122 _cleanup_free_ char *p = NULL;
8f8f05a9 123 Job *j = userdata;
718db961
LP
124
125 assert(bus);
126 assert(j);
c1e1601e 127
97e6a119
MS
128 p = job_dbus_path(j);
129 if (!p)
718db961 130 return -ENOMEM;
c1e1601e 131
718db961 132 return sd_bus_emit_properties_changed(bus, p, "org.freedesktop.systemd1.Job", "State", NULL);
97e6a119
MS
133}
134
135void bus_job_send_change_signal(Job *j) {
718db961
LP
136 int r;
137
97e6a119
MS
138 assert(j);
139
140 if (j->in_dbus_queue) {
71fda00f 141 LIST_REMOVE(dbus_queue, j->manager->dbus_job_queue, j);
97e6a119
MS
142 j->in_dbus_queue = false;
143 }
144
b39a2770 145 r = bus_foreach_bus(j->manager, j->clients, j->sent_dbus_new_signal ? send_changed_signal : send_new_signal, j);
718db961 146 if (r < 0)
da927ba9 147 log_debug_errno(r, "Failed to send job change signal for %u: %m", j->id);
97e6a119
MS
148
149 j->sent_dbus_new_signal = true;
718db961
LP
150}
151
8f8f05a9 152static int send_removed_signal(sd_bus *bus, void *userdata) {
718db961
LP
153 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
154 _cleanup_free_ char *p = NULL;
8f8f05a9 155 Job *j = userdata;
718db961
LP
156 int r;
157
158 assert(bus);
159 assert(j);
160
161 p = job_dbus_path(j);
162 if (!p)
163 return -ENOMEM;
c1e1601e 164
718db961
LP
165 r = sd_bus_message_new_signal(
166 bus,
151b9b96 167 &m,
718db961
LP
168 "/org/freedesktop/systemd1",
169 "org.freedesktop.systemd1.Manager",
151b9b96 170 "JobRemoved");
718db961
LP
171 if (r < 0)
172 return r;
173
174 r = sd_bus_message_append(m, "uoss", j->id, p, j->unit->id, job_result_to_string(j->result));
175 if (r < 0)
176 return r;
177
8f8f05a9 178 return sd_bus_send(bus, m, NULL);
97e6a119 179}
c1e1601e 180
97e6a119 181void bus_job_send_removed_signal(Job *j) {
718db961 182 int r;
c1e1601e 183
718db961 184 assert(j);
97e6a119
MS
185
186 if (!j->sent_dbus_new_signal)
187 bus_job_send_change_signal(j);
188
b39a2770 189 r = bus_foreach_bus(j->manager, j->clients, send_removed_signal, j);
718db961 190 if (r < 0)
da927ba9 191 log_debug_errno(r, "Failed to send job remove signal for %u: %m", j->id);
c1e1601e 192}