2 This file is part of systemd.
4 Copyright 2010 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 #include "alloc-util.h"
22 #include "dbus-cgroup.h"
23 #include "dbus-execute.h"
24 #include "dbus-socket.h"
26 #include "string-util.h"
29 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result
, socket_result
, SocketResult
);
30 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_bind_ipv6_only
, socket_address_bind_ipv6_only
, SocketAddressBindIPv6Only
);
32 static int property_get_listen(
35 const char *interface
,
37 sd_bus_message
*reply
,
39 sd_bus_error
*error
) {
42 Socket
*s
= SOCKET(userdata
);
50 r
= sd_bus_message_open_container(reply
, 'a', "(ss)");
54 LIST_FOREACH(port
, p
, s
->ports
) {
55 _cleanup_free_
char *address
= NULL
;
60 r
= socket_address_print(&p
->address
, &address
);
71 case SOCKET_USB_FUNCTION
:
76 assert_not_reached("Unknown socket type");
79 r
= sd_bus_message_append(reply
, "(ss)", socket_port_type_to_string(p
), a
);
84 return sd_bus_message_close_container(reply
);
88 static int property_get_fdname(
91 const char *interface
,
93 sd_bus_message
*reply
,
95 sd_bus_error
*error
) {
97 Socket
*s
= SOCKET(userdata
);
103 return sd_bus_message_append(reply
, "s", socket_fdname(s
));
106 const sd_bus_vtable bus_socket_vtable
[] = {
107 SD_BUS_VTABLE_START(0),
108 SD_BUS_PROPERTY("BindIPv6Only", "s", property_get_bind_ipv6_only
, offsetof(Socket
, bind_ipv6_only
), SD_BUS_VTABLE_PROPERTY_CONST
),
109 SD_BUS_PROPERTY("Backlog", "u", bus_property_get_unsigned
, offsetof(Socket
, backlog
), SD_BUS_VTABLE_PROPERTY_CONST
),
110 SD_BUS_PROPERTY("TimeoutUSec", "t", bus_property_get_usec
, offsetof(Socket
, timeout_usec
), SD_BUS_VTABLE_PROPERTY_CONST
),
111 SD_BUS_PROPERTY("BindToDevice", "s", NULL
, offsetof(Socket
, bind_to_device
), SD_BUS_VTABLE_PROPERTY_CONST
),
112 SD_BUS_PROPERTY("SocketUser", "s", NULL
, offsetof(Socket
, user
), SD_BUS_VTABLE_PROPERTY_CONST
),
113 SD_BUS_PROPERTY("SocketGroup", "s", NULL
, offsetof(Socket
, group
), SD_BUS_VTABLE_PROPERTY_CONST
),
114 SD_BUS_PROPERTY("SocketMode", "u", bus_property_get_mode
, offsetof(Socket
, socket_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
115 SD_BUS_PROPERTY("DirectoryMode", "u", bus_property_get_mode
, offsetof(Socket
, directory_mode
), SD_BUS_VTABLE_PROPERTY_CONST
),
116 SD_BUS_PROPERTY("Accept", "b", bus_property_get_bool
, offsetof(Socket
, accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
117 SD_BUS_PROPERTY("Writable", "b", bus_property_get_bool
, offsetof(Socket
, writable
), SD_BUS_VTABLE_PROPERTY_CONST
),
118 SD_BUS_PROPERTY("KeepAlive", "b", bus_property_get_bool
, offsetof(Socket
, keep_alive
), SD_BUS_VTABLE_PROPERTY_CONST
),
119 SD_BUS_PROPERTY("KeepAliveTimeUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_time
), SD_BUS_VTABLE_PROPERTY_CONST
),
120 SD_BUS_PROPERTY("KeepAliveIntervalUSec", "t", bus_property_get_usec
, offsetof(Socket
, keep_alive_interval
), SD_BUS_VTABLE_PROPERTY_CONST
),
121 SD_BUS_PROPERTY("KeepAliveProbes", "u", bus_property_get_unsigned
, offsetof(Socket
, keep_alive_cnt
), SD_BUS_VTABLE_PROPERTY_CONST
),
122 SD_BUS_PROPERTY("DeferAcceptUSec" , "t", bus_property_get_usec
, offsetof(Socket
, defer_accept
), SD_BUS_VTABLE_PROPERTY_CONST
),
123 SD_BUS_PROPERTY("NoDelay", "b", bus_property_get_bool
, offsetof(Socket
, no_delay
), SD_BUS_VTABLE_PROPERTY_CONST
),
124 SD_BUS_PROPERTY("Priority", "i", bus_property_get_int
, offsetof(Socket
, priority
), SD_BUS_VTABLE_PROPERTY_CONST
),
125 SD_BUS_PROPERTY("ReceiveBuffer", "t", bus_property_get_size
, offsetof(Socket
, receive_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
126 SD_BUS_PROPERTY("SendBuffer", "t", bus_property_get_size
, offsetof(Socket
, send_buffer
), SD_BUS_VTABLE_PROPERTY_CONST
),
127 SD_BUS_PROPERTY("IPTOS", "i", bus_property_get_int
, offsetof(Socket
, ip_tos
), SD_BUS_VTABLE_PROPERTY_CONST
),
128 SD_BUS_PROPERTY("IPTTL", "i", bus_property_get_int
, offsetof(Socket
, ip_ttl
), SD_BUS_VTABLE_PROPERTY_CONST
),
129 SD_BUS_PROPERTY("PipeSize", "t", bus_property_get_size
, offsetof(Socket
, pipe_size
), SD_BUS_VTABLE_PROPERTY_CONST
),
130 SD_BUS_PROPERTY("FreeBind", "b", bus_property_get_bool
, offsetof(Socket
, free_bind
), SD_BUS_VTABLE_PROPERTY_CONST
),
131 SD_BUS_PROPERTY("Transparent", "b", bus_property_get_bool
, offsetof(Socket
, transparent
), SD_BUS_VTABLE_PROPERTY_CONST
),
132 SD_BUS_PROPERTY("Broadcast", "b", bus_property_get_bool
, offsetof(Socket
, broadcast
), SD_BUS_VTABLE_PROPERTY_CONST
),
133 SD_BUS_PROPERTY("PassCredentials", "b", bus_property_get_bool
, offsetof(Socket
, pass_cred
), SD_BUS_VTABLE_PROPERTY_CONST
),
134 SD_BUS_PROPERTY("PassSecurity", "b", bus_property_get_bool
, offsetof(Socket
, pass_sec
), SD_BUS_VTABLE_PROPERTY_CONST
),
135 SD_BUS_PROPERTY("RemoveOnStop", "b", bus_property_get_bool
, offsetof(Socket
, remove_on_stop
), SD_BUS_VTABLE_PROPERTY_CONST
),
136 SD_BUS_PROPERTY("Listen", "a(ss)", property_get_listen
, 0, SD_BUS_VTABLE_PROPERTY_CONST
),
137 SD_BUS_PROPERTY("Symlinks", "as", NULL
, offsetof(Socket
, symlinks
), SD_BUS_VTABLE_PROPERTY_CONST
),
138 SD_BUS_PROPERTY("Mark", "i", bus_property_get_int
, offsetof(Socket
, mark
), SD_BUS_VTABLE_PROPERTY_CONST
),
139 SD_BUS_PROPERTY("MaxConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, max_connections
), SD_BUS_VTABLE_PROPERTY_CONST
),
140 SD_BUS_PROPERTY("MessageQueueMaxMessages", "x", bus_property_get_long
, offsetof(Socket
, mq_maxmsg
), SD_BUS_VTABLE_PROPERTY_CONST
),
141 SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long
, offsetof(Socket
, mq_msgsize
), SD_BUS_VTABLE_PROPERTY_CONST
),
142 SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool
, offsetof(Socket
, reuse_port
), SD_BUS_VTABLE_PROPERTY_CONST
),
143 SD_BUS_PROPERTY("SmackLabel", "s", NULL
, offsetof(Socket
, smack
), SD_BUS_VTABLE_PROPERTY_CONST
),
144 SD_BUS_PROPERTY("SmackLabelIPIn", "s", NULL
, offsetof(Socket
, smack_ip_in
), SD_BUS_VTABLE_PROPERTY_CONST
),
145 SD_BUS_PROPERTY("SmackLabelIPOut", "s", NULL
, offsetof(Socket
, smack_ip_out
), SD_BUS_VTABLE_PROPERTY_CONST
),
146 SD_BUS_PROPERTY("ControlPID", "u", bus_property_get_pid
, offsetof(Socket
, control_pid
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
147 SD_BUS_PROPERTY("Result", "s", property_get_result
, offsetof(Socket
, result
), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE
),
148 SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned
, offsetof(Socket
, n_connections
), 0),
149 SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned
, offsetof(Socket
, n_accepted
), 0),
150 SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname
, 0, 0),
151 SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int
, offsetof(Socket
, socket_protocol
), SD_BUS_VTABLE_PROPERTY_CONST
),
152 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
153 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_START_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
154 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_PRE
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
155 BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPost", offsetof(Socket
, exec_command
[SOCKET_EXEC_STOP_POST
]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION
),
159 int bus_socket_set_property(
162 sd_bus_message
*message
,
163 UnitSetPropertiesMode mode
,
164 sd_bus_error
*error
) {
166 Socket
*s
= SOCKET(u
);
172 return bus_cgroup_set_property(u
, &s
->cgroup_context
, name
, message
, mode
, error
);
175 int bus_socket_commit_properties(Unit
*u
) {
178 unit_update_cgroup_members_masks(u
);
179 unit_realize_cgroup(u
);