1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

Added ads_process_results(), which takes a function that is called for each

entry returned from a search, and applies it to the results.  Re-structured
ads_dump to use this, plus changed the ber_free in ads_dump from (b,1) to
(b,0), in accordance with openldap manpages.  Also allows proper free of
result using ldap_msgfree afterwards, so you can do something with the
results after an ads_dump.
(This used to be commit f01f02fc569b4f5101a37d3b493f2fe2d2b2677a)
This commit is contained in:
Jim McDonough 2002-03-29 21:06:33 +00:00
parent 9a8b5fdd37
commit 2ed1dfcf4e

View File

@ -700,14 +700,12 @@ static void dump_string(const char *field, struct berval **values)
}
/*
dump a record from LDAP on stdout
dump a field from LDAP on stdout
used for debugging
*/
void ads_dump(ADS_STRUCT *ads, void *res)
static void ads_dump_field(char *field, void **values, void *data_area)
{
char *field;
void *msg;
BerElement *b;
struct {
char *name;
void (*handler)(const char *, struct berval **);
@ -717,34 +715,89 @@ void ads_dump(ADS_STRUCT *ads, void *res)
{"objectSid", dump_sid},
{NULL, NULL}
};
for (msg = ads_first_entry(ads, res); msg; msg = ads_next_entry(ads, msg)) {
int i;
if (!field) { /* must be end of an entry */
printf("\n");
return;
}
for (i=0; handlers[i].name; i++) {
if (StrCaseCmp(handlers[i].name, field) == 0) {
handlers[i].handler(field, (struct berval **) values);
break;
}
}
if (!handlers[i].name) {
dump_string(field, (struct berval **) values);
}
}
/*
dump a result from LDAP on stdout
used for debugging
*/
void ads_dump(ADS_STRUCT *ads, void *res)
{
ads_process_results(ads, res, ads_dump_field, NULL);
}
/*
Walk through results, calling a function for each entry found.
The function receives a field name, a berval * array of values,
and a data area passed through from the start. The function is
called once with null for field and values at the end of each
entry.
*/
void ads_process_results(ADS_STRUCT *ads, void *res,
void(*fn)(char *, void **, void *),
void *data_area)
{
void *msg;
for (msg = ads_first_entry(ads, res); msg;
msg = ads_next_entry(ads, msg)) {
char *field;
BerElement *b;
for (field = ldap_first_attribute(ads->ld, (LDAPMessage *)msg, &b);
field;
field = ldap_next_attribute(ads->ld, (LDAPMessage *)msg, b)) {
struct berval **values;
int i;
values = ldap_get_values_len(ads->ld, (LDAPMessage *)msg, field);
fn(field, (void **) values, data_area);
for (i=0; handlers[i].name; i++) {
if (StrCaseCmp(handlers[i].name, field) == 0) {
handlers[i].handler(field, values);
break;
}
}
if (!handlers[i].name) {
dump_string(field, values);
}
ldap_value_free_len(values);
ldap_memfree(field);
}
ber_free(b, 0);
fn(NULL, NULL, data_area); /* completed an entry */
ber_free(b, 1);
printf("\n");
}
}
void ads_process_entry(ADS_STRUCT *ads, void *msg,
void(*fn)(ADS_STRUCT *, char *, void **, void *),
void *data_area)
{
char *field;
BerElement *b;
for (field = ldap_first_attribute(ads->ld, (LDAPMessage *)msg, &b);
field;
field = ldap_next_attribute(ads->ld, (LDAPMessage *)msg, b)) {
struct berval **values;
values = ldap_get_values_len(ads->ld, (LDAPMessage *)msg, field);
fn(ads, field, (void **) values, data_area);
ldap_value_free_len(values);
ldap_memfree(field);
}
ber_free(b, 0);
}
/*
count how many replies are in a LDAPMessage
*/