diff --git a/include/heimqueue.h b/include/heimqueue.h index 423a68478..f54f7d7a2 100644 --- a/include/heimqueue.h +++ b/include/heimqueue.h @@ -35,6 +35,81 @@ #ifndef _HEIM_QUEUE_H_ #define _HEIM_QUEUE_H_ +/* + * Singly-linked List definitions. + */ +#define HEIM_SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define HEIM_SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define HEIM_SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define HEIM_SLIST_INIT(head) do { \ + (head)->slh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + HEIM_SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while(curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + +/* + * Singly-linked List access methods. + */ +#define HEIM_SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define HEIM_SLIST_FIRST(head) ((head)->slh_first) +#define HEIM_SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +/* + * Singly-linked List atomic functions. + */ +#include "heimbase.h" + +#define HEIM_SLIST_ATOMIC_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = \ + heim_base_exchange_pointer(&(head)->slh_first, (elm)); \ +} while (/*CONSTCOND*/0) + +#define HEIM_SLIST_ATOMIC_FOREACH(var, head, field) \ + for ((void)heim_base_exchange_pointer(&(var), (head)->slh_first); \ + (var) != NULL; \ + (void)heim_base_exchange_pointer(&(var), (var)->field.sle_next)) + /* * Tail queue definitions. */ @@ -146,11 +221,30 @@ struct { \ (var); \ (var) = ((var)->field.tqe_next)) +#define HEIM_TAILQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->tqh_first); \ + (var) != NULL && ((next) = HEIM_TAILQ_NEXT(var, field), 1); \ + (var) = (next)) + #define HEIM_TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ (var); \ (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) +#define HEIM_TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, prev) \ + for ((var) = HEIM_TAILQ_LAST((head), headname); \ + (var) && ((prev) = HEIM_TAILQ_PREV((var), headname, field), 1);\ + (var) = (prev)) + +#define HEIM_TAILQ_CONCAT(head1, head2, field) do { \ + if (!HEIM_TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + HEIM_TAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + /* * Tail queue access methods. */ diff --git a/lib/gssapi/Makefile.am b/lib/gssapi/Makefile.am index c9ba40643..7f668e091 100644 --- a/lib/gssapi/Makefile.am +++ b/lib/gssapi/Makefile.am @@ -157,7 +157,6 @@ mechsrc = \ mech/gss_wrap_size_limit.c \ mech/gss_inquire_sec_context_by_oid.c \ mech/mech_switch.h \ - mech/mechqueue.h \ mech/mech_locl.h \ mech/name.h \ mech/utils.h diff --git a/lib/gssapi/NTMakefile b/lib/gssapi/NTMakefile index 54a6dffe3..b5b4c3f54 100644 --- a/lib/gssapi/NTMakefile +++ b/lib/gssapi/NTMakefile @@ -173,7 +173,6 @@ mechsrc = \ mech/gss_wrap_size_limit.c \ mech/gss_inquire_sec_context_by_oid.c \ mech/mech_switch.h \ - mech/mechqueue.h \ mech/mech_locl.h \ mech/name.h \ mech/utils.h diff --git a/lib/gssapi/mech/cred.c b/lib/gssapi/mech/cred.c index 63af0f76f..aa0b89d8a 100644 --- a/lib/gssapi/mech/cred.c +++ b/lib/gssapi/mech/cred.c @@ -52,12 +52,11 @@ release_mech_cred(OM_uint32 *minor, struct _gss_mechanism_cred *mc) void _gss_mg_release_cred(struct _gss_cred *cred) { - struct _gss_mechanism_cred *mc; + struct _gss_mechanism_cred *mc, *next; OM_uint32 junk; - while (HEIM_SLIST_FIRST(&cred->gc_mc)) { - mc = HEIM_SLIST_FIRST(&cred->gc_mc); - HEIM_SLIST_REMOVE_HEAD(&cred->gc_mc, gmc_link); + HEIM_TAILQ_FOREACH_SAFE(mc, &cred->gc_mc, gmc_link, next) { + HEIM_TAILQ_REMOVE(&cred->gc_mc, mc, gmc_link); release_mech_cred(&junk, mc); } free(cred); @@ -70,7 +69,7 @@ _gss_mg_alloc_cred(void) cred = calloc(1, sizeof(struct _gss_cred)); if (cred == NULL) return NULL; - HEIM_SLIST_INIT(&cred->gc_mc); + HEIM_TAILQ_INIT(&cred->gc_mc); return cred; } @@ -81,20 +80,17 @@ gss_release_cred_by_mech(OM_uint32 *minor_status, gss_const_OID mech_oid) { struct _gss_cred *cred = (struct _gss_cred *)cred_handle; - struct _gss_mechanism_cred *mc; - OM_uint32 major_status; + struct _gss_mechanism_cred *mc, *next; + OM_uint32 major_status = GSS_S_NO_CRED; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { - if (gss_oid_equal(mech_oid, mc->gmc_mech_oid)) - break; - } + *minor_status = 0; - if (mc) { - HEIM_SLIST_REMOVE(&cred->gc_mc, mc, _gss_mechanism_cred, gmc_link); - major_status = release_mech_cred(minor_status, mc); - } else { - *minor_status = 0; - major_status = GSS_S_NO_CRED; + HEIM_TAILQ_FOREACH_SAFE(mc, &cred->gc_mc, gmc_link, next) { + if (gss_oid_equal(mech_oid, mc->gmc_mech_oid)) { + HEIM_TAILQ_REMOVE(&cred->gc_mc, mc, gmc_link); + major_status = release_mech_cred(minor_status, mc); + break; + } } return major_status; diff --git a/lib/gssapi/mech/cred.h b/lib/gssapi/mech/cred.h index 33e7bb6e5..7ae22fc4a 100644 --- a/lib/gssapi/mech/cred.h +++ b/lib/gssapi/mech/cred.h @@ -28,12 +28,12 @@ */ struct _gss_mechanism_cred { - HEIM_SLIST_ENTRY(_gss_mechanism_cred) gmc_link; + HEIM_TAILQ_ENTRY(_gss_mechanism_cred) gmc_link; gssapi_mech_interface gmc_mech; /* mechanism ops for MC */ gss_OID gmc_mech_oid; /* mechanism oid for MC */ gss_cred_id_t gmc_cred; /* underlying MC */ }; -HEIM_SLIST_HEAD(_gss_mechanism_cred_list, _gss_mechanism_cred); +HEIM_TAILQ_HEAD(_gss_mechanism_cred_list, _gss_mechanism_cred); struct _gss_cred { struct _gss_mechanism_cred_list gc_mc; diff --git a/lib/gssapi/mech/gss_accept_sec_context.c b/lib/gssapi/mech/gss_accept_sec_context.c index 4e970223a..100ac7427 100644 --- a/lib/gssapi/mech/gss_accept_sec_context.c +++ b/lib/gssapi/mech/gss_accept_sec_context.c @@ -209,7 +209,7 @@ gss_accept_sec_context(OM_uint32 *minor_status, } if (cred) { - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) if (mc->gmc_mech == m) break; if (!mc) { @@ -295,7 +295,7 @@ gss_accept_sec_context(OM_uint32 *minor_status, dmc->gmc_mech = m; dmc->gmc_mech_oid = &m->gm_mech_oid; dmc->gmc_cred = delegated_mc; - HEIM_SLIST_INSERT_HEAD(&dcred->gc_mc, dmc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&dcred->gc_mc, dmc, gmc_link); *delegated_cred_handle = (gss_cred_id_t) dcred; } diff --git a/lib/gssapi/mech/gss_acquire_cred_from.c b/lib/gssapi/mech/gss_acquire_cred_from.c index 195505306..9293da91b 100644 --- a/lib/gssapi/mech/gss_acquire_cred_from.c +++ b/lib/gssapi/mech/gss_acquire_cred_from.c @@ -219,7 +219,7 @@ gss_acquire_cred_from(OM_uint32 *minor_status, continue; } - HEIM_SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&cred->gc_mc, mc, gmc_link); if (cred_time < min_time) min_time = cred_time; @@ -236,7 +236,7 @@ gss_acquire_cred_from(OM_uint32 *minor_status, * If we didn't manage to create a single credential, return * an error. */ - if (!HEIM_SLIST_FIRST(&cred->gc_mc)) { + if (!HEIM_TAILQ_FIRST(&cred->gc_mc)) { if (mechs->count > 1) { *minor_status = 0; major_status = GSS_S_NO_CRED; diff --git a/lib/gssapi/mech/gss_add_cred_from.c b/lib/gssapi/mech/gss_add_cred_from.c index f1a0514a1..785ea9d04 100644 --- a/lib/gssapi/mech/gss_add_cred_from.c +++ b/lib/gssapi/mech/gss_add_cred_from.c @@ -175,7 +175,7 @@ gss_add_cred_from(OM_uint32 *minor_status, * mechanism. If it matches, we call gss_add_cred for that mechanism, * otherwise we just add a new mc. */ - HEIM_SLIST_FOREACH(mc, &mut_cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &mut_cred->gc_mc, gmc_link) { if (!gss_oid_equal(mc->gmc_mech_oid, desired_mech)) continue; major_status = _gss_mg_add_mech_cred(minor_status, m, @@ -196,7 +196,7 @@ gss_add_cred_from(OM_uint32 *minor_status, _gss_mg_error(m, *minor_status); goto done; } - HEIM_SLIST_INSERT_HEAD(&mut_cred->gc_mc, new_mc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&mut_cred->gc_mc, new_mc, gmc_link); new_mc = NULL; done: diff --git a/lib/gssapi/mech/gss_authorize_localname.c b/lib/gssapi/mech/gss_authorize_localname.c index 75060a446..b72b7bde8 100644 --- a/lib/gssapi/mech/gss_authorize_localname.c +++ b/lib/gssapi/mech/gss_authorize_localname.c @@ -45,7 +45,7 @@ mech_authorize_localname(OM_uint32 *minor_status, OM_uint32 major_status = GSS_S_NAME_NOT_MN; struct _gss_mechanism_name *mn; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (m->gm_authorize_localname == NULL) { @@ -134,7 +134,7 @@ gss_authorize_localname(OM_uint32 *minor_status, * not possible to make this check. */ #if 0 - if (HEIM_SLIST_FIRST(&user->gn_mn) != NULL) + if (HEIM_TAILQ_FIRST(&user->gn_mn) != NULL) return GSS_S_BAD_NAME; #endif diff --git a/lib/gssapi/mech/gss_compare_name.c b/lib/gssapi/mech/gss_compare_name.c index 781a8bf21..fdeb6c757 100644 --- a/lib/gssapi/mech/gss_compare_name.c +++ b/lib/gssapi/mech/gss_compare_name.c @@ -57,7 +57,7 @@ gss_compare_name(OM_uint32 *minor_status, struct _gss_mechanism_name *mn1; struct _gss_mechanism_name *mn2; - HEIM_SLIST_FOREACH(mn1, &name1->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn1, &name1->gn_mn, gmn_link) { OM_uint32 major_status; major_status = _gss_find_mn(minor_status, name2, @@ -70,7 +70,7 @@ gss_compare_name(OM_uint32 *minor_status, name_equal)); } } - HEIM_SLIST_FOREACH(mn2, &name2->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn2, &name2->gn_mn, gmn_link) { OM_uint32 major_status; major_status = _gss_find_mn(minor_status, name1, diff --git a/lib/gssapi/mech/gss_cred.c b/lib/gssapi/mech/gss_cred.c index 3660dbe46..79f11e090 100644 --- a/lib/gssapi/mech/gss_cred.c +++ b/lib/gssapi/mech/gss_cred.c @@ -63,7 +63,7 @@ gss_export_cred(OM_uint32 * minor_status, return GSS_S_NO_CRED; } - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { if (mc->gmc_mech->gm_export_cred == NULL) { *minor_status = 0; return GSS_S_NO_CRED; @@ -76,7 +76,7 @@ gss_export_cred(OM_uint32 * minor_status, return GSS_S_FAILURE; } - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { major = mc->gmc_mech->gm_export_cred(minor_status, mc->gmc_cred, &buffer); @@ -201,12 +201,12 @@ gss_import_cred(OM_uint32 * minor_status, mc->gmc_mech_oid = &m->gm_mech_oid; mc->gmc_cred = mcred; - HEIM_SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&cred->gc_mc, mc, gmc_link); } krb5_storage_free(sp); sp = NULL; - if (HEIM_SLIST_EMPTY(&cred->gc_mc)) { + if (HEIM_TAILQ_EMPTY(&cred->gc_mc)) { major = GSS_S_NO_CRED; goto out; } diff --git a/lib/gssapi/mech/gss_delete_name_attribute.c b/lib/gssapi/mech/gss_delete_name_attribute.c index ce2dbdefc..a1ca5daf8 100644 --- a/lib/gssapi/mech/gss_delete_name_attribute.c +++ b/lib/gssapi/mech/gss_delete_name_attribute.c @@ -46,7 +46,7 @@ gss_delete_name_attribute(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_delete_name_attribute) diff --git a/lib/gssapi/mech/gss_destroy_cred.c b/lib/gssapi/mech/gss_destroy_cred.c index 03f1df3b7..f3bd54981 100644 --- a/lib/gssapi/mech/gss_destroy_cred.c +++ b/lib/gssapi/mech/gss_destroy_cred.c @@ -34,7 +34,8 @@ gss_destroy_cred(void *status, gss_cred_id_t *cred_handle) { struct _gss_cred *cred; - struct _gss_mechanism_cred *mc; + struct _gss_mechanism_cred *mc, *next; + OM_uint32 junk; if (cred_handle == NULL) @@ -45,9 +46,8 @@ gss_destroy_cred(void *status, cred = (struct _gss_cred *)*cred_handle; *cred_handle = GSS_C_NO_CREDENTIAL; - while (HEIM_SLIST_FIRST(&cred->gc_mc)) { - mc = HEIM_SLIST_FIRST(&cred->gc_mc); - HEIM_SLIST_REMOVE_HEAD(&cred->gc_mc, gmc_link); + HEIM_TAILQ_FOREACH_SAFE(mc, &cred->gc_mc, gmc_link, next) { + HEIM_TAILQ_REMOVE(&cred->gc_mc, mc, gmc_link); if (mc->gmc_mech->gm_destroy_cred) mc->gmc_mech->gm_destroy_cred(&junk, &mc->gmc_cred); else diff --git a/lib/gssapi/mech/gss_display_name.c b/lib/gssapi/mech/gss_display_name.c index cf8e9186a..fadd68ba3 100644 --- a/lib/gssapi/mech/gss_display_name.c +++ b/lib/gssapi/mech/gss_display_name.c @@ -67,7 +67,7 @@ gss_display_name(OM_uint32 *minor_status, *minor_status = 0; return (GSS_S_COMPLETE); } else { - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { major_status = mn->gmn_mech->gm_display_name( minor_status, mn->gmn_name, output_name_buffer, diff --git a/lib/gssapi/mech/gss_display_name_ext.c b/lib/gssapi/mech/gss_display_name_ext.c index 91d16152f..80ea72b8d 100644 --- a/lib/gssapi/mech/gss_display_name_ext.c +++ b/lib/gssapi/mech/gss_display_name_ext.c @@ -48,7 +48,7 @@ gss_display_name_ext(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_display_name_ext) diff --git a/lib/gssapi/mech/gss_duplicate_cred.c b/lib/gssapi/mech/gss_duplicate_cred.c index 19c4c1974..720b4b47f 100644 --- a/lib/gssapi/mech/gss_duplicate_cred.c +++ b/lib/gssapi/mech/gss_duplicate_cred.c @@ -132,14 +132,14 @@ gss_duplicate_cred(OM_uint32 *minor_status, *minor_status = 0; major_status = GSS_S_NO_CRED; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { struct _gss_mechanism_cred *copy_mc; major_status = copy_cred_element(minor_status, mc, ©_mc); if (major_status != GSS_S_COMPLETE) break; - HEIM_SLIST_INSERT_HEAD(&new_cred->gc_mc, copy_mc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&new_cred->gc_mc, copy_mc, gmc_link); } if (major_status != GSS_S_COMPLETE) { diff --git a/lib/gssapi/mech/gss_duplicate_name.c b/lib/gssapi/mech/gss_duplicate_name.c index 222b683e1..e8d1e323a 100644 --- a/lib/gssapi/mech/gss_duplicate_name.c +++ b/lib/gssapi/mech/gss_duplicate_name.c @@ -53,7 +53,7 @@ gss_duplicate_name(OM_uint32 *minor_status, return (major_status); new_name = (struct _gss_name *) *dest_name; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { struct _gss_mechanism_name *mn2; _gss_find_mn(minor_status, new_name, mn->gmn_mech_oid, &mn2); @@ -66,7 +66,7 @@ gss_duplicate_name(OM_uint32 *minor_status, } *dest_name = (gss_name_t) new_name; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { struct _gss_mechanism_name *new_mn; new_mn = malloc(sizeof(*new_mn)); @@ -84,7 +84,7 @@ gss_duplicate_name(OM_uint32 *minor_status, free(new_mn); continue; } - HEIM_SLIST_INSERT_HEAD(&new_name->gn_mn, new_mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&new_name->gn_mn, new_mn, gmn_link); } } diff --git a/lib/gssapi/mech/gss_export_name.c b/lib/gssapi/mech/gss_export_name.c index 7365c720d..885375421 100644 --- a/lib/gssapi/mech/gss_export_name.c +++ b/lib/gssapi/mech/gss_export_name.c @@ -57,7 +57,7 @@ gss_export_name(OM_uint32 *minor_status, * one, otherwise export based on the first mechanism in our * list. */ - mn = HEIM_SLIST_FIRST(&name->gn_mn); + mn = HEIM_TAILQ_FIRST(&name->gn_mn); if (!mn) { *minor_status = 0; return (GSS_S_NAME_NOT_MN); diff --git a/lib/gssapi/mech/gss_export_name_composite.c b/lib/gssapi/mech/gss_export_name_composite.c index 922055204..d833ebbba 100644 --- a/lib/gssapi/mech/gss_export_name_composite.c +++ b/lib/gssapi/mech/gss_export_name_composite.c @@ -47,7 +47,7 @@ gss_export_name_composite(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_export_name_composite) diff --git a/lib/gssapi/mech/gss_get_name_attribute.c b/lib/gssapi/mech/gss_get_name_attribute.c index f2b14fede..f2e4169e1 100644 --- a/lib/gssapi/mech/gss_get_name_attribute.c +++ b/lib/gssapi/mech/gss_get_name_attribute.c @@ -57,7 +57,7 @@ gss_get_name_attribute(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_get_name_attribute) diff --git a/lib/gssapi/mech/gss_get_neg_mechs.c b/lib/gssapi/mech/gss_get_neg_mechs.c index 1ef7792d4..500db0cc4 100644 --- a/lib/gssapi/mech/gss_get_neg_mechs.c +++ b/lib/gssapi/mech/gss_get_neg_mechs.c @@ -68,7 +68,7 @@ gss_get_neg_mechs (OM_uint32 *minor_status, major = GSS_S_UNAVAILABLE; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { gssapi_mech_interface m; gss_OID_set mechs2 = GSS_C_NO_OID_SET; size_t i; diff --git a/lib/gssapi/mech/gss_import_name.c b/lib/gssapi/mech/gss_import_name.c index 438a1144b..d268b5e45 100644 --- a/lib/gssapi/mech/gss_import_name.c +++ b/lib/gssapi/mech/gss_import_name.c @@ -221,8 +221,6 @@ gss_import_name(OM_uint32 *minor_status, return (GSS_S_FAILURE); } - HEIM_SLIST_INIT(&name->gn_mn); - major_status = _gss_intern_oid(minor_status, name_type, &name->gn_type); if (major_status) { @@ -241,7 +239,7 @@ gss_import_name(OM_uint32 *minor_status, * for those supported this nametype. */ - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { int present = 0; major_status = gss_test_oid_set_member(minor_status, @@ -276,14 +274,14 @@ gss_import_name(OM_uint32 *minor_status, mn->gmn_mech = &m->gm_mech; mn->gmn_mech_oid = m->gm_mech_oid; - HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&name->gn_mn, mn, gmn_link); } /* * If we can't find a mn for the name, bail out already here. */ - mn = HEIM_SLIST_FIRST(&name->gn_mn); + mn = HEIM_TAILQ_FIRST(&name->gn_mn); if (!mn) { *minor_status = 0; major_status = GSS_S_NAME_NOT_MN; diff --git a/lib/gssapi/mech/gss_indicate_mechs.c b/lib/gssapi/mech/gss_indicate_mechs.c index 22493e57e..9eef62e0b 100644 --- a/lib/gssapi/mech/gss_indicate_mechs.c +++ b/lib/gssapi/mech/gss_indicate_mechs.c @@ -44,7 +44,7 @@ gss_indicate_mechs(OM_uint32 *minor_status, return (major_status); /* XXX We ignore ENOMEM from gss_add_oid_set_member() */ - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_indicate_mechs) { major_status = m->gm_mech.gm_indicate_mechs( minor_status, &set); diff --git a/lib/gssapi/mech/gss_init_sec_context.c b/lib/gssapi/mech/gss_init_sec_context.c index d8dc9c86b..5f1769440 100644 --- a/lib/gssapi/mech/gss_init_sec_context.c +++ b/lib/gssapi/mech/gss_init_sec_context.c @@ -39,7 +39,7 @@ _gss_mech_cred_find(gss_const_cred_id_t cred_handle, gss_OID mech_type) if (cred == NULL) return GSS_C_NO_CREDENTIAL; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { if (gss_oid_equal(mech_type, mc->gmc_mech_oid)) return mc->gmc_cred; } diff --git a/lib/gssapi/mech/gss_inquire_cred.c b/lib/gssapi/mech/gss_inquire_cred.c index 89bdc7af3..5e2348faa 100644 --- a/lib/gssapi/mech/gss_inquire_cred.c +++ b/lib/gssapi/mech/gss_inquire_cred.c @@ -95,7 +95,7 @@ gss_inquire_cred(OM_uint32 *minor_status, if (cred) { struct _gss_mechanism_cred *mc; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { gss_name_t mc_name; OM_uint32 mc_lifetime; @@ -118,7 +118,7 @@ gss_inquire_cred(OM_uint32 *minor_status, mn->gmn_mech = mc->gmc_mech; mn->gmn_mech_oid = mc->gmc_mech_oid; mn->gmn_name = mc_name; - HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&name->gn_mn, mn, gmn_link); } else { mc->gmc_mech->gm_release_name(minor_status, &mc_name); @@ -133,7 +133,7 @@ gss_inquire_cred(OM_uint32 *minor_status, found++; } } else { - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { gss_name_t mc_name; OM_uint32 mc_lifetime; @@ -158,7 +158,7 @@ gss_inquire_cred(OM_uint32 *minor_status, mn->gmn_mech = &m->gm_mech; mn->gmn_mech_oid = m->gm_mech_oid; mn->gmn_name = mc_name; - HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&name->gn_mn, mn, gmn_link); } else if (mc_name) { m->gm_mech.gm_release_name(minor_status, &mc_name); diff --git a/lib/gssapi/mech/gss_inquire_cred_by_mech.c b/lib/gssapi/mech/gss_inquire_cred_by_mech.c index c64053c9e..10ba9b7b8 100644 --- a/lib/gssapi/mech/gss_inquire_cred_by_mech.c +++ b/lib/gssapi/mech/gss_inquire_cred_by_mech.c @@ -60,7 +60,7 @@ gss_inquire_cred_by_mech(OM_uint32 *minor_status, if (cred_handle != GSS_C_NO_CREDENTIAL) { struct _gss_cred *cred = (struct _gss_cred *) cred_handle; - HEIM_SLIST_FOREACH(mcp, &cred->gc_mc, gmc_link) + HEIM_TAILQ_FOREACH(mcp, &cred->gc_mc, gmc_link) if (mcp->gmc_mech == m) break; if (!mcp) diff --git a/lib/gssapi/mech/gss_inquire_cred_by_oid.c b/lib/gssapi/mech/gss_inquire_cred_by_oid.c index 8e2909ac3..1e6c51ff4 100644 --- a/lib/gssapi/mech/gss_inquire_cred_by_oid.c +++ b/lib/gssapi/mech/gss_inquire_cred_by_oid.c @@ -52,7 +52,7 @@ gss_inquire_cred_by_oid (OM_uint32 *minor_status, status = GSS_S_FAILURE; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { gss_buffer_set_t rset = GSS_C_NO_BUFFER_SET; size_t i; diff --git a/lib/gssapi/mech/gss_inquire_mechs_for_name.c b/lib/gssapi/mech/gss_inquire_mechs_for_name.c index b445c6530..f75dbaab0 100644 --- a/lib/gssapi/mech/gss_inquire_mechs_for_name.c +++ b/lib/gssapi/mech/gss_inquire_mechs_for_name.c @@ -52,7 +52,7 @@ gss_inquire_mechs_for_name(OM_uint32 *minor_status, * name's type is supported by the mechanism. If it is, add * the mechanism to the set. */ - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { major_status = gss_inquire_names_for_mech(minor_status, m->gm_mech_oid, &name_types); if (major_status) { diff --git a/lib/gssapi/mech/gss_inquire_name.c b/lib/gssapi/mech/gss_inquire_name.c index 4f985537e..f109a9f4e 100644 --- a/lib/gssapi/mech/gss_inquire_name.c +++ b/lib/gssapi/mech/gss_inquire_name.c @@ -54,7 +54,7 @@ gss_inquire_name(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_inquire_name) diff --git a/lib/gssapi/mech/gss_krb5.c b/lib/gssapi/mech/gss_krb5.c index 4416d5181..8a497ae98 100644 --- a/lib/gssapi/mech/gss_krb5.c +++ b/lib/gssapi/mech/gss_krb5.c @@ -225,7 +225,7 @@ gsskrb5_set_dns_canonicalize(int flag) buffer.value = &b; buffer.length = sizeof(b); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -500,7 +500,7 @@ gsskrb5_set_send_to_kdc(struct gsskrb5_send_to_kdc *c) buffer.length = 0; } - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -535,7 +535,7 @@ gss_krb5_ccache_name(OM_uint32 *minor_status, _mg_buffer_zero(&buffer); } - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -823,7 +823,7 @@ gsskrb5_set_default_realm(const char *realm) buffer.value = rk_UNCONST(realm); buffer.length = strlen(realm); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -885,7 +885,7 @@ gsskrb5_set_time_offset(int offset) buffer.value = &o; buffer.length = sizeof(o); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -908,7 +908,7 @@ gsskrb5_get_time_offset(int *offset) buffer.value = &o; buffer.length = sizeof(o); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; maj_stat = m->gm_mech.gm_set_sec_context_option(&junk, NULL, @@ -935,7 +935,7 @@ gsskrb5_plugin_register(struct gsskrb5_krb5_plugin *c) buffer.value = c; buffer.length = sizeof(*c); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_sec_context_option == NULL) continue; m->gm_mech.gm_set_sec_context_option(&junk, NULL, diff --git a/lib/gssapi/mech/gss_mech_switch.c b/lib/gssapi/mech/gss_mech_switch.c index b86697150..c9ccb2c77 100644 --- a/lib/gssapi/mech/gss_mech_switch.c +++ b/lib/gssapi/mech/gss_mech_switch.c @@ -33,7 +33,7 @@ #define _PATH_GSS_MECH "/etc/gss/mech" #endif -struct _gss_mech_switch_list _gss_mechs = { NULL } ; +struct _gss_mech_switch_list _gss_mechs = { NULL, NULL } ; gss_OID_set _gss_mech_oids; static HEIMDAL_MUTEX _gss_mech_mutex = HEIMDAL_MUTEX_INITIALIZER; @@ -233,10 +233,18 @@ add_builtin(gssapi_mech_interface mech) if (m->gm_name_types == NULL) gss_create_empty_oid_set(&minor_status, &m->gm_name_types); - HEIM_SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link); + HEIM_TAILQ_INSERT_TAIL(&_gss_mechs, m, gm_link); return 0; } +static void +init_mech_switch_list(void *p) +{ + struct _gss_mech_switch_list *mechs = p; + + HEIM_TAILQ_INIT(mechs); +} + /* * Load the mechanisms file (/etc/gss/mech). */ @@ -244,6 +252,7 @@ void _gss_load_mech(void) { OM_uint32 major_status, minor_status; + static heim_base_once_t once = HEIM_BASE_ONCE_INIT; #ifdef HAVE_DLOPEN FILE *fp; char buf[256]; @@ -255,10 +264,11 @@ _gss_load_mech(void) int found; #endif + heim_base_once_f(&once, &_gss_mechs, init_mech_switch_list); HEIMDAL_MUTEX_lock(&_gss_mech_mutex); - if (HEIM_SLIST_FIRST(&_gss_mechs)) { + if (!HEIM_TAILQ_EMPTY(&_gss_mechs)) { HEIMDAL_MUTEX_unlock(&_gss_mech_mutex); return; } @@ -305,7 +315,7 @@ _gss_load_mech(void) * Check for duplicates, already loaded mechs. */ found = 0; - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (gss_oid_equal(&m->gm_mech.gm_mech_oid, mech_oid)) { found = 1; break; @@ -424,7 +434,7 @@ _gss_load_mech(void) if (m->gm_name_types == NULL) gss_create_empty_oid_set(&minor_status, &m->gm_name_types); - HEIM_SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link); + HEIM_TAILQ_INSERT_TAIL(&_gss_mechs, m, gm_link); continue; bad: @@ -448,7 +458,7 @@ __gss_get_mechanism(gss_const_OID mech) struct _gss_mech_switch *m; _gss_load_mech(); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (gss_oid_equal(&m->gm_mech.gm_mech_oid, mech)) return &m->gm_mech; } @@ -461,7 +471,7 @@ _gss_mg_support_mechanism(gss_const_OID mech) struct _gss_mech_switch *m; _gss_load_mech(); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (gss_oid_equal(&m->gm_mech.gm_mech_oid, mech)) return m->gm_mech_oid; } diff --git a/lib/gssapi/mech/gss_mo.c b/lib/gssapi/mech/gss_mo.c index c692365f9..b6ae282b1 100644 --- a/lib/gssapi/mech/gss_mo.c +++ b/lib/gssapi/mech/gss_mo.c @@ -353,7 +353,7 @@ gss_inquire_mech_for_saslname(OM_uint32 *minor_status, *mech_type = NULL; - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { struct gss_mech_compat_desc_struct *gmc; /* Native SPI */ @@ -461,7 +461,7 @@ gss_indicate_mechs_by_attrs(OM_uint32 * minor_status, _gss_load_mech(); - HEIM_SLIST_FOREACH(ms, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(ms, &_gss_mechs, gm_link) { gssapi_mech_interface mi = &ms->gm_mech; struct gss_mech_compat_desc_struct *gmc = mi->gm_compat; OM_uint32 tmp; @@ -560,7 +560,7 @@ gss_inquire_attrs_for_mech(OM_uint32 * minor_status, _gss_load_mech(); - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) add_all_mo(&m->gm_mech, known_mech_attrs, GSS_MO_MA); } diff --git a/lib/gssapi/mech/gss_names.c b/lib/gssapi/mech/gss_names.c index 98bb230a7..eda87bdde 100644 --- a/lib/gssapi/mech/gss_names.c +++ b/lib/gssapi/mech/gss_names.c @@ -46,7 +46,7 @@ _gss_find_mn(OM_uint32 *minor_status, if (name == NULL) return GSS_S_COMPLETE; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { if (gss_oid_equal(mech, mn->gmn_mech_oid)) break; } @@ -79,7 +79,7 @@ _gss_find_mn(OM_uint32 *minor_status, mn->gmn_mech = m; mn->gmn_mech_oid = &m->gm_mech_oid; - HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&name->gn_mn, mn, gmn_link); } *output_mn = mn; return 0; @@ -100,7 +100,7 @@ _gss_create_name(gss_name_t new_mn, if (!name) return (0); - HEIM_SLIST_INIT(&name->gn_mn); + HEIM_TAILQ_INIT(&name->gn_mn); if (new_mn) { mn = malloc(sizeof(struct _gss_mechanism_name)); @@ -112,7 +112,7 @@ _gss_create_name(gss_name_t new_mn, mn->gmn_mech = m; mn->gmn_mech_oid = &m->gm_mech_oid; mn->gmn_name = new_mn; - HEIM_SLIST_INSERT_HEAD(&name->gn_mn, mn, gmn_link); + HEIM_TAILQ_INSERT_TAIL(&name->gn_mn, mn, gmn_link); } return (name); @@ -126,13 +126,12 @@ void _gss_mg_release_name(struct _gss_name *name) { OM_uint32 junk; + struct _gss_mechanism_name *mn, *next; gss_release_oid(&junk, &name->gn_type); - while (HEIM_SLIST_FIRST(&name->gn_mn)) { - struct _gss_mechanism_name *mn; - mn = HEIM_SLIST_FIRST(&name->gn_mn); - HEIM_SLIST_REMOVE_HEAD(&name->gn_mn, gmn_link); + HEIM_TAILQ_FOREACH_SAFE(mn, &name->gn_mn, gmn_link, next) { + HEIM_TAILQ_REMOVE(&name->gn_mn, mn, gmn_link); mn->gmn_mech->gm_release_name(&junk, &mn->gmn_name); free(mn); } diff --git a/lib/gssapi/mech/gss_pname_to_uid.c b/lib/gssapi/mech/gss_pname_to_uid.c index a7b73f5ec..72fd9de46 100644 --- a/lib/gssapi/mech/gss_pname_to_uid.c +++ b/lib/gssapi/mech/gss_pname_to_uid.c @@ -120,7 +120,7 @@ gss_localname(OM_uint32 *minor_status, if (major_status != GSS_S_COMPLETE) major_status = attr_localname(minor_status, mn, localname); } else { - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { major_status = mech_localname(minor_status, mn, localname); if (major_status != GSS_S_COMPLETE) major_status = attr_localname(minor_status, mn, localname); diff --git a/lib/gssapi/mech/gss_set_cred_option.c b/lib/gssapi/mech/gss_set_cred_option.c index 3a8427a06..39b49e32e 100644 --- a/lib/gssapi/mech/gss_set_cred_option.c +++ b/lib/gssapi/mech/gss_set_cred_option.c @@ -56,7 +56,7 @@ gss_set_cred_option (OM_uint32 *minor_status, return GSS_S_FAILURE; } - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_cred_option == NULL) continue; @@ -81,7 +81,7 @@ gss_set_cred_option (OM_uint32 *minor_status, continue; } one_ok = 1; - HEIM_SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link); + HEIM_TAILQ_INSERT_TAIL(&cred->gc_mc, mc, gmc_link); } *cred_handle = (gss_cred_id_t)cred; if (!one_ok) { @@ -91,7 +91,7 @@ gss_set_cred_option (OM_uint32 *minor_status, } else { gssapi_mech_interface m; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { m = mc->gmc_mech; if (m == NULL) diff --git a/lib/gssapi/mech/gss_set_name_attribute.c b/lib/gssapi/mech/gss_set_name_attribute.c index 2bbe18274..4e963f343 100644 --- a/lib/gssapi/mech/gss_set_name_attribute.c +++ b/lib/gssapi/mech/gss_set_name_attribute.c @@ -48,7 +48,7 @@ gss_set_name_attribute(OM_uint32 *minor_status, if (input_name == GSS_C_NO_NAME) return GSS_S_BAD_NAME; - HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { + HEIM_TAILQ_FOREACH(mn, &name->gn_mn, gmn_link) { gssapi_mech_interface m = mn->gmn_mech; if (!m->gm_set_name_attribute) diff --git a/lib/gssapi/mech/gss_set_neg_mechs.c b/lib/gssapi/mech/gss_set_neg_mechs.c index c7bcf122d..5402e9656 100644 --- a/lib/gssapi/mech/gss_set_neg_mechs.c +++ b/lib/gssapi/mech/gss_set_neg_mechs.c @@ -55,7 +55,7 @@ gss_set_neg_mechs (OM_uint32 *minor_status, if (cred == NULL) { struct _gss_mech_switch *m; - HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { + HEIM_TAILQ_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_set_neg_mechs == NULL) continue; major = m->gm_mech.gm_set_neg_mechs(minor_status, @@ -68,7 +68,7 @@ gss_set_neg_mechs (OM_uint32 *minor_status, } else { struct _gss_mechanism_cred *mc; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { gssapi_mech_interface m; m = mc->gmc_mech; diff --git a/lib/gssapi/mech/gss_store_cred_into.c b/lib/gssapi/mech/gss_store_cred_into.c index b9e74ada0..c327e08e0 100644 --- a/lib/gssapi/mech/gss_store_cred_into.c +++ b/lib/gssapi/mech/gss_store_cred_into.c @@ -107,7 +107,7 @@ gss_store_cred_into(OM_uint32 *minor_status, major_status = GSS_S_NO_CRED; successes = 0; - HEIM_SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) { + HEIM_TAILQ_FOREACH(mc, &cred->gc_mc, gmc_link) { gssapi_mech_interface m = mc->gmc_mech; if (m == NULL) diff --git a/lib/gssapi/mech/mech_locl.h b/lib/gssapi/mech/mech_locl.h index 613a93bb2..5e65a0786 100644 --- a/lib/gssapi/mech/mech_locl.h +++ b/lib/gssapi/mech/mech_locl.h @@ -57,7 +57,7 @@ #include #include -#include "mechqueue.h" +#include #include "context.h" #include "cred.h" diff --git a/lib/gssapi/mech/mech_switch.h b/lib/gssapi/mech/mech_switch.h index 5ef883cc2..abc89ae12 100644 --- a/lib/gssapi/mech/mech_switch.h +++ b/lib/gssapi/mech/mech_switch.h @@ -30,13 +30,13 @@ #include struct _gss_mech_switch { - HEIM_SLIST_ENTRY(_gss_mech_switch) gm_link; + HEIM_TAILQ_ENTRY(_gss_mech_switch) gm_link; gss_OID gm_mech_oid; gss_OID_set gm_name_types; void *gm_so; gssapi_mech_interface_desc gm_mech; }; -HEIM_SLIST_HEAD(_gss_mech_switch_list, _gss_mech_switch); +HEIM_TAILQ_HEAD(_gss_mech_switch_list, _gss_mech_switch); extern struct _gss_mech_switch_list _gss_mechs; extern gss_OID_set _gss_mech_oids; diff --git a/lib/gssapi/mech/mechqueue.h b/lib/gssapi/mech/mechqueue.h deleted file mode 100644 index a9b8ef933..000000000 --- a/lib/gssapi/mech/mechqueue.h +++ /dev/null @@ -1,112 +0,0 @@ -/* $NetBSD: queue.h,v 1.39 2004/04/18 14:25:34 lukem Exp $ */ - -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _MECHQUEUE_H_ -#define _MECHQUEUE_H_ - -/* - * Singly-linked List definitions. - */ -#define HEIM_SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define HEIM_SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define HEIM_SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define HEIM_SLIST_INIT(head) do { \ - (head)->slh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - HEIM_SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) - -/* - * Singly-linked List access methods. - */ -#define HEIM_SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define HEIM_SLIST_FIRST(head) ((head)->slh_first) -#define HEIM_SLIST_NEXT(elm, field) ((elm)->field.sle_next) - -/* - * Singly-linked List atomic functions. - */ -#include "heimbase.h" - -#define HEIM_SLIST_ATOMIC_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = \ - heim_base_exchange_pointer(&(head)->slh_first, (elm)); \ -} while (/*CONSTCOND*/0) - -#define HEIM_SLIST_ATOMIC_FOREACH(var, head, field) \ - for ((void)heim_base_exchange_pointer(&(var), (head)->slh_first); \ - (var) != NULL; \ - (void)heim_base_exchange_pointer(&(var), (var)->field.sle_next)) - -#endif /* !_MECHQUEUE_H_ */ diff --git a/lib/gssapi/mech/name.h b/lib/gssapi/mech/name.h index 40cae4ce8..80dfee99c 100644 --- a/lib/gssapi/mech/name.h +++ b/lib/gssapi/mech/name.h @@ -28,12 +28,12 @@ */ struct _gss_mechanism_name { - HEIM_SLIST_ENTRY(_gss_mechanism_name) gmn_link; + HEIM_TAILQ_ENTRY(_gss_mechanism_name) gmn_link; gssapi_mech_interface gmn_mech; /* mechanism ops for MN */ gss_OID gmn_mech_oid; /* mechanism oid for MN */ gss_name_t gmn_name; /* underlying MN */ }; -HEIM_SLIST_HEAD(_gss_mechanism_name_list, _gss_mechanism_name); +HEIM_TAILQ_HEAD(_gss_mechanism_name_list, _gss_mechanism_name); struct _gss_name { gss_OID gn_type; /* type of name */