/* centipede.c - generate and install indexing information (view w/tabstop=4) */
+#include "portable.h"
+
#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/time.h>
+#include <ac/stdlib.h>
+
+#include <ac/ctype.h>
+#include <ac/string.h>
+#include <ac/time.h>
+#include <ac/unistd.h> /* get link(), unlink() */
+
#include <lber.h>
#include <ldap.h>
-#include <ldapconfig.h>
+
#include <ldbm.h>
#define DEFAULT_LDAPFILTER "(objectclass=*)"
int verbose;
int not;
-static LDAP *start_ldap_search();
-static LDAP *bind_to_destination_ldap();
-static int create_tmp_files();
-static int generate_new_centroids();
-static LDAPMod **diff_centroids();
-static LDAPMod **full_centroid();
-static char **charray_add_dup();
+static LDAP *start_ldap_search(char *ldapsrcurl, char *ldapfilter, char **attrs);
+static LDAP *bind_to_destination_ldap(char *ldapsrcurl, char *ldapdesturl);
+static int create_tmp_files(char **attrs, char ***tmpfile, LDBM **ldbm);
+static int generate_new_centroids(LDAP *ld, char **attrs, LDBM *ldbm);
+static LDAPMod **diff_centroids(char *attr, LDBM oldbm, LDBM nldbm, int nentries);
+static LDAPMod **full_centroid(char *attr, LDBM ldbm, int nentries);
+static char **charray_add_dup(char ***a, int *cur, int *max, char *s);
static void usage( char *name )
{
fprintf( stderr, "\t-c size\t\tldbm cache size\n" );
}
+int
main( int argc, char **argv )
{
- char *ldapfilter, *ldapref;
+ char *ldapfilter;
char *ldapsrcurl, *ldapdesturl;
LDAP *ld;
LDAPMod **mods;
char buf[BUFSIZ];
int i, j, k, count;
char *s;
- extern int optind;
- extern char *optarg;
ldapsrcurl = NULL;
ldapdesturl = NULL;
- ldaphost = LDAPHOST;
- ldapbase = DEFAULT_BASE;
+ ldaphost = NULL;
+ ldapbase = NULL;
srcldapauthmethod = LDAP_AUTH_SIMPLE;
destldapauthmethod = LDAP_AUTH_SIMPLE;
srcldapbinddn = NULL;
srcldapauthmethod = LDAP_AUTH_KRBV4;
} else {
fprintf( stderr, "%s: unknown auth method\n", optarg );
- fprintf( stderr, "expecting \"simple\" or \"kerberos\"\n",
- optarg );
+ fputs( "expecting \"simple\" or \"kerberos\"\n", stderr );
exit( 1 );
}
break;
destldapauthmethod = LDAP_AUTH_KRBV4;
} else {
fprintf( stderr, "%s: unknown auth method\n", optarg );
- fprintf( stderr, "expecting \"simple\" or \"kerberos\"\n",
- optarg );
+ fputs( "expecting \"simple\" or \"kerberos\"\n", stderr );
exit( 1 );
}
break;
char *s, *s2;
int i;
- if ( strncmp( ldapsrcurl, "ldap://", 7 ) == 0 ) {
- s = ldapsrcurl + 7;
+ if ( strncmp( ldapsrcurl, "ldap://", 7 ) != 0 ) {
+ fputs( "Not an LDAP URL", stderr ); /* Should be smarter? */
+ return( NULL );
}
+ s = ldapsrcurl + 7;
if ( (s2 = strchr( s, '/' )) == NULL ) {
ldapbase = strdup( s );
} else {
fflush( stdout );
}
- if ( (ld = ldap_open( ldaphost, LDAP_PORT )) == NULL ) {
- perror( "ldap_open" );
+ if ( (ld = ldap_init( ldaphost, 0 )) == NULL ) {
+ perror( "ldap_init" );
return( NULL );
}
char **val;
char last;
+ ldbm_datum_init( data );
+
if ( verbose ) {
printf( "Generating new centroids for..." );
fflush( stdout );
/* for each value */
for ( j = 0; val[j] != NULL; j++ ) {
+
+ ldbm_datum_init( key );
+
/* normalize the value */
for ( s = val[j]; *s; s++ ) {
- if ( isascii( *s ) ) {
- *s = tolower( *s );
- }
+ *s = TOLOWER( (unsigned char) *s );
last = *s;
}
if ( isascii( last ) && isdigit( last ) ) {
/* generate a word-based centroid */
} else {
- for ( w = strtok( val[j], WORD_BREAKS ); w != NULL;
- w = strtok( NULL, WORD_BREAKS ) ) {
+ char *lasts;
+ for ( w = ldap_pvt_strtok( val[j], WORD_BREAKS, &lasts );
+ w != NULL;
+ w = ldap_pvt_strtok( NULL, WORD_BREAKS, &lasts ) ) {
key.dptr = w;
key.dsize = strlen( key.dptr ) + 1;
(void) ldbm_store( ldbm[i], key, data, LDBM_INSERT );
Datum olast, nlast;
Datum lastkey, key;
Datum data;
- int rc;
LDAPMod **mods;
char **avals, **dvals;
int amax, acur, dmax, dcur;
char **vals;
+#ifdef HAVE_BERKELEY_DB2
+ DBC *ocursorp;
+ DBC *ncursorp;
+#endif /* HAVE_BERKELEY_DB2 */
+
if ( verbose ) {
printf( "Generating mods for differential %s centroid...", attr );
fflush( stdout );
}
+ ldbm_datum_init( okey );
+ ldbm_datum_init( nkey );
+ ldbm_datum_init( olast );
+ ldbm_datum_init( nlast );
+ ldbm_datum_init( lastkey );
+ ldbm_datum_init( key );
+ ldbm_datum_init( data );
+
if ( (mods = (LDAPMod **) malloc( sizeof(LDAPMod *) * 4 )) == NULL ||
(mods[0] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL ||
(mods[1] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL ||
olast.dptr = NULL;
nlast.dptr = NULL;
+#ifdef HAVE_BERKELEY_DB2
+ for ( okey = ldbm_firstkey( oldbm, &ocursorp ),
+ nkey = ldbm_firstkey( nldbm, &ncursorp );
+ okey.dptr != NULL && nkey.dptr != NULL; )
+#else
for ( okey = ldbm_firstkey( oldbm ), nkey = ldbm_firstkey( nldbm );
okey.dptr != NULL && nkey.dptr != NULL; )
+#endif
{
- rc = strcmp( okey.dptr, nkey.dptr );
+ int rc = strcmp( okey.dptr, nkey.dptr );
if ( rc == 0 ) {
/* value is in both places - leave it */
}
nlast = nkey;
+#ifdef HAVE_BERKELEY_DB2
+ okey = ldbm_nextkey( oldbm, olast, ocursorp );
+ nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
okey = ldbm_nextkey( oldbm, olast );
nkey = ldbm_nextkey( nldbm, nlast );
+#endif
} else if ( rc > 0 ) {
/* new value is not in old centroid - add it */
if ( charray_add_dup( &avals, &acur, &amax, nkey.dptr ) == NULL ) {
ldbm_datum_free( nldbm, nlast );
}
nlast = nkey;
+
+#ifdef HAVE_BERKELEY_DB2
+ nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
nkey = ldbm_nextkey( nldbm, nlast );
+#endif
} else {
/* old value is not in new centroid - delete it */
if ( charray_add_dup( &dvals, &dcur, &dmax, okey.dptr ) == NULL ) {
ldbm_datum_free( oldbm, olast );
}
olast = okey;
+
+#ifdef HAVE_BERKELEY_DB2
+ okey = ldbm_nextkey( oldbm, olast, ocursorp );
+#else
okey = ldbm_nextkey( oldbm, olast );
+#endif
}
}
return( NULL );
}
+#ifdef HAVE_BERKELEY_DB2
+ okey = ldbm_nextkey( oldbm, olast, ocursorp );
+#else
okey = ldbm_nextkey( oldbm, olast );
+#endif
if ( olast.dptr != NULL ) {
ldbm_datum_free( oldbm, olast );
}
return( NULL );
}
+#ifdef HAVE_BERKELEY_DB2
+ nkey = ldbm_nextkey( nldbm, nlast, ncursorp );
+#else
nkey = ldbm_nextkey( nldbm, nlast );
+#endif
if ( nlast.dptr != NULL ) {
ldbm_datum_free( nldbm, nlast );
}
/* generate list of values to add */
lastkey.dptr = NULL;
+#ifdef HAVE_BERKELEY_DB2
+ for ( key = ldbm_firstkey( nldbm, &ncursorp ); key.dptr != NULL;
+ key = ldbm_nextkey( nldbm, lastkey, ncursorp ) )
+#else
for ( key = ldbm_firstkey( nldbm ); key.dptr != NULL;
- key = ldbm_nextkey( nldbm, lastkey ) ) {
+ key = ldbm_nextkey( nldbm, lastkey ) )
+#endif
+ {
/* see if it's in the old one */
data = ldbm_fetch( oldbm, key );
/* generate list of values to delete */
lastkey.dptr = NULL;
+#ifdef HAVE_BERKELEY_DB2
+ for ( key = ldbm_firstkey( oldbm, &ocursorp ); key.dptr != NULL;
+ key = ldbm_nextkey( oldbm, lastkey, ocursorp ) )
+#else
for ( key = ldbm_firstkey( oldbm ); key.dptr != NULL;
- key = ldbm_nextkey( oldbm, lastkey ) ) {
+ key = ldbm_nextkey( oldbm, lastkey ) )
+#endif
+ {
/* see if it's in the new one */
data = ldbm_fetch( nldbm, key );
char **vals;
int vcur, vmax;
+#ifdef HAVE_BERKELEY_DB2
+ DBC *cursorp;
+#endif
+
if ( verbose ) {
printf( "Generating mods for full %s centroid...", attr );
fflush( stdout );
}
+ ldbm_datum_init( key );
+ ldbm_datum_init( lastkey );
+
if ( (mods = (LDAPMod **) malloc( sizeof(LDAPMod *) * 3 )) == NULL ||
(mods[0] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL ||
(mods[1] = (LDAPMod *) malloc( sizeof(LDAPMod) )) == NULL ||
lastkey.dptr = NULL;
vals = NULL;
vcur = vmax = 0;
+#ifdef HAVE_BERKELEY_DB2
+ for ( key = ldbm_firstkey( ldbm, &cursorp ); key.dptr != NULL;
+ key = ldbm_nextkey( ldbm, lastkey, cursorp ) )
+#else
for ( key = ldbm_firstkey( ldbm ); key.dptr != NULL;
- key = ldbm_nextkey( ldbm, lastkey ) ) {
+ key = ldbm_nextkey( ldbm, lastkey ) )
+#endif
+ {
if ( charray_add_dup( &vals, &vcur, &vmax, key.dptr ) == NULL ) {
ldap_mods_free( mods, 1 );
return( NULL );
/* first, pick out the destination ldap server info */
if ( ldapbase != NULL ) {
free( ldapbase );
+ ldapbase = NULL;
}
- if ( strncmp( ldapdesturl, "ldap://", 7 ) == 0 ) {
- s = ldapdesturl + 7;
+ if ( strncmp( ldapdesturl, "ldap://", 7 ) != 0 ) {
+ fputs( "Not an LDAP URL", stderr ); /* Should be smarter? */
+ return( NULL );
}
+ s = ldapdesturl + 7;
if ( (s2 = strchr( s, '/' )) == NULL ) {
ldapbase = strdup( s );
} else {
free( ldapbase );
ldapbase = strdup( buf );
- if ( (ld = ldap_open( ldaphost, LDAP_PORT )) == NULL ) {
- perror( "ldap_open" );
+ if ( (ld = ldap_init( ldaphost, 0 )) == NULL ) {
+ perror( "ldap_init" );
return( NULL );
}
char *s
)
{
- int n;
-
if ( *a == NULL ) {
*a = (char **) malloc( (BUFSIZ + 1) * sizeof(char *) );
*cur = 0;