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:
Johan Danielsson
2000-07-11 15:57:19 +00:00
parent f889876136
commit 909da8dc41

View File

@@ -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, &params);
ret = _kadm5_marshal_params(context, ctx->realm_params, &params);
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;
}