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, &params);
37555682Smarkm
37655682Smarkm	ret = krb5_mk_priv(context,
37755682Smarkm			   ctx->ac,
37855682Smarkm			   &params,
37955682Smarkm			   &enc_data,
38055682Smarkm			   NULL);
38155682Smarkm
38255682Smarkm	ret = krb5_write_message(context, &s, &enc_data);
38355682Smarkm
38455682Smarkm	krb5_data_free(&params);
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