X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=common%2Ftr_rp.c;h=0b7d08ef6dfe754f4036427e4309606697c41727;hb=HEAD;hp=afa87fafbae1775ff7625c77a56e874e716acb7a;hpb=01f4563ebc1c802ff7e3a29935744b61466e38e9;p=trust_router.git diff --git a/common/tr_rp.c b/common/tr_rp.c index afa87fa..0b7d08e 100644 --- a/common/tr_rp.c +++ b/common/tr_rp.c @@ -35,92 +35,12 @@ #include #include -#include -#include +#include +#include #include #include #include -static int tr_rp_client_destructor(void *obj) -{ - return 0; -} - -TR_RP_CLIENT *tr_rp_client_new(TALLOC_CTX *mem_ctx) -{ - TR_RP_CLIENT *client=talloc(mem_ctx, TR_RP_CLIENT); - - if (client!=NULL) { - client->next=NULL; - client->comm_next=NULL; - client->gss_names=NULL; - client->filter=NULL; - talloc_set_destructor((void *)client, tr_rp_client_destructor); - } - return client; -} - -void tr_rp_client_free(TR_RP_CLIENT *client) -{ - talloc_free(client); -} - -static TR_RP_CLIENT *tr_rp_client_tail(TR_RP_CLIENT *client) -{ - if (client==NULL) - return NULL; - - while (client->next!=NULL) - client=client->next; - return client; -} - -/* do not call directly, use the tr_rp_client_add() macro */ -TR_RP_CLIENT *tr_rp_client_add_func(TR_RP_CLIENT *clients, TR_RP_CLIENT *new) -{ - if (clients==NULL) - clients=new; - else { - tr_rp_client_tail(clients)->next=new; - while (new!=NULL) { - talloc_steal(clients, new); /* put it in the right context */ - new=new->next; - } - } - return clients; -} - - -int tr_rp_client_add_gss_name(TR_RP_CLIENT *rp_client, TR_NAME *gss_name) -{ - return tr_gss_names_add(rp_client->gss_names, gss_name); -} - -int tr_rp_client_set_filter(TR_RP_CLIENT *client, TR_FILTER *filt) -{ - if (client->filter!=NULL) - tr_filter_free(client->filter); - client->filter=filt; - talloc_steal(client, filt); - return 0; /* success */ -} - -TR_RP_CLIENT *tr_rp_client_lookup(TR_RP_CLIENT *rp_clients, TR_NAME *gss_name) -{ - TR_RP_CLIENT *rp = NULL; - - if ((!rp_clients) || (!gss_name)) { - tr_debug("tr_rp_client_lookup: Bad parameters."); - return NULL; - } - - for (rp = rp_clients; NULL != rp; rp = rp->next) { - if (tr_gss_names_matches(rp->gss_names, gss_name)) - return rp; - } - return NULL; -} - TR_RP_REALM *tr_rp_realm_lookup(TR_RP_REALM *rp_realms, TR_NAME *rp_name) { TR_RP_REALM *rp = NULL; @@ -130,8 +50,8 @@ TR_RP_REALM *tr_rp_realm_lookup(TR_RP_REALM *rp_realms, TR_NAME *rp_name) return NULL; } - for (rp = rp_realms; NULL != rp; rp = rp->next) { - if (tr_name_cmp(tr_rp_realm_get_id(rp), rp_name)) + for (rp=rp_realms; NULL!=rp; rp=rp->next) { + if (0==tr_name_cmp(tr_rp_realm_get_id(rp), rp_name)) return rp; } return NULL; @@ -193,6 +113,37 @@ TR_RP_REALM *tr_rp_realm_add_func(TR_RP_REALM *head, TR_RP_REALM *new) return head; } +/* use the macro */ +TR_RP_REALM *tr_rp_realm_remove_func(TR_RP_REALM *head, TR_RP_REALM *remove) +{ + TALLOC_CTX *list_ctx=talloc_parent(head); + TR_RP_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; +} + void tr_rp_realm_incref(TR_RP_REALM *realm) { realm->refcount++; @@ -204,11 +155,53 @@ void tr_rp_realm_decref(TR_RP_REALM *realm) realm->refcount--; } +/* remove any with zero refcount + * Call via macro. */ +TR_RP_REALM *tr_rp_realm_sweep_func(TR_RP_REALM *head) +{ + TR_RP_REALM *rp=NULL; + TR_RP_REALM *old_next=NULL; + + if (head==NULL) + return NULL; + + while ((head!=NULL) && (head->refcount==0)) { + rp=head; /* keep a pointer so we can remove it */ + tr_rp_realm_remove(head, rp); /* use this to get talloc contexts right */ + tr_rp_realm_free(rp); + } + + if (head==NULL) + return NULL; + + /* will not remove the head here, that has already been done */ + for (rp=head; (rp!=NULL) && (rp->next!=NULL); rp=rp->next) { + if (rp->next->refcount==0) { + old_next=rp->next; + tr_rp_realm_remove(head, rp->next); /* changes rp->next, may make it null */ + tr_rp_realm_free(old_next); + } + } + + return head; +} + TR_NAME *tr_rp_realm_get_id(TR_RP_REALM *rp) { + if (rp==NULL) + return NULL; + return rp->realm_id; } +TR_NAME *tr_rp_realm_dup_id(TR_RP_REALM *rp) +{ + if (rp==NULL) + return NULL; + + return tr_dup_name(tr_rp_realm_get_id(rp)); +} + void tr_rp_realm_set_id(TR_RP_REALM *rp, TR_NAME *id) { if (rp->realm_id!=NULL) @@ -222,3 +215,4 @@ char *tr_rp_realm_to_str(TALLOC_CTX *mem_ctx, TR_RP_REALM *rp) "RP realm: \"%.*s\"\n", rp->realm_id->len, rp->realm_id->buf); } +