- thisext->which = ODR_EXTERNAL_octet;
- if (!(thisext->u.octet_aligned = odr_malloc(a->encode,
- sizeof(Odr_oct))))
- return 0;
- if (!(thisext->u.octet_aligned->buf = odr_malloc(a->encode, fres->len)))
- return 0;
- memcpy(thisext->u.octet_aligned->buf, fres->record, fres->len);
- thisext->u.octet_aligned->len = thisext->u.octet_aligned->size =
- fres->len;
+ if (fres->len < 0) /* Structured data */
+ {
+ switch (fres->format)
+ {
+ case VAL_SUTRS: thisext->which = Z_External_sutrs; break;
+ case VAL_GRS1: thisext->which = Z_External_grs1; break;
+ case VAL_EXPLAIN: thisext->which = Z_External_explainRecord;
+ break;
+
+ default:
+ logf(LOG_FATAL, "Unknown structured format from backend.");
+ return 0;
+ }
+
+ /*
+ * We cheat on the pointers here. Obviously, the record field
+ * of the backend-fetch structure should have been a union for
+ * correctness, but we're stuck with this for backwards
+ * compatibility.
+ */
+ thisext->u.grs1 = (Z_GenericRecord*) fres->record;
+ }
+ else if (fres->format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */
+ {
+ Odr_oct *sutrs = odr_malloc(a->encode, sizeof(*sutrs));
+
+ thisext->which = Z_External_sutrs;
+ thisext->u.sutrs = sutrs;
+ sutrs->buf = odr_malloc(a->encode, fres->len);
+ sutrs->len = sutrs->size = fres->len;
+ memcpy(sutrs->buf, fres->record, fres->len);
+ }
+ else /* octet-aligned record. */
+ {
+ thisext->which = Z_External_octet;
+ if (!(thisext->u.octet_aligned = odr_malloc(a->encode,
+ sizeof(Odr_oct))))
+ return 0;
+ if (!(thisext->u.octet_aligned->buf = odr_malloc(a->encode,
+ fres->len)))
+ return 0;
+ memcpy(thisext->u.octet_aligned->buf, fres->record, fres->len);
+ thisext->u.octet_aligned->len = thisext->u.octet_aligned->size =
+ fres->len;
+ }