]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Numerous minor fixes from HEAD, see CHANGES
authorKurt Zeilenga <kurt@openldap.org>
Thu, 6 Mar 2003 00:48:30 +0000 (00:48 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 6 Mar 2003 00:48:30 +0000 (00:48 +0000)
21 files changed:
CHANGES
configure.in
include/ac/socket.h
include/ldap.h
include/ldap_pvt.h
libraries/liblber/io.c
libraries/libldap/os-ip.c
libraries/libldap/os-local.c
libraries/libldap/util-int.c
libraries/liblutil/getpeereid.c
servers/slapd/back-bdb/config.c
servers/slapd/back-meta/config.c
servers/slapd/back-monitor/database.c
servers/slapd/backend.c
servers/slapd/backglue.c
servers/slapd/daemon.c
servers/slapd/modify.c
servers/slapd/root_dse.c
servers/slapd/slap.h
servers/slapd/tools/slapcommon.c
tests/progs/slapd-modrdn.c

diff --git a/CHANGES b/CHANGES
index 5494a7cced03d03136c7a7ced3a6d2c9be346e50..ce925b8032b26972348f55c7d8e9c0b74c00f91d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,9 +2,13 @@ OpenLDAP 2.1 Change Log
 
 OpenLDAP 2.1.15 Engineering
        Fixed slapd saslauthz null backend crash
-       Fixed liblutil getpeereid replacement function
-       Fixed liblber 64bit len/tag bug
+       Fixed libldap IPv6 SASL host bug (ITS#2347)
+       Fixed liblber 64bit len/tag bug (ITS#2344)
+       Fixed liblutil getpeereid replacement function (ITS#2333)
+       Fixed slapd illegal schema crash (ITS#2342)
+       Updated slaptools default backend (ITS#2343)
        Updated liblber ber_get_stringbv handling
+       Removed lint
        Build Environment
                Updated NT build environment w/ slurpd support
                Updated test suite
index 179f6c8a96dcfbb940f92d2fd648e83f8dc82a4d..cacc884cabf86f1607361bbadf6a7f13733862e3 100644 (file)
@@ -998,7 +998,7 @@ fi
 dnl ----------------------------------------------------------------
 dnl PF_INET6 support requires getaddrinfo and INET6_ADDRSTRLEN
 dnl PF_LOCAL may use getaddrinfo in available
-AC_CHECK_FUNCS( getaddrinfo gai_strerror inet_ntop )
+AC_CHECK_FUNCS( getaddrinfo getnameinfo gai_strerror inet_ntop )
 
 ol_link_ipv6=no
 if test $ac_cv_func_getaddrinfo = no -o $ac_cv_func_inet_ntop = no ; then
@@ -1095,7 +1095,7 @@ if test $ol_with_kerberos = yes -o $ol_with_kerberos = auto \
 
                else
                        have_krb5=no
-                       AC_MSG_WARN([Unrecongized Kerberos5 Implementation])
+                       AC_MSG_WARN([Unrecognized Kerberos5 Implementation])
                fi
 
                if test $have_krb5 = yes ; then
index ded4c469685fca85c1ec73b1109a167e2b8d1a01..c0590c2e3d28e5a67309ba8a3c246130ea18be95 100644 (file)
@@ -205,4 +205,9 @@ LDAP_F (int) ldap_pvt_inet_aton LDAP_P(( const char *, struct in_addr * ));
 LDAP_LUTIL_F( int ) getpeereid( int s, uid_t *, gid_t * );
 #endif
 
+/* DNS RFC defines max host name as 255. New systems seem to use 1024 */
+#ifndef NI_MAXHOST
+#define        NI_MAXHOST      256
+#endif
+
 #endif /* _AC_SOCKET_H_ */
index 7c79746997d1d1ef66c24081d7b9b50059ce43b0..82da13f4f07e32d7b29e82c6a19284324f87dc30 100644 (file)
@@ -1616,5 +1616,34 @@ ldap_whoami_s LDAP_P((
        LDAPControl **sctrls,
        LDAPControl **cctrls ));
 
+/*
+ * in passwd.c
+ */
+
+LDAP_F( int )
+ldap_parse_passwd LDAP_P((
+       LDAP *ld,
+       LDAPMessage *res,
+       struct berval *newpasswd ));
+
+LDAP_F( int )
+ldap_passwd LDAP_P(( LDAP *ld,
+       struct berval   *user,
+       struct berval   *oldpw,
+       struct berval   *newpw,
+       LDAPControl             **sctrls,
+       LDAPControl             **cctrls,
+       int                             *msgidp ));
+
+LDAP_F( int )
+ldap_passwd_s LDAP_P((
+       LDAP *ld,
+       struct berval   *user,
+       struct berval   *oldpw,
+       struct berval   *newpw,
+       struct berval *newpasswd,
+       LDAPControl **sctrls,
+       LDAPControl **cctrls ));
+
 LDAP_END_DECL
 #endif /* _LDAP_H */
index 6988c16c411a229ddfec4b77c330b10bb4b3817f..f2635512c5c940b5ffb045fe584bc08421dd3942 100644 (file)
@@ -66,6 +66,16 @@ ldap_pvt_gethostbyaddr_a LDAP_P((
        struct hostent **result,
        int *herrno_ptr ));
 
+struct sockaddr;
+
+LDAP_F( int )
+ldap_pvt_get_hname LDAP_P((
+       const struct sockaddr * sa,
+       int salen,
+       char *name,
+       int namelen,
+       char **herr ));
+
 
 /* charray.c */
 
index dbe7a73dde70892fa789aac8c10915b5662dd235..931982cf9047942c34cdd8c6f08c207b14c7beb0 100644 (file)
@@ -512,7 +512,7 @@ ber_get_next(
        while (ber->ber_rwptr > (char *)&ber->ber_tag && ber->ber_rwptr <
                (char *)&ber->ber_len + LENSIZE*2) {
                ber_slen_t sblen;
-               char buf[LENSIZE-1];
+               char buf[sizeof(ber->ber_len)-1];
                ber_len_t tlen = 0;
 
                sblen=ber_int_sb_read( sb, ber->ber_rwptr,
@@ -574,11 +574,11 @@ ber_get_next(
                }
 
                /* Are there leftover data bytes inside ber->ber_len? */
-               if (ber->ber_ptr < (char *)&ber->ber_len+LENSIZE) {
-                       if (ber->ber_rwptr < (char *)&ber->ber_len+LENSIZE)
+               if (ber->ber_ptr < (char *)&ber->ber_usertag) {
+                       if (ber->ber_rwptr < (char *)&ber->ber_usertag)
                                sblen = ber->ber_rwptr - ber->ber_ptr;
                        else
-                               sblen = ((char *)&ber->ber_len+LENSIZE) - ber->ber_ptr;
+                               sblen = (char *)&ber->ber_usertag - ber->ber_ptr;
                        AC_MEMCPY(buf, ber->ber_ptr, sblen);
                        ber->ber_ptr += sblen;
                } else {
index fc705e9f3320c52d345d2eecd6f7aecabd1daf8a..738e97f930ed903ef16a9dce65a04476d669ce7e 100644 (file)
@@ -499,7 +499,6 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
 char *
 ldap_host_connected_to( Sockbuf *sb )
 {
-       struct hostent  *hp;
        socklen_t               len;
 #ifdef LDAP_PF_INET6
        struct sockaddr_storage sabuf;
@@ -507,13 +506,9 @@ ldap_host_connected_to( Sockbuf *sb )
        struct sockaddr sabuf;
 #endif
        struct sockaddr *sa = (struct sockaddr *) &sabuf;
-       char                    *addr;
-       char                    *host;
-
-       /* buffers for gethostbyaddr_r */
-       struct hostent  he_buf;
-       int                             local_h_errno;
-       char                    *ha_buf=NULL;
+       char                    *host = NULL, *herr;
+       char hbuf[NI_MAXHOST];
+       int rc;
        ber_socket_t    sd;
 
        (void)memset( (char *)sa, '\0', sizeof sabuf );
@@ -537,31 +532,32 @@ ldap_host_connected_to( Sockbuf *sb )
 #endif
 #ifdef LDAP_PF_INET6
        case AF_INET6:
-               addr = (char *) &((struct sockaddr_in6 *)sa)->sin6_addr;
-               len = sizeof( struct in6_addr );
+               {
+                       struct in6_addr localhost = IN6ADDR_LOOPBACK_INIT;
+                       if( memcmp ( &((struct sockaddr_in6 *)sa)->sin6_addr,
+                               &localhost, sizeof(localhost)) == 0 )
+                       {
+                               return LDAP_STRDUP( ldap_int_hostname );
+                       }
+               }
                break;
 #endif
        case AF_INET:
-               addr = (char *) &((struct sockaddr_in *)sa)->sin_addr;
-               len = sizeof( struct in_addr );
-
                {
-                       struct sockaddr_in localhost;
-                       localhost.sin_addr.s_addr = htonl( INADDR_ANY );
+                       struct in_addr localhost;
+                       localhost.s_addr = htonl( INADDR_ANY );
 
-                       if( memcmp ( &localhost.sin_addr,
-                               &((struct sockaddr_in *)sa)->sin_addr,
-                               sizeof(localhost.sin_addr) ) == 0 )
+                       if( memcmp ( &((struct sockaddr_in *)sa)->sin_addr,
+                               &localhost, sizeof(localhost) ) == 0 )
                        {
                                return LDAP_STRDUP( ldap_int_hostname );
                        }
 
 #ifdef INADDR_LOOPBACK
-                       localhost.sin_addr.s_addr = htonl( INADDR_LOOPBACK );
+                       localhost.s_addr = htonl( INADDR_LOOPBACK );
 
-                       if( memcmp ( &localhost.sin_addr,
-                               &((struct sockaddr_in *)sa)->sin_addr,
-                               sizeof(localhost.sin_addr) ) == 0 )
+                       if( memcmp ( &((struct sockaddr_in *)sa)->sin_addr,
+                               &localhost, sizeof(localhost) ) == 0 )
                        {
                                return LDAP_STRDUP( ldap_int_hostname );
                        }
@@ -574,15 +570,13 @@ ldap_host_connected_to( Sockbuf *sb )
                break;
        }
 
-       host = NULL;
-       if ((ldap_pvt_gethostbyaddr_a( addr, len, sa->sa_family,
-               &he_buf, &ha_buf, &hp, &local_h_errno ) == 0 ) &&
-               (hp != NULL) && ( hp->h_name != NULL ) )
+       hbuf[0] = 0;
+       if (ldap_pvt_get_hname( sa, len, hbuf, sizeof(hbuf), &herr ) == 0 &&
+               hbuf[0] ) 
        {
-               host = LDAP_STRDUP( hp->h_name );   
+               host = LDAP_STRDUP( hbuf );   
        }
 
-       LDAP_FREE( ha_buf );
        return host;
 }
 #endif
index 024b21bc450149077eb3280e1ff0573c096c13df..aef423150edfd9734912e730bdbfeacd29d06998 100644 (file)
@@ -139,6 +139,8 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
        !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && \
        defined(HAVE_SENDMSG) && defined(HAVE_MSGHDR_MSG_ACCRIGHTS)
 #define DO_SENDMSG
+static const char abandonPDU[] = {LDAP_TAG_MESSAGE, 6,
+       LDAP_TAG_MSGID, 1, 0, LDAP_REQ_ABANDON, 1, 0};
 #endif
 
 static int
@@ -172,12 +174,10 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr_un *sa, int async)
 sendcred:
                {
                        int fds[2];
-                       /* Abandon, noop, has no reply */
-                       char txt[] = {LDAP_TAG_MESSAGE, 6,
-                               LDAP_TAG_MSGID, 1, 0, LDAP_REQ_ABANDON, 1, 0};
-                       struct iovec iov = {txt, sizeof(txt)};
-                       struct msghdr msg = {0};
                        if (pipe(fds) == 0) {
+                               /* Abandon, noop, has no reply */
+                               struct iovec iov = {abandonPDU, sizeof(abandonPDU)};
+                               struct msghdr msg = {0};
                                msg.msg_iov = &iov;
                                msg.msg_iovlen = 1;
                                msg.msg_accrights = (char *)fds;
index 59c3db48156f14dee6b5bdbad71c12dd9497f70a..23bf1d194c6cdab1d8262a3c24ba415d6366df9e 100644 (file)
@@ -178,7 +178,125 @@ int ldap_pvt_gethostbyname_a(
        return -1;
 #endif 
 }
-        
+
+#ifndef GETNAMEINFO
+static const char *
+hp_strerror( int err )
+{
+       switch (err) {
+       case HOST_NOT_FOUND:    return "Host not found (authoritative)";
+       case TRY_AGAIN:         return "Host not found (server fail?)";
+       case NO_RECOVERY:       return "Non-recoverable failure";
+       case NO_DATA:           return "No data of requested type";
+#ifdef NETDB_INTERNAL
+       case NETDB_INTERNAL:    return STRERROR( errno );
+#endif
+       default:        break;  
+       }
+       return "Unknown resolver error";
+}
+#endif
+
+int ldap_pvt_get_hname(
+       const struct sockaddr *sa,
+       int len,
+       char *name,
+       int namelen,
+       char **err )
+{
+       int rc;
+#if defined( HAVE_GETNAMEINFO )
+
+#if defined( LDAP_R_COMPILE )
+       ldap_pvt_thread_mutex_lock( &ldap_int_resolv_mutex );
+#endif
+       rc = getnameinfo( sa, len, name, namelen, NULL, 0, 0 );
+#if defined( LDAP_R_COMPILE )
+       ldap_pvt_thread_mutex_unlock( &ldap_int_resolv_mutex );
+#endif
+       if ( rc ) *err = AC_GAI_STRERROR( rc );
+       return rc;
+
+#else /* !HAVE_GETNAMEINFO */
+       char *addr;
+       int alen;
+       struct hostent *hp = NULL;
+#ifdef HAVE_GETHOSTBYADDR_R
+       struct hostent hb;
+       int buflen=BUFSTART, h_errno;
+       char *buf=NULL;
+#endif
+
+#ifdef LDAP_PF_INET6
+       if (sa->sa_family == AF_INET6) {
+               struct sockaddr_in6 *sin = (struct sockaddr_in6 *)sa;
+               addr = (char *)&sin->sin6_addr;
+               alen = sizeof(sin->sin6_addr);
+       } else
+#endif
+       if (sa->sa_family == AF_INET) {
+               struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+               addr = (char *)&sin->sin_addr;
+               alen = sizeof(sin->sin_addr);
+       } else {
+               rc = NO_RECOVERY;
+               *err = (char *)hp_strerror( rc );
+               return rc;
+       }
+#if defined( HAVE_GETHOSTBYADDR_R )
+       for(;buflen<BUFMAX;) {
+               if (safe_realloc( &buf, buflen )==NULL) {
+                       *err = (char *)STRERROR( ENOMEM );
+                       return ENOMEM;
+               }
+#if (GETHOSTBYADDR_R_NARGS < 8)
+               hp=gethostbyaddr_r( addr, alen, sa->sa_family,
+                       &hb, buf, buflen, &h_errno );
+               rc = (hp == NULL) ? -1 : 0;
+#else
+               rc = gethostbyaddr_r( addr, alen, sa->sa_family,
+                       &hb, buf, buflen, 
+                       &hp, &h_errno );
+#endif
+#ifdef NETDB_INTERNAL
+               if ((rc<0) &&
+                       (h_errno==NETDB_INTERNAL) &&
+                       (errno==ERANGE))
+               {
+                       buflen*=2;
+                       continue;
+               }
+#endif
+               break;
+       }
+       if (hp) {
+               strncpy( name, hp->h_name, namelen );
+       } else {
+               *err = (char *)hp_strerror( h_errno );
+       }
+       LDAP_FREE(buf);
+#else /* HAVE_GETHOSTBYADDR_R */
+
+#if defined( LDAP_R_COMPILE )
+       ldap_pvt_thread_mutex_lock( &ldap_int_resolv_mutex );
+#endif
+       hp = gethostbyaddr( addr, alen, sa->sa_family );
+       if (hp) {
+               strncpy( name, hp->h_name, namelen );
+               rc = 0;
+       } else {
+               rc = h_errno;
+               *err = (char *)hp_strerror( h_errno );
+       }
+#if defined( LDAP_R_COMPILE )
+       ldap_pvt_thread_mutex_unlock( &ldap_int_resolv_mutex );
+#endif
+
+#endif /* !HAVE_GETHOSTBYADDR_R */
+       return rc;
+#endif /* !HAVE_GETNAMEINFO */
+}
+
 int ldap_pvt_gethostbyaddr_a(
        const char *addr,
        int len,
index 2642886c27374e0a10b73b88fc6e644e73b073fc..de48ab8b537e26828388990b619dd44626188354 100644 (file)
@@ -58,9 +58,12 @@ int getpeereid( int s, uid_t *euid, gid_t *egid )
        }
 #elif defined( DO_SENDMSG )
        int dummy, fd[2];
-       struct iovec iov = {(char *)&dummy, 1};
+       struct iovec iov;
        struct msghdr msg = {0};
        struct stat st;
+
+       iov.iov_base = (char*) &dummy;
+       iov.iov_len = 1;
        msg.msg_iov = &iov;
        msg.msg_iovlen = 1;
        msg.msg_accrights = (char *)fd;
index 5011470d54712342c2c4537427453e3ba61471c5..8fd2e23272e65de63e19fc5357a42a689b5a94f6 100644 (file)
@@ -154,7 +154,8 @@ bdb_db_config(
                              fname, lineno );
                          return( 1 );
                  }
-                 bdb->bi_idl_cache_max_size = atoi( argv[1] );
+                if ( !( slapMode & SLAP_TOOL_MODE ) )
+                        bdb->bi_idl_cache_max_size = atoi( argv[1] );
 #endif
 
        /* anything else */
index e02adc8df63d0ed9df7c672e5ba1605bd109a03c..2c82afdc0d58dd09eb017febc13d72f386fd1fc4 100644 (file)
@@ -73,6 +73,7 @@
 
 #include "slap.h"
 #include "../back-ldap/back-ldap.h"
+#undef ldap_debug      /* silence a warning in ldap-int.h */
 #include "../../../libraries/libldap/ldap-int.h"
 #include "back-meta.h"
 
index 96204196527bfc2b00c1bb13ef1913dbeac243a6..7151d6683b64f4d3e773affc8e19a4e8e76fc8b9 100644 (file)
@@ -103,7 +103,7 @@ monitor_subsys_database_init(
                be = &backendDB[i];
 
                /* Subordinates are not exposed as their own naming context */
-               if ( be->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE ) {
+               if ( SLAP_GLUE_SUBORDINATE( be ) ) {
                        continue;
                }
 
index 6586e3020fa8f342eb7fbaedd1c13f2343c51465..e694be61bf7ae158d8020a4ed90208680ec458d8 100644 (file)
@@ -536,7 +536,7 @@ select_backend(
                for ( j = 0; backends[i].be_nsuffix != NULL &&
                    backends[i].be_nsuffix[j].bv_val != NULL; j++ )
                {
-                       if (( backends[i].be_flags & SLAP_BFLAG_GLUE_SUBORDINATE )
+                       if ( ( SLAP_GLUE_SUBORDINATE( &backends[i] ) )
                                && noSubs )
                        {
                                continue;
index 8ffccd74f5f1a9ccebd01e72f0b802c8bb67b3d3..4db1e9f40a476d249dc763bef6c7d3e569952e3d 100644 (file)
@@ -610,7 +610,7 @@ glue_sub_init( )
         * backends and connect them to their superior.
         */
        for (i = nBackendDB - 1, b1=&backendDB[i]; cont && i>=0; b1--,i--) {
-               if (b1->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE) {
+               if (SLAP_GLUE_SUBORDINATE ( b1 ) ) {
                        /* The last database cannot be a subordinate of noone */
                        if (i == nBackendDB - 1) {
                                b1->be_flags ^= SLAP_BFLAG_GLUE_SUBORDINATE;
@@ -619,11 +619,11 @@ glue_sub_init( )
                }
                gi = NULL;
                for (j = i-1, be=&backendDB[j]; j>=0; be--,j--) {
-                       if (!(be->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE)) {
+                       if ( ! SLAP_GLUE_SUBORDINATE( be ) ) {
                                continue;
                        }
                        /* We will only link it once */
-                       if (be->be_flags & SLAP_BFLAG_GLUE_LINKED) {
+                       if ( SLAP_GLUE_LINKED( be ) ) {
                                continue;
                        }
                        if (!dnIsSuffix(&be->be_nsuffix[0], &b1->be_nsuffix[0])) {
index ea1d1b7e7ce236d72ccda23a1b85b5ca46eeac30..560a0d21ca653dc4e376df87d00a0fe42b4d087f 100644 (file)
@@ -1381,7 +1381,7 @@ slapd_daemon_task(
                        slap_ssf_t ssf = 0;
                        char *authid = NULL;
 #ifdef SLAPD_RLOOKUPS
-                       char *hebuf = NULL;
+                       char hbuf[NI_MAXHOST];
 #endif
 
                        char    *dnsname = NULL;
@@ -1612,23 +1612,12 @@ slapd_daemon_task(
                        ) {
 #ifdef SLAPD_RLOOKUPS
                                if ( use_reverse_lookup ) {
-                                       struct hostent he;
-                                       int herr;
-                                       struct hostent *hp = NULL;
-#  ifdef LDAP_PF_INET6
-                                       if ( from.sa_addr.sa_family == AF_INET6 )
-                                               ldap_pvt_gethostbyaddr_a(
-                                                       (char *)&(from.sa_in6_addr.sin6_addr),
-                                                       sizeof(from.sa_in6_addr.sin6_addr),
-                                                       AF_INET6, &he, &hebuf,
-                                                       &hp, &herr );
-                                       else
-#  endif /* LDAP_PF_INET6 */
-                                       ldap_pvt_gethostbyaddr_a(
-                                               (char *) &(from.sa_in_addr.sin_addr),
-                                               sizeof(from.sa_in_addr.sin_addr),
-                                               AF_INET, &he, &hebuf, &hp, &herr );
-                                       dnsname = hp ? ldap_pvt_str2lower( hp->h_name ) : NULL;
+                                       char *herr;
+                                       if (ldap_pvt_get_hname( &from, len, hbuf,
+                                               sizeof(hbuf), &herr ) == 0) {
+                                               ldap_pvt_str2lower( hbuf );
+                                               dnsname = hbuf;
+                                       }
                                }
 #else
                                dnsname = NULL;
@@ -1666,9 +1655,6 @@ slapd_daemon_task(
                                authid );
 
                        if( authid ) ch_free(authid);
-#ifdef SLAPD_RLOOKUPS
-                       if( hebuf ) ldap_memfree(hebuf);
-#endif
 
                        if( id < 0 ) {
 #ifdef NEW_LOGGING
index 44c9da2be8d937290961a30fc67c8f11d4fdf852..5e6f5232d09f98405e141625f4f43a76f00f2048 100644 (file)
@@ -270,7 +270,6 @@ do_modify(
                }
 #endif
        }
-#endif
 
        if ( StatslogTest( LDAP_DEBUG_STATS ) ) {
                char abuf[BUFSIZ/2], *ptr = abuf;
@@ -298,6 +297,7 @@ do_modify(
                                op->o_connid, op->o_opid, abuf, 0, 0 );
                }
        }
+#endif /* LDAP_DEBUG */
 
        manageDSAit = get_manageDSAit( op );
 
index f61a36c362cc16cef8ba837dfe03bda53a4f12f2..8e9fb01ab1874c447f731f99eca25bdb8a0506df 100644 (file)
@@ -113,7 +113,7 @@ root_dse_info(
                                return LDAP_OTHER;
                        continue;
                }
-               if ( backends[i].be_flags & SLAP_BFLAG_GLUE_SUBORDINATE ) {
+               if ( SLAP_GLUE_SUBORDINATE( &backends[i] ) ) {
                        continue;
                }
                for ( j = 0; backends[i].be_suffix[j].bv_val != NULL; j++ ) {
index 7913b1439ba974c479a7535dbea734a02ad61dec..c4722208c225fa0cbc712f7adae6d9b5beebbc7e 100644 (file)
@@ -1271,6 +1271,10 @@ struct slap_backend_db {
 #define SLAP_BFLAG_DYNAMIC             0x2000U
        slap_mask_t     be_flags;
 #define SLAP_LASTMOD(be)       (!((be)->be_flags & SLAP_BFLAG_NOLASTMOD))
+#define        SLAP_GLUE_INSTANCE(be)  ((be)->be_flags & SLAP_BFLAG_GLUE_INSTANCE)
+#define        SLAP_GLUE_SUBORDINATE(be) \
+       ((be)->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE)
+#define        SLAP_GLUE_LINKED(be)    ((be)->be_flags & SLAP_BFLAG_GLUE_LINKED)
 #define SLAP_ALIASES(be)       ((be)->be_flags & SLAP_BFLAG_ALIASES)
 #define SLAP_REFERRALS(be)     ((be)->be_flags & SLAP_BFLAG_REFERRALS)
 #define SLAP_SUBENTRIES(be)    ((be)->be_flags & SLAP_BFLAG_SUBENTRIES)
@@ -1969,14 +1973,6 @@ typedef struct slap_conn {
                        fprintf( stderr, (fmt), (connid), (opid), (arg1), (arg2), (arg3) );\
        } while (0)
 #define StatslogTest( level ) (ldap_debug & (level))
-#elif defined(LDAP_SYSLOG)
-#define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 ) \
-       do { \
-               if ( ldap_syslog & (level) ) \
-                       syslog( ldap_syslog_level, (fmt), (connid), (opid), (arg1), \
-                               (arg2), (arg3) ); \
-       } while (0)
-#define StatslogTest( level ) (ldap_syslog & (level))
 #else
 #define Statslog( level, fmt, connid, opid, arg1, arg2, arg3 )
 #define StatslogTest( level ) (0)
index 23fc0bf64c2c460cdfa90b69d31b7cb0108a0a39..f5a4847bcce8b1c893e6e206f8bcf4964881498f 100644 (file)
@@ -250,17 +250,45 @@ slap_tool_init(
                /* If the named base is a glue master, operate on the
                 * entire context
                 */
-               if (be->be_flags & SLAP_BFLAG_GLUE_INSTANCE)
+               if (SLAP_GLUE_INSTANCE(be)) {
                        nosubordinates = 1;
+               }
 
        } else if ( dbnum == -1 ) {
+               if ( nbackends <= 0 ) {
+                       fprintf( stderr, "No available databases\n" );
+                       exit( EXIT_FAILURE );
+               }
+               
                be = &backends[dbnum=0];
                /* If just doing the first by default and it is a
                 * glue subordinate, find the master.
                 */
-               while (be->be_flags & SLAP_BFLAG_GLUE_SUBORDINATE) {
-                       nosubordinates = 1;
+               while (SLAP_GLUE_SUBORDINATE(be) || SLAP_MONITOR(be)) {
+                       if (SLAP_GLUE_SUBORDINATE(be)) {
+                               nosubordinates = 1;
+                       }
                        be++;
+                       dbnum++;
+               }
+
+
+               if ( dbnum >= nbackends ) {
+                       fprintf( stderr, "Available database(s) "
+                                       "do not allow %s\n", name );
+                       exit( EXIT_FAILURE );
+               }
+               
+               if ( nosubordinates == 0 && dbnum > 0 ) {
+#ifdef NEW_LOGGING
+                       LDAP_LOG( BACKEND, ERR, 
+"The first database does not allow %s; using the first available one (%d)\n",
+                               name, dbnum + 1, 0 );
+#else
+                       Debug( LDAP_DEBUG_ANY,
+"The first database does not allow %s; using the first available one (%d)\n",
+                               name, dbnum + 1, 0 );
+#endif
                }
 
        } else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
index 8de0b554b14bb9e25c4e1d30e92e45423c5bb8f1..cfedca5cbaaf52daf61fb1e294bae297b9727655 100644 (file)
@@ -93,14 +93,16 @@ main( int argc, char **argv )
 
 
 static void
-do_modrdn( char *uri, char *host, int port, char *manager, char *passwd, char *entry, int maxloop )
+do_modrdn( char *uri, char *host, int port, char *manager,
+       char *passwd, char *entry, int maxloop )
 {
        LDAP    *ld = NULL;
        int     i;
        pid_t   pid = getpid();
-       char *DNs[2] = { entry, NULL };
+       char *DNs[2];
        char *rdns[2];
 
+       DNs[0] = entry;
        DNs[1] = strdup( entry );
 
        /* reverse the RDN, make new DN */