mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-25 23:21:33 +03:00
Merge pull request #1889 from ssahani/socket-proto
socket: Add support for socket protcol
This commit is contained in:
commit
edf1e71381
@ -310,6 +310,15 @@
|
|||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>SocketProtocol=</varname></term>
|
||||||
|
<listitem><para>Takes a one of <option>udplite</option>
|
||||||
|
or <option>sctp</option>. Specifies a socket protocol
|
||||||
|
(<constant>IPPROTO_UDPLITE</constant>) UDP-Lite
|
||||||
|
(<constant>IPPROTO_SCTP</constant>) SCTP socket respectively. </para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>BindIPv6Only=</varname></term>
|
<term><varname>BindIPv6Only=</varname></term>
|
||||||
<listitem><para>Takes a one of <option>default</option>,
|
<listitem><para>Takes a one of <option>default</option>,
|
||||||
|
@ -150,6 +150,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
|
|||||||
SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned, offsetof(Socket, n_connections), 0),
|
SD_BUS_PROPERTY("NConnections", "u", bus_property_get_unsigned, offsetof(Socket, n_connections), 0),
|
||||||
SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned, offsetof(Socket, n_accepted), 0),
|
SD_BUS_PROPERTY("NAccepted", "u", bus_property_get_unsigned, offsetof(Socket, n_accepted), 0),
|
||||||
SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname, 0, 0),
|
SD_BUS_PROPERTY("FileDescriptorName", "s", property_get_fdname, 0, 0),
|
||||||
|
SD_BUS_PROPERTY("SocketProtocol", "i", bus_property_get_int, offsetof(Socket, socket_protocol), SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket, exec_command[SOCKET_EXEC_START_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPre", offsetof(Socket, exec_command[SOCKET_EXEC_START_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
||||||
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket, exec_command[SOCKET_EXEC_START_POST]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStartPost", offsetof(Socket, exec_command[SOCKET_EXEC_START_POST]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
||||||
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket, exec_command[SOCKET_EXEC_STOP_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
BUS_EXEC_COMMAND_LIST_VTABLE("ExecStopPre", offsetof(Socket, exec_command[SOCKET_EXEC_STOP_PRE]), SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION),
|
||||||
|
@ -249,6 +249,7 @@ Socket.ListenNetlink, config_parse_socket_listen, SOCKET_SOCK
|
|||||||
Socket.ListenSpecial, config_parse_socket_listen, SOCKET_SPECIAL, 0
|
Socket.ListenSpecial, config_parse_socket_listen, SOCKET_SPECIAL, 0
|
||||||
Socket.ListenMessageQueue, config_parse_socket_listen, SOCKET_MQUEUE, 0
|
Socket.ListenMessageQueue, config_parse_socket_listen, SOCKET_MQUEUE, 0
|
||||||
Socket.ListenUSBFunction, config_parse_socket_listen, SOCKET_USB_FUNCTION, 0
|
Socket.ListenUSBFunction, config_parse_socket_listen, SOCKET_USB_FUNCTION, 0
|
||||||
|
Socket.SocketProtocol, config_parse_socket_protocol, 0, 0
|
||||||
Socket.BindIPv6Only, config_parse_socket_bind, 0, 0,
|
Socket.BindIPv6Only, config_parse_socket_bind, 0, 0,
|
||||||
Socket.Backlog, config_parse_unsigned, 0, offsetof(Socket, backlog)
|
Socket.Backlog, config_parse_unsigned, 0, offsetof(Socket, backlog)
|
||||||
Socket.BindToDevice, config_parse_socket_bindtodevice, 0, 0
|
Socket.BindToDevice, config_parse_socket_bindtodevice, 0, 0
|
||||||
|
@ -421,6 +421,37 @@ int config_parse_socket_listen(const char *unit,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int config_parse_socket_protocol(const char *unit,
|
||||||
|
const char *filename,
|
||||||
|
unsigned line,
|
||||||
|
const char *section,
|
||||||
|
unsigned section_line,
|
||||||
|
const char *lvalue,
|
||||||
|
int ltype,
|
||||||
|
const char *rvalue,
|
||||||
|
void *data,
|
||||||
|
void *userdata) {
|
||||||
|
Socket *s;
|
||||||
|
|
||||||
|
assert(filename);
|
||||||
|
assert(lvalue);
|
||||||
|
assert(rvalue);
|
||||||
|
assert(data);
|
||||||
|
|
||||||
|
s = SOCKET(data);
|
||||||
|
|
||||||
|
if (streq(rvalue, "udplite"))
|
||||||
|
s->socket_protocol = IPPROTO_UDPLITE;
|
||||||
|
else if (streq(rvalue, "sctp"))
|
||||||
|
s->socket_protocol = IPPROTO_SCTP;
|
||||||
|
else {
|
||||||
|
log_syntax(unit, LOG_ERR, filename, line, 0, "Socket protocol not supported, ignoring: %s", rvalue);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int config_parse_socket_bind(const char *unit,
|
int config_parse_socket_bind(const char *unit,
|
||||||
const char *filename,
|
const char *filename,
|
||||||
unsigned line,
|
unsigned line,
|
||||||
|
@ -38,6 +38,7 @@ int config_parse_unit_path_printf(const char *unit, const char *filename, unsign
|
|||||||
int config_parse_unit_path_strv_printf(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_unit_path_strv_printf(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
int config_parse_documentation(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_documentation(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
int config_parse_socket_listen(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_socket_listen(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
|
int config_parse_socket_protocol(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
int config_parse_socket_bind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_socket_bind(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
int config_parse_exec_nice(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_exec_nice(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
int config_parse_exec_oom_score_adjust(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
int config_parse_exec_oom_score_adjust(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
|
||||||
|
@ -1266,6 +1266,19 @@ static int socket_open_fds(Socket *s) {
|
|||||||
know_label = true;
|
know_label = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Apply the socket protocol */
|
||||||
|
switch(p->address.type) {
|
||||||
|
case SOCK_STREAM:
|
||||||
|
case SOCK_SEQPACKET:
|
||||||
|
if (p->socket->socket_protocol == IPPROTO_SCTP)
|
||||||
|
p->address.protocol = p->socket->socket_protocol;
|
||||||
|
break;
|
||||||
|
case SOCK_DGRAM:
|
||||||
|
if (p->socket->socket_protocol == IPPROTO_UDPLITE)
|
||||||
|
p->address.protocol = p->socket->socket_protocol;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
r = socket_address_listen(
|
r = socket_address_listen(
|
||||||
&p->address,
|
&p->address,
|
||||||
SOCK_CLOEXEC|SOCK_NONBLOCK,
|
SOCK_CLOEXEC|SOCK_NONBLOCK,
|
||||||
|
@ -120,6 +120,8 @@ struct Socket {
|
|||||||
bool remove_on_stop;
|
bool remove_on_stop;
|
||||||
bool writable;
|
bool writable;
|
||||||
|
|
||||||
|
int socket_protocol;
|
||||||
|
|
||||||
/* Socket options */
|
/* Socket options */
|
||||||
bool keep_alive;
|
bool keep_alive;
|
||||||
bool no_delay;
|
bool no_delay;
|
||||||
|
Loading…
Reference in New Issue
Block a user