chiark / gitweb /
socket: make various socket/pipe options configurable
[elogind.git] / src / socket-util.c
index 0c9fc9f999e939b1c3fe188ef2b8c51a790433d1..344d6b98a44086c261e26b9bcbd8c314b5ce6f04 100644 (file)
@@ -305,6 +305,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 +331,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 +450,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 +459,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);
 }