From 4304e719a6393403fa7d4dbc4c970cd62406eb2e Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Sun, 9 Jan 2011 22:16:18 +1100 Subject: [PATCH] Add SPI for dynamically loading mechanism object information --- lib/gssapi/mech/gss_mech_switch.c | 18 ++++++++++++++---- lib/gssapi/mech/mech_switch.h | 11 +++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/lib/gssapi/mech/gss_mech_switch.c b/lib/gssapi/mech/gss_mech_switch.c index 460f06154..844c29e01 100644 --- a/lib/gssapi/mech/gss_mech_switch.c +++ b/lib/gssapi/mech/gss_mech_switch.c @@ -252,6 +252,8 @@ _gss_load_mech(void) rk_cloexec_file(fp); while (fgets(buf, sizeof(buf), fp)) { + _gss_mo_init *mi; + if (*buf == '#') continue; p = buf; @@ -360,10 +362,18 @@ _gss_load_mech(void) OPTSPISYM(acquire_cred_with_password); OPTSYM(add_cred_with_password); - /* API-as-SPI compatibility */ - COMPATSYM(inquire_saslname_for_mech); - COMPATSYM(inquire_mech_for_saslname); - COMPATSYM(inquire_attrs_for_mech); + mi = dlsym(so, "gss_mo_init"); + if (mi != NULL) { + major_status = mi(&minor_status, &mech_oid, + &m->gm_mech.gm_mo, &m->gm_mech.gm_mo_num); + if (GSS_ERROR(major_status)) + goto bad; + } else { + /* API-as-SPI compatibility */ + COMPATSYM(inquire_saslname_for_mech); + COMPATSYM(inquire_mech_for_saslname); + COMPATSYM(inquire_attrs_for_mech); + } /* pick up the oid sets of names */ diff --git a/lib/gssapi/mech/mech_switch.h b/lib/gssapi/mech/mech_switch.h index 7ed3d4d4a..f50b471b2 100644 --- a/lib/gssapi/mech/mech_switch.h +++ b/lib/gssapi/mech/mech_switch.h @@ -40,4 +40,15 @@ HEIM_SLIST_HEAD(_gss_mech_switch_list, _gss_mech_switch); extern struct _gss_mech_switch_list _gss_mechs; extern gss_OID_set _gss_mech_oids; +/* + * Initialization function for MO SPI, so they may dynamically return a + * set of mechanism objects at load time. + */ +typedef OM_uint32 GSSAPI_CALLCONV _gss_mo_init ( + OM_uint32 *minor, + gss_OID oid, + gss_mo_desc **mo, + size_t *mo_num + ); + void _gss_load_mech(void); -- 2.11.4.GIT