Author: mkhl Date: 2006-08-05 17:54:52 +0000 (Sat, 05 Aug 2006) New Revision: 17427
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17427 Log: Change mapping type for "objectClass" into `generate'. Add generator functions for "objectClass" elements, converting their values as before but adding an objectClass of "extensibleObject" in the remote partition. 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-08-05 17:52:23 UTC (rev 17426) +++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-05 17:54:52 UTC (rev 17427) @@ -1890,10 +1890,62 @@ return ldb_val_dup(mem_ctx, val); } +/* Generate a remote message with a mapped objectClass. */ +static +void +map_objectclass_generate_remote(struct ldb_module *module, + const char *local_attr, + const struct ldb_message *old, + struct ldb_message *remote, + struct ldb_message *local) +{ + struct ldb_message_element *el, *oc; + struct ldb_val val; + int i; + + /* Find old local objectClass */ + oc = ldb_msg_find_element(old, local_attr); + if (oc == NULL) { + return; + } + + /* Prepare new element */ + el = talloc_zero(remote, struct ldb_message_element); + if (el == NULL) { + ldb_oom(module->ldb); + return; /* TODO: fail? */ + } + + /* Copy local objectClass element, reverse space for an extra value */ + el->num_values = oc->num_values + 1; + el->values = talloc_array(el, struct ldb_val, el->num_values); + if (el->values == NULL) { + talloc_free(el); + ldb_oom(module->ldb); + return; /* TODO: fail? */ + } + + /* Copy local element name "objectClass" */ + el->name = talloc_strdup(el, local_attr); + + /* Convert all local objectClasses */ + for (i = 0; i < el->num_values - 1; i++) { + el->values[i] = map_objectclass_convert_local(module, el->values, &oc->values[i]); + } + + val.data = (uint8_t *)talloc_strdup(el->values, "extensibleObject"); + val.length = strlen((char *)val.data); + + /* Append additional objectClass "extensibleObject" */ + el->values[i] = val; + + /* Add new objectClass to remote message */ + ldb_msg_add(remote, el, 0); +} + /* Map an objectClass into the local partition. */ static -struct -ldb_val +struct ldb_val map_objectclass_convert_remote(struct ldb_module *module, void *mem_ctx, const struct ldb_val *val) @@ -1912,7 +1964,67 @@ return ldb_val_dup(mem_ctx, val); } +/* Generate a local message with a mapped objectClass. */ +static +struct ldb_message_element * +map_objectclass_generate_local(struct ldb_module *module, + void *mem_ctx, + const char *remote_attr, + const struct ldb_message *remote) +{ + struct ldb_message_element *el, *oc; + struct ldb_val val; + int i; + /* Find old remote objectClass */ + oc = ldb_msg_find_element(remote, remote_attr); + if (oc == NULL) { + return NULL; + } + + /* Prepare new element */ + el = talloc_zero(mem_ctx, struct ldb_message_element); + if (el == NULL) { + ldb_oom(module->ldb); + return NULL; + } + + /* Copy remote objectClass element */ + el->num_values = oc->num_values; + el->values = talloc_array(el, struct ldb_val, el->num_values); + if (el->values == NULL) { + talloc_free(el); + ldb_oom(module->ldb); + return NULL; + } + + /* Copy remote element name "objectClass" */ + el->name = talloc_strdup(el, remote_attr); + + /* Convert all remote objectClasses */ + for (i = 0; i < el->num_values; i++) { + el->values[i] = map_objectclass_convert_remote(module, el->values, &oc->values[i]); + } + + val.data = (uint8_t *)talloc_strdup(el->values, "extensibleObject"); + val.length = strlen((char *)val.data); + + /* Remove last value if it was "extensibleObject" */ + if (ldb_val_equal_exact(&val, &el->values[i-1])) { + el->num_values--; + el->values = talloc_realloc(el, el->values, struct ldb_val, el->num_values); + if (el->values == NULL) { + talloc_free(el); + ldb_oom(module->ldb); + return NULL; + } + } + + return el; +} + + + /* Auxiliary request construction * ============================== */ @@ -3099,12 +3211,12 @@ }, { .local_name = "objectclass", - .type = MAP_CONVERT, + .type = MAP_GENERATE, .u = { - .convert = { - .remote_name = "objectclass", - .convert_local = map_objectclass_convert_local, - .convert_remote = map_objectclass_convert_remote, + .generate = { + .remote_names = { "objectclass", NULL }, + .generate_local = map_objectclass_generate_local, + .generate_remote = map_objectclass_generate_remote, }, }, },