1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
8 #include "alloc-util.h"
10 #include "dbus-cgroup.h"
11 #include "dbus-execute.h"
12 #include "dbus-kill.h"
13 #include "dbus-socket.h"
14 #include "dbus-util.h"
16 #include "parse-util.h"
17 #include "path-util.h"
19 #include "socket-protocol-list.h"
20 #include "socket-util.h"
21 #include "string-util.h"
24 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result
, socket_result
, SocketResult
);
25 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_bind_ipv6_only
, socket_address_bind_ipv6_only
, SocketAddressBindIPv6Only
);
26 static BUS_DEFINE_PROPERTY_GET(property_get_fdname
, "s", Socket
, socket_fdname
);
28 static int property_get_listen(
31 const char *interface
,
33 sd_bus_message
*reply
,
35 sd_bus_error
*error
) {
37 Socket
*s
= SOCKET(userdata
);
45 r
= sd_bus_message_open_container(reply
, 'a', "(ss)");
49 LIST_FOREACH(port
, p
, s
->ports
) {
50 _cleanup_free_
char *address
= NULL
;
55 r
= socket_address_print(&p
->address
, &address
);
66 case SOCKET_USB_FUNCTION
:
71 assert_not_reached("Unknown socket type");
74 r
= sd_bus_message_append(reply
, "(ss)", socket_port_type_to_string(p
), a
);
79 return sd_bus_message_close_container(reply
);
82 const sd_bus_vtable bus_socket_vtable
[] = {
83 SD_BUS_VTABLE_START(0),
84 SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only
, offsetof(Socket
, bind_ipv6_only
), SD_BUS_VTABLE_PROPERTY_CONST
),
85 SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned
, offsetof(Socket
, backlog
), SD_BUS_VTABLE_PROPERTY_CONST
),
86 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec
, offsetof(Socket
, timeout_usec
), SD_BUS_VTABLE_PROPERTY_CONST
),
87 SD_BUS_PROPERTY("BindToDevice", "s", NULL
, offsetof(Socket
, bind_to_device
), SD_BUS_VTABLE_PROPERTY_CONST
),
88 SD_BUS_PROPERTY("SocketUser", "s", NULL
, offsetof(Socket
, user
), SD_BUS_VTABLE_PROPERTY_CONST
),
89 SD_BUS_PROPERTY("SocketGroup", "s", NULL
, offsetof(Socket
, group
), SD_BUS_VTABLE_PROPERTY_CONST
),
90 SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode
, offsetof(Socket
, socket_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
91 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode
, offsetof(Socket
, directory_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
92 SD_BUS_PROPERTY("Accept", "b", bus_property_get_bool
, offsetof(Socket
, accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
93 SD_BUS_PROPERTY("Writable", "b", bus_property_get_bool
, offsetof(Socket
, writable
), SD_BUS_VTABLE_PROPERTY_CONST
),
94 SD_BUS_PROPERTY("KeepAlive", "b", bus_property_get_bool
, offsetof(Socket
, keep_alive
), SD_BUS_VTABLE_PROPERTY_CONST
),
95 SD_BUS_PROPERTY("KeepAliveTimeUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_time
), SD_BUS_VTABLE_PROPERTY_CONST
),
96 SD_BUS_PROPERTY("KeepAliveIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
97 SD_BUS_PROPERTY("KeepAliveProbes", "u", bus_property_get_unsigned
, offsetof(Socket
, keep_alive_cnt
), SD_BUS_VTABLE_PROPERTY_CONST
),
98 SD_BUS_PROPERTY("DeferAcceptUSec" , "t", bus_property_get_usec
, offsetof(Socket
, defer_accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
99 SD_BUS_PROPERTY("NoDelay", "b", bus_property_get_bool
, offsetof(Socket
, no_delay
), SD_BUS_VTABLE_PROPERTY_CONST
),
100 SD_BUS_PROPERTY("Priority", "i", bus_property_get_int
, offsetof(Socket
, priority
), SD_BUS_VTABLE_PROPERTY_CONST
),
101 SD_BUS_PROPERTY("ReceiveBuffer", "t", bus_property_get_size
, offsetof(Socket
, receive_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
102 SD_BUS_PROPERTY("SendBuffer", "t", bus_property_get_size
, offsetof(Socket
, send_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
103 SD_BUS_PROPERTY("IPTOS", "i", bus_property_get_int
, offsetof(Socket
, ip_tos
), SD_BUS_VTABLE_PROPERTY_CONST
),
104 SD_BUS_PROPERTY("IPTTL", "i", bus_property_get_int
, offsetof(Socket
, ip_ttl
), SD_BUS_VTABLE_PROPERTY_CONST
),
105 SD_BUS_PROPERTY("PipeSize", "t", bus_property_get_size
, offsetof(Socket
, pipe_size
), SD_BUS_VTABLE_PROPERTY_CONST
),
106 SD_BUS_PROPERTY("FreeBind", "b", bus_property_get_bool
, offsetof(Socket
, free_bind
), SD_BUS_VTABLE_PROPERTY_CONST
),
107 SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool
, offsetof(Socket
, transparent
), SD_BUS_VTABLE_PROPERTY_CONST
),
108 SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool
, offsetof(Socket
, broadcast
), SD_BUS_VTABLE_PROPERTY_CONST
),
109 SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool
, offsetof(Socket
, pass_cred
), SD_BUS_VTABLE_PROPERTY_CONST
),
110 SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool
, offsetof(Socket
, pass_sec
), SD_BUS_VTABLE_PROPERTY_CONST
),
111 SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool
, offsetof(Socket
, remove_on_stop
), SD_BUS_VTABLE_PROPERTY_CONST
),
112 SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen
, 0, SD_BUS_VTABLE_PROPERTY_CONST
),
113 SD_BUS_PROPERTY("Symlinks", "as", NULL
, offsetof(Socket
, symlinks
), SD_BUS_VTABLE_PROPERTY_CONST
),
114 SD_BUS_PROPERTY("Mark", "i", bus_property_get_int
, offsetof(Socket
, mark
), SD_BUS_VTABLE_PROPERTY_CONST
),
115 SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections
), SD_BUS_VTABLE_PROPERTY_CONST
),
116 SD_BUS_PROPERTY("MaxConnectionsPerSource", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections_per_source
), SD_BUS_VTABLE_PROPERTY_CONST
),
117 SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long
, offsetof(Socket
, mq_maxmsg
), SD_BUS_VTABLE_PROPERTY_CONST
),
118 SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long
, offsetof(Socket
, mq_msgsize
), SD_BUS_VTABLE_PROPERTY_CONST
),
119 SD_BUS_PROPERTY("TCPCongestion", "s", NULL
, offsetof(Socket
, tcp_congestion
), SD_BUS_VTABLE_PROPERTY_CONST
),
120 SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool
, offsetof(Socket
, reuse_port
), SD_BUS_VTABLE_PROPERTY_CONST
),
121 SD_BUS_PROPERTY("SmackLabel", "s", NULL
, offsetof(Socket
, smack
), SD_BUS_VTABLE_PROPERTY_CONST
),
122 SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL
, offsetof(Socket
, smack_ip_in
), SD_BUS_VTABLE_PROPERTY_CONST
),
123 SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL
, offsetof(Socket
, smack_ip_out
), SD_BUS_VTABLE_PROPERTY_CONST
),
124 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid
, offsetof(Socket
, control_pid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
125 SD_BUS_PROPERTY("Result", "s", property_get_result
, offsetof(Socket
, result
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
126 SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, n_connections
), 0),
127 SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned
, offsetof(Socket
, n_accepted
), 0),
128 SD_BUS_PROPERTY("NRefused", "u", bus_property_get_unsigned
, offsetof(Socket
, n_refused
), 0),
129 SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname
, 0, 0),
130 SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int
, offsetof(Socket
, socket_protocol
), SD_BUS_VTABLE_PROPERTY_CONST
),
131 SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, trigger_limit
.interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
132 SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, trigger_limit
.burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
133 SD_BUS_PROPERTY("UID", "u", bus_property_get_uid
, offsetof(Unit
, ref_uid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
134 SD_BUS_PROPERTY("GID", "u", bus_property_get_gid
, offsetof(Unit
, ref_gid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
135 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
136 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
137 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
138 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
142 static inline bool check_size_t_truncation(uint64_t t
) {
143 return (size_t) t
== t
;
146 static inline const char* supported_socket_protocol_to_string(int32_t i
) {
150 if (!IN_SET(i
, IPPROTO_UDPLITE
, IPPROTO_SCTP
))
153 return socket_protocol_to_name(i
);
156 static BUS_DEFINE_SET_TRANSIENT(int, "i", int32_t, int, "%" PRIi32
);
157 static BUS_DEFINE_SET_TRANSIENT(message_queue
, "x", int64_t, long, "%" PRIi64
);
158 static BUS_DEFINE_SET_TRANSIENT_IS_VALID(size_t_check_truncation
, "t", uint64_t, size_t, "%" PRIu64
, check_size_t_truncation
);
159 static BUS_DEFINE_SET_TRANSIENT_PARSE(bind_ipv6_only
, SocketAddressBindIPv6Only
, socket_address_bind_ipv6_only_or_bool_from_string
);
160 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(fdname
, fdname_is_valid
);
161 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(ifname
, ifname_valid
);
162 static BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(ip_tos
, "i", int32_t, int, "%" PRIi32
, ip_tos_to_string_alloc
);
163 static BUS_DEFINE_SET_TRANSIENT_TO_STRING(socket_protocol
, "i", int32_t, int, "%" PRIi32
, supported_socket_protocol_to_string
);
165 static int bus_socket_set_transient_property(
168 sd_bus_message
*message
,
169 UnitWriteFlags flags
,
170 sd_bus_error
*error
) {
172 SocketExecCommand ci
;
180 flags
|= UNIT_PRIVATE
;
182 if (streq(name
, "Accept"))
183 return bus_set_transient_bool(u
, name
, &s
->accept
, message
, flags
, error
);
185 if (streq(name
, "Writable"))
186 return bus_set_transient_bool(u
, name
, &s
->writable
, message
, flags
, error
);
188 if (streq(name
, "KeepAlive"))
189 return bus_set_transient_bool(u
, name
, &s
->keep_alive
, message
, flags
, error
);
191 if (streq(name
, "NoDelay"))
192 return bus_set_transient_bool(u
, name
, &s
->no_delay
, message
, flags
, error
);
194 if (streq(name
, "FreeBind"))
195 return bus_set_transient_bool(u
, name
, &s
->free_bind
, message
, flags
, error
);
197 if (streq(name
, "Transparent"))
198 return bus_set_transient_bool(u
, name
, &s
->transparent
, message
, flags
, error
);
200 if (streq(name
, "Broadcast"))
201 return bus_set_transient_bool(u
, name
, &s
->broadcast
, message
, flags
, error
);
203 if (streq(name
, "PassCredentials"))
204 return bus_set_transient_bool(u
, name
, &s
->pass_cred
, message
, flags
, error
);
206 if (streq(name
, "PassSecurity"))
207 return bus_set_transient_bool(u
, name
, &s
->pass_sec
, message
, flags
, error
);
209 if (streq(name
, "ReusePort"))
210 return bus_set_transient_bool(u
, name
, &s
->reuse_port
, message
, flags
, error
);
212 if (streq(name
, "RemoveOnStop"))
213 return bus_set_transient_bool(u
, name
, &s
->remove_on_stop
, message
, flags
, error
);
215 if (streq(name
, "SELinuxContextFromNet"))
216 return bus_set_transient_bool(u
, name
, &s
->selinux_context_from_net
, message
, flags
, error
);
218 if (streq(name
, "Priority"))
219 return bus_set_transient_int(u
, name
, &s
->priority
, message
, flags
, error
);
221 if (streq(name
, "IPTTL"))
222 return bus_set_transient_int(u
, name
, &s
->ip_ttl
, message
, flags
, error
);
224 if (streq(name
, "Mark"))
225 return bus_set_transient_int(u
, name
, &s
->mark
, message
, flags
, error
);
227 if (streq(name
, "Backlog"))
228 return bus_set_transient_unsigned(u
, name
, &s
->backlog
, message
, flags
, error
);
230 if (streq(name
, "MaxConnections"))
231 return bus_set_transient_unsigned(u
, name
, &s
->max_connections
, message
, flags
, error
);
233 if (streq(name
, "MaxConnectionsPerSource"))
234 return bus_set_transient_unsigned(u
, name
, &s
->max_connections_per_source
, message
, flags
, error
);
236 if (streq(name
, "KeepAliveProbes"))
237 return bus_set_transient_unsigned(u
, name
, &s
->keep_alive_cnt
, message
, flags
, error
);
239 if (streq(name
, "TriggerLimitBurst"))
240 return bus_set_transient_unsigned(u
, name
, &s
->trigger_limit
.burst
, message
, flags
, error
);
242 if (streq(name
, "SocketMode"))
243 return bus_set_transient_mode_t(u
, name
, &s
->socket_mode
, message
, flags
, error
);
245 if (streq(name
, "DirectoryMode"))
246 return bus_set_transient_mode_t(u
, name
, &s
->directory_mode
, message
, flags
, error
);
248 if (streq(name
, "MessageQueueMaxMessages"))
249 return bus_set_transient_message_queue(u
, name
, &s
->mq_maxmsg
, message
, flags
, error
);
251 if (streq(name
, "MessageQueueMessageSize"))
252 return bus_set_transient_message_queue(u
, name
, &s
->mq_msgsize
, message
, flags
, error
);
254 if (streq(name
, "TimeoutUSec"))
255 return bus_set_transient_usec_fix_0(u
, name
, &s
->timeout_usec
, message
, flags
, error
);
257 if (streq(name
, "KeepAliveTimeUSec"))
258 return bus_set_transient_usec(u
, name
, &s
->keep_alive_time
, message
, flags
, error
);
260 if (streq(name
, "KeepAliveIntervalUSec"))
261 return bus_set_transient_usec(u
, name
, &s
->keep_alive_interval
, message
, flags
, error
);
263 if (streq(name
, "DeferAcceptUSec"))
264 return bus_set_transient_usec(u
, name
, &s
->defer_accept
, message
, flags
, error
);
266 if (streq(name
, "TriggerLimitIntervalUSec"))
267 return bus_set_transient_usec(u
, name
, &s
->trigger_limit
.interval
, message
, flags
, error
);
269 if (streq(name
, "SmackLabel"))
270 return bus_set_transient_string(u
, name
, &s
->smack
, message
, flags
, error
);
272 if (streq(name
, "SmackLabelIPin"))
273 return bus_set_transient_string(u
, name
, &s
->smack_ip_in
, message
, flags
, error
);
275 if (streq(name
, "SmackLabelIPOut"))
276 return bus_set_transient_string(u
, name
, &s
->smack_ip_out
, message
, flags
, error
);
278 if (streq(name
, "TCPCongestion"))
279 return bus_set_transient_string(u
, name
, &s
->tcp_congestion
, message
, flags
, error
);
281 if (streq(name
, "FileDescriptorName"))
282 return bus_set_transient_fdname(u
, name
, &s
->fdname
, message
, flags
, error
);
284 if (streq(name
, "SocketUser"))
285 return bus_set_transient_user(u
, name
, &s
->user
, message
, flags
, error
);
287 if (streq(name
, "SocketGroup"))
288 return bus_set_transient_user(u
, name
, &s
->group
, message
, flags
, error
);
290 if (streq(name
, "BindIPv6Only"))
291 return bus_set_transient_bind_ipv6_only(u
, name
, &s
->bind_ipv6_only
, message
, flags
, error
);
293 if (streq(name
, "ReceiveBuffer"))
294 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->receive_buffer
, message
, flags
, error
);
296 if (streq(name
, "SendBuffer"))
297 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->send_buffer
, message
, flags
, error
);
299 if (streq(name
, "PipeSize"))
300 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->pipe_size
, message
, flags
, error
);
302 if (streq(name
, "BindToDevice"))
303 return bus_set_transient_ifname(u
, name
, &s
->bind_to_device
, message
, flags
, error
);
305 if (streq(name
, "IPTOS"))
306 return bus_set_transient_ip_tos(u
, name
, &s
->ip_tos
, message
, flags
, error
);
308 if (streq(name
, "SocketProtocol"))
309 return bus_set_transient_socket_protocol(u
, name
, &s
->socket_protocol
, message
, flags
, error
);
311 if ((ci
= socket_exec_command_from_string(name
)) >= 0)
312 return bus_set_transient_exec_command(u
, name
, &s
->exec_command
[ci
], message
, flags
, error
);
314 if (streq(name
, "Symlinks")) {
315 _cleanup_strv_free_
char **l
= NULL
;
318 r
= sd_bus_message_read_strv(message
, &l
);
323 if (!path_is_absolute(*p
))
324 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Symlink path is not absolute: %s", *p
);
327 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
328 if (strv_isempty(l
)) {
329 s
->symlinks
= strv_free(s
->symlinks
);
330 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=", name
);
332 _cleanup_free_
char *joined
= NULL
;
334 r
= strv_extend_strv(&s
->symlinks
, l
, true);
338 joined
= strv_join(l
, " ");
342 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=%s", name
, joined
);
348 } else if (streq(name
, "Listen")) {
352 r
= sd_bus_message_enter_container(message
, 'a', "(ss)");
356 while ((r
= sd_bus_message_read(message
, "(ss)", &t
, &a
)) > 0) {
357 _cleanup_free_ SocketPort
*p
= NULL
;
359 p
= new0(SocketPort
, 1);
363 p
->type
= socket_port_type_from_string(t
);
365 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown Socket type: %s", t
);
367 if (p
->type
!= SOCKET_SOCKET
) {
369 path_simplify(p
->path
, false);
371 } else if (streq(t
, "Netlink")) {
372 r
= socket_address_parse_netlink(&p
->address
, a
);
374 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid netlink address: %s", a
);
377 r
= socket_address_parse(&p
->address
, a
);
379 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address: %s", a
);
381 p
->address
.type
= socket_address_type_from_string(t
);
382 if (p
->address
.type
< 0)
383 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address type: %s", t
);
385 if (socket_address_family(&p
->address
) != AF_LOCAL
&& p
->address
.type
== SOCK_SEQPACKET
)
386 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Address family not supported: %s", a
);
390 p
->auxiliary_fds
= NULL
;
391 p
->n_auxiliary_fds
= 0;
396 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
399 LIST_FIND_TAIL(port
, s
->ports
, tail
);
400 LIST_INSERT_AFTER(port
, s
->ports
, tail
, p
);
404 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "Listen%s=%s", t
, a
);
410 r
= sd_bus_message_exit_container(message
);
414 if (!UNIT_WRITE_FLAGS_NOOP(flags
) && empty
) {
415 socket_free_ports(s
);
416 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "ListenStream=");
425 int bus_socket_set_property(
428 sd_bus_message
*message
,
429 UnitWriteFlags flags
,
430 sd_bus_error
*error
) {
432 Socket
*s
= SOCKET(u
);
443 r
= bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, flags
, error
);
447 if (u
->transient
&& u
->load_state
== UNIT_STUB
) {
448 /* This is a transient unit, let's load a little more */
450 r
= bus_socket_set_transient_property(s
, name
, message
, flags
, error
);
454 r
= bus_exec_context_set_transient_property(u
, &s
->exec_context
, name
, message
, flags
, error
);
458 r
= bus_kill_context_set_transient_property(u
, &s
->kill_context
, name
, message
, flags
, error
);
466 int bus_socket_commit_properties(Unit
*u
) {
469 unit_update_cgroup_members_masks(u
);
470 unit_realize_cgroup(u
);