+
+void *dalloc_get(const DALLOC_CTX *d, ...)
+{
+ EC_INIT;
+ void *p = NULL;
+ va_list args;
+ const char *type;
+ int elem;
+ const char *elemtype;
+
+ va_start(args, d);
+ type = va_arg(args, const char *);
+
+ if (STRCMP(type, !=, "DALLOC_CTX"))
+ EC_FAIL;
+
+ while (STRCMP(type, ==, "DALLOC_CTX")) {
+ elem = va_arg(args, int);
+ AFP_ASSERT(elem < talloc_array_length(d->dd_talloc_array));
+ d = d->dd_talloc_array[elem];
+ type = va_arg(args, const char *);
+ }
+
+ elem = va_arg(args, int);
+ AFP_ASSERT(elem < talloc_array_length(d->dd_talloc_array));
+
+ p = talloc_check_name(d->dd_talloc_array[elem], type);
+
+ va_end(args);
+
+EC_CLEANUP:
+ if (ret != 0)
+ p = NULL;
+ return p;
+}
+
+void *dalloc_value_for_key(const DALLOC_CTX *d, ...)
+{
+ EC_INIT;
+ void *p = NULL;
+ va_list args;
+ const char *type;
+ int elem;
+ const char *elemtype;
+ char *s;
+
+ va_start(args, d);
+ type = va_arg(args, const char *);
+
+ if (STRCMP(type, !=, "DALLOC_CTX"))
+ EC_FAIL;
+
+ while (STRCMP(type, ==, "DALLOC_CTX")) {
+ elem = va_arg(args, int);
+ AFP_ASSERT(elem < talloc_array_length(d->dd_talloc_array));
+ d = d->dd_talloc_array[elem];
+ type = va_arg(args, const char *);
+ }
+
+ for (elem = 0; elem + 1 < talloc_array_length(d->dd_talloc_array); elem += 2) {
+ memcpy(&s, d->dd_talloc_array[elem], sizeof(char *));
+ if (STRCMP(s, ==, type)) {
+ p = d->dd_talloc_array[elem + 1];
+ break;
+ }
+ }
+ va_end(args);
+
+EC_CLEANUP:
+ if (ret != 0)
+ p = NULL;
+ return p;
+}