add fmt_ldapaddrequest

This commit is contained in:
leitner
2018-09-01 18:30:37 +00:00
parent d177cd15aa
commit d6f4b0f66c
3 changed files with 36 additions and 1 deletions

View File

@@ -30,7 +30,7 @@ bstrstart.o free_ldapadl.o free_ldappal.o free_ldapsearchfilter.o \
scan_ldapsearchfilterstring.o free_ldapsearchresultentry.o \
fmt_ldapsearchfilterstring.o ldap_match_sre.o \
fmt_ldapdeleterequest.o scan_ldapdeleterequest.o normalize_dn.o \
fmt_ldapmodifyrequest.o
fmt_ldapmodifyrequest.o fmt_ldapaddrequest.o
ldif.a: ldif_parse.o ldap_match_mapped.o

34
fmt_ldapaddrequest.c Normal file
View File

@@ -0,0 +1,34 @@
#include "ldap.h"
#include <assert.h>
#include <alloca.h>
#include <stdio.h>
size_t fmt_ldapaddrequest(char* dest,const struct AddRequest* a) {
size_t i,n,l,sum;
const struct Addition* x;
size_t* ls; // lengths of the segments
char* orig=dest;
for (x=&a->a, l=0; x; x=x->next, ++l); // how many additions?
if (l>1000) return 0;
// now for each addition, calculate size of sequence
ls = (size_t*)alloca(l*sizeof(size_t));
for (x=&a->a, sum=i=0; x; x=x->next, ++i) {
ls[i] = fmt_ldapstring(NULL, &x->AttributeDescription) +
fmt_ldapavl(NULL, &x->vals);
sum += ls[i] + fmt_asn1SEQUENCE(NULL, ls[i]);;
}
n=fmt_ldapstring(dest,&a->entry);
if (!dest)
return n + fmt_asn1SEQUENCE(NULL, sum) + sum;
dest += n;
dest += fmt_asn1SEQUENCE(dest, sum);
for (x=&a->a, i=0; x; x=x->next, ++i) {
dest += fmt_asn1SEQUENCE(dest, ls[i]);
dest += fmt_ldapstring(dest, &x->AttributeDescription);
dest += fmt_ldapavl(dest, &x->vals);
}
assert(n + fmt_asn1SEQUENCE(NULL, sum) + sum == (size_t)(dest-orig));
return dest-orig;
}

1
ldap.h
View File

@@ -194,6 +194,7 @@ size_t fmt_ldapava(char* dest,const struct AttributeValueAssertion* a);
size_t fmt_ldapadl(char* dest,const struct AttributeDescriptionList* adl);
size_t fmt_ldapavl(char* dest,const struct AttributeDescriptionList* adl);
size_t fmt_ldapmodifyrequest(char* dest,const struct ModifyRequest* m);
size_t fmt_ldapaddrequest(char* dest,const struct AddRequest* m);
size_t fmt_ldapsearchfilterstring(char* dest,const struct Filter* f);
size_t fmt_ldapdeleterequest(char* dest,const struct string* s);
size_t fmt_ldapmodifydnrequest(char* dest,const struct ModifyDNRequest* mdr);