krb5_error_code krb5_kdc_windc_init(krb5_context context) { struct krb5_plugin *list = NULL, *e; krb5_error_code ret; ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "windc", &list); if(ret != 0 || list == NULL) return 0; for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { windcft = _krb5_plugin_get_symbol(e); if (windcft->minor_version < KRB5_WINDC_PLUGIN_MINOR) continue; (*windcft->init)(context, &windcctx); break; } _krb5_plugin_free(list); if (e == NULL) { krb5_set_error_message(context, ENOENT, "Did not find any WINDC plugin"); windcft = NULL; return ENOENT; } return 0; }
static void plugin_get_hosts(krb5_context context, struct krb5_krbhst_data *kd, enum locate_service_type type) { struct krb5_plugin *list, *e; krb5_error_code ret; ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "resolve", &list); if(ret != 0 || list == NULL) return; kd->flags |= KD_CONFIG_EXISTS; for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { krb5plugin_service_locate_ftable *service; void *ctx; service = _krb5_plugin_get_symbol(e); if (service->minor_version != 0) continue; (*service->init)(context, &ctx); ret = (*service->lookup)(ctx, type, kd->realm, 0, 0, add_locate, kd); (*service->fini)(ctx); if (ret) { krb5_set_error_string(context, "Plugin failed to lookup"); break; } } _krb5_plugin_free(list); }
krb5_error_code hdb_create(krb5_context context, HDB **db, const char *filename) { const struct hdb_method *h; const char *residual; krb5_error_code ret; struct krb5_plugin *list = NULL, *e; if(filename == NULL) filename = HDB_DEFAULT_DB; krb5_add_et_list(context, initialize_hdb_error_table_r); h = find_method (filename, &residual); if (h == NULL) { ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "hdb", &list); if(ret == 0 && list != NULL) { for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { h = _krb5_plugin_get_symbol(e); if (strncmp (filename, h->prefix, strlen(h->prefix)) == 0 && h->interface_version == HDB_INTERFACE_VERSION) { residual = filename + strlen(h->prefix); break; } } if (e == NULL) { h = NULL; _krb5_plugin_free(list); } } } #ifdef HAVE_DLOPEN if (h == NULL) h = find_dynamic_method (context, filename, &residual); #endif if (h == NULL) krb5_errx(context, 1, "No database support for %s", filename); return (*h->create)(context, db, residual); }
static krb5_error_code send_via_plugin(krb5_context context, krb5_krbhst_info *hi, time_t timeout, const krb5_data *send_data, krb5_data *receive) { struct krb5_plugin *list = NULL, *e; krb5_error_code ret; ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_SEND_TO_KDC, &list); if(ret != 0 || list == NULL) return KRB5_PLUGIN_NO_HANDLE; for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { krb5plugin_send_to_kdc_ftable *service; void *ctx; service = _krb5_plugin_get_symbol(e); if (service->minor_version != 0) continue; (*service->init)(context, &ctx); ret = (*service->send_to_kdc)(context, ctx, hi, timeout, send_data, receive); (*service->fini)(ctx); if (ret == 0) break; if (ret != KRB5_PLUGIN_NO_HANDLE) { krb5_set_error_message(context, ret, N_("Plugin send_to_kdc failed to " "lookup with error: %d", ""), ret); break; } } _krb5_plugin_free(list); return KRB5_PLUGIN_NO_HANDLE; }
static void plugin_get_hosts(krb5_context context, struct krb5_krbhst_data *kd, enum locate_service_type type) { struct krb5_plugin *list = NULL, *e; krb5_error_code ret; ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_LOCATE, &list); if(ret != 0 || list == NULL) return; for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { krb5plugin_service_locate_ftable *service; void *ctx; service = _krb5_plugin_get_symbol(e); if (service->minor_version != 0) continue; (*service->init)(context, &ctx); ret = (*service->lookup)(ctx, type, kd->realm, 0, 0, add_locate, kd); (*service->fini)(ctx); if (ret && ret != KRB5_PLUGIN_NO_HANDLE) { krb5_set_error_message(context, ret, N_("Locate plugin failed to lookup realm %s: %d", ""), kd->realm, ret); break; } else if (ret == 0) { _krb5_debug(context, 2, "plugin found result for realm %s", kd->realm); kd->flags |= KD_CONFIG_EXISTS; } } _krb5_plugin_free(list); }