]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemd-activate: Add support for datagram sockets
authorSusant Sahani <ssahani@gmail.com>
Fri, 22 Jan 2016 04:11:44 +0000 (09:41 +0530)
committerSusant Sahani <ssahani@gmail.com>
Fri, 22 Jan 2016 04:11:44 +0000 (09:41 +0530)
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

src/activate/activate.c
src/basic/socket-label.c
src/basic/socket-util.h
src/journal-remote/journal-remote.c

index b7e6255f4905f6c0190a60cf753680712e4d2b1b..36387ea621a9f0a0c56556f08e740ecfa2014ee3 100644 (file)
@@ -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 */;
index e169439e04fdf665c0fbb858cb3e0719eb0fb10d..bd206586ce1e60573ce557583357bd10c1c77755 100644 (file)
@@ -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;
index 6da1df68d80333fa25a73051c13515e85a269210..799cde2151d6b1133bb9a84e5738a0b96e7dcc5f 100644 (file)
@@ -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);
index 2126606661fd515967f8dc051f5d9c614a8aa531..3d71685b33447657050473d84fe9f58d6cfd0c30 100644 (file)
@@ -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;