diff --git a/Makefile b/Makefile index 4c82095..035ed34 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,8 @@ ldif.a: ldif_parse.o ldap_match_mapped.o storage.a: strstorage.o strduptab.o mstorage_add.o mduptab_add.o \ bstr_diff.o mduptab_adds.o bstr_diff2.o mstorage_add_bin.o \ -mstorage_init.o mstorage_init_persistent.o mstorage_unmap.o +mstorage_init.o mstorage_init_persistent.o mstorage_unmap.o \ +mduptab_init.o auth.a: auth.o diff --git a/idx2ldif.c b/idx2ldif.c index 39b298b..f9fba6f 100644 --- a/idx2ldif.c +++ b/idx2ldif.c @@ -30,10 +30,19 @@ static void dumpbstr(const char* c) { } } -int main() { +int main(int argc,char* argv[]) { int verbose=1; unsigned long filelen; - char* map=mmap_read("data",&filelen); + char* fn=argc<2?"data":argv[1]; + char* map=mmap_read(fn,&filelen); + if (!map) { + buffer_puts(buffer_2,"could not open "); + buffer_puts(buffer_2,fn); + buffer_puts(buffer_2,": "); + buffer_puterror(buffer_2); + buffer_putnlflush(buffer_2); + return 1; + } uint32 magic,attribute_count,record_count,indices_offset,size_of_string_table; uint32_unpack(map,&magic); uint32_unpack(map+4,&attribute_count); diff --git a/mduptab.h b/mduptab.h index a61d6c1..9bf12fd 100644 --- a/mduptab.h +++ b/mduptab.h @@ -11,5 +11,6 @@ typedef struct mduptable { mstorage_t table,strings; } mduptab_t; +void mduptab_init(mduptab_t* t); long mduptab_add(mduptab_t* t,const char* s,unsigned int len); long mduptab_adds(mduptab_t* t,const char* s); diff --git a/mduptab_init.c b/mduptab_init.c new file mode 100644 index 0000000..582cc5a --- /dev/null +++ b/mduptab_init.c @@ -0,0 +1,6 @@ +#include "mduptab.h" + +void mduptab_init(mduptab_t* t) { + mstorage_init(&t->table); + mstorage_init(&t->strings); +} diff --git a/parse.c b/parse.c index 39864fa..adfea05 100644 --- a/parse.c +++ b/parse.c @@ -42,6 +42,7 @@ void dumprec(struct ldaprec* l) { } extern mstorage_t stringtable; +extern mduptab_t attributes,classes; int main(int argc,char* argv[]) { int fd; @@ -51,7 +52,18 @@ int main(int argc,char* argv[]) { long offset_stringtable,offset_classes,offset_attributes; char* map,* dest; - mstorage_init(&stringtable); + if ((fd=open(destname,O_RDWR|O_CREAT|O_TRUNC,0600))<0) { + buffer_putsflush(buffer_2,"could not create destination data file"); + return 1; + } + mstorage_init_persistent(&stringtable,fd); + mduptab_init(&attributes); + mduptab_init(&classes); + + { + char dummy[5*4]; + mstorage_add(&stringtable,dummy,5*4); + } ldif_parse(argc<2?"exp.ldif":argv[1]); if (!first) { @@ -59,7 +71,7 @@ int main(int argc,char* argv[]) { return 1; } - size_of_string_table=stringtable.used+classes.strings.used+attributes.strings.used; + size_of_string_table=stringtable.used+classes.strings.used+attributes.strings.used-5*4; size_of_string_table=(size_of_string_table+3)&-4; /* round up to 32 bits */ /* first find out how much space we need */ len = 5*sizeof(uint32_t); /* magic plus four counts */ @@ -104,10 +116,7 @@ int main(int argc,char* argv[]) { len+=record_count*4; /* done! we don't create any indices for now. */ - if ((fd=open(destname,O_RDWR|O_CREAT|O_TRUNC,0600))<0) { - buffer_putsflush(buffer_2,"could not create destination data file"); - return 1; - } + munmap(stringtable.root,stringtable.mapped); ftruncate(fd,len); if ((map=mmap(0,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED) { buffer_putsflush(buffer_2,"could not mmap destination data file!\n"); @@ -122,9 +131,9 @@ int main(int argc,char* argv[]) { // size_of_string_table=stringtable.used+classes.strings.used+attributes.strings.used; offset_stringtable=5*4; - offset_classes=offset_stringtable+stringtable.used; + offset_classes= /* offset_stringtable+ */ stringtable.used; offset_attributes=offset_classes+classes.strings.used; - byte_copy(map+offset_stringtable,stringtable.used,stringtable.root); +// byte_copy(map+offset_stringtable,stringtable.used,stringtable.root); byte_copy(map+offset_classes,classes.strings.used,classes.strings.root); byte_copy(map+offset_attributes,attributes.strings.used,attributes.strings.root); // fdprintf(2,"offset_classes=%lu, offset_attributes=%lu, attributes=%lu\n", @@ -154,7 +163,7 @@ int main(int argc,char* argv[]) { int i=x->n+1; record_offsets[cur]=dest-map; ++cur; uint32_pack(dest,i); uint32_pack(dest+4,0); dest+=8; - uint32_pack(dest,x->dn+offset_stringtable); + uint32_pack(dest,x->dn /* +offset_stringtable */); for (i=0; in; ++i) { if (x->a[i].name==objectClass) { uint32_pack(dest+4,x->a[i].value+offset_classes); @@ -169,7 +178,7 @@ int main(int argc,char* argv[]) { if (x->a[i].name==objectClass) uint32_pack(dest+4,x->a[i].value+offset_classes); else - uint32_pack(dest+4,x->a[i].value+offset_stringtable); + uint32_pack(dest+4,x->a[i].value /* +offset_stringtable */); dest+=8; } }