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("PollLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, poll_limit_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
133 SD_BUS_PROPERTY("PollLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, poll_limit_burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
134 SD_BUS_PROPERTY("UID", "u", bus_property_get_uid
, offsetof(Unit
, ref_uid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
135 SD_BUS_PROPERTY("GID", "u", bus_property_get_gid
, offsetof(Unit
, ref_gid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
136 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
137 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
138 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
139 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
143 static bool check_size_t_truncation(uint64_t t
) {
144 return (size_t) t
== t
;
147 static const char* socket_protocol_to_string(int32_t i
) {
151 if (!IN_SET(i
, IPPROTO_UDPLITE
, IPPROTO_SCTP
))
154 return ip_protocol_to_name(i
);
157 static BUS_DEFINE_SET_TRANSIENT(int, "i", int32_t, int, "%" PRIi32
);
158 static BUS_DEFINE_SET_TRANSIENT(message_queue
, "x", int64_t, long, "%" PRIi64
);
159 static BUS_DEFINE_SET_TRANSIENT_IS_VALID(size_t_check_truncation
, "t", uint64_t, size_t, "%" PRIu64
, check_size_t_truncation
);
160 static BUS_DEFINE_SET_TRANSIENT_PARSE(bind_ipv6_only
, SocketAddressBindIPv6Only
, socket_address_bind_ipv6_only_or_bool_from_string
);
161 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(fdname
, fdname_is_valid
);
162 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(ifname
, ifname_valid
);
163 static BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(ip_tos
, "i", int32_t, int, "%" PRIi32
, ip_tos_to_string_alloc
);
164 static BUS_DEFINE_SET_TRANSIENT_TO_STRING(socket_protocol
, "i", int32_t, int, "%" PRIi32
, socket_protocol_to_string
);
165 static BUS_DEFINE_SET_TRANSIENT_PARSE(socket_timestamping
, SocketTimestamping
, socket_timestamping_from_string_harder
);
167 static int bus_socket_set_transient_property(
170 sd_bus_message
*message
,
171 UnitWriteFlags flags
,
172 sd_bus_error
*error
) {
174 SocketExecCommand ci
;
182 flags
|= UNIT_PRIVATE
;
184 if (streq(name
, "Accept"))
185 return bus_set_transient_bool(u
, name
, &s
->accept
, message
, flags
, error
);
187 if (streq(name
, "FlushPending"))
188 return bus_set_transient_bool(u
, name
, &s
->flush_pending
, message
, flags
, error
);
190 if (streq(name
, "Writable"))
191 return bus_set_transient_bool(u
, name
, &s
->writable
, message
, flags
, error
);
193 if (streq(name
, "KeepAlive"))
194 return bus_set_transient_bool(u
, name
, &s
->keep_alive
, message
, flags
, error
);
196 if (streq(name
, "NoDelay"))
197 return bus_set_transient_bool(u
, name
, &s
->no_delay
, message
, flags
, error
);
199 if (streq(name
, "FreeBind"))
200 return bus_set_transient_bool(u
, name
, &s
->free_bind
, message
, flags
, error
);
202 if (streq(name
, "Transparent"))
203 return bus_set_transient_bool(u
, name
, &s
->transparent
, message
, flags
, error
);
205 if (streq(name
, "Broadcast"))
206 return bus_set_transient_bool(u
, name
, &s
->broadcast
, message
, flags
, error
);
208 if (streq(name
, "PassCredentials"))
209 return bus_set_transient_bool(u
, name
, &s
->pass_cred
, message
, flags
, error
);
211 if (streq(name
, "PassSecurity"))
212 return bus_set_transient_bool(u
, name
, &s
->pass_sec
, message
, flags
, error
);
214 if (streq(name
, "PassPacketInfo"))
215 return bus_set_transient_bool(u
, name
, &s
->pass_pktinfo
, message
, flags
, error
);
217 if (streq(name
, "Timestamping"))
218 return bus_set_transient_socket_timestamping(u
, name
, &s
->timestamping
, message
, flags
, error
);
220 if (streq(name
, "ReusePort"))
221 return bus_set_transient_bool(u
, name
, &s
->reuse_port
, message
, flags
, error
);
223 if (streq(name
, "RemoveOnStop"))
224 return bus_set_transient_bool(u
, name
, &s
->remove_on_stop
, message
, flags
, error
);
226 if (streq(name
, "SELinuxContextFromNet"))
227 return bus_set_transient_bool(u
, name
, &s
->selinux_context_from_net
, message
, flags
, error
);
229 if (streq(name
, "Priority"))
230 return bus_set_transient_int(u
, name
, &s
->priority
, message
, flags
, error
);
232 if (streq(name
, "IPTTL"))
233 return bus_set_transient_int(u
, name
, &s
->ip_ttl
, message
, flags
, error
);
235 if (streq(name
, "Mark"))
236 return bus_set_transient_int(u
, name
, &s
->mark
, message
, flags
, error
);
238 if (streq(name
, "Backlog"))
239 return bus_set_transient_unsigned(u
, name
, &s
->backlog
, message
, flags
, error
);
241 if (streq(name
, "MaxConnections"))
242 return bus_set_transient_unsigned(u
, name
, &s
->max_connections
, message
, flags
, error
);
244 if (streq(name
, "MaxConnectionsPerSource"))
245 return bus_set_transient_unsigned(u
, name
, &s
->max_connections_per_source
, message
, flags
, error
);
247 if (streq(name
, "KeepAliveProbes"))
248 return bus_set_transient_unsigned(u
, name
, &s
->keep_alive_cnt
, message
, flags
, error
);
250 if (streq(name
, "TriggerLimitBurst"))
251 return bus_set_transient_unsigned(u
, name
, &s
->trigger_limit
.burst
, message
, flags
, error
);
253 if (streq(name
, "PollLimitBurst"))
254 return bus_set_transient_unsigned(u
, name
, &s
->poll_limit_burst
, message
, flags
, error
);
256 if (streq(name
, "SocketMode"))
257 return bus_set_transient_mode_t(u
, name
, &s
->socket_mode
, message
, flags
, error
);
259 if (streq(name
, "DirectoryMode"))
260 return bus_set_transient_mode_t(u
, name
, &s
->directory_mode
, message
, flags
, error
);
262 if (streq(name
, "MessageQueueMaxMessages"))
263 return bus_set_transient_message_queue(u
, name
, &s
->mq_maxmsg
, message
, flags
, error
);
265 if (streq(name
, "MessageQueueMessageSize"))
266 return bus_set_transient_message_queue(u
, name
, &s
->mq_msgsize
, message
, flags
, error
);
268 if (streq(name
, "TimeoutUSec"))
269 return bus_set_transient_usec_fix_0(u
, name
, &s
->timeout_usec
, message
, flags
, error
);
271 if (streq(name
, "KeepAliveTimeUSec"))
272 return bus_set_transient_usec(u
, name
, &s
->keep_alive_time
, message
, flags
, error
);
274 if (streq(name
, "KeepAliveIntervalUSec"))
275 return bus_set_transient_usec(u
, name
, &s
->keep_alive_interval
, message
, flags
, error
);
277 if (streq(name
, "DeferAcceptUSec"))
278 return bus_set_transient_usec(u
, name
, &s
->defer_accept
, message
, flags
, error
);
280 if (streq(name
, "TriggerLimitIntervalUSec"))
281 return bus_set_transient_usec(u
, name
, &s
->trigger_limit
.interval
, message
, flags
, error
);
283 if (streq(name
, "PollLimitIntervalUSec"))
284 return bus_set_transient_usec(u
, name
, &s
->poll_limit_interval
, message
, flags
, error
);
286 if (streq(name
, "SmackLabel"))
287 return bus_set_transient_string(u
, name
, &s
->smack
, message
, flags
, error
);
289 if (streq(name
, "SmackLabelIPin"))
290 return bus_set_transient_string(u
, name
, &s
->smack_ip_in
, message
, flags
, error
);
292 if (streq(name
, "SmackLabelIPOut"))
293 return bus_set_transient_string(u
, name
, &s
->smack_ip_out
, message
, flags
, error
);
295 if (streq(name
, "TCPCongestion"))
296 return bus_set_transient_string(u
, name
, &s
->tcp_congestion
, message
, flags
, error
);
298 if (streq(name
, "FileDescriptorName"))
299 return bus_set_transient_fdname(u
, name
, &s
->fdname
, message
, flags
, error
);
301 if (streq(name
, "SocketUser"))
302 return bus_set_transient_user_relaxed(u
, name
, &s
->user
, message
, flags
, error
);
304 if (streq(name
, "SocketGroup"))
305 return bus_set_transient_user_relaxed(u
, name
, &s
->group
, message
, flags
, error
);
307 if (streq(name
, "BindIPv6Only"))
308 return bus_set_transient_bind_ipv6_only(u
, name
, &s
->bind_ipv6_only
, message
, flags
, error
);
310 if (streq(name
, "ReceiveBuffer"))
311 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->receive_buffer
, message
, flags
, error
);
313 if (streq(name
, "SendBuffer"))
314 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->send_buffer
, message
, flags
, error
);
316 if (streq(name
, "PipeSize"))
317 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->pipe_size
, message
, flags
, error
);
319 if (streq(name
, "BindToDevice"))
320 return bus_set_transient_ifname(u
, name
, &s
->bind_to_device
, message
, flags
, error
);
322 if (streq(name
, "IPTOS"))
323 return bus_set_transient_ip_tos(u
, name
, &s
->ip_tos
, message
, flags
, error
);
325 if (streq(name
, "SocketProtocol"))
326 return bus_set_transient_socket_protocol(u
, name
, &s
->socket_protocol
, message
, flags
, error
);
328 ci
= socket_exec_command_from_string(name
);
330 return bus_set_transient_exec_command(u
, name
,
331 &s
->exec_command
[ci
],
332 message
, flags
, error
);
334 if (streq(name
, "Symlinks")) {
335 _cleanup_strv_free_
char **l
= NULL
;
337 r
= sd_bus_message_read_strv(message
, &l
);
342 if (!path_is_absolute(*p
))
343 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Symlink path is not absolute: %s", *p
);
345 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
346 if (strv_isempty(l
)) {
347 s
->symlinks
= strv_free(s
->symlinks
);
348 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=", name
);
350 _cleanup_free_
char *joined
= NULL
;
352 r
= strv_extend_strv(&s
->symlinks
, l
, true);
356 joined
= strv_join(l
, " ");
360 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=%s", name
, joined
);
366 } else if (streq(name
, "Listen")) {
370 r
= sd_bus_message_enter_container(message
, 'a', "(ss)");
374 while ((r
= sd_bus_message_read(message
, "(ss)", &t
, &a
)) > 0) {
375 _cleanup_(socket_port_freep
) SocketPort
*p
= NULL
;
377 p
= new(SocketPort
, 1);
386 p
->type
= socket_port_type_from_string(t
);
388 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown Socket type: %s", t
);
390 if (p
->type
!= SOCKET_SOCKET
) {
391 if (!path_is_absolute(a
) || !path_is_valid(a
))
392 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid socket path: %s", a
);
394 r
= path_simplify_alloc(a
, &p
->path
);
398 } else if (streq(t
, "Netlink")) {
399 r
= socket_address_parse_netlink(&p
->address
, a
);
401 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid netlink address: %s", a
);
404 r
= socket_address_parse(&p
->address
, a
);
406 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address: %s", a
);
408 p
->address
.type
= socket_address_type_from_string(t
);
409 if (p
->address
.type
< 0)
410 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address type: %s", t
);
412 if (socket_address_family(&p
->address
) != AF_UNIX
&& p
->address
.type
== SOCK_SEQPACKET
)
413 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Address family not supported: %s", a
);
418 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
419 LIST_APPEND(port
, s
->ports
, TAKE_PTR(p
));
420 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "Listen%s=%s", t
, a
);
426 r
= sd_bus_message_exit_container(message
);
430 if (!UNIT_WRITE_FLAGS_NOOP(flags
) && empty
) {
431 socket_free_ports(s
);
432 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "ListenStream=");
441 int bus_socket_set_property(
444 sd_bus_message
*message
,
445 UnitWriteFlags flags
,
446 sd_bus_error
*error
) {
448 Socket
*s
= SOCKET(u
);
459 r
= bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, flags
, error
);
463 if (u
->transient
&& u
->load_state
== UNIT_STUB
) {
464 /* This is a transient unit, let's load a little more */
466 r
= bus_socket_set_transient_property(s
, name
, message
, flags
, error
);
470 r
= bus_exec_context_set_transient_property(u
, &s
->exec_context
, name
, message
, flags
, error
);
474 r
= bus_kill_context_set_transient_property(u
, &s
->kill_context
, name
, message
, flags
, error
);
482 int bus_socket_commit_properties(Unit
*u
) {
485 unit_realize_cgroup(u
);