X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fdaemon.c;h=e61feceb12ae2c7505a29cc5d29c38ffeb6cb7bf;hb=9b4bf8a973c8cfea809be9a4b658f785a6b16f2f;hp=ab931923500e932759339554728b08710912f7f1;hpb=daf7d0c0ebc1bbb5b46b60e9969e296ed1c864da;p=openldap diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index ab93192350..e61feceb12 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -107,7 +107,7 @@ void slapd_slp_init( const char* urls ) { if( strcmp( slapd_srvurls[i], "ldap:///" ) == 0) { char *host = ldap_pvt_get_fqdn( NULL ); if ( host != NULL ) { - slapd_srvurls[i] = (char *) realloc( slapd_srvurls[i], + slapd_srvurls[i] = (char *) ch_realloc( slapd_srvurls[i], strlen( host ) + sizeof( LDAP_SRVTYPE_PREFIX ) ); strcpy( lutil_strcopy(slapd_srvurls[i], @@ -119,7 +119,7 @@ void slapd_slp_init( const char* urls ) { } else if ( strcmp( slapd_srvurls[i], "ldaps:///" ) == 0) { char *host = ldap_pvt_get_fqdn( NULL ); if ( host != NULL ) { - slapd_srvurls[i] = (char *) realloc( slapd_srvurls[i], + slapd_srvurls[i] = (char *) ch_realloc( slapd_srvurls[i], strlen( host ) + sizeof( LDAPS_SRVTYPE_PREFIX ) ); strcpy( lutil_strcopy(slapd_srvurls[i], @@ -663,9 +663,6 @@ static int slap_open_listener( return -1; #endif } else { -#ifdef LDAP_CONNECTIONLESS - l.sl_is_udp = ( tmp == LDAP_PROTO_UDP ); -#endif if( lud->lud_host == NULL || lud->lud_host[0] == '\0' || strcmp(lud->lud_host, "*") == 0 ) { @@ -674,6 +671,9 @@ static int slap_open_listener( err = slap_get_listener_addresses(lud->lud_host, port, &sal); } } +#ifdef LDAP_CONNECTIONLESS + l.sl_is_udp = ( tmp == LDAP_PROTO_UDP ); +#endif #if defined(LDAP_PF_LOCAL) || defined(SLAP_X_LISTENER_MOD) if ( lud->lud_exts ) { @@ -1203,9 +1203,6 @@ slapd_daemon_task( fd_set writefds; Sockaddr from; -#if defined(SLAPD_RLOOKUPS) - struct hostent *hp; -#endif struct timeval zero; struct timeval *tvp; @@ -1383,6 +1380,9 @@ slapd_daemon_task( long id; slap_ssf_t ssf = 0; char *authid = NULL; +#ifdef SLAPD_RLOOKUPS + char hbuf[NI_MAXHOST]; +#endif char *dnsname = NULL; char *peeraddr = NULL; @@ -1555,19 +1555,19 @@ slapd_daemon_task( case AF_LOCAL: sprintf( peername, "PATH=%s", from.sa_un_addr.sun_path ); ssf = LDAP_PVT_SASL_LOCAL_SSF; -# ifdef SO_PEERCRED { - struct ucred peercred; - size_t peercred_len = sizeof(peercred); - - if (getsockopt( s, SOL_SOCKET, SO_PEERCRED, - (void *)&peercred, &peercred_len ) == 0 && - peercred_len == sizeof(peercred) ) { - authid = ch_malloc(sizeof("uidNumber=+gidNumber=+,cn=peercred,cn=external,cn=auth") + 32); - sprintf(authid, "uidNumber=%d+gidNumber=%d,cn=peercred,cn=external,cn=auth", peercred.uid, peercred.gid); + uid_t uid; + gid_t gid; + + if( getpeereid( s, &uid, &gid ) == 0 ) { + authid = ch_malloc( + sizeof("uidnumber=4294967295+gidnumber=4294967295," + "cn=peercred,cn=external,cn=auth")); + sprintf(authid, "uidnumber=%d+gidnumber=%d," + "cn=peercred,cn=external,cn=auth", + (int) uid, (int) gid); } } -# endif /* SO_PEERCRED */ dnsname = "local"; break; #endif /* LDAP_PF_LOCAL */ @@ -1612,19 +1612,12 @@ slapd_daemon_task( ) { #ifdef SLAPD_RLOOKUPS if ( use_reverse_lookup ) { -# ifdef LDAP_PF_INET6 - if ( from.sa_addr.sa_family == AF_INET6 ) - hp = gethostbyaddr( - (char *)&(from.sa_in6_addr.sin6_addr), - sizeof(from.sa_in6_addr.sin6_addr), - AF_INET6 ); - else -# endif /* LDAP_PF_INET6 */ - hp = gethostbyaddr( - (char *) &(from.sa_in_addr.sin_addr), - sizeof(from.sa_in_addr.sin_addr), - AF_INET ); - dnsname = hp ? ldap_pvt_str2lower( hp->h_name ) : NULL; + char *herr; + if (ldap_pvt_get_hname( (const struct sockaddr *)&from, len, hbuf, + sizeof(hbuf), &herr ) == 0) { + ldap_pvt_str2lower( hbuf ); + dnsname = hbuf; + } } #else dnsname = NULL; @@ -1638,7 +1631,7 @@ slapd_daemon_task( { /* DENY ACCESS */ Statslog( LDAP_DEBUG_STATS, - "fd=%ld host access from %s (%s) denied.\n", + "fd=%ld DENIED from %s (%s)", (long) s, dnsname != NULL ? dnsname : SLAP_STRING_UNKNOWN, peeraddr != NULL ? peeraddr : SLAP_STRING_UNKNOWN, @@ -1684,8 +1677,7 @@ slapd_daemon_task( } Statslog( LDAP_DEBUG_STATS, - "daemon: conn=%ld fd=%ld connection from %s " - "(%s) accepted.\n", + "conn=%ld fd=%ld ACCEPT from %s (%s)\n", id, (long) s, peername, slap_listeners[l]->sl_name.bv_val, @@ -1910,11 +1902,17 @@ slapd_daemon_task( #endif } - if( slapd_gentle_shutdown != 2 ) + if( slapd_gentle_shutdown != 2 ) { close_listeners ( 0 ); + } + free ( slap_listeners ); slap_listeners = NULL; + if( !slapd_gentle_shutdown ) { + connections_shutdown(); + } + #ifdef NEW_LOGGING LDAP_LOG( CONNECTION, CRIT, "slapd_daemon_task: shutdown waiting for %d threads to terminate.\n",