2 * Copyright (c) 2012, JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of JANET(UK) nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31 * OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include <tr_name_internal.h>
39 #include <tr_gss_names.h>
40 #include <tr_config.h>
44 TR_RP_REALM *tr_rp_realm_lookup(TR_RP_REALM *rp_realms, TR_NAME *rp_name)
46 TR_RP_REALM *rp = NULL;
49 tr_debug("tr_rp_realm_lookup: Bad parameters.");
53 for (rp=rp_realms; NULL!=rp; rp=rp->next) {
54 if (0==tr_name_cmp(tr_rp_realm_get_id(rp), rp_name))
60 static int tr_rp_realm_destructor(void *obj)
62 TR_RP_REALM *rp=talloc_get_type_abort(obj, TR_RP_REALM);
63 if (rp->realm_id!=NULL)
64 tr_free_name(rp->realm_id);
68 TR_RP_REALM *tr_rp_realm_new(TALLOC_CTX *mem_ctx)
70 TR_RP_REALM *rp=talloc(mem_ctx, TR_RP_REALM);
75 talloc_set_destructor((void *)rp, tr_rp_realm_destructor);
80 void tr_rp_realm_free(TR_RP_REALM *rp)
85 /* talloc note: lists of idp realms should be assembled using
86 * tr_idp_realm_add(). This will put all of the elements in the
87 * list, other than the head, as children of the head context.
88 * The head can then be placed in whatever context is desired. */
90 static TR_RP_REALM *tr_rp_realm_tail(TR_RP_REALM *realm)
95 while (realm->next!=NULL)
100 /* for correct behavior, call like: rp_realms=tr_rp_realm_add_func(rp_realms, new_realm);
101 * or better yet, use the macro */
102 TR_RP_REALM *tr_rp_realm_add_func(TR_RP_REALM *head, TR_RP_REALM *new)
107 tr_rp_realm_tail(head)->next=new;
109 talloc_steal(head, new); /* put it in the right context */
117 TR_RP_REALM *tr_rp_realm_remove_func(TR_RP_REALM *head, TR_RP_REALM *remove)
119 TALLOC_CTX *list_ctx=talloc_parent(head);
120 TR_RP_REALM *this=NULL;
126 /* if we're removing the head, put the next element (if present) into the context
127 * the list head was in. */
130 talloc_steal(list_ctx, head);
131 /* now put all the other elements in the context of the list head */
132 for (this=head->next; this!=NULL; this=this->next)
133 talloc_steal(head, this);
136 /* not removing the head; no need to play with contexts */
137 for (this=head; this->next!=NULL; this=this->next) {
138 if (this->next==remove) {
139 this->next=remove->next;
147 void tr_rp_realm_incref(TR_RP_REALM *realm)
152 void tr_rp_realm_decref(TR_RP_REALM *realm)
154 if (realm->refcount>0)
158 /* remove any with zero refcount
160 TR_RP_REALM *tr_rp_realm_sweep_func(TR_RP_REALM *head)
162 TR_RP_REALM *rp=NULL;
163 TR_RP_REALM *old_next=NULL;
168 while ((head!=NULL) && (head->refcount==0)) {
169 rp=head; /* keep a pointer so we can remove it */
170 tr_rp_realm_remove(head, rp); /* use this to get talloc contexts right */
171 tr_rp_realm_free(rp);
177 /* will not remove the head here, that has already been done */
178 for (rp=head; (rp!=NULL) && (rp->next!=NULL); rp=rp->next) {
179 if (rp->next->refcount==0) {
181 tr_rp_realm_remove(head, rp->next); /* changes rp->next, may make it null */
182 tr_rp_realm_free(old_next);
189 TR_NAME *tr_rp_realm_get_id(TR_RP_REALM *rp)
197 TR_NAME *tr_rp_realm_dup_id(TR_RP_REALM *rp)
202 return tr_dup_name(tr_rp_realm_get_id(rp));
205 void tr_rp_realm_set_id(TR_RP_REALM *rp, TR_NAME *id)
207 if (rp->realm_id!=NULL)
208 tr_free_name(rp->realm_id);
212 char *tr_rp_realm_to_str(TALLOC_CTX *mem_ctx, TR_RP_REALM *rp)
214 return talloc_asprintf(mem_ctx,
215 "RP realm: \"%.*s\"\n",
216 rp->realm_id->len, rp->realm_id->buf);