openldap/servers/slapd/tools/slapadd.c

183 lines
3.8 KiB
C
Raw Normal View History

/* $OpenLDAP$ */
/*
2000-05-13 10:47:56 +08:00
* Copyright 1998-2000 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;
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;
}
/* make sure the DN is valid */
if( dn_normalize( e->e_ndn ) == NULL || e->e_ndn[0] == '\0' ) {
2000-09-16 14:23:53 +08:00
fprintf( stderr, "%s: invalid 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
/* make sure the DN is not empty */
if( e->e_ndn == '\0' ) {
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 */
if( select_backend( e->e_ndn, is_entry_referral(e), nosubs ) != be ) {
fprintf( stderr, "%s: database (%s) not configured to "
2000-09-16 14:23:53 +08:00
"hold dn=\"%s\" (line=%d)\n",
progname,
be ? be->be_suffix[0] : "<none>",
e->e_dn, lineno );
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 ) {
struct berval *vals[2];
struct berval scbv;
const char *text;
int ret = structural_class(
oc->a_vals, &scbv, &text );
if( scbv.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;
}
vals[0] = &scbv;
vals[1] = NULL;
attr_merge( e, slap_schema.si_ad_structuralObjectClass,
vals );
}
}
if( global_schemacheck ) {
/* check schema */
const char *text;
char textbuf[SLAP_TEXT_BUFLEN];
size_t textlen = sizeof textbuf;
rc = entry_schema_check( 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;
}