File xinetd-ipv6-fallback.patch of Package xinetd.5694

Index: xinetd-2.3.15/xinetd/service.c
===================================================================
--- xinetd-2.3.15.orig/xinetd/service.c	2015-09-25 14:25:45.519055472 +0200
+++ xinetd-2.3.15/xinetd/service.c	2015-09-25 16:34:23.566551795 +0200
@@ -374,6 +374,22 @@ status_e svc_activate( struct service *s
       return( FAILED ) ;
    }
 
+   /* Map the ipv4 address to ipv6 if using ipv6 socket:
+    * The ipv6 mapped address is in format:
+    * 10 0x0 bytes, 2 0xff bytes, 4 bytes of the ipv4 address.
+    * So we append the ipv4 addr after the 12 bytes of the ipv6 prefix
+    */
+   if( SC_IPV6(scp) && SC_BIND_ADDR(scp)->sa_in.sin_family == AF_INET ) {
+       const char v6_mapped[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                  0x00, 0x00, 0xFF, 0xFF };
+       union xsockaddr *addr_p = SC_BIND_ADDR(scp);
+       addr_p->sa_in6.sin6_family = AF_INET6 ;
+
+       memcpy(addr_p->sa_in6.sin6_addr.s6_addr + 12, &addr_p->sa_in.sin_addr.s_addr, 4);
+       bzero(&addr_p->sa_in6.sin6_flowinfo, sizeof(addr_p->sa_in6.sin6_flowinfo));
+       memcpy(&addr_p->sa_in6.sin6_addr.s6_addr, v6_mapped, sizeof(v6_mapped));
+   }
+
 #ifndef NO_RPC
    if ( SC_IS_RPC( scp ) )
       status = activate_rpc( sp ) ;
openSUSE Build Service is sponsored by