mirror of
https://github.com/systemd/systemd.git
synced 2025-03-22 06:50:18 +03:00
systemd-activate: Add support for datagram sockets
core: Add flexible way to provide socket type the socket type should be a diffrent argumet in make_socket_fd . In this way we can set the socket type like SOCK_STREAM SOCK_DGRAM in the address. journal-remote: modify make_socket_fd
This commit is contained in:
parent
e77435f2b0
commit
7b7afdfc07
@ -39,6 +39,7 @@
|
||||
|
||||
static char** arg_listen = NULL;
|
||||
static bool arg_accept = false;
|
||||
static bool arg_datagram = false;
|
||||
static char** arg_args = NULL;
|
||||
static char** arg_setenv = NULL;
|
||||
static const char *arg_fdname = NULL;
|
||||
@ -98,7 +99,11 @@ static int open_sockets(int *epoll_fd, bool accept) {
|
||||
|
||||
STRV_FOREACH(address, arg_listen) {
|
||||
|
||||
fd = make_socket_fd(LOG_DEBUG, *address, SOCK_STREAM | (arg_accept*SOCK_CLOEXEC));
|
||||
if (arg_datagram)
|
||||
fd = make_socket_fd(LOG_DEBUG, *address, SOCK_DGRAM, SOCK_CLOEXEC);
|
||||
else
|
||||
fd = make_socket_fd(LOG_DEBUG, *address, SOCK_STREAM, (arg_accept*SOCK_CLOEXEC));
|
||||
|
||||
if (fd < 0) {
|
||||
log_open();
|
||||
return log_error_errno(fd, "Failed to open '%s': %m", *address);
|
||||
@ -304,6 +309,7 @@ static void help(void) {
|
||||
printf("%s [OPTIONS...]\n\n"
|
||||
"Listen on sockets and launch child on connection.\n\n"
|
||||
"Options:\n"
|
||||
" -d --datagram Datagram sockets\n"
|
||||
" -l --listen=ADDR Listen for raw connections at ADDR\n"
|
||||
" -a --accept Spawn separate child for each connection\n"
|
||||
" -h --help Show this help and exit\n"
|
||||
@ -323,6 +329,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
static const struct option options[] = {
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ "version", no_argument, NULL, ARG_VERSION },
|
||||
{ "datagram", no_argument, NULL, 'd' },
|
||||
{ "listen", required_argument, NULL, 'l' },
|
||||
{ "accept", no_argument, NULL, 'a' },
|
||||
{ "setenv", required_argument, NULL, 'E' },
|
||||
@ -336,7 +343,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
assert(argc >= 0);
|
||||
assert(argv);
|
||||
|
||||
while ((c = getopt_long(argc, argv, "+hl:aE:", options, NULL)) >= 0)
|
||||
while ((c = getopt_long(argc, argv, "+hl:aEd", options, NULL)) >= 0)
|
||||
switch(c) {
|
||||
case 'h':
|
||||
help();
|
||||
@ -352,6 +359,10 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
arg_datagram = true;
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
arg_accept = true;
|
||||
break;
|
||||
@ -385,6 +396,12 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (arg_datagram && arg_accept) {
|
||||
log_error("Datagram sockets do not accept connections. "
|
||||
"The --datagram and --accept options may not be combined.");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
arg_args = argv + optind;
|
||||
|
||||
return 1 /* work to do */;
|
||||
|
@ -147,7 +147,7 @@ int socket_address_listen(
|
||||
return r;
|
||||
}
|
||||
|
||||
int make_socket_fd(int log_level, const char* address, int flags) {
|
||||
int make_socket_fd(int log_level, const char* address, int type, int flags) {
|
||||
SocketAddress a;
|
||||
int fd, r;
|
||||
|
||||
@ -155,7 +155,9 @@ int make_socket_fd(int log_level, const char* address, int flags) {
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to parse socket address \"%s\": %m", address);
|
||||
|
||||
fd = socket_address_listen(&a, flags, SOMAXCONN, SOCKET_ADDRESS_DEFAULT,
|
||||
a.type = type;
|
||||
|
||||
fd = socket_address_listen(&a, type | flags, SOMAXCONN, SOCKET_ADDRESS_DEFAULT,
|
||||
NULL, false, false, false, 0755, 0644, NULL);
|
||||
if (fd < 0 || log_get_max_level() >= log_level) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
@ -89,7 +89,7 @@ int socket_address_listen(
|
||||
mode_t directory_mode,
|
||||
mode_t socket_mode,
|
||||
const char *label);
|
||||
int make_socket_fd(int log_level, const char* address, int flags);
|
||||
int make_socket_fd(int log_level, const char* address, int type, int flags);
|
||||
|
||||
bool socket_address_is(const SocketAddress *a, const char *s, int type);
|
||||
bool socket_address_is_netlink(const SocketAddress *a, const char *s);
|
||||
|
@ -447,7 +447,7 @@ static int add_raw_socket(RemoteServer *s, int fd) {
|
||||
static int setup_raw_socket(RemoteServer *s, const char *address) {
|
||||
int fd;
|
||||
|
||||
fd = make_socket_fd(LOG_INFO, address, SOCK_STREAM | SOCK_CLOEXEC);
|
||||
fd = make_socket_fd(LOG_INFO, address, SOCK_STREAM, SOCK_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
@ -765,7 +765,7 @@ static int setup_microhttpd_socket(RemoteServer *s,
|
||||
const char *trust) {
|
||||
int fd;
|
||||
|
||||
fd = make_socket_fd(LOG_DEBUG, address, SOCK_STREAM | SOCK_CLOEXEC);
|
||||
fd = make_socket_fd(LOG_DEBUG, address, SOCK_STREAM, SOCK_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user