1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 #include "alloc-util.h"
23 #include "dbus-cgroup.h"
24 #include "dbus-execute.h"
25 #include "dbus-kill.h"
26 #include "dbus-socket.h"
27 #include "dbus-util.h"
29 #include "parse-util.h"
30 #include "path-util.h"
32 #include "socket-protocol-list.h"
33 #include "socket-util.h"
34 #include "string-util.h"
37 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result
, socket_result
, SocketResult
);
38 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_bind_ipv6_only
, socket_address_bind_ipv6_only
, SocketAddressBindIPv6Only
);
40 static int property_get_listen(
43 const char *interface
,
45 sd_bus_message
*reply
,
47 sd_bus_error
*error
) {
50 Socket
*s
= SOCKET(userdata
);
58 r
= sd_bus_message_open_container(reply
, 'a', "(ss)");
62 LIST_FOREACH(port
, p
, s
->ports
) {
63 _cleanup_free_
char *address
= NULL
;
68 r
= socket_address_print(&p
->address
, &address
);
79 case SOCKET_USB_FUNCTION
:
84 assert_not_reached("Unknown socket type");
87 r
= sd_bus_message_append(reply
, "(ss)", socket_port_type_to_string(p
), a
);
92 return sd_bus_message_close_container(reply
);
96 static int property_get_fdname(
99 const char *interface
,
100 const char *property
,
101 sd_bus_message
*reply
,
103 sd_bus_error
*error
) {
105 Socket
*s
= SOCKET(userdata
);
111 return sd_bus_message_append(reply
, "s", socket_fdname(s
));
114 const sd_bus_vtable bus_socket_vtable
[] = {
115 SD_BUS_VTABLE_START(0),
116 SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only
, offsetof(Socket
, bind_ipv6_only
), SD_BUS_VTABLE_PROPERTY_CONST
),
117 SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned
, offsetof(Socket
, backlog
), SD_BUS_VTABLE_PROPERTY_CONST
),
118 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec
, offsetof(Socket
, timeout_usec
), SD_BUS_VTABLE_PROPERTY_CONST
),
119 SD_BUS_PROPERTY("BindToDevice", "s", NULL
, offsetof(Socket
, bind_to_device
), SD_BUS_VTABLE_PROPERTY_CONST
),
120 SD_BUS_PROPERTY("SocketUser", "s", NULL
, offsetof(Socket
, user
), SD_BUS_VTABLE_PROPERTY_CONST
),
121 SD_BUS_PROPERTY("SocketGroup", "s", NULL
, offsetof(Socket
, group
), SD_BUS_VTABLE_PROPERTY_CONST
),
122 SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode
, offsetof(Socket
, socket_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
123 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode
, offsetof(Socket
, directory_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
124 SD_BUS_PROPERTY("Accept", "b", bus_property_get_bool
, offsetof(Socket
, accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
125 SD_BUS_PROPERTY("Writable", "b", bus_property_get_bool
, offsetof(Socket
, writable
), SD_BUS_VTABLE_PROPERTY_CONST
),
126 SD_BUS_PROPERTY("KeepAlive", "b", bus_property_get_bool
, offsetof(Socket
, keep_alive
), SD_BUS_VTABLE_PROPERTY_CONST
),
127 SD_BUS_PROPERTY("KeepAliveTimeUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_time
), SD_BUS_VTABLE_PROPERTY_CONST
),
128 SD_BUS_PROPERTY("KeepAliveIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
129 SD_BUS_PROPERTY("KeepAliveProbes", "u", bus_property_get_unsigned
, offsetof(Socket
, keep_alive_cnt
), SD_BUS_VTABLE_PROPERTY_CONST
),
130 SD_BUS_PROPERTY("DeferAcceptUSec" , "t", bus_property_get_usec
, offsetof(Socket
, defer_accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
131 SD_BUS_PROPERTY("NoDelay", "b", bus_property_get_bool
, offsetof(Socket
, no_delay
), SD_BUS_VTABLE_PROPERTY_CONST
),
132 SD_BUS_PROPERTY("Priority", "i", bus_property_get_int
, offsetof(Socket
, priority
), SD_BUS_VTABLE_PROPERTY_CONST
),
133 SD_BUS_PROPERTY("ReceiveBuffer", "t", bus_property_get_size
, offsetof(Socket
, receive_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
134 SD_BUS_PROPERTY("SendBuffer", "t", bus_property_get_size
, offsetof(Socket
, send_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
135 SD_BUS_PROPERTY("IPTOS", "i", bus_property_get_int
, offsetof(Socket
, ip_tos
), SD_BUS_VTABLE_PROPERTY_CONST
),
136 SD_BUS_PROPERTY("IPTTL", "i", bus_property_get_int
, offsetof(Socket
, ip_ttl
), SD_BUS_VTABLE_PROPERTY_CONST
),
137 SD_BUS_PROPERTY("PipeSize", "t", bus_property_get_size
, offsetof(Socket
, pipe_size
), SD_BUS_VTABLE_PROPERTY_CONST
),
138 SD_BUS_PROPERTY("FreeBind", "b", bus_property_get_bool
, offsetof(Socket
, free_bind
), SD_BUS_VTABLE_PROPERTY_CONST
),
139 SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool
, offsetof(Socket
, transparent
), SD_BUS_VTABLE_PROPERTY_CONST
),
140 SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool
, offsetof(Socket
, broadcast
), SD_BUS_VTABLE_PROPERTY_CONST
),
141 SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool
, offsetof(Socket
, pass_cred
), SD_BUS_VTABLE_PROPERTY_CONST
),
142 SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool
, offsetof(Socket
, pass_sec
), SD_BUS_VTABLE_PROPERTY_CONST
),
143 SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool
, offsetof(Socket
, remove_on_stop
), SD_BUS_VTABLE_PROPERTY_CONST
),
144 SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen
, 0, SD_BUS_VTABLE_PROPERTY_CONST
),
145 SD_BUS_PROPERTY("Symlinks", "as", NULL
, offsetof(Socket
, symlinks
), SD_BUS_VTABLE_PROPERTY_CONST
),
146 SD_BUS_PROPERTY("Mark", "i", bus_property_get_int
, offsetof(Socket
, mark
), SD_BUS_VTABLE_PROPERTY_CONST
),
147 SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections
), SD_BUS_VTABLE_PROPERTY_CONST
),
148 SD_BUS_PROPERTY("MaxConnectionsPerSource", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections_per_source
), SD_BUS_VTABLE_PROPERTY_CONST
),
149 SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long
, offsetof(Socket
, mq_maxmsg
), SD_BUS_VTABLE_PROPERTY_CONST
),
150 SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long
, offsetof(Socket
, mq_msgsize
), SD_BUS_VTABLE_PROPERTY_CONST
),
151 SD_BUS_PROPERTY("TCPCongestion", "s", NULL
, offsetof(Socket
, tcp_congestion
), SD_BUS_VTABLE_PROPERTY_CONST
),
152 SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool
, offsetof(Socket
, reuse_port
), SD_BUS_VTABLE_PROPERTY_CONST
),
153 SD_BUS_PROPERTY("SmackLabel", "s", NULL
, offsetof(Socket
, smack
), SD_BUS_VTABLE_PROPERTY_CONST
),
154 SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL
, offsetof(Socket
, smack_ip_in
), SD_BUS_VTABLE_PROPERTY_CONST
),
155 SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL
, offsetof(Socket
, smack_ip_out
), SD_BUS_VTABLE_PROPERTY_CONST
),
156 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid
, offsetof(Socket
, control_pid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
157 SD_BUS_PROPERTY("Result", "s", property_get_result
, offsetof(Socket
, result
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
158 SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, n_connections
), 0),
159 SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned
, offsetof(Socket
, n_accepted
), 0),
160 SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname
, 0, 0),
161 SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int
, offsetof(Socket
, socket_protocol
), SD_BUS_VTABLE_PROPERTY_CONST
),
162 SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, trigger_limit
.interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
163 SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, trigger_limit
.burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
164 SD_BUS_PROPERTY("UID", "u", NULL
, offsetof(Unit
, ref_uid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
165 SD_BUS_PROPERTY("GID", "u", NULL
, offsetof(Unit
, ref_gid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
166 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
167 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
168 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
169 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
173 static inline bool check_size_t_truncation(uint64_t t
) {
174 return (size_t) t
== t
;
177 static inline const char* socket_protocol_to_name_supported(int32_t i
) {
178 if (!IN_SET(i
, IPPROTO_UDPLITE
, IPPROTO_SCTP
))
181 return socket_protocol_to_name(i
);
184 static BUS_DEFINE_SET_TRANSIENT(int, "i", int32_t, int, "%" PRIi32
);
185 static BUS_DEFINE_SET_TRANSIENT(message_queue
, "x", int64_t, long, "%" PRIi64
);
186 static BUS_DEFINE_SET_TRANSIENT_IS_VALID(size_t_check_truncation
, "t", uint64_t, size_t, "%" PRIu64
, check_size_t_truncation
);
187 static BUS_DEFINE_SET_TRANSIENT_PARSE(bind_ipv6_only
, SocketAddressBindIPv6Only
, parse_socket_address_bind_ipv6_only_or_bool
);
188 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(fdname
, fdname_is_valid
);
189 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(ifname
, ifname_valid
);
190 static BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(ip_tos
, "i", int32_t, int, "%" PRIi32
, ip_tos_to_string_alloc
);
191 static BUS_DEFINE_SET_TRANSIENT_TO_STRING(socket_protocol
, "i", int32_t, int, "%" PRIi32
, socket_protocol_to_name_supported
);
193 static int bus_socket_set_transient_property(
196 sd_bus_message
*message
,
197 UnitWriteFlags flags
,
198 sd_bus_error
*error
) {
200 SocketExecCommand ci
;
208 flags
|= UNIT_PRIVATE
;
210 if (streq(name
, "Accept"))
211 return bus_set_transient_bool(u
, name
, &s
->accept
, message
, flags
, error
);
213 if (streq(name
, "Writable"))
214 return bus_set_transient_bool(u
, name
, &s
->writable
, message
, flags
, error
);
216 if (streq(name
, "KeepAlive"))
217 return bus_set_transient_bool(u
, name
, &s
->keep_alive
, message
, flags
, error
);
219 if (streq(name
, "NoDelay"))
220 return bus_set_transient_bool(u
, name
, &s
->no_delay
, message
, flags
, error
);
222 if (streq(name
, "FreeBind"))
223 return bus_set_transient_bool(u
, name
, &s
->free_bind
, message
, flags
, error
);
225 if (streq(name
, "Transparent"))
226 return bus_set_transient_bool(u
, name
, &s
->transparent
, message
, flags
, error
);
228 if (streq(name
, "Broadcast"))
229 return bus_set_transient_bool(u
, name
, &s
->broadcast
, message
, flags
, error
);
231 if (streq(name
, "PassCredentials"))
232 return bus_set_transient_bool(u
, name
, &s
->pass_cred
, message
, flags
, error
);
234 if (streq(name
, "PassSecurity"))
235 return bus_set_transient_bool(u
, name
, &s
->pass_sec
, message
, flags
, error
);
237 if (streq(name
, "ReusePort"))
238 return bus_set_transient_bool(u
, name
, &s
->reuse_port
, message
, flags
, error
);
240 if (streq(name
, "RemoveOnStop"))
241 return bus_set_transient_bool(u
, name
, &s
->remove_on_stop
, message
, flags
, error
);
243 if (streq(name
, "SELinuxContextFromNet"))
244 return bus_set_transient_bool(u
, name
, &s
->selinux_context_from_net
, message
, flags
, error
);
246 if (streq(name
, "Priority"))
247 return bus_set_transient_int(u
, name
, &s
->priority
, message
, flags
, error
);
249 if (streq(name
, "IPTTL"))
250 return bus_set_transient_int(u
, name
, &s
->ip_ttl
, message
, flags
, error
);
252 if (streq(name
, "Mark"))
253 return bus_set_transient_int(u
, name
, &s
->mark
, message
, flags
, error
);
255 if (streq(name
, "Backlog"))
256 return bus_set_transient_unsigned(u
, name
, &s
->backlog
, message
, flags
, error
);
258 if (streq(name
, "MaxConnections"))
259 return bus_set_transient_unsigned(u
, name
, &s
->max_connections
, message
, flags
, error
);
261 if (streq(name
, "MaxConnectionsPerSource"))
262 return bus_set_transient_unsigned(u
, name
, &s
->max_connections_per_source
, message
, flags
, error
);
264 if (streq(name
, "KeepAliveProbes"))
265 return bus_set_transient_unsigned(u
, name
, &s
->keep_alive_cnt
, message
, flags
, error
);
267 if (streq(name
, "TriggerLimitBurst"))
268 return bus_set_transient_unsigned(u
, name
, &s
->trigger_limit
.burst
, message
, flags
, error
);
270 if (streq(name
, "SocketMode"))
271 return bus_set_transient_mode_t(u
, name
, &s
->socket_mode
, message
, flags
, error
);
273 if (streq(name
, "DirectoryMode"))
274 return bus_set_transient_mode_t(u
, name
, &s
->directory_mode
, message
, flags
, error
);
276 if (streq(name
, "MessageQueueMaxMessages"))
277 return bus_set_transient_message_queue(u
, name
, &s
->mq_maxmsg
, message
, flags
, error
);
279 if (streq(name
, "MessageQueueMessageSize"))
280 return bus_set_transient_message_queue(u
, name
, &s
->mq_msgsize
, message
, flags
, error
);
282 if (streq(name
, "TimeoutUSec"))
283 return bus_set_transient_usec_fix_0(u
, name
, &s
->timeout_usec
, message
, flags
, error
);
285 if (streq(name
, "KeepAliveTimeUSec"))
286 return bus_set_transient_usec(u
, name
, &s
->keep_alive_time
, message
, flags
, error
);
288 if (streq(name
, "KeepAliveIntervalUSec"))
289 return bus_set_transient_usec(u
, name
, &s
->keep_alive_interval
, message
, flags
, error
);
291 if (streq(name
, "DeferAcceptUSec"))
292 return bus_set_transient_usec(u
, name
, &s
->defer_accept
, message
, flags
, error
);
294 if (streq(name
, "TriggerLimitIntervalUSec"))
295 return bus_set_transient_usec(u
, name
, &s
->trigger_limit
.interval
, message
, flags
, error
);
297 if (streq(name
, "SmackLabel"))
298 return bus_set_transient_string(u
, name
, &s
->smack
, message
, flags
, error
);
300 if (streq(name
, "SmackLabelIPin"))
301 return bus_set_transient_string(u
, name
, &s
->smack_ip_in
, message
, flags
, error
);
303 if (streq(name
, "SmackLabelIPOut"))
304 return bus_set_transient_string(u
, name
, &s
->smack_ip_out
, message
, flags
, error
);
306 if (streq(name
, "TCPCongestion"))
307 return bus_set_transient_string(u
, name
, &s
->tcp_congestion
, message
, flags
, error
);
309 if (streq(name
, "FileDescriptorName"))
310 return bus_set_transient_fdname(u
, name
, &s
->fdname
, message
, flags
, error
);
312 if (streq(name
, "SocketUser"))
313 return bus_set_transient_user(u
, name
, &s
->user
, message
, flags
, error
);
315 if (streq(name
, "SocketGroup"))
316 return bus_set_transient_user(u
, name
, &s
->group
, message
, flags
, error
);
318 if (streq(name
, "BindIPv6Only"))
319 return bus_set_transient_bind_ipv6_only(u
, name
, &s
->bind_ipv6_only
, message
, flags
, error
);
321 if (streq(name
, "ReceiveBuffer"))
322 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->receive_buffer
, message
, flags
, error
);
324 if (streq(name
, "SendBuffer"))
325 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->send_buffer
, message
, flags
, error
);
327 if (streq(name
, "PipeSize"))
328 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->pipe_size
, message
, flags
, error
);
330 if (streq(name
, "BindToDevice"))
331 return bus_set_transient_ifname(u
, name
, &s
->bind_to_device
, message
, flags
, error
);
333 if (streq(name
, "IPTOS"))
334 return bus_set_transient_ip_tos(u
, name
, &s
->ip_tos
, message
, flags
, error
);
336 if (streq(name
, "SocketProtocol"))
337 return bus_set_transient_socket_protocol(u
, name
, &s
->socket_protocol
, message
, flags
, error
);
339 if ((ci
= socket_exec_command_from_string(name
)) >= 0)
340 return bus_set_transient_exec_command(u
, name
, &s
->exec_command
[ci
], message
, flags
, error
);
342 if (streq(name
, "Symlinks")) {
343 _cleanup_strv_free_
char **l
= NULL
;
346 r
= sd_bus_message_read_strv(message
, &l
);
351 if (!path_is_absolute(*p
))
352 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Symlink path is not absolute: %s", *p
);
355 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
356 if (strv_isempty(l
)) {
357 s
->symlinks
= strv_free(s
->symlinks
);
358 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=", name
);
360 _cleanup_free_
char *joined
= NULL
;
362 r
= strv_extend_strv(&s
->symlinks
, l
, true);
366 joined
= strv_join(l
, " ");
370 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=%s", name
, joined
);
376 } else if (streq(name
, "Listen")) {
380 r
= sd_bus_message_enter_container(message
, 'a', "(ss)");
384 while ((r
= sd_bus_message_read(message
, "(ss)", &t
, &a
)) > 0) {
385 _cleanup_free_ SocketPort
*p
= NULL
;
387 p
= new0(SocketPort
, 1);
391 p
->type
= socket_port_type_from_string(t
);
393 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown Socket type: %s", t
);
395 if (p
->type
!= SOCKET_SOCKET
) {
397 path_kill_slashes(p
->path
);
399 } else if (streq(t
, "Netlink")) {
400 r
= socket_address_parse_netlink(&p
->address
, a
);
402 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid netlink address: %s", a
);
405 r
= socket_address_parse(&p
->address
, a
);
407 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address: %s", a
);
409 p
->address
.type
= socket_address_type_from_string(t
);
410 if (p
->address
.type
< 0)
411 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address type: %s", t
);
413 if (socket_address_family(&p
->address
) != AF_LOCAL
&& p
->address
.type
== SOCK_SEQPACKET
)
414 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Address family not supported: %s", a
);
418 p
->auxiliary_fds
= NULL
;
419 p
->n_auxiliary_fds
= 0;
424 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
427 LIST_FIND_TAIL(port
, s
->ports
, tail
);
428 LIST_INSERT_AFTER(port
, s
->ports
, tail
, p
);
432 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "Listen%s=%s", t
, a
);
438 r
= sd_bus_message_exit_container(message
);
442 if (!UNIT_WRITE_FLAGS_NOOP(flags
) && empty
) {
443 socket_free_ports(s
);
444 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "ListenStream=");
453 int bus_socket_set_property(
456 sd_bus_message
*message
,
457 UnitWriteFlags flags
,
458 sd_bus_error
*error
) {
460 Socket
*s
= SOCKET(u
);
471 r
= bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, flags
, error
);
475 if (u
->transient
&& u
->load_state
== UNIT_STUB
) {
476 /* This is a transient unit, let's load a little more */
478 r
= bus_socket_set_transient_property(s
, name
, message
, flags
, error
);
482 r
= bus_exec_context_set_transient_property(u
, &s
->exec_context
, name
, message
, flags
, error
);
486 r
= bus_kill_context_set_transient_property(u
, &s
->kill_context
, name
, message
, flags
, error
);
494 int bus_socket_commit_properties(Unit
*u
) {
497 unit_update_cgroup_members_masks(u
);
498 unit_realize_cgroup(u
);