chiark / gitweb /
util: fix missing memory initialization
[elogind.git] / src / socket-util.c
index 32f6bcb94196380049860485a0bab4102e29dbf6..5463ffbcbcb4c41e587a469987598a5f898746ad 100644 (file)
@@ -33,6 +33,7 @@
 #include "macro.h"
 #include "util.h"
 #include "socket-util.h"
+#include "missing.h"
 
 int socket_address_parse(SocketAddress *a, const char *s) {
         int r;
@@ -305,6 +306,7 @@ int socket_address_listen(
                 int backlog,
                 SocketAddressBindIPv6Only only,
                 const char *bind_to_device,
+                bool free_bind,
                 mode_t directory_mode,
                 mode_t socket_mode,
                 int *ret) {
@@ -330,6 +332,12 @@ int socket_address_listen(
                 if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, bind_to_device, strlen(bind_to_device)+1) < 0)
                         goto fail;
 
+        if (free_bind) {
+                one = 1;
+                if (setsockopt(fd, IPPROTO_IP, IP_FREEBIND, &one, sizeof(one)) < 0)
+                        log_warning("IP_FREEBIND failed: %m");
+        }
+
         one = 1;
         if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0)
                 goto fail;
@@ -443,7 +451,7 @@ bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) {
         return true;
 }
 
-bool socket_address_is(const SocketAddress *a, const char *s) {
+bool socket_address_is(const SocketAddress *a, const char *s, int type) {
         struct SocketAddress b;
 
         assert(a);
@@ -452,6 +460,8 @@ bool socket_address_is(const SocketAddress *a, const char *s) {
         if (socket_address_parse(&b, s) < 0)
                 return false;
 
+        b.type = type;
+
         return socket_address_equal(a, &b);
 }
 
@@ -466,3 +476,11 @@ bool socket_address_needs_mount(const SocketAddress *a, const char *prefix) {
 
         return path_startswith(a->sockaddr.un.sun_path, prefix);
 }
+
+static const char* const socket_address_bind_ipv6_only_table[_SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX] = {
+        [SOCKET_ADDRESS_DEFAULT] = "default",
+        [SOCKET_ADDRESS_BOTH] = "both",
+        [SOCKET_ADDRESS_IPV6_ONLY] = "ipv6-only"
+};
+
+DEFINE_STRING_TABLE_LOOKUP(socket_address_bind_ipv6_only, SocketAddressBindIPv6Only);