svn commit: samba r16538 - in branches/SOC/mkhl/ldb-map/modules: .
mkhl at samba.org
mkhl at samba.org
Mon Jun 26 23:46:15 GMT 2006
Author: mkhl
Date: 2006-06-26 23:46:15 +0000 (Mon, 26 Jun 2006)
New Revision: 16538
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16538
Log:
Add select_unmappable_msg_attrs func, which I'll need for mapping
parse-trees in search.
Fix some wrong talloc memory contexts in select_*.
Martin
Modified:
branches/SOC/mkhl/ldb-map/modules/ldb_map.c
Changeset:
Modified: branches/SOC/mkhl/ldb-map/modules/ldb_map.c
===================================================================
--- branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-06-26 23:36:03 UTC (rev 16537)
+++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-06-26 23:46:15 UTC (rev 16538)
@@ -456,7 +456,10 @@
return NULL;
last = 0;
- result = NULL;
+ result = talloc_array(mem_ctx, const char *, 1);
+ if (result == NULL)
+ return NULL;
+ result[0] = NULL;
for (i = 0; attrs[i]; i++) {
/* keep "*" and ignored attrs */
@@ -467,7 +470,7 @@
if (result == NULL)
goto failed;
- result[last] = talloc_strdup(mem_ctx, attrs[i]);
+ result[last] = talloc_strdup(result, attrs[i]);
result[last+1] = NULL;
last++;
}
@@ -497,12 +500,15 @@
return NULL;
last = 0;
- result = NULL;
+ result = talloc_array(mem_ctx, const char *, 1);
+ if (result == NULL)
+ return NULL;
+ result[0] = NULL;
for (i = 0; attrs[i]; i++) {
/* keep "*" as is */
if (ldb_attr_cmp(attrs[i], "*") == 0) {
- name = talloc_strdup(mem_ctx, attrs[i]);
+ name = talloc_strdup(result, attrs[i]);
goto named;
}
@@ -529,7 +535,7 @@
for (j = 0; map->u.generate.remote_names[j]; j++) {
result = talloc_realloc(mem_ctx, result,
const char *, last+2);
- result[last] = talloc_strdup(mem_ctx, map->u .generate.remote_names[j]);
+ result[last] = talloc_strdup(result, map->u .generate.remote_names[j]);
result[last+1] = NULL;
last++;
}
@@ -542,7 +548,7 @@
if (result == NULL)
goto failed;
- result[last] = name;
+ result[last] = talloc_strdup(result, name);
result[last+1] = NULL;
last++;
}
@@ -554,6 +560,68 @@
return NULL;
}
+/* select only local attrs that can be unmapped from msg */
+static
+const char **
+select_unmappable_msg_attrs(struct ldb_module *module,
+ void *mem_ctx,
+ const struct ldb_message *msg)
+{
+ struct ldb_map_context *data = map_get_context(module);
+ const struct ldb_map_attribute *map;
+ const char **result;
+ int i, j, last;
+
+ if (msg == NULL)
+ return NULL;
+
+ last = 0;
+ result = talloc_array(mem_ctx, const char *, 1);
+ if (result == NULL)
+ return NULL;
+ result[0] = NULL;
+
+ /* for each mapping, check if all remote attributes are present
+ if they are, add the local one to the result */
+ /* TODO: Alternatively, walk over msg->elements and use find_remote_attr. */
+ for (i = 0; data->attribute_maps[i].local_name; i++) {
+ BOOL avail = False;
+ map = &data->attribute_maps[i];
+
+ switch (map->type) {
+ case MAP_IGNORE:
+ break;
+
+ case MAP_KEEP:
+ avail = (ldb_msg_find_element(msg, map->local_name) != NULL);
+ break;
+
+ case MAP_RENAME:
+ case MAP_CONVERT:
+ avail = (ldb_msg_find_element(msg, map->u.rename.remote_name) != NULL);
+ break;
+
+ case MAP_GENERATE:
+ /* look for *all* remote names */
+ avail = True;
+ for (j = 0; map->u.generate.remote_names[j]; j++)
+ avail &= (ldb_msg_find_element(msg, map->u.generate.remote_names[j]) != NULL);
+ break;
+ }
+
+ if (!avail)
+ continue;
+
+ result = talloc_realloc(mem_ctx, result, const char *, last+2);
+ result[last] = talloc_strdup(result, map->local_name);
+ result[last+1] = NULL;
+ last++;
+ }
+
+ return result;
+}
+
+
/* Check whether the given objectClass is contained in the specified
* message */
/*
@@ -909,69 +977,7 @@
return ldb_val_dup(mem_ctx, val);
}
-/* /\* XXX *\/ */
-/* /\* Remote message -> List of local attribute names of which all remote */
-/* * attributes are present in the message *\/ */
-/* static const char **mop_msg_available_local_attrs(struct ldb_module *module, */
-/* const struct ldb_message *msg) */
-/* { */
-/* struct ldb_map_context *map = map_get_context(module); */
-/* const char **names; */
-/* const struct ldb_map_attribute *attr; */
-/* int count = 0; */
-/* int i, j; */
-/* names = talloc_array(module, const char *, 1); */
-/* if (names == NULL) */
-/* return NULL; */
-
-/* names[0] = NULL; */
-
-/* for (i = 0; map->attribute_maps[i].local_name; i++) { */
-/* BOOL avail = False; */
-/* attr = &map->attribute_maps[i]; */
-/* if (attr == NULL) { */
-/* ldb_debug(module->ldb, LDB_DEBUG_TRACE, "ldb_map: " */
-/* "NULL-Pointer found in attribute maps!\n"); */
-/* /\* Can't ever happen, right? *\/ */
-/* continue; */
-/* } */
-
-/* /\* If all remote attributes for this attribute are */
-/* * present, add the local one to the list *\/ */
-/* switch (attr->type) { */
-/* case MAP_IGNORE: */
-/* break; */
-
-/* case MAP_KEEP: */
-/* avail = (ldb_msg_find_ldb_val(msg, attr->local_name) != NULL); */
-/* break; */
-
-/* case MAP_RENAME: */
-/* case MAP_CONVERT: */
-/* avail = (ldb_msg_find_ldb_val(msg, attr->u.rename.remote_name) != NULL); */
-/* break; */
-
-/* case MAP_GENERATE: */
-/* avail = True; */
-/* for (j = 0; attr->u.generate.remote_names[j]; j++) */
-/* avail &= (BOOL)(ldb_msg_find_ldb_val(msg, attr->u.generate.remote_names[j]) != NULL); */
-/* break; */
-/* } */
-
-/* if (!avail) */
-/* continue; */
-
-/* names = talloc_realloc(module, names, const char *, count+2); */
-/* names[count] = attr->local_name; */
-/* names[count+1] = NULL; */
-/* count++; */
-/* } */
-
-/* return names; */
-/* } */
-
-
/* Mapping data structures */
/* /\* XXX *\/ */
@@ -1150,62 +1156,6 @@
/* return NULL; */
/* } */
-/* /\* XXX *\/ */
-/* /\* Remote message -> Local message *\/ */
-/* static struct ldb_message *mop_ldb_message_incoming(struct ldb_module *module, */
-/* const char *const names[], */
-/* const struct ldb_message *inmsg) */
-/* { */
-/* struct ldb_map_context *map = map_get_context(module); */
-/* struct ldb_message *msg; */
-/* struct ldb_message_element *el; */
-/* const struct ldb_map_attribute *attr; */
-/* int i; */
-
-/* if (names == NULL) */
-/* /\* Generate list of the local attributes that *can* be */
-/* * generated using the specific remote attributes *\/ */
-/* return map_ldb_message_incoming(module, map_msg_available_local_attrs(module, inmsg), inmsg); */
-
-
-/* msg = talloc_zero(module, struct ldb_message); */
-/* if (msg == NULL) */
-/* return NULL; */
-
-/* msg->dn = map_remote_dn(module, module, inmsg->dn); */
-/* if (msg->dn == NULL) */
-/* goto failed; */
-
-/* /\* Map each of the specified attributes *\/ */
-/* for (i = 0; names[i]; i++) { */
-/* attr = find_attr_local(map, names[i]); */
-/* if (attr == NULL) { */
-/* ldb_debug(module->ldb, LDB_DEBUG_WARNING, "ldb_map: " */
-/* "Unable to find local attribute '%s' " */
-/* "when generating incoming message\n", */
-/* names[i]); */
-/* continue; */
-/* } */
-
-/* el = map_remote_msg_element(module, msg, inmsg, attr); */
-/* if (el == NULL) { */
-/* ldb_debug(module->ldb, LDB_DEBUG_WARNING, "ldb_map: " */
-/* "Unable to convert local attribute '%s' " */
-/* "when generating incoming message\n", */
-/* names[i]); */
-/* continue; */
-/* } */
-
-/* ldb_msg_add(msg, el, el->flags); */
-/* } */
-
-/* return msg; */
-
-/* failed: */
-/* talloc_free(msg); */
-/* return NULL; */
-/* } */
-
/* add element to message, overwriting old elements of the same name */
static
int
@@ -1478,8 +1428,17 @@
return 0;
}
+/* TODO: from map_ldb_message_incoming:
+ (names was passed in as the list of local names to generate)
+ if (names == NULL)
+ /\* Generate list of the local attributes that *can* be
+ * generated using the specific remote attributes *\/
+ return map_ldb_message_incoming(module, map_msg_available_local_attrs(module, inmsg), inmsg);
+ */
+
+
/* store single search result in async context */
static
int
More information about the samba-cvs
mailing list