KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files(krb5_context context, char **filenames) { krb5_error_code ret; krb5_config_binding *tmp = NULL; while(filenames != NULL && *filenames != NULL && **filenames != '\0') { ret = krb5_config_parse_file_multi(context, *filenames, &tmp); if(ret != 0 && ret != ENOENT && ret != EACCES && ret != EPERM) { krb5_config_file_free(context, tmp); return ret; } filenames++; } #if 0 /* with this enabled and if there are no config files, Kerberos is considererd disabled */ if(tmp == NULL) return ENXIO; #endif #ifdef _WIN32 _krb5_load_config_from_registry(context, &tmp); #endif krb5_config_file_free(context, context->cf); context->cf = tmp; ret = init_context_from_config_file(context); return ret; }
krb5_error_code krb5_reload_config(krb5_context context, unsigned flags, krb5_boolean *reread) { krb5_error_code ret; krb5_config_binding *tmp = NULL; unsigned i; /** * If function returns a failure, and reread is used, value of * reread is FALSE. */ if (reread) *reread = FALSE; if (_krb5_need_to_reload(context) == FALSE) return 0; if (context->config_files == NULL) return 0; for (i = 0; context->config_files[i]; i++) { ret = krb5_config_parse_file_multi(context, context->config_files[i], &tmp); if (ret != 0 && ret != ENOENT && ret != EACCES && ret != EPERM && ret != KRB5_CONFIG_BADFORMAT) { krb5_config_file_free(context, tmp); return ret; } } if (reread) *reread = TRUE; krb5_config_file_free(context, context->cf); context->cf = tmp; return init_context_from_config_file(context); }
static void check_escaped_strings(void) { krb5_context context; krb5_config_section *c = NULL; krb5_error_code ret; int i; ret = krb5_init_context(&context); if (ret) errx(1, "krb5_init_context %d", ret); ret = krb5_config_parse_file(context, "test_config_strings.out", &c); if (ret) krb5_errx(context, 1, "krb5_config_parse_file()"); for (i=0; i < sizeof(config_strings_tests)/sizeof(config_strings_tests[0]); i++) { char **ps; const char **s; const char **e; ps = krb5_config_get_strings(context, c, "escapes", config_strings_tests[i].name, NULL); if (ps == NULL) errx(1, "Failed to read string value %s", config_strings_tests[i].name); e = config_strings_tests[i].expected; for (s = (const char **)ps; *s && *e; s++, e++) { if (strcmp(*s, *e)) errx(1, "Unexpected configuration string at value [%s].\n" "Actual=[%s]\n" "Expected=[%s]\n", config_strings_tests[i].name, *s, *e); } if (*s || *e) errx(1, "Configuation string list for value [%s] has incorrect length.", config_strings_tests[i].name); krb5_config_free_strings(ps); } ret = krb5_config_file_free(context, c); if (ret) krb5_errx(context, 1, "krb5_config_file_free()"); krb5_free_context(context); }
KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context(krb5_context context) { if (context->default_cc_name) free(context->default_cc_name); if (context->default_cc_name_env) free(context->default_cc_name_env); if (context->config_files) krb5_free_config_files(context->config_files); free(context->etypes); free(context->etypes_des); heim_release(context->default_realms); krb5_config_file_free (context, context->cf); free_error_table (context->et_list); free(rk_UNCONST(context->cc_ops)); free(context->kt_types); krb5_clear_error_message(context); if (context->warn_dest != NULL) krb5_closelog(context, context->warn_dest); if (context->debug_dest != NULL) krb5_closelog(context, context->debug_dest); krb5_set_extra_addresses(context, NULL); krb5_set_ignore_addresses(context, NULL); #ifndef HEIMDAL_SMALLER krb5_set_send_to_kdc_func(context, NULL, NULL); #endif #ifdef PKINIT if (context->hx509ctx) hx509_context_free(&context->hx509ctx); #endif HEIMDAL_MUTEX_destroy(context->mutex); free(context->mutex); if (context->flags & KRB5_CTX_F_SOCKETS_INITIALIZED) { rk_SOCK_EXIT(); } memset(context, 0, sizeof(*context)); free(context); }