mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-19 13:23:44 -05:00
nextid cleanup in preparation to disable next_id_return().
This commit is contained in:
parent
ecdf9a354d
commit
5bfb3ac221
4 changed files with 116 additions and 95 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ) {
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
if ( li->li_nextid == NOID ) {
|
||||
li->li_nextid = next_id_read( be );
|
||||
|
||||
if ( li->li_nextid == NOID ) {
|
||||
li->li_nextid = 1;
|
||||
|
||||
} 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 );
|
||||
}
|
||||
}
|
||||
|
||||
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 );
|
||||
if ( li->li_nextid == NOID ) {
|
||||
li->li_nextid = next_id_read( be );
|
||||
|
||||
if ( li->li_nextid == NOID ) {
|
||||
li->li_nextid = 1;
|
||||
|
||||
} 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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue