tinydns now actually appears to answer a test question correctly!

This commit is contained in:
leitner
2002-01-16 01:05:43 +00:00
parent 3f031d8339
commit da78511a26
5 changed files with 95 additions and 19 deletions

View File

@@ -14,7 +14,7 @@ scan_ldapstring.o scan_ldapsearchfilter.o scan_ldapsearchrequest.o \
freefilter.o freeava.o scan_ldapava.o fmt_ldapsearchresultentry.o \
fmt_ldapstring.o freepal.o scan_ldapsearchresultentry.o \
fmt_ldapresult.o fmt_ldappal.o fmt_ldapadl.o fmt_ldapava.o \
fmt_ldapsearchfilter.o fmt_ldapsearchrequest.o
fmt_ldapsearchfilter.o fmt_ldapsearchrequest.o matchstring.o
ldif.a: ldif_parse.o ldap_match.o strduptab.o strstorage.o

2
ldap.h
View File

@@ -6,6 +6,8 @@ struct string {
const char* s;
};
int matchstring(struct string* s,const char* c);
struct AttributeValueAssertion {
struct string desc, value;
};

View File

@@ -5,21 +5,6 @@
#include <unistd.h>
#include <stdio.h>
/* behave like strcmp */
static int matchstring(struct string* s,const char* c) {
int l,l1,i;
if (!c) return -1;
l1=l=strlen(c);
if (s->l<l1) l1=s->l;
i=byte_diff(s->s,l1,c);
if (i) return i;
/* one is a prefix of the other */
if (l==s->l) return 0;
if (c[l1]) /* is c the longer string? */
return c[l1];
return -(int)(s->s[l1]);
}
/* look up value of an attribute for an LDIF record.
* Return NULL if not found */
static const char* findattr(struct ldaprec* f,struct string* name) {

17
matchstring.c Normal file
View File

@@ -0,0 +1,17 @@
#include "ldif.h"
/* behave like strcmp */
int matchstring(struct string* s,const char* c) {
int l,l1,i;
if (!c) return -1;
l1=l=strlen(c);
if (s->l<l1) l1=s->l;
i=byte_diff(s->s,l1,c);
if (i) return i;
/* one is a prefix of the other */
if (l==s->l) return 0;
if (c[l1]) /* is c the longer string? */
return c[l1];
return -(int)(s->s[l1]);
}

View File

@@ -1,4 +1,5 @@
#include <unistd.h>
#include <stdlib.h>
#include "byte.h"
#include "buffer.h"
#include "ldap.h"
@@ -55,12 +56,83 @@ int main() {
break;
case SearchRequest:
{
struct SearchRequest br;
struct SearchRequest sr;
int tmp;
if ((tmp=scan_ldapsearchrequest(buf+res,buf+res+len,&br))) {
if ((tmp=scan_ldapsearchrequest(buf+res,buf+res+len,&sr))) {
struct ldaprec* r=first;
while (r) {
if (ldap_match(r,&br)) {
if (ldap_match(r,&sr)) {
struct SearchResultEntry sre;
struct PartialAttributeList** pal=&sre.attributes;
sre.objectName.s=r->dn; sre.objectName.l=strlen(r->dn);
sre.attributes=0;
/* now go through list of requested attributes */
{
struct AttributeDescriptionList* adl=sr.attributes;
while (adl) {
const char* val=0;
int i=0;
buffer_puts(buffer_2,"looking for attribute \"");
buffer_put(buffer_2,adl->a.s,adl->a.l);
buffer_putsflush(buffer_2,"\"\n");
if (!matchstring(&adl->a,"dn")) val=r->dn; else
if (!matchstring(&adl->a,"cn")) val=r->cn; else
if (!matchstring(&adl->a,"mail")) val=r->mail; else
if (!matchstring(&adl->a,"sn")) val=r->sn; else
for (; i<r->n; ++i) {
buffer_puts(buffer_2,"comparing with \"");
buffer_puts(buffer_2,r->a[i].name);
buffer_putsflush(buffer_2,"\"\n");
if (!matchstring(&adl->a,r->a[i].name))
val=r->a[i].value;
}
if (val) {
*pal=malloc(sizeof(struct PartialAttributeList));
if (!*pal) {
nomem:
buffer_putsflush(buffer_2,"out of virtual memory!\n");
exit(1);
}
(*pal)->type=adl->a;
{
struct AttributeDescriptionList** a=&(*pal)->values;
while (i<r->n) {
*a=malloc(sizeof(struct AttributeDescriptionList));
if (!*a) goto nomem;
(*a)->a.s=val;
(*a)->a.l=strlen(val);
(*a)->next=0;
for (;i<r->n; ++i)
if (!matchstring(&adl->a,r->a[i].name)) {
val=r->a[i].value;
break;
}
}
}
(*pal)->next=0;
pal=&(*pal)->next;
}
adl=adl->next;
}
}
{
long l=fmt_ldapsearchresultentry(0,&sre);
char *buf=alloca(l+300); /* you never know ;) */
long tmp;
buffer_puts(buffer_2,"sre len ");
buffer_putulong(buffer_2,l);
buffer_putsflush(buffer_2,".\n");
tmp=fmt_ldapmessage(buf,++messageid,SearchResultEntry,l);
fmt_ldapsearchresultentry(buf+tmp,&sre);
write(1,buf,l+tmp);
}
{
char buf[1000];
long l=fmt_ldapsearchresultdone(buf+100,0,"","","");
int hlen=fmt_ldapmessage(0,++messageid,SearchResultDone,l);
fmt_ldapmessage(buf+100-hlen,messageid,SearchResultDone,l);
write(1,buf+100-hlen,l+hlen);
}
buffer_puts(buffer_2,"found: ");
buffer_puts(buffer_2,r->dn);
buffer_putsflush(buffer_2,"\n");