krb5_error_code KRB5_LIB_FUNCTION krb5_krbhst_init(krb5_context context, const char *realm, unsigned int type, krb5_krbhst_handle *handle) { return krb5_krbhst_init_flags(context, realm, type, 0, handle); }
int main(int argc, char **argv) { krb5_error_code ret; krb5_context context; krb5_krbhst_handle handle; char host[MAXHOSTNAMELEN]; int found = 0; setprogname(argv[0]); ret = krb5_init_context(&context); if (ret) errx(1, "krb5_init_contex"); ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_LOCATE, &resolve); if (ret) krb5_err(context, 1, ret, "krb5_plugin_register"); ret = krb5_krbhst_init_flags(context, "NOTHERE.H5L.SE", KRB5_KRBHST_KDC, 0, &handle); if (ret) krb5_err(context, 1, ret, "krb5_krbhst_init_flags"); while(krb5_krbhst_next_as_string(context, handle, host, sizeof(host)) == 0){ found++; if (strcmp(host, "127.0.0.2") != 0 && strcmp(host, "tcp/127.0.0.2") != 0) krb5_errx(context, 1, "wrong address: %s", host); } if (!found) krb5_errx(context, 1, "failed to find host"); krb5_krbhst_free(context, handle); krb5_free_context(context); return 0; }
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendto_context(krb5_context context, krb5_sendto_ctx ctx, const krb5_data *send_data, const krb5_realm realm, krb5_data *receive) { krb5_error_code ret; krb5_krbhst_handle handle = NULL; int type, freectx = 0; int action; krb5_data_zero(receive); if (ctx == NULL) { freectx = 1; ret = krb5_sendto_ctx_alloc(context, &ctx); if (ret) return ret; } type = ctx->type; if (type == 0) { if ((ctx->flags & KRB5_KRBHST_FLAGS_MASTER) || context->use_admin_kdc) type = KRB5_KRBHST_ADMIN; else type = KRB5_KRBHST_KDC; } if ((int)send_data->length > context->large_msg_size) ctx->flags |= KRB5_KRBHST_FLAGS_LARGE_MSG; /* loop until we get back a appropriate response */ do { action = KRB5_SENDTO_DONE; krb5_data_free(receive); if (handle == NULL) { ret = krb5_krbhst_init_flags(context, realm, type, ctx->flags, &handle); if (ret) { if (freectx) krb5_sendto_ctx_free(context, ctx); return ret; } } ret = krb5_sendto(context, send_data, handle, receive); if (ret) break; if (ctx->func) { ret = (*ctx->func)(context, ctx, ctx->data, receive, &action); if (ret) break; } if (action != KRB5_SENDTO_CONTINUE) { krb5_krbhst_free(context, handle); handle = NULL; } } while (action != KRB5_SENDTO_DONE); if (handle) krb5_krbhst_free(context, handle); if (ret == KRB5_KDC_UNREACH) krb5_set_error_message(context, ret, N_("unable to reach any KDC in realm %s", ""), realm); if (ret) krb5_data_free(receive); if (freectx) krb5_sendto_ctx_free(context, ctx); return ret; }