X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=common%2Ftr_idp.c;h=a3d84a733bb67f6df2c227e879048ff8d4f40f20;hb=b5117dd88f660ee157de3cf96f8fb6d952ac342a;hp=2ef9e932f7fcc08ecec0cad3de6e0514d4d8c161;hpb=0705cc5174a47715ade9e2b91b051d6c067f0bd5;p=trust_router.git diff --git a/common/tr_idp.c b/common/tr_idp.c index 2ef9e93..a3d84a7 100644 --- a/common/tr_idp.c +++ b/common/tr_idp.c @@ -33,35 +33,16 @@ */ #include +#include -#include +#include +#include #include #include +#include -static int tr_aaa_server_destructor(void *obj) -{ - TR_AAA_SERVER *aaa=talloc_get_type_abort(obj, TR_AAA_SERVER); - if (aaa->hostname!=NULL) - tr_free_name(aaa->hostname); - return 0; -} - -TR_AAA_SERVER *tr_aaa_server_new(TALLOC_CTX *mem_ctx, TR_NAME *hostname) -{ - TR_AAA_SERVER *aaa=talloc(mem_ctx, TR_AAA_SERVER); - if (aaa!=NULL) { - aaa->hostname=hostname; - talloc_set_destructor((void *)aaa, tr_aaa_server_destructor); - } - return aaa; -} - -void tr_aaa_server_free(TR_AAA_SERVER *aaa) -{ - talloc_free(aaa); -} - -TR_AAA_SERVER *tr_idp_aaa_server_lookup(TR_IDP_REALM *idp_realms, TR_NAME *idp_realm_name, TR_NAME *comm) +/* fills in shared if pointer not null */ +TR_AAA_SERVER *tr_idp_aaa_server_lookup(TR_IDP_REALM *idp_realms, TR_NAME *idp_realm_name, TR_NAME *comm, int *shared_out) { TR_IDP_REALM *idp = NULL; @@ -71,9 +52,11 @@ TR_AAA_SERVER *tr_idp_aaa_server_lookup(TR_IDP_REALM *idp_realms, TR_NAME *idp_r break; } } - if (idp) + if (idp) { + if (shared_out!=NULL) + *shared_out=idp->shared_config; return idp->aaa_servers; - else + } else return NULL; } @@ -108,11 +91,70 @@ TR_IDP_REALM *tr_idp_realm_new(TALLOC_CTX *mem_ctx) idp->aaa_servers=NULL; idp->apcs=NULL; idp->origin=TR_REALM_LOCAL; + idp->refcount=0; talloc_set_destructor((void *)idp, tr_idp_realm_destructor); } return idp; } +void tr_idp_realm_free(TR_IDP_REALM *idp) +{ + talloc_free(idp); +} + +TR_NAME *tr_idp_realm_get_id(TR_IDP_REALM *idp) +{ + if (idp==NULL) + return NULL; + + return idp->realm_id; +} + +TR_NAME *tr_idp_realm_dup_id(TR_IDP_REALM *idp) +{ + if (idp==NULL) + return NULL; + + return tr_dup_name(tr_idp_realm_get_id(idp)); +} + +void tr_idp_realm_set_id(TR_IDP_REALM *idp, TR_NAME *id) +{ + if (idp->realm_id!=NULL) + tr_free_name(idp->realm_id); + idp->realm_id=id; +} + +void tr_idp_realm_set_apcs(TR_IDP_REALM *idp, TR_APC *apc) +{ + if (idp->apcs!=NULL) + tr_apc_free(idp->apcs); + idp->apcs=apc; + talloc_steal(idp, apc); +} + +TR_APC *tr_idp_realm_get_apcs(TR_IDP_REALM *idp) +{ + return idp->apcs; +} + +TR_IDP_REALM *tr_idp_realm_lookup(TR_IDP_REALM *idp_realms, TR_NAME *idp_name) +{ + TR_IDP_REALM *idp = NULL; + + if (!idp_name) { + tr_debug("tr_idp_realm_lookup: Bad parameters."); + return NULL; + } + + for (idp=idp_realms; NULL!=idp; idp=idp->next) { + if (0==tr_name_cmp(tr_idp_realm_get_id(idp), idp_name)) + return idp; + } + return NULL; +} + + static TR_IDP_REALM *tr_idp_realm_tail(TR_IDP_REALM *idp) { if (idp==NULL) @@ -123,8 +165,8 @@ static TR_IDP_REALM *tr_idp_realm_tail(TR_IDP_REALM *idp) return idp; } -/* for correct behavior, call like: idp_realms=tr_idp_realm_add(idp_realms, new_realm); */ -TR_IDP_REALM *tr_idp_realm_add(TR_IDP_REALM *head, TR_IDP_REALM *new) +/* do not call directly, use the tr_idp_realm_add() macro */ +TR_IDP_REALM *tr_idp_realm_add_func(TR_IDP_REALM *head, TR_IDP_REALM *new) { if (head==NULL) head=new; @@ -138,7 +180,38 @@ TR_IDP_REALM *tr_idp_realm_add(TR_IDP_REALM *head, TR_IDP_REALM *new) return head; } -static int tr_idp_realm_apc_count(TR_IDP_REALM *idp) +/* use the macro */ +TR_IDP_REALM *tr_idp_realm_remove_func(TR_IDP_REALM *head, TR_IDP_REALM *remove) +{ + TALLOC_CTX *list_ctx=talloc_parent(head); + TR_IDP_REALM *this=NULL; + + if (head==NULL) + return NULL; + + if (head==remove) { + /* if we're removing the head, put the next element (if present) into the context + * the list head was in. */ + head=head->next; + if (head!=NULL) { + talloc_steal(list_ctx, head); + /* now put all the other elements in the context of the list head */ + for (this=head->next; this!=NULL; this=this->next) + talloc_steal(head, this); + } + } else { + /* not removing the head; no need to play with contexts */ + for (this=head; this->next!=NULL; this=this->next) { + if (this->next==remove) { + this->next=remove->next; + break; + } + } + } + return head; +} + +int tr_idp_realm_apc_count(TR_IDP_REALM *idp) { int ii=0; TR_APC *apc=idp->apcs; @@ -149,7 +222,7 @@ static int tr_idp_realm_apc_count(TR_IDP_REALM *idp) return ii; } -static int tr_idp_realm_aaa_server_count(TR_IDP_REALM *idp) +int tr_idp_realm_aaa_server_count(TR_IDP_REALM *idp) { int ii=0; TR_AAA_SERVER *aaa=idp->aaa_servers; @@ -160,80 +233,45 @@ static int tr_idp_realm_aaa_server_count(TR_IDP_REALM *idp) return ii; } -static char *tr_aaa_server_to_str(TALLOC_CTX *mem_ctx, TR_AAA_SERVER *aaa) +void tr_idp_realm_incref(TR_IDP_REALM *realm) { - return talloc_strndup(mem_ctx, aaa->hostname->buf, aaa->hostname->len); + realm->refcount++; } -char *tr_idp_realm_to_str(TALLOC_CTX *mem_ctx, TR_IDP_REALM *idp) +void tr_idp_realm_decref(TR_IDP_REALM *realm) { - TALLOC_CTX *tmp_ctx=talloc_new(NULL); - char **s_aaa=NULL, *aaa_servers=NULL; - char **s_apc=NULL, *apcs=NULL; - int ii=0, aaa_servers_strlen=0, apcs_strlen=0; - int n_aaa_servers=tr_idp_realm_aaa_server_count(idp); - int n_apcs=tr_idp_realm_apc_count(idp); - TR_AAA_SERVER *aaa=NULL; - TR_APC *apc=NULL; - char *result=NULL; + if (realm->refcount>0) + realm->refcount--; +} - /* get the AAA servers */ - if (n_aaa_servers<=0) - aaa_servers=talloc_strdup(tmp_ctx, ""); - else { - s_aaa=talloc_array(tmp_ctx, char *, n_aaa_servers); - for (aaa=idp->aaa_servers,ii=0; aaa!=NULL; aaa=aaa->next,ii++) { - s_aaa[ii]=tr_aaa_server_to_str(s_aaa, aaa); - aaa_servers_strlen+=strlen(s_aaa[ii]); - } +/* remove any with zero refcount + * Call via macro. */ +TR_IDP_REALM *tr_idp_realm_sweep_func(TR_IDP_REALM *head) +{ + TR_IDP_REALM *idp=NULL; + TR_IDP_REALM *old_next=NULL; - /* add space for comma-space separators */ - aaa_servers_strlen+=2*(n_aaa_servers-1); + if (head==NULL) + return NULL; - aaa_servers=talloc_array(tmp_ctx, char, aaa_servers_strlen+1); - aaa_servers[0]='\0'; - for (ii=0; iirefcount==0)) { + idp=head; /* keep a pointer so we can remove it */ + tr_idp_realm_remove(head, idp); /* use this to get talloc contexts right */ + tr_idp_realm_free(idp); } - /* get the APCs */ - if (n_apcs<=0) - apcs=talloc_strdup(tmp_ctx, ""); - else { - s_apc=talloc_array(tmp_ctx, char *, n_apcs); - for (apc=idp->apcs,ii=0; apc!=NULL; apc=apc->next,ii++) { - s_apc[ii]=tr_apc_to_str(s_apc, apc); - apcs_strlen+=strlen(s_apc[ii]); - } - - /* add space for comma-space separators */ - apcs_strlen+=2*(n_apcs-1); + if (head==NULL) + return NULL; - apcs=talloc_array(tmp_ctx, char, apcs_strlen+1); - apcs[0]='\0'; - for (ii=0; iinext!=NULL); idp=idp->next) { + if (idp->next->refcount==0) { + old_next=idp->next; + tr_idp_realm_remove(head, idp->next); /* changes idp->next, may make it NULL */ + tr_idp_realm_free(old_next); } - talloc_free(s_apc); } - result=talloc_asprintf(mem_ctx, - "IDP realm: \"%.*s\"\n" - " shared: %s\n" - " local: %s\n" - " AAA servers: %s\n" - " APCs: %s\n", - idp->realm_id->len, idp->realm_id->buf, - (idp->shared_config)?"yes":"no", - (idp->origin==TR_REALM_LOCAL)?"yes":"no", - aaa_servers, - apcs); - talloc_free(tmp_ctx); - return result; + return head; } +