+ switch( (*sal)->sa_family ) {
+ case AF_INET:
+ addrlen = sizeof(struct sockaddr_in);
+ break;
+#ifdef LDAP_PF_INET6
+ case AF_INET6:
+#ifdef IPV6_V6ONLY
+ /* Try to use IPv6 sockets for IPv6 only */
+ tmp = 1;
+ rc = setsockopt( l.sl_sd, IPPROTO_IPV6, IPV6_V6ONLY,
+ (char *) &tmp, sizeof(tmp) );
+ if ( rc == AC_SOCKET_ERROR ) {
+ int err = sock_errno();
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, INFO,
+ "slap_open_listener: setsockopt( %ld, IPV6_V6ONLY ) failed errno %d (%s)\n",
+ (long)l.sl_sd, err, sock_errstr(err) );
+#else
+ Debug( LDAP_DEBUG_ANY,
+ "slapd(%ld): setsockopt(IPV6_V6ONLY) failed errno=%d (%s)\n",
+ (long) l.sl_sd, err, sock_errstr(err) );
+#endif
+ }
+#endif
+ addrlen = sizeof(struct sockaddr_in6);
+ break;
+#endif
+#ifdef LDAP_PF_LOCAL
+ case AF_LOCAL:
+ addrlen = sizeof(struct sockaddr_un);
+ break;
+#endif
+ }
+
+ if (bind(l.sl_sd, *sal, addrlen)) {
+ err = sock_errno();
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, INFO,
+ "slap_open_listener: bind(%ld) failed errno=%d (%s)\n",
+ (long)l.sl_sd, err, sock_errstr(err) );
+#else
+ Debug( LDAP_DEBUG_ANY, "daemon: bind(%ld) failed errno=%d (%s)\n",
+ (long) l.sl_sd, err, sock_errstr(err) );
+#endif
+ tcp_close( l.sl_sd );
+ sal++;
+ continue;
+ }
+
+ switch ( (*sal)->sa_family ) {
+#ifdef LDAP_PF_LOCAL
+ case AF_LOCAL: {
+ char *addr = ((struct sockaddr_un *)*sal)->sun_path;
+#if 0 /* don't muck with socket perms */
+ if ( chmod( addr, l.sl_perms ) < 0 && crit ) {
+ int err = sock_errno();
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, INFO,
+ "slap_open_listener: fchmod(%ld) failed errno=%d (%s)\n",
+ (long)l.sl_sd, err, sock_errstr(err) );
+#else
+ Debug( LDAP_DEBUG_ANY, "daemon: fchmod(%ld) failed errno=%d (%s)",
+ (long) l.sl_sd, err, sock_errstr(err) );
+#endif
+ tcp_close( l.sl_sd );
+ slap_free_listener_addresses(psal);
+ return -1;
+ }
+#endif
+ l.sl_name.bv_len = strlen(addr) + sizeof("PATH=") - 1;
+ l.sl_name.bv_val = ber_memalloc( l.sl_name.bv_len + 1 );
+ snprintf( l.sl_name.bv_val, l.sl_name.bv_len + 1,
+ "PATH=%s", addr );
+ } break;
+#endif /* LDAP_PF_LOCAL */
+
+ case AF_INET: {
+ char *s;
+#if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
+ char addr[INET_ADDRSTRLEN];
+ inet_ntop( AF_INET, &((struct sockaddr_in *)*sal)->sin_addr,
+ addr, sizeof(addr) );
+ s = addr;
+#else
+ s = inet_ntoa( ((struct sockaddr_in *) *sal)->sin_addr );
+#endif
+ port = ntohs( ((struct sockaddr_in *)*sal) ->sin_port );
+ l.sl_name.bv_val = ber_memalloc( sizeof("IP=255.255.255.255:65535") );
+ snprintf( l.sl_name.bv_val, sizeof("IP=255.255.255.255:65535"),
+ "IP=%s:%d",
+ s != NULL ? s : SLAP_STRING_UNKNOWN, port );
+ l.sl_name.bv_len = strlen( l.sl_name.bv_val );
+ } break;
+
+#ifdef LDAP_PF_INET6
+ case AF_INET6: {
+ char addr[INET6_ADDRSTRLEN];
+ inet_ntop( AF_INET6, &((struct sockaddr_in6 *)*sal)->sin6_addr,
+ addr, sizeof addr);
+ port = ntohs( ((struct sockaddr_in6 *)*sal)->sin6_port );
+ l.sl_name.bv_len = strlen(addr) + sizeof("IP= 65535");
+ l.sl_name.bv_val = ber_memalloc( l.sl_name.bv_len );
+ snprintf( l.sl_name.bv_val, l.sl_name.bv_len, "IP=%s %d",
+ addr, port );
+ l.sl_name.bv_len = strlen( l.sl_name.bv_val );
+ } break;
+#endif /* LDAP_PF_INET6 */
+
+ default:
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, INFO,
+ "slap_open_listener: unsupported address family (%d)\n",
+ (int)(*sal)->sa_family, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_ANY, "daemon: unsupported address family (%d)\n",
+ (int) (*sal)->sa_family, 0, 0 );
+#endif
+ break;
+ }
+
+ AC_MEMCPY(&l.sl_sa, *sal, addrlen);
+ ber_str2bv( url, 0, 1, &l.sl_url);
+ li = ch_malloc( sizeof( Listener ) );
+ *li = l;
+ slap_listeners[*cur] = li;
+ (*cur)++;
+ sal++;
+
+ } /* while ( *sal != NULL ) */
+
+ slap_free_listener_addresses(psal);
+
+ if ( l.sl_url.bv_val == NULL )
+ {
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, RESULTS,
+ "slap_open_listener: failed on %s\n", url, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "slap_open_listener: failed on %s\n", url, 0, 0 );
+#endif
+ return -1;
+ }
+
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, RESULTS,
+ "slap_open_listener: daemon initialized %s\n",
+ l.sl_url.bv_val, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "daemon: initialized %s\n",
+ l.sl_url.bv_val, 0, 0 );
+#endif
+ return 0;
+}
+
+static int sockinit(void);
+static int sockdestroy(void);
+
+int slapd_daemon_init( const char *urls )
+{
+ int i, j, n, rc;
+ char **u;
+
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, ARGS,
+ "slapd_daemon_init: %s\n", urls ? urls : "<null>", 0, 0 );
+#else
+ Debug( LDAP_DEBUG_ARGS, "daemon_init: %s\n",
+ urls ? urls : "<null>", 0, 0 );
+#endif
+ if( (rc = sockinit()) != 0 ) {
+ return rc;
+ }