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
;
48 r
= socket_port_to_address(p
, &address
);
52 r
= sd_bus_message_append(reply
, "(ss)", socket_port_type_to_string(p
), address
);
57 return sd_bus_message_close_container(reply
);
60 const sd_bus_vtable bus_socket_vtable
[] = {
61 SD_BUS_VTABLE_START(0),
62 SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only
, offsetof(Socket
, bind_ipv6_only
), SD_BUS_VTABLE_PROPERTY_CONST
),
63 SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned
, offsetof(Socket
, backlog
), SD_BUS_VTABLE_PROPERTY_CONST
),
64 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec
, offsetof(Socket
, timeout_usec
), SD_BUS_VTABLE_PROPERTY_CONST
),
65 SD_BUS_PROPERTY("BindToDevice", "s", NULL
, offsetof(Socket
, bind_to_device
), SD_BUS_VTABLE_PROPERTY_CONST
),
66 SD_BUS_PROPERTY("SocketUser", "s", NULL
, offsetof(Socket
, user
), SD_BUS_VTABLE_PROPERTY_CONST
),
67 SD_BUS_PROPERTY("SocketGroup", "s", NULL
, offsetof(Socket
, group
), SD_BUS_VTABLE_PROPERTY_CONST
),
68 SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode
, offsetof(Socket
, socket_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
69 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode
, offsetof(Socket
, directory_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
70 SD_BUS_PROPERTY("Accept", "b", bus_property_get_bool
, offsetof(Socket
, accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
71 SD_BUS_PROPERTY("FlushPending", "b", bus_property_get_bool
, offsetof(Socket
, flush_pending
), SD_BUS_VTABLE_PROPERTY_CONST
),
72 SD_BUS_PROPERTY("Writable", "b", bus_property_get_bool
, offsetof(Socket
, writable
), SD_BUS_VTABLE_PROPERTY_CONST
),
73 SD_BUS_PROPERTY("KeepAlive", "b", bus_property_get_bool
, offsetof(Socket
, keep_alive
), SD_BUS_VTABLE_PROPERTY_CONST
),
74 SD_BUS_PROPERTY("KeepAliveTimeUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_time
), SD_BUS_VTABLE_PROPERTY_CONST
),
75 SD_BUS_PROPERTY("KeepAliveIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
76 SD_BUS_PROPERTY("KeepAliveProbes", "u", bus_property_get_unsigned
, offsetof(Socket
, keep_alive_cnt
), SD_BUS_VTABLE_PROPERTY_CONST
),
77 SD_BUS_PROPERTY("DeferAcceptUSec" , "t", bus_property_get_usec
, offsetof(Socket
, defer_accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
78 SD_BUS_PROPERTY("NoDelay", "b", bus_property_get_bool
, offsetof(Socket
, no_delay
), SD_BUS_VTABLE_PROPERTY_CONST
),
79 SD_BUS_PROPERTY("Priority", "i", bus_property_get_int
, offsetof(Socket
, priority
), SD_BUS_VTABLE_PROPERTY_CONST
),
80 SD_BUS_PROPERTY("ReceiveBuffer", "t", bus_property_get_size
, offsetof(Socket
, receive_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
81 SD_BUS_PROPERTY("SendBuffer", "t", bus_property_get_size
, offsetof(Socket
, send_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
82 SD_BUS_PROPERTY("IPTOS", "i", bus_property_get_int
, offsetof(Socket
, ip_tos
), SD_BUS_VTABLE_PROPERTY_CONST
),
83 SD_BUS_PROPERTY("IPTTL", "i", bus_property_get_int
, offsetof(Socket
, ip_ttl
), SD_BUS_VTABLE_PROPERTY_CONST
),
84 SD_BUS_PROPERTY("PipeSize", "t", bus_property_get_size
, offsetof(Socket
, pipe_size
), SD_BUS_VTABLE_PROPERTY_CONST
),
85 SD_BUS_PROPERTY("FreeBind", "b", bus_property_get_bool
, offsetof(Socket
, free_bind
), SD_BUS_VTABLE_PROPERTY_CONST
),
86 SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool
, offsetof(Socket
, transparent
), SD_BUS_VTABLE_PROPERTY_CONST
),
87 SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool
, offsetof(Socket
, broadcast
), SD_BUS_VTABLE_PROPERTY_CONST
),
88 SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool
, offsetof(Socket
, pass_cred
), SD_BUS_VTABLE_PROPERTY_CONST
),
89 SD_BUS_PROPERTY("PassFileDescriptorsToExec", "b", bus_property_get_bool
, offsetof(Socket
, pass_fds_to_exec
), SD_BUS_VTABLE_PROPERTY_CONST
),
90 SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool
, offsetof(Socket
, pass_sec
), SD_BUS_VTABLE_PROPERTY_CONST
),
91 SD_BUS_PROPERTY("PassPacketInfo", "b", bus_property_get_bool
, offsetof(Socket
, pass_pktinfo
), SD_BUS_VTABLE_PROPERTY_CONST
),
92 SD_BUS_PROPERTY("Timestamping", "s", property_get_timestamping
, offsetof(Socket
, timestamping
), SD_BUS_VTABLE_PROPERTY_CONST
),
93 SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool
, offsetof(Socket
, remove_on_stop
), SD_BUS_VTABLE_PROPERTY_CONST
),
94 SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen
, 0, SD_BUS_VTABLE_PROPERTY_CONST
),
95 SD_BUS_PROPERTY("Symlinks", "as", NULL
, offsetof(Socket
, symlinks
), SD_BUS_VTABLE_PROPERTY_CONST
),
96 SD_BUS_PROPERTY("Mark", "i", bus_property_get_int
, offsetof(Socket
, mark
), SD_BUS_VTABLE_PROPERTY_CONST
),
97 SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections
), SD_BUS_VTABLE_PROPERTY_CONST
),
98 SD_BUS_PROPERTY("MaxConnectionsPerSource", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections_per_source
), SD_BUS_VTABLE_PROPERTY_CONST
),
99 SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long
, offsetof(Socket
, mq_maxmsg
), SD_BUS_VTABLE_PROPERTY_CONST
),
100 SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long
, offsetof(Socket
, mq_msgsize
), SD_BUS_VTABLE_PROPERTY_CONST
),
101 SD_BUS_PROPERTY("TCPCongestion", "s", NULL
, offsetof(Socket
, tcp_congestion
), SD_BUS_VTABLE_PROPERTY_CONST
),
102 SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool
, offsetof(Socket
, reuse_port
), SD_BUS_VTABLE_PROPERTY_CONST
),
103 SD_BUS_PROPERTY("SmackLabel", "s", NULL
, offsetof(Socket
, smack
), SD_BUS_VTABLE_PROPERTY_CONST
),
104 SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL
, offsetof(Socket
, smack_ip_in
), SD_BUS_VTABLE_PROPERTY_CONST
),
105 SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL
, offsetof(Socket
, smack_ip_out
), SD_BUS_VTABLE_PROPERTY_CONST
),
106 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid
, offsetof(Socket
, control_pid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
107 SD_BUS_PROPERTY("Result", "s", property_get_result
, offsetof(Socket
, result
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
108 SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, n_connections
), 0),
109 SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned
, offsetof(Socket
, n_accepted
), 0),
110 SD_BUS_PROPERTY("NRefused", "u", bus_property_get_unsigned
, offsetof(Socket
, n_refused
), 0),
111 SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname
, 0, 0),
112 SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int
, offsetof(Socket
, socket_protocol
), SD_BUS_VTABLE_PROPERTY_CONST
),
113 SD_BUS_PROPERTY("TriggerLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, trigger_limit
.interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
114 SD_BUS_PROPERTY("TriggerLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, trigger_limit
.burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
115 SD_BUS_PROPERTY("PollLimitIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, poll_limit_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
116 SD_BUS_PROPERTY("PollLimitBurst", "u", bus_property_get_unsigned
, offsetof(Socket
, poll_limit_burst
), SD_BUS_VTABLE_PROPERTY_CONST
),
117 SD_BUS_PROPERTY("UID", "u", bus_property_get_uid
, offsetof(Unit
, ref_uid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
118 SD_BUS_PROPERTY("GID", "u", bus_property_get_gid
, offsetof(Unit
, ref_gid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
119 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
120 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
121 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
122 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
126 static bool check_size_t_truncation(uint64_t t
) {
127 return (size_t) t
== t
;
130 static const char* socket_protocol_to_string(int32_t i
) {
134 if (!IN_SET(i
, IPPROTO_UDPLITE
, IPPROTO_SCTP
))
137 return ip_protocol_to_name(i
);
140 static BUS_DEFINE_SET_TRANSIENT(int, "i", int32_t, int, "%" PRIi32
);
141 static BUS_DEFINE_SET_TRANSIENT(message_queue
, "x", int64_t, long, "%" PRIi64
);
142 static BUS_DEFINE_SET_TRANSIENT_IS_VALID(size_t_check_truncation
, "t", uint64_t, size_t, "%" PRIu64
, check_size_t_truncation
);
143 static BUS_DEFINE_SET_TRANSIENT_PARSE(bind_ipv6_only
, SocketAddressBindIPv6Only
, socket_address_bind_ipv6_only_or_bool_from_string
);
144 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(fdname
, fdname_is_valid
);
145 static BUS_DEFINE_SET_TRANSIENT_STRING_WITH_CHECK(ifname
, ifname_valid
);
146 static BUS_DEFINE_SET_TRANSIENT_TO_STRING_ALLOC(ip_tos
, "i", int32_t, int, "%" PRIi32
, ip_tos_to_string_alloc
);
147 static BUS_DEFINE_SET_TRANSIENT_TO_STRING(socket_protocol
, "i", int32_t, int, "%" PRIi32
, socket_protocol_to_string
);
148 static BUS_DEFINE_SET_TRANSIENT_PARSE(socket_timestamping
, SocketTimestamping
, socket_timestamping_from_string_harder
);
150 static int bus_socket_set_transient_property(
153 sd_bus_message
*message
,
154 UnitWriteFlags flags
,
155 sd_bus_error
*error
) {
157 SocketExecCommand ci
;
165 flags
|= UNIT_PRIVATE
;
167 if (streq(name
, "Accept"))
168 return bus_set_transient_bool(u
, name
, &s
->accept
, message
, flags
, error
);
170 if (streq(name
, "FlushPending"))
171 return bus_set_transient_bool(u
, name
, &s
->flush_pending
, message
, flags
, error
);
173 if (streq(name
, "Writable"))
174 return bus_set_transient_bool(u
, name
, &s
->writable
, message
, flags
, error
);
176 if (streq(name
, "KeepAlive"))
177 return bus_set_transient_bool(u
, name
, &s
->keep_alive
, message
, flags
, error
);
179 if (streq(name
, "NoDelay"))
180 return bus_set_transient_bool(u
, name
, &s
->no_delay
, message
, flags
, error
);
182 if (streq(name
, "FreeBind"))
183 return bus_set_transient_bool(u
, name
, &s
->free_bind
, message
, flags
, error
);
185 if (streq(name
, "Transparent"))
186 return bus_set_transient_bool(u
, name
, &s
->transparent
, message
, flags
, error
);
188 if (streq(name
, "Broadcast"))
189 return bus_set_transient_bool(u
, name
, &s
->broadcast
, message
, flags
, error
);
191 if (streq(name
, "PassCredentials"))
192 return bus_set_transient_bool(u
, name
, &s
->pass_cred
, message
, flags
, error
);
194 if (streq(name
, "PassFileDescriptorsToExec"))
195 return bus_set_transient_bool(u
, name
, &s
->pass_fds_to_exec
, message
, flags
, error
);
197 if (streq(name
, "PassSecurity"))
198 return bus_set_transient_bool(u
, name
, &s
->pass_sec
, message
, flags
, error
);
200 if (streq(name
, "PassPacketInfo"))
201 return bus_set_transient_bool(u
, name
, &s
->pass_pktinfo
, message
, flags
, error
);
203 if (streq(name
, "Timestamping"))
204 return bus_set_transient_socket_timestamping(u
, name
, &s
->timestamping
, message
, flags
, error
);
206 if (streq(name
, "ReusePort"))
207 return bus_set_transient_bool(u
, name
, &s
->reuse_port
, message
, flags
, error
);
209 if (streq(name
, "RemoveOnStop"))
210 return bus_set_transient_bool(u
, name
, &s
->remove_on_stop
, message
, flags
, error
);
212 if (streq(name
, "SELinuxContextFromNet"))
213 return bus_set_transient_bool(u
, name
, &s
->selinux_context_from_net
, message
, flags
, error
);
215 if (streq(name
, "Priority"))
216 return bus_set_transient_int(u
, name
, &s
->priority
, message
, flags
, error
);
218 if (streq(name
, "IPTTL"))
219 return bus_set_transient_int(u
, name
, &s
->ip_ttl
, message
, flags
, error
);
221 if (streq(name
, "Mark"))
222 return bus_set_transient_int(u
, name
, &s
->mark
, message
, flags
, error
);
224 if (streq(name
, "Backlog"))
225 return bus_set_transient_unsigned(u
, name
, &s
->backlog
, message
, flags
, error
);
227 if (streq(name
, "MaxConnections"))
228 return bus_set_transient_unsigned(u
, name
, &s
->max_connections
, message
, flags
, error
);
230 if (streq(name
, "MaxConnectionsPerSource"))
231 return bus_set_transient_unsigned(u
, name
, &s
->max_connections_per_source
, message
, flags
, error
);
233 if (streq(name
, "KeepAliveProbes"))
234 return bus_set_transient_unsigned(u
, name
, &s
->keep_alive_cnt
, message
, flags
, error
);
236 if (streq(name
, "TriggerLimitBurst"))
237 return bus_set_transient_unsigned(u
, name
, &s
->trigger_limit
.burst
, message
, flags
, error
);
239 if (streq(name
, "PollLimitBurst"))
240 return bus_set_transient_unsigned(u
, name
, &s
->poll_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
, "PollLimitIntervalUSec"))
270 return bus_set_transient_usec(u
, name
, &s
->poll_limit_interval
, message
, flags
, error
);
272 if (streq(name
, "SmackLabel"))
273 return bus_set_transient_string(u
, name
, &s
->smack
, message
, flags
, error
);
275 if (streq(name
, "SmackLabelIPin"))
276 return bus_set_transient_string(u
, name
, &s
->smack_ip_in
, message
, flags
, error
);
278 if (streq(name
, "SmackLabelIPOut"))
279 return bus_set_transient_string(u
, name
, &s
->smack_ip_out
, message
, flags
, error
);
281 if (streq(name
, "TCPCongestion"))
282 return bus_set_transient_string(u
, name
, &s
->tcp_congestion
, message
, flags
, error
);
284 if (streq(name
, "FileDescriptorName"))
285 return bus_set_transient_fdname(u
, name
, &s
->fdname
, message
, flags
, error
);
287 if (streq(name
, "SocketUser"))
288 return bus_set_transient_user_relaxed(u
, name
, &s
->user
, message
, flags
, error
);
290 if (streq(name
, "SocketGroup"))
291 return bus_set_transient_user_relaxed(u
, name
, &s
->group
, message
, flags
, error
);
293 if (streq(name
, "BindIPv6Only"))
294 return bus_set_transient_bind_ipv6_only(u
, name
, &s
->bind_ipv6_only
, message
, flags
, error
);
296 if (streq(name
, "ReceiveBuffer"))
297 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->receive_buffer
, message
, flags
, error
);
299 if (streq(name
, "SendBuffer"))
300 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->send_buffer
, message
, flags
, error
);
302 if (streq(name
, "PipeSize"))
303 return bus_set_transient_size_t_check_truncation(u
, name
, &s
->pipe_size
, message
, flags
, error
);
305 if (streq(name
, "BindToDevice"))
306 return bus_set_transient_ifname(u
, name
, &s
->bind_to_device
, message
, flags
, error
);
308 if (streq(name
, "IPTOS"))
309 return bus_set_transient_ip_tos(u
, name
, &s
->ip_tos
, message
, flags
, error
);
311 if (streq(name
, "SocketProtocol"))
312 return bus_set_transient_socket_protocol(u
, name
, &s
->socket_protocol
, message
, flags
, error
);
314 ci
= socket_exec_command_from_string(name
);
316 return bus_set_transient_exec_command(u
, name
,
317 &s
->exec_command
[ci
],
318 message
, flags
, error
);
320 if (streq(name
, "Symlinks")) {
321 _cleanup_strv_free_
char **l
= NULL
;
323 r
= sd_bus_message_read_strv(message
, &l
);
328 if (!path_is_absolute(*p
))
329 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Symlink path is not absolute: %s", *p
);
331 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
332 if (strv_isempty(l
)) {
333 s
->symlinks
= strv_free(s
->symlinks
);
334 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=", name
);
336 _cleanup_free_
char *joined
= NULL
;
338 r
= strv_extend_strv(&s
->symlinks
, l
, true);
342 joined
= strv_join(l
, " ");
346 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "%s=%s", name
, joined
);
352 } else if (streq(name
, "Listen")) {
356 r
= sd_bus_message_enter_container(message
, 'a', "(ss)");
360 while ((r
= sd_bus_message_read(message
, "(ss)", &t
, &a
)) > 0) {
361 _cleanup_(socket_port_freep
) SocketPort
*p
= NULL
;
363 p
= new(SocketPort
, 1);
372 p
->type
= socket_port_type_from_string(t
);
374 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Unknown Socket type: %s", t
);
376 if (p
->type
!= SOCKET_SOCKET
) {
377 if (!path_is_absolute(a
) || !path_is_valid(a
))
378 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid socket path: %s", a
);
380 r
= path_simplify_alloc(a
, &p
->path
);
384 } else if (streq(t
, "Netlink")) {
385 r
= socket_address_parse_netlink(&p
->address
, a
);
387 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid netlink address: %s", a
);
390 r
= socket_address_parse(&p
->address
, a
);
392 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address: %s", a
);
394 p
->address
.type
= socket_address_type_from_string(t
);
395 if (p
->address
.type
< 0)
396 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Invalid address type: %s", t
);
398 if (socket_address_family(&p
->address
) != AF_UNIX
&& p
->address
.type
== SOCK_SEQPACKET
)
399 return sd_bus_error_setf(error
, SD_BUS_ERROR_INVALID_ARGS
, "Address family not supported: %s", a
);
404 if (!UNIT_WRITE_FLAGS_NOOP(flags
)) {
405 LIST_APPEND(port
, s
->ports
, TAKE_PTR(p
));
406 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "Listen%s=%s", t
, a
);
412 r
= sd_bus_message_exit_container(message
);
416 if (!UNIT_WRITE_FLAGS_NOOP(flags
) && empty
) {
417 socket_free_ports(s
);
418 unit_write_settingf(u
, flags
|UNIT_ESCAPE_SPECIFIERS
, name
, "ListenStream=");
427 int bus_socket_set_property(
430 sd_bus_message
*message
,
431 UnitWriteFlags flags
,
432 sd_bus_error
*error
) {
434 Socket
*s
= SOCKET(u
);
445 r
= bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, flags
, error
);
449 if (u
->transient
&& u
->load_state
== UNIT_STUB
) {
450 /* This is a transient unit, let's load a little more */
452 r
= bus_socket_set_transient_property(s
, name
, message
, flags
, error
);
456 r
= bus_exec_context_set_transient_property(u
, &s
->exec_context
, name
, message
, flags
, error
);
460 r
= bus_kill_context_set_transient_property(u
, &s
->kill_context
, name
, message
, flags
, error
);
468 int bus_socket_commit_properties(Unit
*u
) {
471 unit_realize_cgroup(u
);