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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static kadm5_ret_t
|
static kadm5_ret_t
|
||||||
kadm5_c_init_with_context(krb5_context context,
|
kadm_connect(kadm5_client_context *ctx)
|
||||||
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_ret_t ret;
|
||||||
kadm5_client_context *ctx;
|
|
||||||
krb5_principal server;
|
krb5_principal server;
|
||||||
krb5_ccache cc;
|
krb5_ccache cc;
|
||||||
int s;
|
int s;
|
||||||
@@ -311,15 +300,12 @@ kadm5_c_init_with_context(krb5_context context,
|
|||||||
int error;
|
int error;
|
||||||
char portstr[NI_MAXSERV];
|
char portstr[NI_MAXSERV];
|
||||||
char *hostname, *slash;
|
char *hostname, *slash;
|
||||||
|
krb5_context context = ctx->context;
|
||||||
|
|
||||||
memset (&hints, 0, sizeof(hints));
|
memset (&hints, 0, sizeof(hints));
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
hints.ai_protocol = IPPROTO_TCP;
|
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));
|
snprintf (portstr, sizeof(portstr), "%u", ntohs(ctx->kadmind_port));
|
||||||
|
|
||||||
hostname = ctx->admin_server;
|
hostname = ctx->admin_server;
|
||||||
@@ -347,8 +333,9 @@ kadm5_c_init_with_context(krb5_context context,
|
|||||||
krb5_warnx (context, "failed to contact %s", hostname);
|
krb5_warnx (context, "failed to contact %s", hostname);
|
||||||
return KADM5_FAILURE;
|
return KADM5_FAILURE;
|
||||||
}
|
}
|
||||||
ret = get_cred_cache(context, client_name, service_name,
|
ret = get_cred_cache(context, ctx->client_name, ctx->service_name,
|
||||||
password, prompter, keytab, ccache, &cc);
|
NULL, ctx->prompter, ctx->keytab,
|
||||||
|
ctx->ccache, &cc);
|
||||||
|
|
||||||
if(ret) {
|
if(ret) {
|
||||||
freeaddrinfo (ai);
|
freeaddrinfo (ai);
|
||||||
@@ -358,7 +345,7 @@ kadm5_c_init_with_context(krb5_context context,
|
|||||||
ret = krb5_parse_name(context, KADM5_ADMIN_SERVICE, &server);
|
ret = krb5_parse_name(context, KADM5_ADMIN_SERVICE, &server);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
freeaddrinfo (ai);
|
freeaddrinfo (ai);
|
||||||
if(ccache == NULL)
|
if(ctx->ccache == NULL)
|
||||||
krb5_cc_close(context, cc);
|
krb5_cc_close(context, cc);
|
||||||
close(s);
|
close(s);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -371,7 +358,7 @@ kadm5_c_init_with_context(krb5_context context,
|
|||||||
NULL, NULL, cc, NULL, NULL, NULL);
|
NULL, NULL, cc, NULL, NULL, NULL);
|
||||||
if(ret == 0) {
|
if(ret == 0) {
|
||||||
krb5_data params, enc_data;
|
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,
|
ret = krb5_mk_priv(context,
|
||||||
ctx->ac,
|
ctx->ac,
|
||||||
@@ -410,13 +397,64 @@ kadm5_c_init_with_context(krb5_context context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
krb5_free_principal(context, server);
|
krb5_free_principal(context, server);
|
||||||
if(ccache == NULL)
|
if(ctx->ccache == NULL)
|
||||||
krb5_cc_close(context, cc);
|
krb5_cc_close(context, cc);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
close(s);
|
close(s);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ctx->sock = s;
|
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;
|
*server_handle = ctx;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user