#include "portable.h"
#include <stdio.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;
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 ||
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 */
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 ||
/* 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;