+TR_REALM_ROLE trp_inforec_get_role(TRP_INFOREC *rec)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL)
+ return rec->data->comm->role;
+ break;
+ default:
+ break;
+ }
+ return TR_ROLE_UNKNOWN;
+}
+
+TRP_RC trp_inforec_set_role(TRP_INFOREC *rec, TR_REALM_ROLE role)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL) {
+ rec->data->comm->role=role;
+ return TRP_SUCCESS;
+ break;
+ }
+ default:
+ break;
+ }
+ return TRP_ERROR;
+}
+
+TR_APC *trp_inforec_get_apcs(TRP_INFOREC *rec)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL)
+ return rec->data->comm->apcs;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+TRP_RC trp_inforec_set_apcs(TRP_INFOREC *rec, TR_APC *apcs)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL) {
+ rec->data->comm->apcs=apcs;
+ talloc_steal(rec, apcs);
+ return TRP_SUCCESS;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return TRP_ERROR;
+}
+
+TR_NAME *trp_inforec_get_owner_realm(TRP_INFOREC *rec)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL)
+ return rec->data->comm->owner_realm;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+TRP_RC trp_inforec_set_owner_realm(TRP_INFOREC *rec, TR_NAME *name)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL) {
+ rec->data->comm->owner_realm=name;
+ return TRP_SUCCESS;
+ default:
+ break;
+ }
+ break;
+ }
+ return TRP_ERROR;
+}
+
+TR_NAME *trp_inforec_get_owner_contact(TRP_INFOREC *rec)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL)
+ return rec->data->comm->owner_contact;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+TRP_RC trp_inforec_set_owner_contact(TRP_INFOREC *rec, TR_NAME *name)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL) {
+ rec->data->comm->owner_contact=name;
+ return TRP_SUCCESS;
+ }
+ break;
+ default:
+ break;
+ }
+ return TRP_ERROR;
+}
+
+/* caller needs to incref the output if they're going to hang on to it */
+json_t *trp_inforec_get_provenance(TRP_INFOREC *rec)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL)
+ return rec->data->comm->provenance;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+/* increments the reference count */
+TRP_RC trp_inforec_set_provenance(TRP_INFOREC *rec, json_t *prov)
+{
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ if (rec->data->comm!=NULL) {
+ if (rec->data->comm->provenance!=NULL)
+ json_decref(rec->data->comm->provenance);
+ rec->data->comm->provenance=prov;
+ json_incref(prov);
+ return TRP_SUCCESS;
+ }
+ break;
+ default:
+ break;
+ }
+ return TRP_ERROR;
+}
+
+static TRP_RC trp_inforec_add_to_provenance(TRP_INFOREC *rec, TR_NAME *name)
+{
+ json_t *jname=NULL;
+
+ switch (rec->type) {
+ case TRP_INFOREC_TYPE_ROUTE:
+ /* no provenance list */
+ break;
+ case TRP_INFOREC_TYPE_COMMUNITY:
+ jname=tr_name_to_json_string(name);
+ if (jname==NULL)
+ return TRP_ERROR;
+ if (rec->data->comm->provenance==NULL) {
+ rec->data->comm->provenance=json_array();
+ if (rec->data->comm->provenance==NULL) {
+ json_decref(jname);
+ return TRP_ERROR;
+ }
+ }
+ if (0!=json_array_append_new(rec->data->comm->provenance, jname)) {
+ json_decref(jname);
+ return TRP_ERROR;
+ }
+ break;
+ default:
+ break;
+ }
+ return TRP_SUCCESS;
+}
+
+TR_NAME *trp_inforec_dup_origin(TRP_INFOREC *rec)
+{
+ TR_NAME *origin=NULL;
+ json_t *prov=trp_inforec_get_provenance(rec);
+ const char *s=NULL;
+
+ if (prov==NULL)
+ return NULL;
+
+ s=json_string_value(json_array_get(prov, 0));
+ if (s==NULL) {
+ tr_debug("trp_inforec_dup_origin: empty origin in provenance list.");
+ return NULL;
+ }
+ origin=tr_new_name(s);
+ return origin;
+}
+