X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapadd.c;h=898f0347a1c1e14c37543ec0acaed3040aa3b944;hb=5747896ba081ff998fd97863de26d2f4af59bbd2;hp=2235c54dbf723064806c16049a4dcf7ddc9d4728;hpb=632d7186c06e667b38368c41f01a125bc87b78c3;p=openldap diff --git a/servers/slapd/slapadd.c b/servers/slapd/slapadd.c index 2235c54dbf..898f0347a1 100644 --- a/servers/slapd/slapadd.c +++ b/servers/slapd/slapadd.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * Portions Copyright 1998-2003 Kurt D. Zeilenga. * Portions Copyright 2003 IBM Corporation. * All rights reserved. @@ -44,11 +44,7 @@ static char maxcsnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ]; int slapadd( int argc, char **argv ) { - char *buf = NULL; - int lineno; - int lmax; - int rc = EXIT_SUCCESS; - + char *buf = NULL; const char *text; char textbuf[SLAP_TEXT_BUFLEN] = { '\0' }; size_t textlen = sizeof textbuf; @@ -56,19 +52,34 @@ slapadd( int argc, char **argv ) struct berval csn; struct berval maxcsn; - int match; + struct berval bvtext; Attribute *attr; Entry *ctxcsn_e; ID ctxcsn_id, id; + OperationBuffer opbuf; + Operation *op; + + int match; int ret; - struct berval bvtext; - int i, checkvals; - struct berval mc; + int checkvals; + int lineno, nextline; + int lmax; + int rc = EXIT_SUCCESS; + int manage = 0; + slap_tool_init( progname, SLAPADD, argc, argv ); + memset( &opbuf, 0, sizeof(opbuf) ); + op = (Operation *) &opbuf; + op->o_hdr = (Opheader *)(op+1); + if( !be->be_entry_open || !be->be_entry_close || - !be->be_entry_put ) + !be->be_entry_put || + (update_ctxcsn && + (!be->be_dn2id_get || + !be->be_id2entry_get || + !be->be_entry_modify)) ) { fprintf( stderr, "%s: database doesn't support necessary operations.\n", progname ); @@ -83,7 +94,7 @@ slapadd( int argc, char **argv ) checkvals = (slapMode & SLAP_TOOL_QUICK) ? 0 : 1; lmax = 0; - lineno = 0; + nextline = 0; if( !dryrun && be->be_entry_open( be, 1 ) != 0 ) { fprintf( stderr, "%s: could not open database.\n", @@ -96,8 +107,15 @@ slapadd( int argc, char **argv ) maxcsn.bv_len = 0; } - while( ldif_read_record( ldiffp, &lineno, &buf, &lmax ) ) { - Entry *e = str2entry2( buf, checkvals ); + /* nextline is the line number of the end of the current entry */ + for( lineno=1; ldif_read_record( ldiffp, &nextline, &buf, &lmax ); + lineno=nextline+1 ) { + Entry *e; + + if ( lineno < jumpline ) + continue; + + e = str2entry2( buf, checkvals ); /* * Initialize text buffer @@ -115,7 +133,8 @@ slapadd( int argc, char **argv ) } /* make sure the DN is not empty */ - if( !e->e_nname.bv_len ) { + if( BER_BVISEMPTY( &e->e_nname ) && + !BER_BVISEMPTY( be->be_nsuffix )) { fprintf( stderr, "%s: empty dn=\"%s\" (line=%d)\n", progname, e->e_dn, lineno ); rc = EXIT_FAILURE; @@ -144,9 +163,7 @@ slapadd( int argc, char **argv ) break; } - if( global_schemacheck ) { - Attribute *sc = attr_find( e->e_attrs, - slap_schema.si_ad_structuralObjectClass ); + { Attribute *oc = attr_find( e->e_attrs, slap_schema.si_ad_objectClass ); @@ -160,11 +177,12 @@ slapadd( int argc, char **argv ) break; } - if( sc == NULL ) { - struct berval vals[2]; + /* check schema */ + op->o_bd = be; - rc = structural_class( oc->a_vals, vals, - NULL, &text, textbuf, textlen ); + if ( (slapMode & SLAP_TOOL_NO_SCHEMA_CHECK) == 0) { + rc = entry_schema_check( op, e, NULL, manage, 1, + &text, textbuf, textlen ); if( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s: dn=\"%s\" (line=%d): (%d) %s\n", @@ -174,29 +192,10 @@ slapadd( int argc, char **argv ) if( continuemode ) continue; break; } - - vals[1].bv_len = 0; - vals[1].bv_val = NULL; - - attr_merge( e, slap_schema.si_ad_structuralObjectClass, - vals, NULL /* FIXME */ ); - } - - /* check schema */ - rc = entry_schema_check( be, e, NULL, &text, textbuf, textlen ); - - if( rc != LDAP_SUCCESS ) { - fprintf( stderr, "%s: dn=\"%s\" (line=%d): (%d) %s\n", - progname, e->e_dn, lineno, rc, text ); - rc = EXIT_FAILURE; - entry_free( e ); - if( continuemode ) continue; - break; } } if ( SLAP_LASTMOD(be) ) { - struct tm *ltm; time_t now = slap_get_time(); char uuidbuf[ LDAP_LUTIL_UUIDSTR_BUFSIZE ]; struct berval vals[ 2 ]; @@ -213,14 +212,13 @@ slapadd( int argc, char **argv ) nvals[1].bv_len = 0; nvals[1].bv_val = NULL; - ltm = gmtime(&now); - lutil_gentime( timebuf, sizeof(timebuf), ltm ); - csn.bv_len = lutil_csnstr( csnbuf, sizeof( csnbuf ), 0, 0 ); csn.bv_val = csnbuf; timestamp.bv_val = timebuf; - timestamp.bv_len = strlen(timebuf); + timestamp.bv_len = sizeof(timebuf); + + slap_timestamp( &now, ×tamp ); if ( BER_BVISEMPTY( &be->be_rootndn ) ) { BER_BVSTR( &name, SLAPD_ANONYMOUS ); @@ -235,8 +233,7 @@ slapadd( int argc, char **argv ) { vals[0].bv_len = lutil_uuidstr( uuidbuf, sizeof( uuidbuf ) ); vals[0].bv_val = uuidbuf; - attr_merge_normalize_one( e, - slap_schema.si_ad_entryUUID, vals, NULL ); + attr_merge_normalize_one( e, slap_schema.si_ad_entryUUID, vals, NULL ); } if( attr_find( e->e_attrs, slap_schema.si_ad_creatorsName ) @@ -305,19 +302,15 @@ slapadd( int argc, char **argv ) if( continuemode ) continue; break; } - } - - if ( verbose ) { - if ( dryrun ) { - fprintf( stderr, "added: \"%s\"\n", - e->e_dn ); - } else { + if ( verbose ) fprintf( stderr, "added: \"%s\" (%08lx)\n", e->e_dn, (long) id ); - } + } else { + if ( verbose ) + fprintf( stderr, "added: \"%s\"\n", + e->e_dn ); } -done:; entry_free( e ); }