From: Kurt Zeilenga Date: Fri, 22 Jan 1999 01:40:39 +0000 (+0000) Subject: nextid cleanup in preparation to disable next_id_return(). X-Git-Tag: OPENLDAP_SLAPD_BACK_LDAP~722 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=5bfb3ac2217d251daa81d75cb8b903bf7c09d8f7;p=openldap nextid cleanup in preparation to disable next_id_return(). --- diff --git a/servers/slapd/back-ldbm/back-ldbm.h b/servers/slapd/back-ldbm/back-ldbm.h index a7d3cd34b8..227bde5a40 100644 --- a/servers/slapd/back-ldbm/back-ldbm.h +++ b/servers/slapd/back-ldbm/back-ldbm.h @@ -106,6 +106,7 @@ struct attrinfo { struct ldbminfo { ID li_nextid; + char *li_nextid_file; pthread_mutex_t li_root_mutex; pthread_mutex_t li_add_mutex; pthread_mutex_t li_nextid_mutex; diff --git a/servers/slapd/back-ldbm/config.c b/servers/slapd/back-ldbm/config.c index 99a7c7794e..541410ee4d 100644 --- a/servers/slapd/back-ldbm/config.c +++ b/servers/slapd/back-ldbm/config.c @@ -37,6 +37,12 @@ ldbm_back_config( } li->li_directory = ch_strdup( argv[1] ); + li->li_nextid_file = + ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") ); + + strcpy(li->li_nextid_file, li->li_directory); + strcat(li->li_nextid_file, "/NEXTID"); + /* mode with which to create new database files */ } else if ( strcasecmp( argv[0], "mode" ) == 0 ) { if ( argc < 2 ) { diff --git a/servers/slapd/back-ldbm/nextid.c b/servers/slapd/back-ldbm/nextid.c index 63c7ed4d89..594e542a21 100644 --- a/servers/slapd/back-ldbm/nextid.c +++ b/servers/slapd/back-ldbm/nextid.c @@ -13,65 +13,94 @@ #include "slap.h" #include "back-ldbm.h" +static ID +next_id_read( Backend *be ) +{ + struct ldbminfo *li = (struct ldbminfo *) be->be_private; + ID id; + char buf[20]; + char* file = li->li_nextid_file; + FILE* fp; + + if ( (fp = fopen( file, "r" )) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "next_id_read: could not open \"%s\"\n", + file, 0, 0 ); + return NOID; + } + + if ( fgets( buf, sizeof(buf), fp ) == NULL ) { + Debug( LDAP_DEBUG_ANY, + "next_id_read: could not fgets nextid from \"%s\"\n", + file, 0, 0 ); + fclose( fp ); + return NOID; + } + + id = atol( buf ); + fclose( fp ); + + if(id < 1) { + Debug( LDAP_DEBUG_ANY, + "next_id_read %lu: atol(%s) return non-positive integer\n", + id, buf, 0 ); + return NOID; + } + + return id; +} + +static int +next_id_write( Backend *be, ID id ) +{ + struct ldbminfo *li = (struct ldbminfo *) be->be_private; + char buf[20]; + char* file = li->li_nextid_file; + FILE* fp; + int rc; + + if ( (fp = fopen( file, "w" )) == NULL ) { + Debug( LDAP_DEBUG_ANY, "next_id_write(%lu): could not open \"%s\"\n", + id, file, 0 ); + return -1; + } + + rc = 0; + + if ( fprintf( fp, "%ld\n", id ) == EOF ) { + Debug( LDAP_DEBUG_ANY, "next_id_write(%lu): cannot fprintf\n", + id, 0, 0 ); + rc = -1; + } + + if( fclose( fp ) != 0 ) { + Debug( LDAP_DEBUG_ANY, "next_id_write %lu: cannot fclose\n", + id, 0, 0 ); + rc = -1; + } + + return rc; +} + ID next_id( Backend *be ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - char buf2[20]; - FILE *fp; ID id; - sprintf( buf, "%s/NEXTID", li->li_directory ); - pthread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ - if ( li->li_nextid == -1 ) { - if ( (fp = fopen( buf, "r" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - li->li_nextid = 1; + if ( li->li_nextid == NOID ) { + li->li_nextid = next_id_read( be ); - } else { - if ( fgets( buf2, sizeof(buf2), fp ) != NULL ) { - li->li_nextid = atol( buf2 ); - - if(li->li_nextid < 1) { - /* protect against bad data */ - Debug( LDAP_DEBUG_ANY, - "next_id %lu: atol(%s) return non-positive integer\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - } else { - Debug( LDAP_DEBUG_ANY, - "next_id %lu: could not fgets nextid from \"%s\"\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - fclose( fp ); + if ( li->li_nextid == NOID ) { + li->li_nextid = 1; } } id = li->li_nextid++; - - if ( (fp = fopen( buf, "w" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - } else { - if ( fprintf( fp, "%ld\n", li->li_nextid ) == EOF ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: cannot fprintf\n", - li->li_nextid, 0, 0 ); - } - if( fclose( fp ) != 0 ) { - Debug( LDAP_DEBUG_ANY, "next_id %lu: cannot fclose\n", - li->li_nextid, 0, 0 ); - } - } + (void) next_id_write( be, li->li_nextid ); pthread_mutex_unlock( &li->li_nextid_mutex ); return( id ); @@ -81,8 +110,6 @@ void next_id_return( Backend *be, ID id ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - FILE *fp; pthread_mutex_lock( &li->li_nextid_mutex ); @@ -91,25 +118,9 @@ next_id_return( Backend *be, ID id ) return; } - sprintf( buf, "%s/NEXTID", li->li_directory ); - li->li_nextid--; - if ( (fp = fopen( buf, "w" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: could not open \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } else { - if ( fprintf( fp, "%ld\n", li->li_nextid ) == EOF ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: cannot fprintf \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } - if( fclose( fp ) != 0 ) { - Debug( LDAP_DEBUG_ANY, - "next_id_return of %lu: cannot fclose \"%s\" next id %lu\n", - id, buf, li->li_nextid ); - } - } + (void) next_id_write( be, li->li_nextid ); + pthread_mutex_unlock( &li->li_nextid_mutex ); } @@ -117,42 +128,16 @@ ID next_id_get( Backend *be ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - char buf[MAXPATHLEN]; - char buf2[20]; - FILE *fp; ID id; - sprintf( buf, "%s/NEXTID", li->li_directory ); - pthread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ - if ( li->li_nextid == -1 ) { - if ( (fp = fopen( buf, "r" )) == NULL ) { - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: could not open \"%s\"\n", - li->li_nextid, buf, 0 ); - li->li_nextid = 1; + if ( li->li_nextid == NOID ) { + li->li_nextid = next_id_read( be ); - } else { - if ( fgets( buf2, sizeof(buf2), fp ) != NULL ) { - li->li_nextid = atol( buf2 ); - - if(li->li_nextid < 1) { - /* protect against bad data */ - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: atol(%s) return non-positive integer\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - - } else { - Debug( LDAP_DEBUG_ANY, - "next_id_get %lu: cannot fgets nextid from \"%s\"\n", - li->li_nextid, buf2, 0 ); - li->li_nextid = 1; - } - fclose( fp ); + if ( li->li_nextid == NOID ) { + li->li_nextid = 1; } } diff --git a/servers/slapd/bind.c b/servers/slapd/bind.c index 189ec03408..0a64185499 100644 --- a/servers/slapd/bind.c +++ b/servers/slapd/bind.c @@ -135,8 +135,22 @@ do_bind( free( cred.bv_val ); } + pthread_mutex_lock( &conn->c_dnmutex ); + conn->c_protocol = version; + if ( conn->c_cdn != NULL ) { + free( conn->c_cdn ); + conn->c_cdn = NULL; + } + + if ( conn->c_dn != NULL ) { + free( conn->c_dn ); + conn->c_dn = NULL; + } + + pthread_mutex_unlock( &conn->c_dnmutex ); + send_ldap_result( conn, op, LDAP_SUCCESS, NULL, NULL ); return; } @@ -154,7 +168,22 @@ do_bind( free( cred.bv_val ); } if ( cred.bv_len == 0 ) { + pthread_mutex_lock( &conn->c_dnmutex ); + conn->c_protocol = version; + + if ( conn->c_cdn != NULL ) { + free( conn->c_cdn ); + conn->c_cdn = NULL; + } + + if ( conn->c_dn != NULL ) { + free( conn->c_dn ); + conn->c_dn = NULL; + } + + pthread_mutex_unlock( &conn->c_dnmutex ); + send_ldap_result( conn, op, LDAP_SUCCESS, NULL, NULL ); } else if ( default_referral && *default_referral ) {