1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
4 #include "bus-get-properties.h"
5 #include "dbus-cgroup.h"
6 #include "dbus-execute.h"
8 #include "dbus-socket.h"
11 #include "ip-protocol-list.h"
12 #include "parse-util.h"
13 #include "path-util.h"
15 #include "socket-netlink.h"
16 #include "socket-util.h"
17 #include "string-util.h"
20 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result
, socket_result
, SocketResult
);
21 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_bind_ipv6_only
, socket_address_bind_ipv6_only
, SocketAddressBindIPv6Only
);
22 static BUS_DEFINE_PROPERTY_GET(property_get_fdname
, "s", Socket
, socket_fdname
);
23 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_timestamping
, socket_timestamping
, SocketTimestamping
);
25 static int property_get_listen(
28 const char *interface
,
30 sd_bus_message
*reply
,
32 sd_bus_error
*error
) {
34 Socket
*s
= SOCKET(userdata
);
41 r
= sd_bus_message_open_container(reply
, 'a', "(ss)");
45 LIST_FOREACH(port
, p
, s
->ports
) {
46 _cleanup_free_
char *address
= NULL
;
51 r
= socket_address_print(&p
->address
, &address
);
62 case SOCKET_USB_FUNCTION
:
70 r
= sd_bus_message_append(reply
, "(ss)", socket_port_type_to_string(p
), a
);
75 return sd_bus_message_close_container(reply
);
78 const sd_bus_vtable bus_socket_vtable
[] = {
79 SD_BUS_VTABLE_START(0),
80 SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only
, offsetof(Socket
, bind_ipv6_only
), SD_BUS_VTABLE_PROPERTY_CONST
),
81 SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned
, offsetof(Socket
, backlog
), SD_BUS_VTABLE_PROPERTY_CONST
),
82 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec
, offsetof(Socket
, timeout_usec
), SD_BUS_VTABLE_PROPERTY_CONST
),
83 SD_BUS_PROPERTY("BindToDevice", "s", NULL
, offsetof(Socket
, bind_to_device
), SD_BUS_VTABLE_PROPERTY_CONST
),
84 SD_BUS_PROPERTY("SocketUser", "s", NULL
, offsetof(Socket
, user
), SD_BUS_VTABLE_PROPERTY_CONST
),
85 SD_BUS_PROPERTY("SocketGroup", "s", NULL
, offsetof(Socket
, group
), SD_BUS_VTABLE_PROPERTY_CONST
),
86 SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode
, offsetof(Socket
, socket_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
87 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode
, offsetof(Socket
, directory_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
88 SD_BUS_PROPERTY("Accept", "b", bus_property_get_bool
, offsetof(Socket
, accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
89 SD_BUS_PROPERTY("FlushPending", "b", bus_property_get_bool
, offsetof(Socket
, flush_pending
), SD_BUS_VTABLE_PROPERTY_CONST
),
90 SD_BUS_PROPERTY("Writable", "b", bus_property_get_bool
, offsetof(Socket
, writable
), SD_BUS_VTABLE_PROPERTY_CONST
),
91 SD_BUS_PROPERTY("KeepAlive", "b", bus_property_get_bool
, offsetof(Socket
, keep_alive
), SD_BUS_VTABLE_PROPERTY_CONST
),
92 SD_BUS_PROPERTY("KeepAliveTimeUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_time
), SD_BUS_VTABLE_PROPERTY_CONST
),
93 SD_BUS_PROPERTY("KeepAliveIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
94 SD_BUS_PROPERTY("KeepAliveProbes", "u", bus_property_get_unsigned
, offsetof(Socket
, keep_alive_cnt
), SD_BUS_VTABLE_PROPERTY_CONST
),
95 SD_BUS_PROPERTY("DeferAcceptUSec" , "t", bus_property_get_usec
, offsetof(Socket
, defer_accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
96 SD_BUS_PROPERTY("NoDelay", "b", bus_property_get_bool
, offsetof(Socket
, no_delay
), SD_BUS_VTABLE_PROPERTY_CONST
),
97 SD_BUS_PROPERTY("Priority", "i", bus_property_get_int
, offsetof(Socket
, priority
), SD_BUS_VTABLE_PROPERTY_CONST
),
98 SD_BUS_PROPERTY("ReceiveBuffer", "t", bus_property_get_size
, offsetof(Socket
, receive_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
99 SD_BUS_PROPERTY("SendBuffer", "t", bus_property_get_size
, offsetof(Socket
, send_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
100 SD_BUS_PROPERTY("IPTOS", "i", bus_property_get_int
, offsetof(Socket
, ip_tos
), SD_BUS_VTABLE_PROPERTY_CONST
),
101 SD_BUS_PROPERTY("IPTTL", "i", bus_property_get_int
, offsetof(Socket
, ip_ttl
), SD_BUS_VTABLE_PROPERTY_CONST
),
102 SD_BUS_PROPERTY("PipeSize", "t", bus_property_get_size
, offsetof(Socket
, pipe_size
), SD_BUS_VTABLE_PROPERTY_CONST
),
103 SD_BUS_PROPERTY("FreeBind", "b", bus_property_get_bool
, offsetof(Socket
, free_bind
), SD_BUS_VTABLE_PROPERTY_CONST
),
104 SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool
, offsetof(Socket
, transparent
), SD_BUS_VTABLE_PROPERTY_CONST
),
105 SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool
, offsetof(Socket
, broadcast
), SD_BUS_VTABLE_PROPERTY_CONST
),
106 SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool
, offsetof(Socket
, pass_cred
), SD_BUS_VTABLE_PROPERTY_CONST
),
107 SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool
, offsetof(Socket
, pass_sec
), SD_BUS_VTABLE_PROPERTY_CONST
),
108 SD_BUS_PROPERTY("PassPacketInfo", "b", bus_property_get_bool
, offsetof(Socket
, pass_pktinfo
), SD_BUS_VTABLE_PROPERTY_CONST
),
109 SD_BUS_PROPERTY("Timestamping", "s", property_get_timestamping
, offsetof(Socket
, timestamping
), SD_BUS_VTABLE_PROPERTY_CONST
),
110 SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool
, offsetof(Socket
, remove_on_stop
), SD_BUS_VTABLE_PROPERTY_CONST
),
111 SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen
, 0, SD_BUS_VTABLE_PROPERTY_CONST
),
112 SD_BUS_PROPERTY("Symlinks", "as", NULL
, offsetof(Socket
, symlinks
), SD_BUS_VTABLE_PROPERTY_CONST
),
113 SD_BUS_PROPERTY("Mark", "i", bus_property_get_int
, offsetof(Socket
, mark
), SD_BUS_VTABLE_PROPERTY_CONST
),
114 SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections
), SD_BUS_VTABLE_PROPERTY_CONST
),
115 SD_BUS_PROPERTY("MaxConnectionsPerSource", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections_per_source
), SD_BUS_VTABLE_PROPERTY_CONST
),
116 SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long
, offsetof(Socket
, mq_maxmsg
), SD_BUS_VTABLE_PROPERTY_CONST
),
117 SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long
, offsetof(Socket
, mq_msgsize
), SD_BUS_VTABLE_PROPERTY_CONST
),
118 SD_BUS_PROPERTY("TCPCongestion", "s", NULL
, offsetof(Socket
, tcp_congestion
), SD_BUS_VTABLE_PROPERTY_CONST
),
119 SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool
, offsetof(Socket
, reuse_port
), SD_BUS_VTABLE_PROPERTY_CONST
),
120 SD_BUS_PROPERTY("SmackLabel", "s", NULL
, offsetof(Socket
, smack
), SD_BUS_VTABLE_PROPERTY_CONST
),
121 SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL
, offsetof(Socket
, smack_ip_in
), SD_BUS_VTABLE_PROPERTY_CONST
),
122 SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL
, offsetof(Socket
, smack_ip_out
), SD_BUS_VTABLE_PROPERTY_CONST
),
123 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid
, offsetof(Socket
, control_pid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
124 SD_BUS_PROPERTY("Result", "s", property_get_result
, offsetof(Socket
, result
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
125 SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, n_connections
), 0),
126 SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned
, offsetof(Socket
, n_accepted
), 0),
127 SD_BUS_PROPERTY("NRefused", "u", bus_property_get_unsigned
, offsetof(Socket
, n_refused
), 0),
128 SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname
, 0, 0),
129 SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int
, offsetof(Socket
, socket_protocol
), SD_BUS_VTABLE_PROPERTY_CONST
),
130 SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, trigger_limit
.interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
131 SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, trigger_limit
.burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
132 SD_BUS_PROPERTY("UID", "u", bus_property_get_uid
, offsetof(Unit
, ref_uid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
133 SD_BUS_PROPERTY("GID", "u", bus_property_get_gid
, offsetof(Unit
, ref_gid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
134 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
135 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
136 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
137 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
141 static bool check_size_t_truncation(uint64_t t
) {
142 return (size_t) t
== t
;
145 static const char* socket_protocol_to_string(int32_t i
) {
149 if (!IN_SET(i
, IPPROTO_UDPLITE
, IPPROTO_SCTP
))
152 return ip_protocol_to_name(i
);
155 static BUS_DEFINE_SET_TRANSIENT(int, "i", int32_t, int, "%" PRIi32
);
156 static BUS_DEFINE_SET_TRANSIENT(message_queue
, "x", int64_t, long, "%" PRIi64
);
157 static BUS_DEFINE_SET_TRANSIENT_IS_VALID(size_t_check_truncation
, "t", uint64_t, size_t, "%" PRIu64
, check_size_t_truncation
);
158 static BUS_DEFINE_SET_TRANSIENT_PARSE(bind_ipv6_only
, SocketAddressBindIPv6Only
, socket_address_bind_ipv6_only_or_bool_from_string
);
159 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(fdname
, fdname_is_valid
);
160 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(ifname
, ifname_valid
);
161 static BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(ip_tos
, "i", int32_t, int, "%" PRIi32
, ip_tos_to_string_alloc
);
162 static BUS_DEFINE_SET_TRANSIENT_TO_STRING(socket_protocol
, "i", int32_t, int, "%" PRIi32
, socket_protocol_to_string
);
163 static BUS_DEFINE_SET_TRANSIENT_PARSE(socket_timestamping
, SocketTimestamping
, socket_timestamping_from_string_harder
);
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
, "FlushPending"))
186 return bus_set_transient_bool(u
, name
, &s
->flush_pending
, message
, flags
, error
);
188 if (streq(name
, "Writable"))
189 return bus_set_transient_bool(u
, name
, &s
->writable
, message
, flags
, error
);
191 if (streq(name
, "KeepAlive"))
192 return bus_set_transient_bool(u
, name
, &s
->keep_alive
, message
, flags
, error
);
194 if (streq(name
, "NoDelay"))
195 return bus_set_transient_bool(u
, name
, &s
->no_delay
, message
, flags
, error
);
197 if (streq(name
, "FreeBind"))
198 return bus_set_transient_bool(u
, name
, &s
->free_bind
, message
, flags
, error
);
200 if (streq(name
, "Transparent"))
201 return bus_set_transient_bool(u
, name
, &s
->transparent
, message
, flags
, error
);
203 if (streq(name
, "Broadcast"))
204 return bus_set_transient_bool(u
, name
, &s
->broadcast
, message
, flags
, error
);
206 if (streq(name
, "PassCredentials"))
207 return bus_set_transient_bool(u
, name
, &s
->pass_cred
, message
, flags
, error
);
209 if (streq(name
, "PassSecurity"))
210 return bus_set_transient_bool(u
, name
, &s
->pass_sec
, message
, flags
, error
);
212 if (streq(name
, "PassPacketInfo"))
213 return bus_set_transient_bool(u
, name
, &s
->pass_pktinfo
, message
, flags
, error
);
215 if (streq(name
, "Timestamping"))
216 return bus_set_transient_socket_timestamping(u
, name
, &s
->timestamping
, message
, flags
, error
);
218 if (streq(name
, "ReusePort"))
219 return bus_set_transient_bool(u
, name
, &s
->reuse_port
, message
, flags
, error
);
221 if (streq(name
, "RemoveOnStop"))
222 return bus_set_transient_bool(u
, name
, &s
->remove_on_stop
, message
, flags
, error
);
224 if (streq(name
, "SELinuxContextFromNet"))
225 return bus_set_transient_bool(u
, name
, &s
->selinux_context_from_net
, message
, flags
, error
);
227 if (streq(name
, "Priority"))
228 return bus_set_transient_int(u
, name
, &s
->priority
, message
, flags
, error
);
230 if (streq(name
, "IPTTL"))
231 return bus_set_transient_int(u
, name
, &s
->ip_ttl
, message
, flags
, error
);
233 if (streq(name
, "Mark"))
234 return bus_set_transient_int(u
, name
, &s
->mark
, message
, flags
, error
);
236 if (streq(name
, "Backlog"))
237 return bus_set_transient_unsigned(u
, name
, &s
->backlog
, message
, flags
, error
);
239 if (streq(name
, "MaxConnections"))
240 return bus_set_transient_unsigned(u
, name
, &s
->max_connections
, message
, flags
, error
);
242 if (streq(name
, "MaxConnectionsPerSource"))
243 return bus_set_transient_unsigned(u
, name
, &s
->max_connections_per_source
, message
, flags
, error
);
245 if (streq(name
, "KeepAliveProbes"))
246 return bus_set_transient_unsigned(u
, name
, &s
->keep_alive_cnt
, message
, flags
, error
);
248 if (streq(name
, "TriggerLimitBurst"))
249 return bus_set_transient_unsigned(u
, name
, &s
->trigger_limit
.burst
, message
, flags
, error
);
251 if (streq(name
, "SocketMode"))
252 return bus_set_transient_mode_t(u
, name
, &s
->socket_mode
, message
, flags
, error
);
254 if (streq(name
, "DirectoryMode"))
255 return bus_set_transient_mode_t(u
, name
, &s
->directory_mode
, message
, flags
, error
);
257 if (streq(name
, "MessageQueueMaxMessages"))
258 return bus_set_transient_message_queue(u
, name
, &s
->mq_maxmsg
, message
, flags
, error
);
260 if (streq(name
, "MessageQueueMessageSize"))
261 return bus_set_transient_message_queue(u
, name
, &s
->mq_msgsize
, message
, flags
, error
);
263 if (streq(name
, "TimeoutUSec"))
264 return bus_set_transient_usec_fix_0(u
, name
, &s
->timeout_usec
, message
, flags
, error
);
266 if (streq(name
, "KeepAliveTimeUSec"))
267 return bus_set_transient_usec(u
, name
, &s
->keep_alive_time
, message
, flags
, error
);
269 if (streq(name
, "KeepAliveIntervalUSec"))
270 return bus_set_transient_usec(u
, name
, &s
->keep_alive_interval
, message
, flags
, error
);
272 if (streq(name
, "DeferAcceptUSec"))
273 return bus_set_transient_usec(u
, name
, &s
->defer_accept
, message
, flags
, error
);
275 if (streq(name
, "TriggerLimitIntervalUSec"))
276 return bus_set_transient_usec(u
, name
, &s
->trigger_limit
.interval
, message
, flags
, error
);
278 if (streq(name
, "SmackLabel"))
279 return bus_set_transient_string(u
, name
, &s
->smack
, message
, flags
, error
);
281 if (streq(name
, "SmackLabelIPin"))
282 return bus_set_transient_string(u
, name
, &s
->smack_ip_in
, message
, flags
, error
);
284 if (streq(name
, "SmackLabelIPOut"))
285 return bus_set_transient_string(u
, name
, &s
->smack_ip_out
, message
, flags
, error
);
287 if (streq(name
, "TCPCongestion"))
288 return bus_set_transient_string(u
, name
, &s
->tcp_congestion
, message
, flags
, error
);
290 if (streq(name
, "FileDescriptorName"))
291 return bus_set_transient_fdname(u
, name
, &s
->fdname
, message
, flags
, error
);
293 if (streq(name
, "SocketUser"))
294 return bus_set_transient_user_relaxed(u
, name
, &s
->user
, message
, flags
, error
);
296 if (streq(name
, "SocketGroup"))
297 return bus_set_transient_user_relaxed(u
, name
, &s
->group
, message
, flags
, error
);
299 if (streq(name
, "BindIPv6Only"))
300 return bus_set_transient_bind_ipv6_only(u
, name
, &s
->bind_ipv6_only
, message
, flags
, error
);
302 if (streq(name
, "ReceiveBuffer"))
303 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->receive_buffer
, message
, flags
, error
);
305 if (streq(name
, "SendBuffer"))
306 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->send_buffer
, message
, flags
, error
);
308 if (streq(name
, "PipeSize"))
309 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->pipe_size
, message
, flags
, error
);
311 if (streq(name
, "BindToDevice"))
312 return bus_set_transient_ifname(u
, name
, &s
->bind_to_device
, message
, flags
, error
);
314 if (streq(name
, "IPTOS"))
315 return bus_set_transient_ip_tos(u
, name
, &s
->ip_tos
, message
, flags
, error
);
317 if (streq(name
, "SocketProtocol"))
318 return bus_set_transient_socket_protocol(u
, name
, &s
->socket_protocol
, message
, flags
, error
);
320 ci
= socket_exec_command_from_string(name
);
322 return bus_set_transient_exec_command(u
, name
,
323 &s
->exec_command
[ci
],
324 message
, flags
, error
);
326 if (streq(name
, "Symlinks")) {
327 _cleanup_strv_free_
char **l
= NULL
;
329 r
= sd_bus_message_read_strv(message
, &l
);
334 if (!path_is_absolute(*p
))
335 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Symlink path is not absolute: %s", *p
);
337 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
338 if (strv_isempty(l
)) {
339 s
->symlinks
= strv_free(s
->symlinks
);
340 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=", name
);
342 _cleanup_free_
char *joined
= NULL
;
344 r
= strv_extend_strv(&s
->symlinks
, l
, true);
348 joined
= strv_join(l
, " ");
352 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=%s", name
, joined
);
358 } else if (streq(name
, "Listen")) {
362 r
= sd_bus_message_enter_container(message
, 'a', "(ss)");
366 while ((r
= sd_bus_message_read(message
, "(ss)", &t
, &a
)) > 0) {
367 _cleanup_(socket_port_freep
) SocketPort
*p
= NULL
;
369 p
= new(SocketPort
, 1);
378 p
->type
= socket_port_type_from_string(t
);
380 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown Socket type: %s", t
);
382 if (p
->type
!= SOCKET_SOCKET
) {
383 if (!path_is_absolute(a
) || !path_is_valid(a
))
384 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid socket path: %s", a
);
390 path_simplify(p
->path
);
392 } else if (streq(t
, "Netlink")) {
393 r
= socket_address_parse_netlink(&p
->address
, a
);
395 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid netlink address: %s", a
);
398 r
= socket_address_parse(&p
->address
, a
);
400 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address: %s", a
);
402 p
->address
.type
= socket_address_type_from_string(t
);
403 if (p
->address
.type
< 0)
404 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address type: %s", t
);
406 if (socket_address_family(&p
->address
) != AF_UNIX
&& p
->address
.type
== SOCK_SEQPACKET
)
407 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Address family not supported: %s", a
);
412 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
413 LIST_APPEND(port
, s
->ports
, TAKE_PTR(p
));
414 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "Listen%s=%s", t
, a
);
420 r
= sd_bus_message_exit_container(message
);
424 if (!UNIT_WRITE_FLAGS_NOOP(flags
) && empty
) {
425 socket_free_ports(s
);
426 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "ListenStream=");
435 int bus_socket_set_property(
438 sd_bus_message
*message
,
439 UnitWriteFlags flags
,
440 sd_bus_error
*error
) {
442 Socket
*s
= SOCKET(u
);
453 r
= bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, flags
, error
);
457 if (u
->transient
&& u
->load_state
== UNIT_STUB
) {
458 /* This is a transient unit, let's load a little more */
460 r
= bus_socket_set_transient_property(s
, name
, message
, flags
, error
);
464 r
= bus_exec_context_set_transient_property(u
, &s
->exec_context
, name
, message
, flags
, error
);
468 r
= bus_kill_context_set_transient_property(u
, &s
->kill_context
, name
, message
, flags
, error
);
476 int bus_socket_commit_properties(Unit
*u
) {
479 unit_realize_cgroup(u
);