break out connection code to separate function, and defer calling it
until we actually do something git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@8650 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -288,21 +288,10 @@ get_cred_cache(krb5_context context,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static kadm5_ret_t
|
||||
kadm5_c_init_with_context(krb5_context context,
|
||||
const char *client_name,
|
||||
const char *password,
|
||||
krb5_prompter_fct prompter,
|
||||
const char *keytab,
|
||||
krb5_ccache ccache,
|
||||
const char *service_name,
|
||||
kadm5_config_params *realm_params,
|
||||
unsigned long struct_version,
|
||||
unsigned long api_version,
|
||||
void **server_handle)
|
||||
static kadm5_ret_t
|
||||
kadm_connect(kadm5_client_context *ctx)
|
||||
{
|
||||
kadm5_ret_t ret;
|
||||
kadm5_client_context *ctx;
|
||||
krb5_principal server;
|
||||
krb5_ccache cc;
|
||||
int s;
|
||||
@@ -311,15 +300,12 @@ kadm5_c_init_with_context(krb5_context context,
|
||||
int error;
|
||||
char portstr[NI_MAXSERV];
|
||||
char *hostname, *slash;
|
||||
krb5_context context = ctx->context;
|
||||
|
||||
memset (&hints, 0, sizeof(hints));
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_protocol = IPPROTO_TCP;
|
||||
|
||||
ret = _kadm5_c_init_context(&ctx, realm_params, context);
|
||||
if(ret)
|
||||
return ret;
|
||||
|
||||
|
||||
snprintf (portstr, sizeof(portstr), "%u", ntohs(ctx->kadmind_port));
|
||||
|
||||
hostname = ctx->admin_server;
|
||||
@@ -347,8 +333,9 @@ kadm5_c_init_with_context(krb5_context context,
|
||||
krb5_warnx (context, "failed to contact %s", hostname);
|
||||
return KADM5_FAILURE;
|
||||
}
|
||||
ret = get_cred_cache(context, client_name, service_name,
|
||||
password, prompter, keytab, ccache, &cc);
|
||||
ret = get_cred_cache(context, ctx->client_name, ctx->service_name,
|
||||
NULL, ctx->prompter, ctx->keytab,
|
||||
ctx->ccache, &cc);
|
||||
|
||||
if(ret) {
|
||||
freeaddrinfo (ai);
|
||||
@@ -358,7 +345,7 @@ kadm5_c_init_with_context(krb5_context context,
|
||||
ret = krb5_parse_name(context, KADM5_ADMIN_SERVICE, &server);
|
||||
if(ret) {
|
||||
freeaddrinfo (ai);
|
||||
if(ccache == NULL)
|
||||
if(ctx->ccache == NULL)
|
||||
krb5_cc_close(context, cc);
|
||||
close(s);
|
||||
return ret;
|
||||
@@ -371,7 +358,7 @@ kadm5_c_init_with_context(krb5_context context,
|
||||
NULL, NULL, cc, NULL, NULL, NULL);
|
||||
if(ret == 0) {
|
||||
krb5_data params, enc_data;
|
||||
ret = _kadm5_marshal_params(context, realm_params, ¶ms);
|
||||
ret = _kadm5_marshal_params(context, ctx->realm_params, ¶ms);
|
||||
|
||||
ret = krb5_mk_priv(context,
|
||||
ctx->ac,
|
||||
@@ -410,13 +397,64 @@ kadm5_c_init_with_context(krb5_context context,
|
||||
}
|
||||
|
||||
krb5_free_principal(context, server);
|
||||
if(ccache == NULL)
|
||||
if(ctx->ccache == NULL)
|
||||
krb5_cc_close(context, cc);
|
||||
if(ret) {
|
||||
close(s);
|
||||
return ret;
|
||||
}
|
||||
ctx->sock = s;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
kadm5_ret_t
|
||||
_kadm5_connect(void *handle)
|
||||
{
|
||||
kadm5_client_context *ctx = handle;
|
||||
if(ctx->sock == -1)
|
||||
return kadm_connect(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static kadm5_ret_t
|
||||
kadm5_c_init_with_context(krb5_context context,
|
||||
const char *client_name,
|
||||
const char *password,
|
||||
krb5_prompter_fct prompter,
|
||||
const char *keytab,
|
||||
krb5_ccache ccache,
|
||||
const char *service_name,
|
||||
kadm5_config_params *realm_params,
|
||||
unsigned long struct_version,
|
||||
unsigned long api_version,
|
||||
void **server_handle)
|
||||
{
|
||||
kadm5_ret_t ret;
|
||||
kadm5_client_context *ctx;
|
||||
krb5_ccache cc;
|
||||
|
||||
ret = _kadm5_c_init_context(&ctx, realm_params, context);
|
||||
if(ret)
|
||||
return ret;
|
||||
|
||||
if(password != NULL && *password != '\0') {
|
||||
ret = get_cred_cache(context, client_name, service_name,
|
||||
password, prompter, keytab, ccache, &cc);
|
||||
if(ret)
|
||||
return ret; /* XXX */
|
||||
ccache = cc;
|
||||
}
|
||||
|
||||
|
||||
ctx->client_name = strdup(client_name);
|
||||
ctx->service_name = strdup(service_name);
|
||||
ctx->prompter = prompter;
|
||||
ctx->keytab = keytab;
|
||||
ctx->ccache = ccache;
|
||||
ctx->realm_params = realm_params;
|
||||
ctx->sock = -1;
|
||||
|
||||
*server_handle = ctx;
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user