init_c.c revision 57416
155682Smarkm/* 257416Smarkm * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 555682Smarkm * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 955682Smarkm * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 1255682Smarkm * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 1655682Smarkm * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 2055682Smarkm * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include "kadm5_locl.h" 3555682Smarkm#include <sys/types.h> 3655682Smarkm#include <sys/socket.h> 3755682Smarkm#include <netinet/in.h> 3855682Smarkm#include <netdb.h> 3955682Smarkm 4057416SmarkmRCSID("$Id: init_c.c,v 1.35 2000/01/28 03:20:18 assar Exp $"); 4155682Smarkm 4255682Smarkmstatic void 4355682Smarkmset_funcs(kadm5_client_context *c) 4455682Smarkm{ 4555682Smarkm#define SET(C, F) (C)->funcs.F = kadm5 ## _c_ ## F 4655682Smarkm SET(c, chpass_principal); 4755682Smarkm SET(c, chpass_principal); 4855682Smarkm SET(c, create_principal); 4955682Smarkm SET(c, delete_principal); 5055682Smarkm SET(c, destroy); 5155682Smarkm SET(c, flush); 5255682Smarkm SET(c, get_principal); 5355682Smarkm SET(c, get_principals); 5455682Smarkm SET(c, get_privs); 5555682Smarkm SET(c, modify_principal); 5655682Smarkm SET(c, randkey_principal); 5755682Smarkm SET(c, rename_principal); 5855682Smarkm} 5955682Smarkm 6055682Smarkmkadm5_ret_t 6155682Smarkm_kadm5_c_init_context(kadm5_client_context **ctx, 6255682Smarkm kadm5_config_params *params, 6355682Smarkm krb5_context context) 6455682Smarkm{ 6555682Smarkm krb5_error_code ret; 6655682Smarkm char *colon; 6755682Smarkm 6855682Smarkm *ctx = malloc(sizeof(**ctx)); 6955682Smarkm if(*ctx == NULL) 7055682Smarkm return ENOMEM; 7155682Smarkm memset(*ctx, 0, sizeof(**ctx)); 7255682Smarkm krb5_add_et_list (context, initialize_kadm5_error_table_r); 7355682Smarkm set_funcs(*ctx); 7455682Smarkm (*ctx)->context = context; 7555682Smarkm if(params->mask & KADM5_CONFIG_REALM) 7655682Smarkm (*ctx)->realm = strdup(params->realm); 7755682Smarkm else 7855682Smarkm krb5_get_default_realm((*ctx)->context, &(*ctx)->realm); 7955682Smarkm if(params->mask & KADM5_CONFIG_ADMIN_SERVER) 8055682Smarkm (*ctx)->admin_server = strdup(params->admin_server); 8155682Smarkm else { 8255682Smarkm char **hostlist; 8355682Smarkm 8455682Smarkm ret = krb5_get_krb_admin_hst (context, &(*ctx)->realm, &hostlist); 8555682Smarkm if (ret) 8655682Smarkm return ret; 8755682Smarkm (*ctx)->admin_server = strdup(*hostlist); 8855682Smarkm krb5_free_krbhst (context, hostlist); 8955682Smarkm } 9055682Smarkm 9155682Smarkm if ((*ctx)->admin_server == NULL) 9255682Smarkm return ENOMEM; 9355682Smarkm colon = strchr ((*ctx)->admin_server, ':'); 9455682Smarkm if (colon != NULL) 9555682Smarkm *colon++ = '\0'; 9655682Smarkm 9755682Smarkm (*ctx)->kadmind_port = 0; 9855682Smarkm 9955682Smarkm if(params->mask & KADM5_CONFIG_KADMIND_PORT) 10055682Smarkm (*ctx)->kadmind_port = params->kadmind_port; 10155682Smarkm else if (colon != NULL) { 10255682Smarkm char *end; 10355682Smarkm 10455682Smarkm (*ctx)->kadmind_port = htons(strtol (colon, &end, 0)); 10555682Smarkm } 10655682Smarkm if ((*ctx)->kadmind_port == 0) 10755682Smarkm (*ctx)->kadmind_port = krb5_getportbyname (context, "kerberos-adm", 10855682Smarkm "tcp", 749); 10955682Smarkm return 0; 11055682Smarkm} 11155682Smarkm 11255682Smarkmstatic krb5_error_code 11355682Smarkmget_kadm_ticket(krb5_context context, 11455682Smarkm krb5_ccache id, 11555682Smarkm krb5_principal client, 11655682Smarkm const char *server_name) 11755682Smarkm{ 11855682Smarkm krb5_error_code ret; 11955682Smarkm krb5_creds in, *out; 12055682Smarkm 12155682Smarkm memset(&in, 0, sizeof(in)); 12255682Smarkm in.client = client; 12355682Smarkm ret = krb5_parse_name(context, server_name, &in.server); 12455682Smarkm if(ret) 12555682Smarkm return ret; 12655682Smarkm ret = krb5_get_credentials(context, 0, id, &in, &out); 12755682Smarkm if(ret == 0) 12855682Smarkm krb5_free_creds(context, out); 12955682Smarkm krb5_free_principal(context, in.server); 13055682Smarkm return ret; 13155682Smarkm} 13255682Smarkm 13355682Smarkmstatic krb5_error_code 13455682Smarkmget_new_cache(krb5_context context, 13555682Smarkm krb5_principal client, 13655682Smarkm const char *password, 13755682Smarkm krb5_prompter_fct prompter, 13855682Smarkm const char *keytab, 13955682Smarkm const char *server_name, 14055682Smarkm krb5_ccache *ret_cache) 14155682Smarkm{ 14255682Smarkm krb5_error_code ret; 14355682Smarkm krb5_creds cred; 14455682Smarkm krb5_get_init_creds_opt opt; 14555682Smarkm krb5_ccache id; 14655682Smarkm 14755682Smarkm krb5_get_init_creds_opt_init (&opt); 14857416Smarkm krb5_get_init_creds_opt_set_forwardable (&opt, FALSE); 14957416Smarkm krb5_get_init_creds_opt_set_proxiable (&opt, FALSE); 15057416Smarkm 15155682Smarkm if(password == NULL && prompter == NULL) { 15255682Smarkm krb5_keytab kt; 15355682Smarkm if(keytab == NULL) 15455682Smarkm ret = krb5_kt_default(context, &kt); 15555682Smarkm else 15655682Smarkm ret = krb5_kt_resolve(context, keytab, &kt); 15755682Smarkm if(ret) 15855682Smarkm return ret; 15955682Smarkm ret = krb5_get_init_creds_keytab (context, 16055682Smarkm &cred, 16155682Smarkm client, 16255682Smarkm kt, 16355682Smarkm 0, 16455682Smarkm server_name, 16555682Smarkm &opt); 16655682Smarkm krb5_kt_close(context, kt); 16755682Smarkm } else { 16855682Smarkm ret = krb5_get_init_creds_password (context, 16955682Smarkm &cred, 17055682Smarkm client, 17155682Smarkm password, 17255682Smarkm prompter, 17355682Smarkm NULL, 17455682Smarkm 0, 17555682Smarkm server_name, 17655682Smarkm &opt); 17755682Smarkm } 17855682Smarkm switch(ret){ 17955682Smarkm case 0: 18055682Smarkm break; 18155682Smarkm case KRB5_LIBOS_PWDINTR: /* don't print anything if it was just C-c:ed */ 18255682Smarkm case KRB5KRB_AP_ERR_BAD_INTEGRITY: 18355682Smarkm case KRB5KRB_AP_ERR_MODIFIED: 18455682Smarkm return KADM5_BAD_PASSWORD; 18555682Smarkm default: 18655682Smarkm return ret; 18755682Smarkm } 18855682Smarkm ret = krb5_cc_gen_new(context, &krb5_mcc_ops, &id); 18955682Smarkm if(ret) 19055682Smarkm return ret; 19155682Smarkm ret = krb5_cc_initialize (context, id, cred.client); 19255682Smarkm if (ret) 19355682Smarkm return ret; 19455682Smarkm ret = krb5_cc_store_cred (context, id, &cred); 19555682Smarkm if (ret) 19655682Smarkm return ret; 19755682Smarkm krb5_free_creds_contents (context, &cred); 19855682Smarkm *ret_cache = id; 19955682Smarkm return 0; 20055682Smarkm} 20155682Smarkm 20255682Smarkmstatic krb5_error_code 20355682Smarkmget_cred_cache(krb5_context context, 20455682Smarkm const char *client_name, 20555682Smarkm const char *server_name, 20655682Smarkm const char *password, 20755682Smarkm krb5_prompter_fct prompter, 20855682Smarkm const char *keytab, 20955682Smarkm krb5_ccache ccache, 21055682Smarkm krb5_ccache *ret_cache) 21155682Smarkm{ 21255682Smarkm krb5_error_code ret; 21355682Smarkm krb5_ccache id = NULL; 21455682Smarkm krb5_principal default_client = NULL, client = NULL; 21555682Smarkm 21655682Smarkm /* treat empty password as NULL */ 21755682Smarkm if(password && *password == '\0') 21855682Smarkm password = NULL; 21955682Smarkm if(server_name == NULL) 22055682Smarkm server_name = KADM5_ADMIN_SERVICE; 22155682Smarkm 22255682Smarkm if(client_name != NULL) { 22355682Smarkm ret = krb5_parse_name(context, client_name, &client); 22455682Smarkm if(ret) 22555682Smarkm return ret; 22655682Smarkm } 22755682Smarkm 22855682Smarkm if(password != NULL || prompter != NULL) { 22955682Smarkm /* get principal from default cache, ok if this doesn't work */ 23055682Smarkm ret = krb5_cc_default(context, &id); 23155682Smarkm if(ret == 0) { 23255682Smarkm ret = krb5_cc_get_principal(context, id, &default_client); 23355682Smarkm if(ret) { 23455682Smarkm krb5_cc_close(context, id); 23555682Smarkm id = NULL; 23655682Smarkm } 23755682Smarkm } 23855682Smarkm 23955682Smarkm if(client == NULL) 24055682Smarkm client = default_client; 24155682Smarkm if(client == NULL) { 24255682Smarkm const char *user; 24355682Smarkm 24455682Smarkm user = get_default_username (); 24555682Smarkm 24655682Smarkm if(user == NULL) 24755682Smarkm return KADM5_FAILURE; 24855682Smarkm ret = krb5_make_principal(context, &client, 24955682Smarkm NULL, user, "admin", NULL); 25055682Smarkm if(ret) 25155682Smarkm return ret; 25255682Smarkm } 25355682Smarkm if(client != default_client) { 25455682Smarkm krb5_free_principal(context, default_client); 25555682Smarkm default_client = NULL; 25655682Smarkm if (id != NULL) { 25755682Smarkm krb5_cc_close(context, id); 25855682Smarkm id = NULL; 25955682Smarkm } 26055682Smarkm } 26155682Smarkm } else if(ccache != NULL) 26255682Smarkm id = ccache; 26355682Smarkm 26455682Smarkm 26555682Smarkm if(id && (default_client == NULL || 26655682Smarkm krb5_principal_compare(context, client, default_client))) { 26755682Smarkm ret = get_kadm_ticket(context, id, client, server_name); 26855682Smarkm if(ret == 0) { 26955682Smarkm *ret_cache = id; 27055682Smarkm krb5_free_principal(context, default_client); 27155682Smarkm if (default_client != client) 27255682Smarkm krb5_free_principal(context, client); 27355682Smarkm return 0; 27455682Smarkm } 27555682Smarkm if(ccache != NULL) 27655682Smarkm /* couldn't get ticket from cache */ 27755682Smarkm return -1; 27855682Smarkm } 27955682Smarkm /* get creds via AS request */ 28055682Smarkm if(id) 28155682Smarkm krb5_cc_close(context, id); 28255682Smarkm if (client != default_client) 28355682Smarkm krb5_free_principal(context, default_client); 28455682Smarkm 28555682Smarkm ret = get_new_cache(context, client, password, prompter, keytab, 28655682Smarkm server_name, ret_cache); 28755682Smarkm krb5_free_principal(context, client); 28855682Smarkm return ret; 28955682Smarkm} 29055682Smarkm 29155682Smarkmstatic kadm5_ret_t 29255682Smarkmkadm5_c_init_with_context(krb5_context context, 29355682Smarkm const char *client_name, 29455682Smarkm const char *password, 29555682Smarkm krb5_prompter_fct prompter, 29655682Smarkm const char *keytab, 29755682Smarkm krb5_ccache ccache, 29855682Smarkm const char *service_name, 29955682Smarkm kadm5_config_params *realm_params, 30055682Smarkm unsigned long struct_version, 30155682Smarkm unsigned long api_version, 30255682Smarkm void **server_handle) 30355682Smarkm{ 30455682Smarkm kadm5_ret_t ret; 30555682Smarkm kadm5_client_context *ctx; 30655682Smarkm krb5_principal server; 30755682Smarkm krb5_ccache cc; 30855682Smarkm int s; 30955682Smarkm struct addrinfo *ai, *a; 31055682Smarkm struct addrinfo hints; 31155682Smarkm int error; 31255682Smarkm char portstr[NI_MAXSERV]; 31355682Smarkm char *hostname, *slash; 31455682Smarkm 31555682Smarkm memset (&hints, 0, sizeof(hints)); 31655682Smarkm hints.ai_socktype = SOCK_STREAM; 31755682Smarkm hints.ai_protocol = IPPROTO_TCP; 31855682Smarkm 31955682Smarkm ret = _kadm5_c_init_context(&ctx, realm_params, context); 32055682Smarkm if(ret) 32155682Smarkm return ret; 32255682Smarkm 32355682Smarkm snprintf (portstr, sizeof(portstr), "%u", ntohs(ctx->kadmind_port)); 32455682Smarkm 32555682Smarkm hostname = ctx->admin_server; 32655682Smarkm slash = strchr (hostname, '/'); 32755682Smarkm if (slash != NULL) 32855682Smarkm hostname = slash + 1; 32955682Smarkm 33055682Smarkm error = getaddrinfo (hostname, portstr, &hints, &ai); 33155682Smarkm if (error) 33255682Smarkm return KADM5_BAD_SERVER_NAME; 33355682Smarkm 33455682Smarkm for (a = ai; a != NULL; a = a->ai_next) { 33555682Smarkm s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); 33655682Smarkm if (s < 0) 33755682Smarkm continue; 33855682Smarkm if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { 33955682Smarkm krb5_warn (context, errno, "connect(%s)", hostname); 34055682Smarkm close (s); 34155682Smarkm continue; 34255682Smarkm } 34355682Smarkm break; 34455682Smarkm } 34555682Smarkm if (a == NULL) { 34655682Smarkm freeaddrinfo (ai); 34755682Smarkm krb5_warnx (context, "failed to contact %s", hostname); 34855682Smarkm return KADM5_FAILURE; 34955682Smarkm } 35055682Smarkm ret = get_cred_cache(context, client_name, service_name, 35155682Smarkm password, prompter, keytab, ccache, &cc); 35255682Smarkm 35355682Smarkm if(ret) { 35455682Smarkm freeaddrinfo (ai); 35555682Smarkm close(s); 35655682Smarkm return ret; 35755682Smarkm } 35855682Smarkm ret = krb5_parse_name(context, KADM5_ADMIN_SERVICE, &server); 35955682Smarkm if(ret) { 36055682Smarkm freeaddrinfo (ai); 36155682Smarkm if(ccache == NULL) 36255682Smarkm krb5_cc_close(context, cc); 36355682Smarkm close(s); 36455682Smarkm return ret; 36555682Smarkm } 36655682Smarkm ctx->ac = NULL; 36755682Smarkm 36855682Smarkm ret = krb5_sendauth(context, &ctx->ac, &s, 36955682Smarkm KADMIN_APPL_VERSION, NULL, 37055682Smarkm server, AP_OPTS_MUTUAL_REQUIRED, 37155682Smarkm NULL, NULL, cc, NULL, NULL, NULL); 37255682Smarkm if(ret == 0) { 37355682Smarkm krb5_data params, enc_data; 37455682Smarkm ret = _kadm5_marshal_params(context, realm_params, ¶ms); 37555682Smarkm 37655682Smarkm ret = krb5_mk_priv(context, 37755682Smarkm ctx->ac, 37855682Smarkm ¶ms, 37955682Smarkm &enc_data, 38055682Smarkm NULL); 38155682Smarkm 38255682Smarkm ret = krb5_write_message(context, &s, &enc_data); 38355682Smarkm 38455682Smarkm krb5_data_free(¶ms); 38555682Smarkm krb5_data_free(&enc_data); 38655682Smarkm } else if(ret == KRB5_SENDAUTH_BADAPPLVERS) { 38755682Smarkm close(s); 38855682Smarkm 38955682Smarkm s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); 39055682Smarkm if (s < 0) { 39155682Smarkm freeaddrinfo (ai); 39255682Smarkm return errno; 39355682Smarkm } 39455682Smarkm if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { 39555682Smarkm close (s); 39655682Smarkm freeaddrinfo (ai); 39755682Smarkm return errno; 39855682Smarkm } 39955682Smarkm freeaddrinfo (ai); 40055682Smarkm 40155682Smarkm ret = krb5_sendauth(context, &ctx->ac, &s, 40255682Smarkm KADMIN_OLD_APPL_VERSION, NULL, 40355682Smarkm server, AP_OPTS_MUTUAL_REQUIRED, 40455682Smarkm NULL, NULL, cc, NULL, NULL, NULL); 40555682Smarkm } 40655682Smarkm freeaddrinfo (ai); 40755682Smarkm if(ret) { 40855682Smarkm close(s); 40955682Smarkm return ret; 41055682Smarkm } 41155682Smarkm 41255682Smarkm krb5_free_principal(context, server); 41355682Smarkm if(ccache == NULL) 41455682Smarkm krb5_cc_close(context, cc); 41555682Smarkm if(ret) { 41655682Smarkm close(s); 41755682Smarkm return ret; 41855682Smarkm } 41955682Smarkm ctx->sock = s; 42055682Smarkm *server_handle = ctx; 42155682Smarkm return 0; 42255682Smarkm} 42355682Smarkm 42455682Smarkmstatic kadm5_ret_t 42555682Smarkminit_context(const char *client_name, 42655682Smarkm const char *password, 42755682Smarkm krb5_prompter_fct prompter, 42855682Smarkm const char *keytab, 42955682Smarkm krb5_ccache ccache, 43055682Smarkm const char *service_name, 43155682Smarkm kadm5_config_params *realm_params, 43255682Smarkm unsigned long struct_version, 43355682Smarkm unsigned long api_version, 43455682Smarkm void **server_handle) 43555682Smarkm{ 43655682Smarkm krb5_context context; 43755682Smarkm kadm5_ret_t ret; 43855682Smarkm kadm5_server_context *ctx; 43955682Smarkm 44055682Smarkm krb5_init_context(&context); 44155682Smarkm ret = kadm5_c_init_with_context(context, 44255682Smarkm client_name, 44355682Smarkm password, 44455682Smarkm prompter, 44555682Smarkm keytab, 44655682Smarkm ccache, 44755682Smarkm service_name, 44855682Smarkm realm_params, 44955682Smarkm struct_version, 45055682Smarkm api_version, 45155682Smarkm server_handle); 45255682Smarkm if(ret){ 45355682Smarkm krb5_free_context(context); 45455682Smarkm return ret; 45555682Smarkm } 45655682Smarkm ctx = *server_handle; 45755682Smarkm ctx->my_context = 1; 45855682Smarkm return 0; 45955682Smarkm} 46055682Smarkm 46155682Smarkmkadm5_ret_t 46255682Smarkmkadm5_c_init_with_password_ctx(krb5_context context, 46355682Smarkm const char *client_name, 46455682Smarkm const char *password, 46555682Smarkm const char *service_name, 46655682Smarkm kadm5_config_params *realm_params, 46755682Smarkm unsigned long struct_version, 46855682Smarkm unsigned long api_version, 46955682Smarkm void **server_handle) 47055682Smarkm{ 47155682Smarkm return kadm5_c_init_with_context(context, 47255682Smarkm client_name, 47355682Smarkm password, 47455682Smarkm krb5_prompter_posix, 47555682Smarkm NULL, 47655682Smarkm NULL, 47755682Smarkm service_name, 47855682Smarkm realm_params, 47955682Smarkm struct_version, 48055682Smarkm api_version, 48155682Smarkm server_handle); 48255682Smarkm} 48355682Smarkm 48455682Smarkmkadm5_ret_t 48555682Smarkmkadm5_c_init_with_password(const char *client_name, 48655682Smarkm const char *password, 48755682Smarkm const char *service_name, 48855682Smarkm kadm5_config_params *realm_params, 48955682Smarkm unsigned long struct_version, 49055682Smarkm unsigned long api_version, 49155682Smarkm void **server_handle) 49255682Smarkm{ 49355682Smarkm return init_context(client_name, 49455682Smarkm password, 49555682Smarkm krb5_prompter_posix, 49655682Smarkm NULL, 49755682Smarkm NULL, 49855682Smarkm service_name, 49955682Smarkm realm_params, 50055682Smarkm struct_version, 50155682Smarkm api_version, 50255682Smarkm server_handle); 50355682Smarkm} 50455682Smarkm 50555682Smarkmkadm5_ret_t 50655682Smarkmkadm5_c_init_with_skey_ctx(krb5_context context, 50755682Smarkm const char *client_name, 50855682Smarkm const char *keytab, 50955682Smarkm const char *service_name, 51055682Smarkm kadm5_config_params *realm_params, 51155682Smarkm unsigned long struct_version, 51255682Smarkm unsigned long api_version, 51355682Smarkm void **server_handle) 51455682Smarkm{ 51555682Smarkm return kadm5_c_init_with_context(context, 51655682Smarkm client_name, 51755682Smarkm NULL, 51855682Smarkm NULL, 51955682Smarkm keytab, 52055682Smarkm NULL, 52155682Smarkm service_name, 52255682Smarkm realm_params, 52355682Smarkm struct_version, 52455682Smarkm api_version, 52555682Smarkm server_handle); 52655682Smarkm} 52755682Smarkm 52855682Smarkm 52955682Smarkmkadm5_ret_t 53055682Smarkmkadm5_c_init_with_skey(const char *client_name, 53155682Smarkm const char *keytab, 53255682Smarkm const char *service_name, 53355682Smarkm kadm5_config_params *realm_params, 53455682Smarkm unsigned long struct_version, 53555682Smarkm unsigned long api_version, 53655682Smarkm void **server_handle) 53755682Smarkm{ 53855682Smarkm return init_context(client_name, 53955682Smarkm NULL, 54055682Smarkm NULL, 54155682Smarkm keytab, 54255682Smarkm NULL, 54355682Smarkm service_name, 54455682Smarkm realm_params, 54555682Smarkm struct_version, 54655682Smarkm api_version, 54755682Smarkm server_handle); 54855682Smarkm} 54955682Smarkm 55055682Smarkmkadm5_ret_t 55155682Smarkmkadm5_c_init_with_creds_ctx(krb5_context context, 55255682Smarkm const char *client_name, 55355682Smarkm krb5_ccache ccache, 55455682Smarkm const char *service_name, 55555682Smarkm kadm5_config_params *realm_params, 55655682Smarkm unsigned long struct_version, 55755682Smarkm unsigned long api_version, 55855682Smarkm void **server_handle) 55955682Smarkm{ 56055682Smarkm return kadm5_c_init_with_context(context, 56155682Smarkm client_name, 56255682Smarkm NULL, 56355682Smarkm NULL, 56455682Smarkm NULL, 56555682Smarkm ccache, 56655682Smarkm service_name, 56755682Smarkm realm_params, 56855682Smarkm struct_version, 56955682Smarkm api_version, 57055682Smarkm server_handle); 57155682Smarkm} 57255682Smarkm 57355682Smarkmkadm5_ret_t 57455682Smarkmkadm5_c_init_with_creds(const char *client_name, 57555682Smarkm krb5_ccache ccache, 57655682Smarkm const char *service_name, 57755682Smarkm kadm5_config_params *realm_params, 57855682Smarkm unsigned long struct_version, 57955682Smarkm unsigned long api_version, 58055682Smarkm void **server_handle) 58155682Smarkm{ 58255682Smarkm return init_context(client_name, 58355682Smarkm NULL, 58455682Smarkm NULL, 58555682Smarkm NULL, 58655682Smarkm ccache, 58755682Smarkm service_name, 58855682Smarkm realm_params, 58955682Smarkm struct_version, 59055682Smarkm api_version, 59155682Smarkm server_handle); 59255682Smarkm} 59355682Smarkm 59455682Smarkm#if 0 59555682Smarkmkadm5_ret_t 59655682Smarkmkadm5_init(char *client_name, char *pass, 59755682Smarkm char *service_name, 59855682Smarkm kadm5_config_params *realm_params, 59955682Smarkm unsigned long struct_version, 60055682Smarkm unsigned long api_version, 60155682Smarkm void **server_handle) 60255682Smarkm{ 60355682Smarkm} 60455682Smarkm#endif 60555682Smarkm 606