Skip to content
Snippets Groups Projects
Commit 5bfb3ac2 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

nextid cleanup in preparation to disable next_id_return().

parent ecdf9a35
No related branches found
No related tags found
No related merge requests found
......@@ -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 );
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;
}
}
......
......@@ -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 ) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment