SLAPD_SQL_INCLUDES = @SLAPD_SQL_INCLUDES@
SLAPD_SQL_LIBS = @SLAPD_SQL_LIBS@
-QUIPU_LIBS = @QUIPU_LIBS@
-SLAPD_LIBS = @SLAPD_LIBS@ @SLAPD_PERL_LDFLAGS@ @SLAPD_SQL_LDFLAGS@ @SLAPD_SQL_LIBS@
+SLAPD_LIBS = @SLAPD_LIBS@ \
+ @SLAPD_PERL_LDFLAGS@ \
+ @SLAPD_SQL_LDFLAGS@ @SLAPD_SQL_LIBS@
SLURPD_LIBS = @SLURPD_LIBS@
# Our Defaults
OL_ARG_ENABLE(modules,[ --enable-modules enable dynamic module support], no)dnl
OL_ARG_ENABLE(multimaster,[ --enable-multimaster enable multimaster replication], no)dnl
OL_ARG_ENABLE(phonetic,[ --enable-phonetic enable phonetic/soundex], no)dnl
-OL_ARG_ENABLE(quipu,[ --enable-quipu build quipu migration tools], no)dnl
OL_ARG_ENABLE(rlookups,[ --enable-rlookups enable reverse lookups], auto)dnl
OL_ARG_ENABLE(aci,[ --enable-aci enable per-object ACIs], no)dnl
OL_ARG_ENABLE(wrappers,[ --enable-wrappers enable tcp wrapper support], no)dnl
if test $ol_enable_phonetic = yes ; then
AC_MSG_WARN([slapd disabled, ignoring --enable-phonetic argument])
fi
- if test $ol_enable_quipu = yes ; then
- AC_MSG_WARN([slapd disabled, ignoring --enable-quipu argument])
- fi
if test $ol_enable_rlookups = yes ; then
AC_MSG_WARN([slapd disabled, ignoring --enable-rlookups argument])
fi
ol_enable_modules=no
ol_enable_multimaster=no
ol_enable_phonetic=no
- ol_enable_quipu=no
ol_enable_rlookups=no
ol_enable_aci=no
ol_enable_wrappers=no
LTHREAD_LIBS=
LUTIL_LIBS=
-QUIPU_LIBS=
SLAPD_LIBS=
SLURPD_LIBS=
BUILD_SLAPD=no
BUILD_SLURPD=no
-BUILD_QUIPU=no
BUILD_THREAD=no
BUILD_DNSSRV=no
AC_MSG_ERROR([DNSSRV requires res_query()])
fi
-dnl ----------------------------------------------------------------
-dnl QUIPU
-if test $ol_enable_quipu != no ; then
- AC_CHECK_HEADERS(quipu/commonarg.h)
-
- if test $ac_cv_header_quipu_commonarg_h = yes ; then
- BUILD_QUIPU=yes
- elif test $ol_enable_quipu = auto ; then
- AC_MSG_WARN([no quipu for --enable-quipu=auto, disabling])
- else
- AC_MSG_ERROR(no quipu for --enable-quipu=$ol_enable_quipu)
- fi
-fi
-
dnl ----------------------------------------------------------------
dnl Kerberos
ol_link_kbind=no
AC_SUBST(BUILD_LDBM)
AC_SUBST(BUILD_PASSWD)
AC_SUBST(BUILD_PERL)
- AC_SUBST(BUILD_QUIPU)
AC_SUBST(BUILD_SHELL)
AC_SUBST(BUILD_SQL)
AC_SUBST(BUILD_TCL)
AC_SUBST(LDAP_LIBS)
AC_SUBST(LDIF_LIBS)
AC_SUBST(SLAPD_LIBS)
-AC_SUBST(QUIPU_LIBS)
AC_SUBST(SLURPD_LIBS)
AC_SUBST(LDBM_LIBS)
AC_SUBST(LTHREAD_LIBS)
#
#-----------------------------------------------------------------------------
BUILD_LDBM = @BUILD_LDBM@
-BUILD_QUIPU = @BUILD_QUIPU@
LDAP_INCDIR= ../../../include
LDAP_LIBDIR= ../../../libraries
XLDFLAGS = $(MODULES_LDFLAGS) $(SLAPD_MODULES)
XLIBS = -lavl -lldif -lldbm -llutil -lldap_r -llber
-XXLIBS = $(QUIPU_LIBS) $(SLAPD_LIBS) \
+XXLIBS = $(SLAPD_LIBS) \
$(LDBM_LIBS) $(SECURITY_LIBS) \
$(LDIF_LIBS) $(LUTIL_LIBS)
XXXLIBS = $(LTHREAD_LIBS) $(MODULES_LIBS)
PROGRAMS=ldif slappasswd slapadd slapcat slapindex
LDBMPROGRAMS=centipede sizecount
-QUIPUPROGRAMS=chlog2replog edb2ldif
# CPPFLAGS will include the defines for dynamic libs in Mingw32.
NT_DYN_DEFS = -DLBER_DECL=dllimport -DLDAP_DECL=dllimport
# LDBMSRCS = centipede.c sizecount.c
LDBMSRCS =
-QUIPUSRCS = edb2ldif.c ldapsyntax.c chlog2replog.c
SLAPD_OBJS = ../config.o ../ch_malloc.o ../backend.o ../charray.o \
../module.o ../aclparse.o ../filterentry.o \
../schema.o ../schema_check.o ../schema_init.o ../schema_prep.o \
EDB2LDIFSRCS = edb2ldif.c ldapsyntax.c
EDB2LDIFOBJS = edb2ldif.o ldapsyntax.o
-UNIX_PRGS = build-ldbm build-quipu
+UNIX_PRGS = build-ldbm
all-local: build-progs $(@PLAT@_PRGS)
ldbm-tools-yes ldbm-tools-mod: $(LDBMPROGRAMS)
-build-quipu: quipu-tools-$(BUILD_QUIPU)
-quipu-tools-no:
- @echo "run configure with --enable-quipu to build QUIPU tools"
-
-quipu-tools-yes quipu-tools-mod: $(QUIPUPROGRAMS)
-
#
# SLAP Tools
#
sizecount: sizecount.o ../phonetic.o ../ch_malloc.o $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ sizecount.o ../phonetic.o ../ch_malloc.o $(LIBS)
-#
-# QUIPU Specific Tools
-#
-edb2ldif: edb2-vers.o
- $(CC) $(LDFLAGS) -o $@ $(EDB2LDIFOBJS) edb2-vers.o $(LIBS)
-
-edb2-vers.c: $(EDB2LDIFOBJS)
- @-$(RM) $@
- $(MKVERSION) ebd2ldif > $@
-
-chlog2replog: chlog2replog.o ../lock.o ../ch_malloc.o $(SLAPD_LIBDEPEND)
- $(LTLINK) -o $@ chlog2replog.o ../lock.o ../ch_malloc.o $(LIBS)
-
clean-local: FORCE
- $(RM) $(PROGRAMS) $(LDBMPROGRAMS) $(QUIPUPROGRAMS) \
+ $(RM) $(PROGRAMS) $(LDBMPROGRAMS) \
$(XPROGRAMS) $(XSRCS) *.o core .libs/* *.exe
depend-local: FORCE
- DEPEND_LDBM= ; DEPEND_QUIPU= ; \
+ DEPEND_LDBM= ; \
if [ "$(BUILD_LDBM)" != "no" ]; then \
DEPEND_LDBM="$(LDBMSRCS)"; \
fi; \
- if [ "$(BUILD_QUIPU)" != "no" ]; then \
- DEPEND_QUIPU="$(QUIPUINCLUDEFLAG) $(QUIPUSRCS)"; \
- fi; \
- $(MKDEP) $(DEFS) $(DEFINES) $(SRCS) $$DEPEND_QUIPU $$DEPEND_LDBM
+ $(MKDEP) $(DEFS) $(DEFINES) $(SRCS) $$DEPEND_LDBM
-install-local: install-ldbm-$(BUILD_LDBM) \
- install-quipu-$(BUILD_QUIPU)
+install-local: install-ldbm-$(BUILD_LDBM)
-install-ldbm-no install-quipu-no:
+install-ldbm-no:
install-ldbm-yes install-ldbm-mod: FORCE
-$(MKDIR) $(DESTDIR)$(sbindir)
$(LTINSTALL) $(INSTALLFLAGS) -s -m 755 \
$$bin$(EXEEXT) $(DESTDIR)$(sbindir); \
done
-
-install-quipu-yes: FORCE
- @-$(MKDIR) $(DESTDIR)$(sbindir)
- for bin in edb2ldif chlog2replog; do \
- $(LTINSTALL) $(INSTALLFLAGS) -s -m 755 \
- $$bin $(DESTDIR)$(sbindir); \
- done
+++ /dev/null
-/* $OpenLDAP$ */
-/*
- * Copyright (c) 1990, 1995 Regents of the University of Michigan.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of Michigan at Ann Arbor. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
-/*
- * chlog2replog - read a quipu-style changelog on stdin and write a
- * slapd-style replog on stdout, or write to a file, respecting
- * slapd/slurpd locking conventions.
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-#include <ac/stdlib.h>
-
-#include <ac/ctype.h>
-#include <ac/string.h>
-#include <ac/unistd.h>
-
-#include <quipu/commonarg.h>
-#include <quipu/attrvalue.h>
-
-#include "ldif.h"
-
-static int dn2ldif(PS ps, DN dn);
-static void de_t61(char *s, int t61mark);
-
-extern FILE *lock_fopen( char *, char *, FILE ** );
-extern int lock_fclose( FILE *, FILE * );
-extern void *ch_realloc( void *, unsigned long );
-
-short ldap_dn_syntax;
-PS rps;
-char *progname;
-int ldap_syslog = 0;
-int ldap_syslog_level = 0;
-
-
-#define ST_START 0
-#define ST_DN 2
-#define ST_TYPE 3
-#define ST_ARGS 4
-#define ST_NL1 5
-#define ST_PUNT 6
-#define ST_BAD 7
-#define ST_CONCAT 8
-
-#define TY_MODIFYTYPE 1
-#define TY_ADD 2
-#define TY_REMOVE 3
-#define TY_NEWRDN 4
-#define TY_PUNT 5
-#define TY_MODIFYARGS 6
-
-#define MOD_ADDVALUES 1
-#define MOD_ADDATTRIBUTE 2
-#define MOD_REMOVEATTRIBUTE 3
-#define MOD_REMOVEVALUES 4
-
-
-char *
-dn2ldap( char *edbdn )
-{
- DN dn;
- PS str_ps;
- char *ldapdn;
- int len;
- static int inited = 0;
-
- if ( !inited ) {
- /* load & initialize quipu syntax handlers */
- quipu_syntaxes();
-
-#ifdef LDAP_USE_PP
- pp_quipu_init( progname );
-#endif
-
- dsap_init( NULL, NULL );
-
- if (( ldap_dn_syntax = str2syntax( "DN" )) == 0 ) {
- return( NULL );
- }
- inited = 1;
- }
-
- if (( dn = str2dn( edbdn )) == NULLDN ) {
- return( NULL );
- }
-
- if (( str_ps = ps_alloc( str_open )) == NULLPS ||
- str_setup( str_ps, NULLCP, 0, 0 ) == NOTOK ) {
- dn_free( dn );
- return( NULL );
- }
-
- if ( dn2ldif( str_ps, dn ) != 0 ) {
- ps_free( str_ps );
- dn_free( dn );
- return( NULL );
- }
-
- dn_free( dn );
- len = ( str_ps->ps_ptr - str_ps->ps_base );
-
- if (( ldapdn = malloc( len + 1 )) == NULL ) {
- ps_free( str_ps );
- return( NULL );
- }
-
- memcpy( ldapdn, str_ps->ps_base, len );
- ldapdn[ len ] = '\0';
- ps_free( str_ps );
- return( ldapdn );
-}
-
-
-#define SEPARATOR(c) ((c) == ',' || (c) == ';')
-#define SPACE(c) ((c) == ' ' || (c) == '\n')
-
-static int
-dn2ldif( PS ps, DN dn )
-{
- RDN rdn;
- int firstrdn, rc;
- char *value;
- PS rps;
-
- if ( dn == NULLDN ) {
- return( 0 );
- }
-
- if ( dn->dn_parent != NULLDN ) {
- if (( rc = dn2ldif( ps, dn->dn_parent )) != 0 ) {
- return( rc );
- }
- ps_print( ps, ", " );
- }
-
- if ( (rps = ps_alloc( str_open )) == NULLPS ||
- str_setup( rps, NULLCP, 0, 0 ) == NOTOK ) {
- return( -1 );
- }
-
- firstrdn = 1;
- for ( rdn = dn->dn_rdn; rdn != NULLRDN; rdn = rdn->rdn_next ) {
- if ( firstrdn ) {
- firstrdn = 0;
- } else {
- ps_print( ps, " + " );
- }
-
- AttrT_print( ps, rdn->rdn_at, EDBOUT );
- ps_print( ps, "=" );
-
- if ( rdn->rdn_at->oa_syntax == ldap_dn_syntax ) {
- if (( rc = dn2ldif( rps, (DN) rdn->rdn_av.av_struct )) != 0 ) {
- return( rc );
- }
- *rps->ps_ptr = '\0';
- value = rps->ps_base;
- } else {
- AttrV_print( rps, &rdn->rdn_av, EDBOUT );
- *rps->ps_ptr = '\0';
- value = rps->ps_base;
- de_t61( value, 0 );
- }
-
- /*
- * ,+="\\\n all go in quotes. " and \\ need to
- * be preceeded by \\.
- */
-
- if ( strpbrk( value, ",+=\"\\\n" ) != NULL || SPACE( value[0] )
- || SPACE( value[max( strlen(value) - 1, 0 )] ) ) {
- char *p, *t, *tmp;
- int specialcount;
-
- ps_print( ps, "\"" );
-
- specialcount = 0;
- for ( p = value; *p != '\0'; p++ ) {
- if ( *p == '"' || *p == '\\' ) {
- specialcount++;
- }
- }
- if ( specialcount > 0 ) {
- tmp = smalloc( strlen( value ) + specialcount + 1 );
- for ( p = value, t = tmp; *p != '\0'; p++ ) {
- switch ( *p ) {
- case '"':
- case '\\':
- *t++ = '\\';
- /* FALL THROUGH */
- default:
- *t++ = *p;
- }
- }
- *t = '\0';
- ps_print( ps, tmp );
- free( tmp );
- } else {
- ps_print( ps, value );
- }
-
- ps_print( ps, "\"" );
- } else {
- ps_print( ps, value );
- }
-
- rps->ps_ptr = rps->ps_base;
- }
-
- ps_free( rps );
-
- return( 0 );
-}
-
-#define T61 "{T.61}"
-#define T61LEN 6
-
-
-
-static void
-de_t61(char *s, int t61mark)
-{
- char *next = s;
- unsigned char c;
- unsigned int hex;
-
- while ( *s ) {
- switch ( *s ) {
- case '{' :
- if ( strncasecmp( s, T61, T61LEN) == 0 ) {
- s += T61LEN;
- if ( t61mark )
- *next++ = '@';
- } else {
- *next++ = *s++;
- }
- break;
-
- case '\\':
- c = *(s + 1);
- if ( c == '\n' ) {
- s += 2;
- if ( *s == '\t' )
- s++;
- break;
- }
- if ( isdigit( c ) )
- hex = c - '0';
- else if ( c >= 'A' && c <= 'F' )
- hex = c - 'A' + 10;
- else if ( c >= 'a' && c <= 'f' )
- hex = c - 'a' + 10;
- else {
- *next++ = *s++;
- break;
- }
- hex <<= 4;
- c = *(s + 2);
- if ( isdigit( c ) )
- hex += c - '0';
- else if ( c >= 'A' && c <= 'F' )
- hex += c - 'A' + 10;
- else if ( c >= 'a' && c <= 'f' )
- hex += c - 'a' + 10;
- else {
- *next++ = *s++;
- *next++ = *s++;
- break;
- }
-
- *next++ = hex;
- s += 3;
- break;
-
- default:
- *next++ = *s++;
- break;
- }
- }
- *next = '\0';
-}
-
-
-
-
-char *
-getattr(char *buf, char sep)
-{
- char *val;
-#define RBSIZE 255
- static char retbuf[ RBSIZE ];
-
- if (( val = strchr( buf, sep )) != NULL ) {
- strncpy( retbuf, buf, val - buf );
- retbuf[ val - buf ] = '\0';
- } else {
- retbuf[ 0 ] = '\0';
- }
- return( retbuf );
-}
-
-
-char *
-getattr_ldif(char *buf)
-{
- return( getattr( buf, ':' ));
-}
-
-
-char *
-getattr_edb(char *buf)
-{
- return( getattr( buf, '=' ));
-}
-
-char *
-getval(char *buf, char sep)
-{
- char *val;
-
- if (( val = strchr( buf, sep )) != NULL ) {
- return( strdup( ++val ));
- } else {
- return( NULL );
- }
-}
-
-char *
-getval_ldif(char *buf)
-{
- return( getval( buf, ':' ));
-}
-
-
-char *
-getval_edb(char *buf)
-{
- return( getval( buf, '=' ));
-}
-
-
-
-
-int
-isDNsyntax(char *attr)
-{
- oid_table_attr *p, *name2attr(char *);
-
- p = name2attr( attr );
- if ( p == ( oid_table_attr * ) 0 ) {
- return( -1 );
- }
- if ( p->oa_syntax == ldap_dn_syntax ) {
- return( 1 );
- } else {
- return( 0 );
- }
-}
-
-
-
-void
-print_as(Attr_Sequence as, int modtype, FILE *ofp)
-{
- Attr_Sequence p;
- AV_Sequence av;
- char *attrname, *tmpdn, *obuf;
-
- p = as;
- for ( p = as; p != NULLATTR; p = p->attr_link) {
- rps->ps_ptr = rps->ps_base;
- AttrT_print( rps, p->attr_type, EDBOUT );
- *rps->ps_ptr = '\0';
- attrname = strdup( rps->ps_base );
- if ( modtype != 0 ) {
- switch ( modtype ) {
- case MOD_ADDVALUES:
- case MOD_ADDATTRIBUTE:
- fprintf( ofp, "add: %s\n", attrname );
- break;
- case MOD_REMOVEATTRIBUTE:
- case MOD_REMOVEVALUES:
- fprintf( ofp, "delete: %s\n", attrname );
- break;
- default:
- break;
- }
- }
- for ( av = p->attr_value; av != NULLAV; av = av->avseq_next ) {
- rps->ps_ptr = rps->ps_base;
- AttrV_print( rps, &av->avseq_av, EDBOUT );
- *rps->ps_ptr = '\0';
- de_t61( rps->ps_base, 0 );
- if ( isDNsyntax( attrname )) {
- tmpdn = dn2ldap( rps->ps_base );
- obuf = ldif_type_and_value( attrname, tmpdn,
- strlen( tmpdn ));
- free( tmpdn );
- } else {
- obuf = ldif_type_and_value( attrname, rps->ps_base,
- strlen( rps->ps_base ));
- }
- if ( obuf != NULL ) {
- fputs( obuf, ofp );
- ber_memfree( obuf );
- }
- }
- if ( modtype != 0 ) {
- fprintf( ofp, "-\n" );
- }
- free( attrname );
- }
-}
-
-
-
-void
-usage( char *name )
-{
- fprintf( stderr, "usage: %s -d dn-suffix -r replica:port ", name );
- fprintf( stderr, "[-r replica:port...] [-o outputfile]\n" );
-}
-
-
-
-main( int argc, char **argv )
-{
- char *ldapdn, nbuf[ 4096 ], *buf, *p;
- int state, prevstate, modstate, modtype, i;
- int buflen, nbuflen;
- Attr_Sequence as;
- PS std_ps;
- int arg;
- char *ofile = NULL;
- FILE *ofp, *lfp;
-
- extern char *optarg;
- char **replicas = NULL;
- int nreplicas = 0;
- char *dn_suffix = NULL;
-
- if (( progname = strrchr( argv[ 0 ], '/' )) == NULL ) {
- progname = argv[ 0 ];
- } else {
- ++progname;
- }
-
- while (( arg = getopt( argc, argv, "o:r:d:" )) != EOF ) {
- switch( arg ) {
- case 'o':
- ofile = optarg;
- break;
- case 'r':
- replicas = (char **) ch_realloc( (char *) replicas, (unsigned long)
- ( nreplicas + 2 ) * sizeof( char * ));
- replicas[ nreplicas ] = optarg;
- replicas[ nreplicas + 1 ] = NULL;
- nreplicas++;
- break;
- case 'd':
- dn_suffix = optarg;
- break;
- default:
- usage( progname );
- exit( EXIT_FAILURE );
- }
- }
-
- if (( dn_suffix == NULL ) || ( nreplicas == 0 )) {
- usage( progname );
- exit( EXIT_FAILURE );
- }
-
- if ( ofile == NULL ) {
- /* Just write to stdout */
- ofp = stdout;
- }
-
-
- state = prevstate = ST_START;
- buf = NULL;
- as = NULL;
- if (( std_ps = ps_alloc( std_open )) == NULLPS ||
- std_setup( std_ps, ofp ) != OK ) {
- fprintf( stderr, "std_ps setup failed - help!\n" );
- exit( EXIT_FAILURE );
- }
- if (( rps = ps_alloc( str_open )) == NULLPS ||
- str_setup( rps, NULLCP, 0, 0 ) != OK ) {
- fprintf( stderr, "rps setup failed - help!\n" );
- exit( EXIT_FAILURE );
- }
-
-
- while ( gets( nbuf ) != NULL ) {
- if ( nbuf[ 0 ] == '\0' ) {
- if ( state == ST_NL1 ) {
- if ( prevstate == ST_ARGS ) {
- /* We've got an attribute sequence to print */
- if ( modtype == TY_ADD ) {
- print_as( as, 0, ofp );
- } else {
- print_as( as, modstate, ofp );
- }
- /* as_print( std_ps, as, EDBOUT ); */
- as_free( as );
- as = NULL;
- }
- state = ST_START;
- fprintf( ofp, "\n" );
- fflush( ofp );
- /* If writing to a file, release the lock */
- if ( ofile != NULL ) {
- lock_fclose( ofp, lfp );
- }
- } else {
- prevstate = state;
- state = ST_NL1;
- }
- continue;
- }
-
- /* See if we've got a line continuation to deal with */
- nbuflen = strlen( nbuf );
- if ( state == ST_CONCAT ) {
- for ( p = nbuf; isspace( (unsigned char) *p ); p++, nbuflen-- )
- ; /* skip space */
- buf = realloc( buf, buflen + nbuflen + 1 );
- strcat( buf, p );
- buflen += ( nbuflen );
- } else {
- if ( buf != NULL ) {
- free( buf );
- }
- buf = strdup( nbuf );
- buflen = nbuflen;
- }
- if ( buf[ buflen - 1 ] == '\\' ) {
- if ( state != ST_CONCAT ) {
- prevstate = state;
- }
- state = ST_CONCAT;
- buf[ buflen - 1 ] = '\0';
- buflen--;
- continue;
- } else if ( state == ST_CONCAT ) {
- state = prevstate;
- }
-
- if ( state == ST_PUNT ) {
- continue;
- }
-
- if ( state == ST_START ) {
- /*
- * Acquire the file lock if writing to a file.
- */
- if ( ofile != NULL ) {
- if (( ofp = lock_fopen( ofile, "a", &lfp )) == NULL ) {
- perror( "open" );
- exit( EXIT_FAILURE );
- }
- }
- /*
- * If we have a changelog entry, then go ahead
- * and write the replica: lines for the replog entry.
- */
- for ( i = 0; replicas[ i ] != NULL; i++ ) {
- fprintf( ofp, "replica: %s\n", replicas[ i ] );
- }
- fprintf( ofp, "time: %ld\n", time( NULL ));
- state = ST_DN;
- continue;
- }
-
- if ( state == ST_DN ) {
- /* Second line - dn (quipu-style) of entry to be modified */
- if (( ldapdn = dn2ldap( buf )) == NULL ) {
- fprintf( ofp, "dn: (conversion failed)\n" );
- } else {
- fprintf( ofp, "dn: %s%s\n", ldapdn, dn_suffix );
- free( ldapdn );
- }
- state = ST_TYPE;
- continue;
- }
-
- if ( state == ST_TYPE ) {
- state = ST_ARGS;
- modstate = 0;
- if ( !strcmp( buf, "modify" )) {
- modtype = TY_MODIFYTYPE;
- fprintf( ofp, "changetype: modify\n" );
- } else if ( !strcmp( buf, "add" )) {
- modtype = TY_ADD;
- fprintf( ofp, "changetype: add\n" );
- as = NULL;
- } else if ( !strcmp( buf, "remove" )) {
- modtype = TY_REMOVE;
- fprintf( ofp, "changetype: delete\n" );
- } else if ( !strcmp( buf, "newrdn" )) {
- modtype = TY_NEWRDN;
- fprintf( ofp, "changetype: modrdn\n" );
- } else {
- modtype = TY_PUNT;
- state = ST_BAD;
- }
- continue;
- }
-
- if ( state == ST_ARGS ) {
- switch ( modtype ) {
- case TY_NEWRDN:
- fprintf( ofp, "newrdn: %s\n", buf );
- break;
- case TY_REMOVE: /* No additional args */
- break;
- case TY_ADD:
- as = as_combine( as, buf, 0 );
- break;
- case TY_MODIFYTYPE:
- case TY_MODIFYARGS:
- if ( buf[ 0 ] == '\0' ) {
- state == ST_NL1;
- if ( as != NULL ) {
- print_as( as, modstate, ofp);
- as_free( as );
- as = NULL;
- }
- continue;
- }
- if (!strcmp( buf, "addvalues" )) {
- if ( as != NULL ) {
- print_as( as, modstate, ofp );
- as_free( as );
- as = NULL;
- }
- modstate = MOD_ADDVALUES;
- continue;
- } else if (!strcmp( buf, "removevalues" )) {
- if ( as != NULL ) {
- print_as( as, modstate, ofp );
- as_free( as );
- as = NULL;
- }
- modstate = MOD_REMOVEVALUES;
- continue;
- } else if (!strcmp( buf, "addattribute" )) {
- if ( as != NULL ) {
- print_as( as, modstate, ofp );
- as_free( as );
- as = NULL;
- }
- modstate = MOD_ADDATTRIBUTE;
- continue;
- } else if (!strcmp( buf, "removeattribute" )) {
- if ( as != NULL ) {
- print_as( as, modstate, ofp );
- as_free( as );
- as = NULL;
- }
- modstate = MOD_REMOVEATTRIBUTE;
- continue;
- }
- switch ( modstate ) {
- case MOD_ADDVALUES:
- as = as_combine( as, buf, 0 );
- break;
- case MOD_REMOVEVALUES:
- as = as_combine( as, buf, 0 );
- break;
- case MOD_ADDATTRIBUTE:
- as = as_combine( as, buf, 0 );
- break;
- case MOD_REMOVEATTRIBUTE:
- fprintf( ofp, "delete: %s\n-\n", buf);
- break;
- }
- }
- continue;
- }
- }
-
- if ( ofile != NULL ) {
- lock_fclose( ofp, lfp );
- sprintf( nbuf, "%s.lock", ofile );
- (void) unlink( nbuf );
- }
- exit( EXIT_SUCCESS );
-}
+++ /dev/null
-/* $OpenLDAP$ */
-/*
- * Copyright (c) 1995 Regents of the University of Michigan.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of Michigan at Ann Arbor. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/stdlib.h>
-
-#include <ac/ctype.h>
-#include <ac/errno.h>
-#include <ac/dirent.h>
-#include <ac/string.h>
-#include <ac/unistd.h>
-
-#include <sys/stat.h>
-
-#include <quipu/config.h>
-#include <quipu/entry.h>
-#include <quipu/commonarg.h>
-#include <quipu/attrvalue.h>
-
-#if ICRELEASE > 1
-#define HAVE_FILE_ATTR_DIR
-#endif
-
-#ifdef TURBO_DISK
-#define HAVE_PARSE_ENTRY
-#endif
-
-#define DEF_EDBFILENAME "EDB"
-#define EDB_ROOT_FILENAME "EDB.root"
-#define DEF_BASEDN ""
-#define EDBMAP_FILENAME "EDB.map"
-#define ADDVALS_FILENAME ".add"
-
-#define MAX_LINE_SIZE 2048
-
-#define VERBOSE_ENTRY_REPORT_THRESHOLD 250
-
-
-/* data structures */
-struct edbmap {
- char *edbm_filename;
- char *edbm_rdn;
- struct edbmap *edbm_next;
-};
-
-/* prototypes */
-static int edb2ldif( FILE *outfp, char *edbfile, char *basedn, int recurse );
-static int convert_entry( FILE *fp, char *edbname, FILE *outfp,
- char *basedn, char *loc_addvals, int loc_addlen, char *linebuf );
-static int add_rdn_values (Attr_Sequence entryas, RDN rdn);
-static int read_edbmap( char *mapfile, struct edbmap **edbmapp );
-static char *file2rdn( struct edbmap *edbmap, char *filename );
-static void free_edbmap( struct edbmap *edbmap );
-static char *read_file( char *filename, int *lenp );
-static void print_err( char *msg );
-
-
-/* globals */
-#ifdef LDAP_DEBUG
-static int debugflg;
-#endif
-static int verboseflg;
-static int override_add = 0;
-static int entrycount;
-static char **ignore_attr = NULL;
-static char *always_addvals = NULL;
-static int always_addlen;
-static char *last_dn;
-static char *edb_home = ".";
-char *progname;
-int ldap_syslog = 0;
-int ldap_syslog_level = 0;
-
-
-int
-main( int argc, char **argv )
-{
- char *usage = "usage: %s [-d] [-o] [-r] [-v] [-b basedn] [-a addvalsfile] [-f fileattrdir] [-i ignoreattr...] [edbfile...]\n";
- char edbfile[ MAXNAMLEN ], *basedn;
- int c, rc, errflg, ignore_count, recurse;
- extern char dsa_mode;
-#ifdef HAVE_FILE_ATTR_DIR
- extern char *file_attr_directory;
-#endif
-
- if (( progname = strrchr( argv[ 0 ], '/' )) == NULL ) {
- progname = argv[ 0 ];
- } else {
- ++progname;
- }
-
- errflg = recurse = 0;
-#ifdef LDAP_DEBUG
- debugflg = 0;
-#endif
- ignore_count = 0;
- always_addvals = NULL;
- basedn = NULL;
-
- while (( c = getopt( argc, argv, "dorva:b:f:h:i:" )) != EOF ) {
- switch( c ) {
- case 'd':
-#ifdef LDAP_DEBUG
- ++debugflg;
-#else
- fprintf( stderr, "Ignoring -d: compile with -DLDAP_DEBUG to enable this option.\n" );
-#endif
- break;
-
- case 'o':
- ++override_add;
- break;
-
- case 'r':
- ++recurse;
- break;
-
- case 'v':
- ++verboseflg;
- break;
-
- case 'a':
- if ( always_addvals != NULL ) {
- ++errflg;
- } else if (( always_addvals = read_file( optarg, &always_addlen ))
- == NULL ) {
- print_err( optarg );
- exit( EXIT_FAILURE );
- }
- break;
-
- case 'b':
- if ( basedn != NULL ) {
- ++errflg;
- } else {
- basedn = optarg;
- }
- break;
-
- case 'f':
-#ifdef HAVE_FILE_ATTR_DIR
- /* add trailing slash to directory name if missing */
- if ( *( optarg + strlen( optarg ) - 1 ) == '/' ) {
- file_attr_directory = strdup( optarg );
- } else if (( file_attr_directory = (char *)malloc( strlen( optarg )
- + 2 )) != NULL ) {
- sprintf( file_attr_directory, "%s/", optarg );
-
- }
- if ( file_attr_directory == NULL ) {
- print_err( "malloc" );
- exit( EXIT_FAILURE );
- }
-#else /* HAVE_FILE_ATTR_DIR */
- fprintf( stderr, "Ignoring -f: this option requires a newer version of ISODE.\n" );
-#endif /* HAVE_FILE_ATTR_DIR */
- break;
-
- case 'h':
- edb_home = optarg;
- break;
-
- case 'i':
- if ( ignore_count == 0 ) {
- ignore_attr = (char **)malloc( 2 * sizeof( char * ));
- } else {
- ignore_attr = (char **)realloc( ignore_attr,
- ( ignore_count + 2 ) * sizeof( char * ));
- }
- if ( ignore_attr == NULL ) {
- print_err( "malloc/realloc" );
- exit( EXIT_FAILURE );
- }
- ignore_attr[ ignore_count ] = optarg;
- ignore_attr[ ++ignore_count ] = NULL;
- break;
-
- default:
- ++errflg;
- }
- }
-
- if ( errflg ) {
- fprintf( stderr, usage, progname );
- exit( EXIT_FAILURE );
- }
-
- if ( basedn == NULL ) {
- basedn = DEF_BASEDN;
- }
-
- /* load & initialize quipu syntax handlers */
- quipu_syntaxes();
-#ifdef LDAP_USE_PP
- pp_quipu_init( progname );
-#endif
- dsap_init( NULL, NULL );
-
- dsa_mode = 1; /* so {CRYPT} is accepted by EDB parse routines */
-
- if ( init_syntaxes() < 0 ) {
- fprintf( stderr, "%s: init_syntaxes failed -- check your oid tables \n",
- progname );
- exit( EXIT_FAILURE );
- }
-
-
- entrycount = 0;
-
- /* process EDB file(s) */
- if ( optind >= argc ) {
- *edbfile = '\0';
- rc = edb2ldif( stdout, edbfile, basedn, recurse );
- } else {
- for ( rc = 0; rc >= 0 && optind < argc; ++optind ) {
- if ( argv[ optind ][ 0 ] == '/' ) {
- strcpy( edbfile, argv[ optind ] );
- } else {
- sprintf( edbfile, "%s/%s", edb_home, argv[ optind ] );
- }
- rc = edb2ldif( stdout, edbfile, basedn, recurse );
- }
- }
-
- if ( last_dn != NULL ) {
- free( last_dn );
- }
-
-#ifdef LDAP_DEBUG
- fprintf( stderr, "edb2ldif: exit( %d )\n", ( rc < 0 ) ? 1 : 0 );
-#endif
-
- exit( ( rc < 0 ) ? EXIT_FAILURE : EXIT_SUCCESS );
-}
-
-
-static int
-edb2ldif( FILE *outfp, char *edbfile, char *basedn, int recurse )
-{
- FILE *fp;
- char *addvals, *p, *rdn, line[ MAX_LINE_SIZE + 1 ];
- char dirname[ MAXNAMLEN ], filename[ MAXNAMLEN ];
- int err, startcount, addvals_len;
- struct stat st;
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif( 0x%X, \"%s\", \"%s\", %d)\n",
- outfp, edbfile, basedn, recurse );
- }
-#endif
-
- if ( *edbfile == '\0' ) {
- sprintf( filename, "%s/%s", edb_home, EDB_ROOT_FILENAME );
- if ( stat( filename, &st ) == 0 ) {
- if (( err = edb2ldif( outfp, filename, basedn, 0 )) < 0 ) {
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 0 return( %d )\n", err );
- }
-#endif
- return( err );
- }
- if (( basedn = strdup( last_dn )) == NULL ) {
- print_err( "strdup" );
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 1 return( -1 )\n" );
- }
-#endif
- return( -1 );
- }
- }
- sprintf( edbfile, "%s/%s", edb_home, DEF_EDBFILENAME );
- }
-
- if ( verboseflg ) {
- fprintf( stderr, "%s: converting EDB file: \"%s\"\n\tbasedn: \"%s\"\n",
- progname, edbfile, basedn );
- }
-
- startcount = entrycount;
- err = 0;
-
-
- /* construct name of directory we are working in */
- if (( p = strrchr( edbfile, '/' )) == NULL ) {
- dirname[ 0 ] = '.';
- dirname[ 1 ] = '\0';
- } else {
- strncpy( dirname, edbfile, p - edbfile );
- dirname[ p - edbfile ] = '\0';
- }
-
- /* load local ".add" file (if any) */
- sprintf( filename, "%s/%s", dirname, ADDVALS_FILENAME );
- addvals_len = 0;
- addvals = read_file( filename, &addvals_len );
-
- /* read and convert this EDB file */
- if (( fp = fopen( edbfile, "r" )) == NULL ) {
- print_err( edbfile );
- if ( addvals != NULL ) {
- free( addvals );
- }
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 2 return( -1 )\n" );
- }
-#endif
- return( -1 );
- }
-
- /* skip first two lines (type and timestamp) if they are present */
- if ( fgets( line, MAX_LINE_SIZE, fp ) == NULL ) {
- err = -1;
- } else {
- line[ strlen( line ) - 1 ] = '\0';
- if ( strcmp( line, "MASTER" ) == 0 || strcmp( line, "SLAVE" ) == 0 ||
- strcmp( line, "CACHE" ) == 0 ) {
- if ( fgets( line, MAX_LINE_SIZE, fp ) == NULL ) {
- err = -1;
- }
- } else {
- rewind( fp );
- }
- }
-
- if ( err != 0 ) {
- fprintf( stderr, "%s: skipping empty EDB file %s\n", progname,
- edbfile );
- err = 0; /* treat as a non-fatal error */
- } else {
- while ( !feof( fp ) && ( err = convert_entry( fp, edbfile, outfp,
- basedn, addvals, addvals_len, line )) > 0 ) {
- if ( verboseflg && (( entrycount - startcount ) %
- VERBOSE_ENTRY_REPORT_THRESHOLD ) == 0 ) {
- fprintf( stderr, "\tworking... %d entries done...\n",
- entrycount - startcount );
- }
- }
- }
-
- fclose( fp );
- if ( addvals != NULL ) {
- free( addvals );
- }
-
- if ( err < 0 ) {
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 3 return( %d )\n", err );
- }
-#endif
- return( err );
- }
-
- if ( verboseflg ) {
- fprintf( stderr, "\t%d entries converted\n\n",
- entrycount - startcount );
- }
-
- /* optionally convert EDB file within sub-directories */
- if ( recurse ) {
- char *newbase;
- DIR *dp;
- struct dirent *dep;
- struct edbmap *edbmap;
-
- /* open this directory */
- if (( dp = opendir( dirname )) == NULL ) {
- print_err( dirname );
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 4 return( -1 )\n" );
- }
-#endif
- return( -1 );
- }
-
- /* check for EDB.map file and record contents for future reference */
- sprintf( filename, "%s/%s", dirname, EDBMAP_FILENAME );
- if ( read_edbmap( filename, &edbmap ) < 0 ) {
- print_err( "read_edbmap" );
- closedir( dp );
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 5 return( -1 )\n" );
- }
-#endif
- return( -1 );
- }
-
- p = dirname + strlen( dirname );
- *p++ = '/';
- *p = '\0';
-
- /* scan looking for sub-directories w/EDB files in them */
- err = 0;
- while ( err >= 0 && ( dep = readdir( dp )) != NULL ) {
- if ( dep->d_name[ 0 ] == '.' && ( dep->d_name[ 1 ] == '\0' ||
- ( dep->d_name[ 1 ] == '.' && dep->d_name[ 2 ] == '\0' ))) {
- continue; /* skip "." and ".." */
- }
-
- strcpy( p, dep->d_name );
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: checking directory \"%s\"\n",
- dirname );
- }
-#endif
-
- if ( stat( dirname, &st ) != 0 ) {
- print_err( dirname );
- } else if ( S_ISDIR( st.st_mode )) {
- sprintf( filename, "%s/%s", dirname, DEF_EDBFILENAME );
-
- if ( stat( filename, &st ) == 0 && S_ISREG( st.st_mode )) {
- if (( newbase = malloc( strlen( basedn ) +
- strlen( dep->d_name ) + 3 )) == NULL ) {
- print_err( "malloc" );
- err = -1;
- continue;
- }
-
- sprintf( newbase, "%s@%s", basedn,
- file2rdn( edbmap, dep->d_name ));
-
- /* recurse */
- err = edb2ldif( outfp, filename, newbase, recurse );
-
- free( newbase );
- }
- }
- }
-
- free_edbmap( edbmap );
- closedir( dp );
-
- if ( verboseflg ) {
- fprintf( stderr, "%s: %d total entries converted under \"%s\"\n\n",
- progname, entrycount - startcount, basedn );
- }
- }
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "edb2ldif: 6 return( %d )\n", err );
- }
-#endif
- return( err );
-}
-
-
-/*
- * read one entry from fp and write to outfp.
- * return > 0 if entry converted, 0 if end of file, < 0 if error occurs
- */
-static int
-convert_entry(
- FILE *fp,
- char *edbname,
- FILE *outfp,
- char *basedn,
- char *loc_addvals,
- int loc_addlen,
- char *linebuf
-)
-{
- Attr_Sequence as, tmpas;
- AV_Sequence av;
- PS attrtype_ps, val_ps;
- char *dnstr;
- DN dn;
- RDN rdn;
- int valcnt;
- extern int parse_status;
- extern char *parse_file;
- extern RDN parse_rdn;
-#ifdef HAVE_PARSE_ENTRY
- extern char *parse_entry;
- extern Attr_Sequence fget_attributes();
-#else /* HAVE_PARSE_ENTRY */
- extern Attr_Sequence get_attributes();
-#endif /* HAVE_PARSE_ENTRY */
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "convert_entry( 0x%X, \"%s\", 0x%X, \"%s\", ...)\n",
- fp, edbname, outfp, basedn );
- }
-#endif
-
- while (( dnstr = fgets( linebuf, MAX_LINE_SIZE, fp )) != NULL &&
- *linebuf == '\n' ) {
- ;
- }
-
- if ( dnstr == NULL ) {
- return( feof( fp ) ? 0 : -1 ); /* end of file or error */
- }
-
- linebuf[ strlen( linebuf ) - 1 ] = '\0';
-
- if (( dnstr = malloc( strlen( basedn ) + strlen( linebuf ) + 2 ))
- == NULL ) {
- print_err( "convert_entry" );
- return( -1 );
- }
- sprintf( dnstr, "%s@%s", basedn, linebuf );
- if ( last_dn != NULL ) {
- free( last_dn );
- }
- last_dn = dnstr;
-
- if ( entrycount > 0 ) {
- fputc( '\n', outfp );
- }
-
- /*
- * parse_entry, parse_file and parse_rdn are needed inside the
- * libisode decoding routines, so we set it here.
- */
- parse_file = edbname;
-#ifdef HAVE_PARSE_ENTRY
- parse_entry = dnstr;
-#endif
- parse_rdn = rdn = str2rdn( linebuf );
-
- if (( val_ps = ps_alloc( str_open )) == NULLPS ||
- str_setup( val_ps, NULLCP, 0, 0 ) == NOTOK ) {
- fprintf( stderr, "%s: ps_alloc/setup failed (EDB file %s)\n", progname,
- edbname );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
- if (( dn = str2dn( dnstr )) == NULLDN || av2ldif( outfp, NULL, dn,
- 0, "dn", val_ps ) < 0 ) {
- sprintf( linebuf,
- "str2dn or av2ldif of DN failed (EDB file %s, entry %s)\n",
- edbname, dnstr );
- print_err( linebuf );
- if ( dn != NULLDN ) {
- dn_free( dn );
- }
- ps_free( val_ps );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
- dn_free( dn );
-
- ++entrycount;
-
- if ( always_addvals != NULL && ( loc_addvals == NULL || !override_add )
- && fwrite( always_addvals, always_addlen, 1, outfp ) != 1 ) {
- sprintf( linebuf,
- "write of additional values failed (EDB file %s, entry %s)\n",
- edbname, dnstr );
- print_err( linebuf );
- ps_free( val_ps );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
- if ( loc_addvals != NULL && fwrite( loc_addvals, loc_addlen, 1,
- outfp ) != 1 ) {
- sprintf( linebuf,
- "write of additional values failed (EDB file %s, entry %s)\n",
- edbname, dnstr );
- print_err( linebuf );
- ps_free( val_ps );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
-
-#ifdef HAVE_PARSE_ENTRY
- as = fget_attributes( fp );
-#else /* HAVE_PARSE_ENTRY */
- as = get_attributes( fp );
-#endif /* HAVE_PARSE_ENTRY */
-
- if ( parse_status != 0 ) {
- fprintf( stderr, "%s: problem parsing entry (EDB file %s)\n", progname,
- edbname );
- ps_free( val_ps );
- if ( as != NULLATTR ) {
- as_free( as );
- }
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
- if ( add_rdn_values( as, rdn ) != 0 ) {
- sprintf( linebuf,
- "adding RDN values(s) failed (EDB file %s, entry %s)\n",
- edbname, dnstr );
- print_err( linebuf );
- if ( as != NULLATTR ) {
- as_free( as );
- }
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
- if (( attrtype_ps = ps_alloc( str_open )) == NULLPS ||
- str_setup( attrtype_ps, NULLCP, 0, 0 ) == NOTOK ) {
- fprintf( stderr, "%s: ps_alloc/setup failed (EDB file %s)\n", progname,
- edbname );
- if ( as != NULLATTR ) {
- as_free( as );
- }
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
-
- for ( tmpas = as; tmpas != NULLATTR; tmpas = tmpas->attr_link ) {
- attrtype_ps->ps_ptr = attrtype_ps->ps_base;
- AttrT_print( attrtype_ps, tmpas->attr_type, EDBOUT );
- *attrtype_ps->ps_ptr = '\0';
-
- if ( ignore_attr != NULL ) {
- int i;
-
- for ( i = 0; ignore_attr[ i ] != NULL; ++i ) {
- if ( strcasecmp( attrtype_ps->ps_base, ignore_attr[ i ] )
- == 0 ) {
- break;
- }
- }
- if ( ignore_attr[ i ] != NULL ) {
- continue; /* skip this attribute */
- }
- }
-
- valcnt = 0;
- for ( av = tmpas->attr_value; av != NULLAV; av = av->avseq_next ) {
- ++valcnt;
- if ( av2ldif( outfp, av, NULL, tmpas->attr_type->oa_syntax,
- attrtype_ps->ps_base, val_ps ) < 0 ) {
- sprintf( linebuf,
- "av2ldif failed (EDB file %s, entry %s, attribute %s, value no. %d)\n",
- edbname, dnstr, attrtype_ps->ps_base, valcnt );
- print_err( linebuf );
- ps_free( attrtype_ps );
- ps_free( val_ps );
- as_free( as );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
- return( -1 );
- }
- }
- }
-
- ps_free( attrtype_ps );
- ps_free( val_ps );
- as_free( as );
- if ( rdn != NULLRDN ) {
- rdn_free( rdn );
- }
-
- return( 1 );
-}
-
-
-static int
-add_rdn_values( Attr_Sequence entryas, RDN rdn )
-{
-/*
- * this routine is based on code from the real_unravel_attribute() routine
- * found in isode-8.0/.dsap/common/attribute.c
- */
- AttributeType at;
- AV_Sequence avs;
- Attr_Sequence as;
-
- for (; rdn != NULLRDN; rdn = rdn->rdn_next ) {
- if (( as = as_find_type( entryas, rdn->rdn_at )) == NULLATTR ) {
- at = AttrT_cpy( rdn->rdn_at );
- avs = avs_comp_new( AttrV_cpy(&rdn->rdn_av ));
- as = as_comp_new( at, avs, NULLACL_INFO );
- entryas = as_merge( entryas, as );
- } else {
- for ( avs = as->attr_value; avs != NULLAV; avs = avs->avseq_next ) {
- if ( AttrV_cmp( &rdn->rdn_av, &avs->avseq_av ) == 0 ) {
- break;
- }
- }
-
- if ( avs == NULLAV ) {
- avs = avs_comp_new( AttrV_cpy( &rdn->rdn_av ));
- as->attr_value = avs_merge( as->attr_value, avs );
- }
- }
- }
-
- return( 0 );
-}
-
-
-/* read the EDB.map file and return a linked list of translations */
-static int
-read_edbmap( char *mapfile, struct edbmap **edbmapp )
-{
- FILE *fp;
- char *p, *filename, *rdn, line[ MAX_LINE_SIZE + 1 ];
- int err;
- struct edbmap *emp, *tmpemp;
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "read_edbmap( \"%s\", ...)\n", mapfile );
- }
-#endif
-
- if (( fp = fopen( mapfile, "r" )) == NULL ) {
- *edbmapp = NULL;
- return( 0 ); /* soft error -- no EDB.map file */
- }
-
- emp = NULL;
-
- /*
- * read all the lines in the file, looking for lines of the form:
- * RDN # filename
- */
- err = 0;
- while ( err == 0 && fgets( line, MAX_LINE_SIZE, fp ) != NULL ) {
- line[ strlen( line ) - 1 ] = '\0'; /* remove trailing newline */
- if (( filename = strchr( line, '#' )) == NULL ) {
- continue;
- }
-
- *filename++ = '\0';
- while ( isspace((unsigned char) *filename) ) { /* strip leading whitespace */
- ++filename;
- }
-
- if ( *filename == '\0' ) {
- continue;
- }
-
- p = filename + strlen( filename ) - 1;
- while ( isspace((unsigned char) *p) ) { /* strip trailing whitespace */
- *p-- = '\0';
- }
-
- rdn = line;
- while ( isspace((unsigned char) *rdn)) { /* strip leading whitespace */
- ++rdn;
- }
-
- if ( *rdn == '\0' ) {
- continue;
- }
-
- p = rdn + strlen( rdn ) - 1;
- while ( isspace((unsigned char) *p)) { /* strip trailing whitespace */
- *p-- = '\0';
- }
-
- if (( tmpemp = (struct edbmap *)calloc( 1, sizeof( struct edbmap )))
- == NULL ||
- ( tmpemp->edbm_filename = strdup( filename )) == NULL ||
- ( tmpemp->edbm_rdn = strdup( rdn )) == NULL ) {
- err = -1;
- } else {
- tmpemp->edbm_next = emp;
- emp = tmpemp;
- }
- }
-
- fclose( fp );
-
- if ( err == 0 ) {
- *edbmapp = emp;
- } else {
- free_edbmap( emp );
- }
-
- return( err );
-}
-
-
-static char *
-file2rdn( struct edbmap *edbmap, char *filename )
-{
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "file2rdn( 0x%X, \"%s\" )\n", edbmap, filename );
- }
-#endif
-
- while ( edbmap != NULL ) {
- if ( strcmp( filename, edbmap->edbm_filename ) == 0 ) {
- break;
- }
- edbmap = edbmap->edbm_next;
- }
-
- return(( edbmap == NULL ) ? filename : edbmap->edbm_rdn );
-}
-
-
-/* free the edbmap list */
-static void
-free_edbmap( struct edbmap *edbmap )
-{
- struct edbmap *tmp;
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "free_edbmap( 0x%X )\n", edbmap );
- }
-#endif
-
- while ( edbmap != NULL ) {
- if ( edbmap->edbm_filename != NULL ) free( edbmap->edbm_filename );
- if ( edbmap->edbm_rdn != NULL ) free( edbmap->edbm_rdn );
- tmp = edbmap;
- edbmap = edbmap->edbm_next;
- free( tmp );
- }
-}
-
-
-static void
-print_err( char *msg )
-{
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "print_err( \"%s\" )\n", msg );
- }
-#endif
-
- if ( errno > sys_nerr ) {
- fprintf( stderr, "%s: %s: errno=%d\n", progname, msg, errno );
- } else {
- fprintf( stderr, "%s: %s: %s\n", progname, msg, sys_errlist[ errno ] );
- }
-}
-
-
-static char *
-read_file( char *filename, int *lenp )
-{
- FILE *fp;
- struct stat st;
- char *buf;
-
-#ifdef LDAP_DEBUG
- if ( debugflg ) {
- fprintf( stderr, "read_file( \"%s\", 0x%X )\n", filename, lenp );
- }
-#endif
-
- if ( stat( filename, &st ) != 0 || !S_ISREG( st.st_mode ) ||
- ( fp = fopen( filename, "r" )) == NULL ) {
- return( NULL );
- }
-
- if (( buf = (char *)malloc( st.st_size )) == NULL ) {
- fclose( fp );
- return( NULL );
- }
-
- if ( fread( buf, st.st_size, 1, fp ) != 1 ) {
- fclose( fp );
- free( buf );
- return( NULL );
- }
-
- fclose( fp );
- *lenp = st.st_size;
- return( buf );
-}
+++ /dev/null
-/* $OpenLDAP$ */
-/*
- * Copyright (c) 1995 Regents of the University of Michigan.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of Michigan at Ann Arbor. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/ctype.h>
-#include <ac/string.h>
-
-#include <quipu/commonarg.h>
-#include <quipu/attrvalue.h>
-#include <quipu/ds_error.h>
-#include <quipu/ds_search.h>
-/* #include <quipu/dap2.h> */
-#include <quipu/dua.h>
-
-#include <ldap.h>
-
-#include "ldif.h"
-#include "ldapsyntax.h"
-
-short ldap_dn_syntax;
-short ldap_password_syntax;
-short ldap_photo_syntax;
-short ldap_jpeg_syntax;
-short ldap_audio_syntax;
-
-static int dn2ldif( PS ps, DN dn );
-static int jpeg2ldif( PS ps, AttributeValue av );
-static int audio2ldif( PS ps, AttributeValue av );
-static int photo2ldif( PS ps, AttributeValue av );
-static int fileattr2ldif( PS ps, AttributeValue av );
-static void de_t61( char *s, int t61mark );
-static void de_crypt( char *s );
-
-extern char *progname;
-
-#define SEPARATOR(c) ((c) == ',' || (c) == ';')
-#define SPACE(c) ((c) == ' ' || (c) == '\n')
-
-
-int
-init_syntaxes()
-{
- if (( ldap_dn_syntax = str2syntax( "DN" )) == 0 ) {
- return( -1 ); /* must have this syntax handler */
- }
- ldap_password_syntax = str2syntax( "password" );
- ldap_photo_syntax = str2syntax( "photo" );
- ldap_jpeg_syntax = str2syntax( "jpeg" );
- ldap_audio_syntax = str2syntax( "audio" );
-
- return( 0 );
-}
-
-
-/*
- * av2ldif: convert attribute value contained in "av" to ldif format
- * and write to "outfp". If "dn" is not NULL, convert it instead of "av".
- */
-int
-av2ldif( FILE *outfp, AV_Sequence av, DN dn, short syntax, char *attrname,
- PS str_ps )
-{
- char *buf;
- int rc;
- struct file_syntax *fsyntax;
-
- if ( av != NULLAV ) {
- fsyntax = (struct file_syntax *) av->avseq_av.av_struct;
- }
-
- rc = 0; /* optimistic */
- str_ps->ps_ptr = str_ps->ps_base; /* reset string PS */
-
- if ( dn != NULL || syntax == ldap_dn_syntax ) { /* DNs */
- rc = dn2ldif( str_ps, ( dn != NULLDN ) ? dn :
- (DN)(av->avseq_av.av_struct));
-
- } else if ( syntax == ldap_jpeg_syntax || ( syntax > AV_WRITE_FILE &&
- fsyntax->fs_real_syntax == ldap_jpeg_syntax )) {
- rc = jpeg2ldif( str_ps, &av->avseq_av );
-
- } else if ( syntax == ldap_photo_syntax || ( syntax > AV_WRITE_FILE &&
- fsyntax->fs_real_syntax == ldap_photo_syntax )) {
- rc = photo2ldif( str_ps, &av->avseq_av );
-
- } else if ( syntax == ldap_audio_syntax || ( syntax > AV_WRITE_FILE &&
- fsyntax->fs_real_syntax == ldap_audio_syntax )) {
- rc = audio2ldif( str_ps, &av->avseq_av );
-
- } else if ( syntax > AV_WRITE_FILE ) {
- rc = fileattr2ldif( str_ps, &av->avseq_av );
-
- } else {
- AttrV_print( str_ps, &av->avseq_av, EDBOUT );
- *str_ps->ps_ptr = '\0';
- de_t61( str_ps->ps_base, 0 );
-
- if ( syntax == ldap_password_syntax ) {
- de_crypt( str_ps->ps_base );
- }
-
- str_ps->ps_ptr = str_ps->ps_base + strlen( str_ps->ps_base );
- }
-
- if ( rc == 0 && str_ps->ps_ptr > str_ps->ps_base ) {
- *str_ps->ps_ptr = '\0';
- if (( buf = ldif_type_and_value( attrname, str_ps->ps_base,
- str_ps->ps_ptr - str_ps->ps_base )) == NULL ) {
- rc = -1;
- } else {
- if ( fputs( buf, outfp ) == EOF ) {
- rc = -1;
- }
- ber_memfree( buf );
- }
- }
-
- if ( rc == -2 ) {
- if ( syntax > AV_WRITE_FILE ) {
- fprintf( stderr,
- "%s: attribute file '%s' not found (skipping value)\n",
- progname, fsyntax->fs_name );
- }
- rc = 0; /* treat as "soft" error -- keep going */
- }
-
- return( rc );
-}
-
-
-static int
-dn2ldif( PS ps, DN dn )
-{
- RDN rdn;
- int firstrdn, rc;
- char *value;
- PS rps;
-
- if ( dn == NULLDN ) {
- return( 0 );
- }
-
- if ( dn->dn_parent != NULLDN ) {
- if (( rc = dn2ldif( ps, dn->dn_parent )) != 0 ) {
- return( rc );
- }
- ps_print( ps, ", " );
- }
-
- if ( (rps = ps_alloc( str_open )) == NULLPS ||
- str_setup( rps, NULLCP, 0, 0 ) == NOTOK ) {
- return( -1 );
- }
-
- firstrdn = 1;
- for ( rdn = dn->dn_rdn; rdn != NULLRDN; rdn = rdn->rdn_next ) {
- if ( firstrdn ) {
- firstrdn = 0;
- } else {
- ps_print( ps, " + " );
- }
-
- AttrT_print( ps, rdn->rdn_at, EDBOUT );
- ps_print( ps, "=" );
-
- if ( rdn->rdn_at->oa_syntax == ldap_dn_syntax ) {
- if (( rc = dn2ldif( rps, (DN) rdn->rdn_av.av_struct )) != 0 ) {
- return( rc );
- }
- *rps->ps_ptr = '\0';
- value = rps->ps_base;
- } else {
- AttrV_print( rps, &rdn->rdn_av, EDBOUT );
- *rps->ps_ptr = '\0';
- value = rps->ps_base;
- de_t61( value, 0 );
- }
-
- /*
- * ,+="\\\n all go in quotes. " and \\ need to
- * be preceeded by \\.
- */
-
- if ( strpbrk( value, ",+=\"\\\n" ) != NULL || SPACE( value[0] )
- || SPACE( value[max( strlen(value) - 1, 0 )] ) ) {
- char *p, *t, *tmp;
- int specialcount;
-
- ps_print( ps, "\"" );
-
- specialcount = 0;
- for ( p = value; *p != '\0'; p++ ) {
- if ( *p == '"' || *p == '\\' ) {
- specialcount++;
- }
- }
- if ( specialcount > 0 ) {
- tmp = smalloc( strlen( value ) + specialcount + 1 );
- for ( p = value, t = tmp; *p != '\0'; p++ ) {
- switch ( *p ) {
- case '"':
- case '\\':
- *t++ = '\\';
- /* FALL THROUGH */
- default:
- *t++ = *p;
- }
- }
- *t = '\0';
- ps_print( ps, tmp );
- free( tmp );
- } else {
- ps_print( ps, value );
- }
-
- ps_print( ps, "\"" );
- } else {
- ps_print( ps, value );
- }
-
- rps->ps_ptr = rps->ps_base;
- }
-
- ps_free( rps );
-
- return( 0 );
-}
-
-#define T61 "{T.61}"
-#define T61LEN 6
-
-static void
-de_t61( s, t61mark )
-char *s;
-int t61mark;
-{
- char *next = s;
- unsigned char c;
- unsigned int hex;
-
- while ( *s ) {
- switch ( *s ) {
- case '{' :
- if ( strncasecmp( s, T61, T61LEN) == 0 ) {
- s += T61LEN;
- if ( t61mark )
- *next++ = '@';
- } else {
- *next++ = *s++;
- }
- break;
-
- case '\\':
- c = *(s + 1);
- if ( c == '\n' ) {
- s += 2;
- if ( *s == '\t' )
- s++;
- break;
- }
- if ( isdigit( c ) )
- hex = c - '0';
- else if ( c >= 'A' && c <= 'F' )
- hex = c - 'A' + 10;
- else if ( c >= 'a' && c <= 'f' )
- hex = c - 'a' + 10;
- else {
- *next++ = *s++;
- break;
- }
- hex <<= 4;
- c = *(s + 2);
- if ( isdigit( c ) )
- hex += c - '0';
- else if ( c >= 'A' && c <= 'F' )
- hex += c - 'A' + 10;
- else if ( c >= 'a' && c <= 'f' )
- hex += c - 'a' + 10;
- else {
- *next++ = *s++;
- *next++ = *s++;
- break;
- }
-
- *next++ = hex;
- s += 3;
- break;
-
- default:
- *next++ = *s++;
- break;
- }
- }
- *next = '\0';
-}
-
-
-#define CRYPT_MASK 0x23
-
-static void
-de_crypt( char *s )
-{
- char *p;
-
- if ( strncmp( s, "{CRYPT}", 7 ) == 0 ) {
- SAFEMEMCPY( s, s + 7, strlen( s + 7 ) + 1 ); /* strip off "{CRYPT}" */
-
- for ( p = s; *p != '\0'; ++p) { /* "decrypt" each byte */
- if ( *p != CRYPT_MASK ) {
- *p ^= CRYPT_MASK;
- }
- }
- }
-}
-
-
-static int
-jpeg2ldif( PS ps, AttributeValue av )
-{
- PE pe;
- int len;
-
- if (( pe = grab_pe( av )) == NULLPE || pe->pe_id == PE_PRIM_NULL ) {
- return( -2 ); /* signal soft error */
- }
-
- if (( pe->pe_class != PE_CLASS_UNIV && pe->pe_class != PE_CLASS_CONT )
- || pe->pe_form != PE_FORM_PRIM || pe->pe_id != PE_PRIM_OCTS ) {
- return( -1 );
- }
-
- if ( pe_pullup( pe ) == NOTOK ) {
- return( -1 );
- }
-
- len = ps_get_abs( pe );
-
- if ( ps_write( ps, (PElementData)pe->pe_prim, len ) == NOTOK ) {
- return( -1 );
- }
-
- return( 0 );
-}
-
-
-static int
-audio2ldif( PS ps, AttributeValue av )
-{
- PE pe;
- struct qbuf *qb, *p;
- int rc, len;
- char *buf;
-
- return( 0 ); /* for now */
-
- if (( pe = grab_pe( av )) == NULLPE || pe->pe_id == PE_PRIM_NULL ) {
- return( -2 ); /* signal soft error */
- }
-
- qb = (struct qbuf *)pe;
-
- len = 0;
- for ( p = qb->qb_forw; p != qb; p = p->qb_forw ) {
- len += p->qb_len;
- }
-
- if (( buf = (char *) malloc( len )) == NULL ) {
- return( -1 );
- }
-
- len = 0;
- for ( p = qb->qb_forw; p != qb; p = p->qb_forw ) {
- SAFEMEMCPY( buf + len, p->qb_data, p->qb_len );
- len += p->qb_len;
- }
-
- if ( ps_write( ps, (PElementData)buf, len ) == NOTOK ) {
- rc = -1;
- } else {
- rc = 0;
- }
-
- free( buf );
-
- return( rc );
-}
-
-
-static int
-photo2ldif( PS ps, AttributeValue av )
-{
- PE pe;
- int len;
- char *faxparamset = "\000\300\000\000";
- BerElement *phber;
-
- if (( pe = grab_pe( av )) == NULLPE || pe->pe_id == PE_PRIM_NULL ) {
- return( -2 ); /* signal soft error */
- }
-
- /* old bit string-like format - only handle this for now */
- if ( pe->pe_class == PE_CLASS_UNIV && pe->pe_form == PE_FORM_PRIM
- && pe->pe_id == PE_PRIM_BITS ) {
- len = ps_get_abs( pe );
- if (( phber = der_alloc()) == NULL ) {
- return( -1 );
- }
- if ( ber_printf( phber, "t{[tB]{B}}",
- (ber_tag_t) 0xA3, (ber_tag_t) 0x81, faxparamset, (ber_len_t) 31,
- (char *)pe->pe_prim, (ber_len_t) (len * 8) ) == -1 )
- {
- ber_free( phber, 1 );
- return( -1 );
- }
- if ( ps_write( ps, (PElementData)phber->ber_buf,
- phber->ber_ptr - phber->ber_buf ) == NOTOK ) {
- ber_free( phber, 1 );
- return( -1 );
- }
- ber_free( phber, 1 );
- } else {
- /*
- * try just writing this into a PS and sending it along
- */
- if ( pe2ps( ps, pe ) == NOTOK ) {
- return( -1 );
- }
- }
-
- return( 0 );
-}
-
-
-static int
-fileattr2ldif( PS ps, AttributeValue av )
-{
- PE pe;
-
- if (( pe = grab_pe( av )) == NULLPE || pe->pe_id == PE_PRIM_NULL ) {
- return( -2 ); /* signal soft error */
- }
-
- /*
- * try just writing this into a PS and sending it along
- */
- if ( pe2ps( ps, pe ) == NOTOK ) {
- return( -1 );
- }
-
- return( 0 );
-}
+++ /dev/null
-/* $OpenLDAP$ */
-/*
- * Copyright (c) 1995 Regents of the University of Michigan.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of Michigan at Ann Arbor. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
-#ifndef LDAPSYNTAX_H
-#define LDAPSYNTAX_H 1
-
-#include <ldap_cdefs.h>
-
-LDAP_BEGIN_DECL
-
-/* XXX: the "master" LINE_WIDTH #define is in ../slap.h */
-#define LINE_WIDTH 76 /* for lines in string rep of an entry */
-
-/*
- * function prototypes
- */
-
-int init_syntaxes LDAP_P(( void ));
-int av2ldif LDAP_P(( FILE *outfp, AV_Sequence av, DN dn, short syntax,
- char *attrname, PS str_ps ));
-
-LDAP_END_DECL
-#endif