openldap/servers/slapd/tools/slapadd.c

179 lines
3.7 KiB
C
Raw Normal View History

/* $OpenLDAP$ */
/*
2002-01-05 05:17:25 +08:00
* Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
#include "portable.h"
#include <stdio.h>
#include <ac/stdlib.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>
#include <ac/unistd.h>
2001-12-09 10:34:45 +08:00
#include <lber.h>
#include <ldif.h>
#include "slapcommon.h"
int
main( int argc, char **argv )
{
char *buf;
int lineno;
int lmax;
int rc = EXIT_SUCCESS;
const char *text;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
slap_tool_init( "slapadd", SLAPADD, argc, argv );
2000-08-21 11:08:01 +08:00
if( !be->be_entry_open ||
!be->be_entry_close ||
!be->be_entry_put )
{
fprintf( stderr, "%s: database doesn't support necessary operations.\n",
progname );
exit( EXIT_FAILURE );
}
buf = NULL;
lmax = 0;
1999-08-22 11:32:13 +08:00
lineno = 0;
if( be->be_entry_open( be, 1 ) != 0 ) {
fprintf( stderr, "%s: could not open database.\n",
progname );
exit( EXIT_FAILURE );
}
while( ldif_read_record( ldiffp, &lineno, &buf, &lmax ) ) {
ID id;
Entry *e = str2entry( buf );
if( e == NULL ) {
fprintf( stderr, "%s: could not parse entry (line=%d)\n",
progname, lineno );
rc = EXIT_FAILURE;
if( continuemode ) continue;
break;
}
2000-09-16 14:23:53 +08:00
/* make sure the DN is not empty */
2001-12-25 03:21:42 +08:00
if( !e->e_nname.bv_len ) {
fprintf( stderr, "%s: empty dn=\"%s\" (line=%d)\n",
progname, e->e_dn, lineno );
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
}
2000-09-16 14:23:53 +08:00
/* check backend */
2001-12-27 10:03:57 +08:00
if( select_backend( &e->e_nname, is_entry_referral(e), nosubordinates )
!= be )
{
fprintf( stderr, "%s: line %d: "
"database (%s) not configured to hold \"%s\"\n",
progname, lineno,
2001-12-26 03:48:26 +08:00
be ? be->be_suffix[0]->bv_val : "<none>",
e->e_dn );
fprintf( stderr, "%s: line %d: "
"database (%s) not configured to hold \"%s\"\n",
progname, lineno,
be ? be->be_nsuffix[0]->bv_val : "<none>",
e->e_ndn );
2000-09-16 14:23:53 +08:00
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
}
{
Attribute *sc = attr_find( e->e_attrs,
slap_schema.si_ad_structuralObjectClass );
Attribute *oc = attr_find( e->e_attrs,
slap_schema.si_ad_objectClass );
if( oc == NULL ) {
fprintf( stderr, "%s: dn=\"%s\" (line=%d): %s\n",
progname, e->e_dn, lineno,
"no objectClass attribute");
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
}
if( sc == NULL ) {
2002-01-02 19:00:36 +08:00
struct berval vals[2];
2002-01-03 07:26:20 +08:00
int ret = structural_class( oc->a_vals, vals,
NULL, &text, textbuf, textlen );
2002-01-02 19:00:36 +08:00
if( vals[0].bv_len == 0 ) {
fprintf( stderr, "%s: dn=\"%s\" (line=%d): %s\n",
progname, e->e_dn, lineno, text );
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
}
2002-01-02 19:00:36 +08:00
vals[1].bv_val = NULL;
attr_merge( e, slap_schema.si_ad_structuralObjectClass,
vals );
}
}
if( global_schemacheck ) {
/* check schema */
rc = entry_schema_check( be, e, NULL, &text, textbuf, textlen );
if( rc != LDAP_SUCCESS ) {
2000-04-25 21:07:14 +08:00
fprintf( stderr, "%s: dn=\"%s\" (line=%d): %s\n",
progname, e->e_dn, lineno, text );
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
}
}
id = be->be_entry_put( be, e );
if( id == NOID ) {
fprintf( stderr, "%s: could not add entry dn=\"%s\" (line=%d)\n",
progname, e->e_dn, lineno );
rc = EXIT_FAILURE;
entry_free( e );
if( continuemode ) continue;
break;
2000-09-17 06:46:52 +08:00
}
if ( verbose ) {
1999-08-19 08:40:18 +08:00
fprintf( stderr, "added: \"%s\" (%08lx)\n",
e->e_dn, (long) id );
}
entry_free( e );
}
2000-05-28 01:06:11 +08:00
ch_free( buf );
be->be_entry_close( be );
if( be->be_sync ) {
be->be_sync( be );
}
slap_tool_destroy();
return rc;
}