]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/connection.c
Merge remote-tracking branch 'origin/mdb.RE/0.9' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / connection.c
index 7f9cd8adbf3713228220bd48f65062ce66f985cf..c8cb2b7738d28228ab643a3a6d35465e94267e0c 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2012 The OpenLDAP Foundation.
+ * Copyright 1998-2015 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -574,6 +574,11 @@ Connection * connection_init(
        backend_connection_init(c);
        ldap_pvt_thread_mutex_unlock( &c->c_mutex );
 
+       if ( !(flags & CONN_IS_UDP ))
+               Statslog( LDAP_DEBUG_STATS,
+                       "conn=%ld fd=%ld ACCEPT from %s (%s)\n",
+                       id, (long) s, peername, listener->sl_name.bv_val, 0 );
+
        return c;
 }
 
@@ -1511,22 +1516,53 @@ connection_input( Connection *conn , conn_readinfo *cri )
 
 #ifdef LDAP_CONNECTIONLESS
        if ( conn->c_is_udp ) {
+#if defined(LDAP_PF_INET6)
+               char peername[sizeof("IP=[ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]:65535")];
+               char addr[INET6_ADDRSTRLEN];
+#else
                char peername[sizeof("IP=255.255.255.255:65336")];
+               char addr[INET_ADDRSTRLEN];
+#endif
                const char *peeraddr_string = NULL;
 
-               len = ber_int_sb_read(conn->c_sb, &peeraddr, sizeof(struct sockaddr));
-               if (len != sizeof(struct sockaddr)) return 1;
+               len = ber_int_sb_read(conn->c_sb, &peeraddr, sizeof(Sockaddr));
+               if (len != sizeof(Sockaddr)) return 1;
 
+#if defined(LDAP_PF_INET6)
+               if (peeraddr.sa_addr.sa_family == AF_INET6) {
+                       if ( IN6_IS_ADDR_V4MAPPED(&peeraddr.sa_in6_addr.sin6_addr) ) {
 #if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
-               char addr[INET_ADDRSTRLEN];
-               peeraddr_string = inet_ntop( AF_INET, &peeraddr.sa_in_addr.sin_addr,
+                               peeraddr_string = inet_ntop( AF_INET,
+                                  ((struct in_addr *)&peeraddr.sa_in6_addr.sin6_addr.s6_addr[12]),
+                                  addr, sizeof(addr) );
+#else /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
+                               peeraddr_string = inet_ntoa( *((struct in_addr *)
+                                       &peeraddr.sa_in6_addr.sin6_addr.s6_addr[12]) );
+#endif /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
+                               if ( !peeraddr_string ) peeraddr_string = SLAP_STRING_UNKNOWN;
+                               sprintf( peername, "IP=%s:%d", peeraddr_string,
+                                       (unsigned) ntohs( peeraddr.sa_in6_addr.sin6_port ) );
+                       } else {
+                               peeraddr_string = inet_ntop( AF_INET6,
+                                     &peeraddr.sa_in6_addr.sin6_addr,
+                                     addr, sizeof addr );
+                               if ( !peeraddr_string ) peeraddr_string = SLAP_STRING_UNKNOWN;
+                               sprintf( peername, "IP=[%s]:%d", peeraddr_string,
+                                        (unsigned) ntohs( peeraddr.sa_in6_addr.sin6_port ) );
+                       }
+               } else
+#endif
+#if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
+               {
+                       peeraddr_string = inet_ntop( AF_INET, &peeraddr.sa_in_addr.sin_addr,
                           addr, sizeof(addr) );
 #else /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
-               peeraddr_string = inet_ntoa( peeraddr.sa_in_addr.sin_addr );
+                       peeraddr_string = inet_ntoa( peeraddr.sa_in_addr.sin_addr );
 #endif /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
-               sprintf( peername, "IP=%s:%d",
-                        peeraddr_string,
-                       (unsigned) ntohs( peeraddr.sa_in_addr.sin_port ) );
+                       sprintf( peername, "IP=%s:%d",
+                                peeraddr_string,
+                               (unsigned) ntohs( peeraddr.sa_in_addr.sin_port ) );
+               }
                Statslog( LDAP_DEBUG_STATS,
                        "conn=%lu UDP request from %s (%s) accepted.\n",
                        conn->c_connid, peername, conn->c_sock_name.bv_val, 0, 0 );