summaryrefslogtreecommitdiffstats
path: root/src/kadmin/server
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2011-10-03 19:13:39 +0000
committerGreg Hudson <ghudson@mit.edu>2011-10-03 19:13:39 +0000
commitaded0f894fce27ee7fd94f8ff204517160d67423 (patch)
treedcf8c88637110bdb346c5b93988fab2fadf0e656 /src/kadmin/server
parent41944ee6ad71cb6f3c443bba77f184e335388b64 (diff)
downloadkrb5-aded0f894fce27ee7fd94f8ff204517160d67423.tar.gz
krb5-aded0f894fce27ee7fd94f8ff204517160d67423.tar.xz
krb5-aded0f894fce27ee7fd94f8ff204517160d67423.zip
Make dispatch() respond via a callback
From npmccallum@redhat.com with changes. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25291 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/kadmin/server')
-rw-r--r--src/kadmin/server/schpw.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/src/kadmin/server/schpw.c b/src/kadmin/server/schpw.c
index 4f7f1104e..d46d43b15 100644
--- a/src/kadmin/server/schpw.c
+++ b/src/kadmin/server/schpw.c
@@ -454,10 +454,10 @@ bailout:
}
/* Dispatch routine for set/change password */
-krb5_error_code
-dispatch(void *handle,
- struct sockaddr *local_saddr, const krb5_fulladdr *remote_faddr,
- krb5_data *request, krb5_data **response_out, int is_tcp)
+void
+dispatch(void *handle, struct sockaddr *local_saddr,
+ const krb5_fulladdr *remote_faddr, krb5_data *request, int is_tcp,
+ loop_respond_fn respond, void *arg)
{
krb5_error_code ret;
krb5_keytab kt = NULL;
@@ -466,12 +466,10 @@ dispatch(void *handle,
krb5_address **local_kaddrs = NULL, local_kaddr_buf;
krb5_data *response = NULL;
- *response_out = NULL;
-
if (local_saddr == NULL) {
ret = krb5_os_localaddr(server_handle->context, &local_kaddrs);
if (ret != 0)
- goto cleanup;
+ goto egress;
local_faddr.address = local_kaddrs[0];
local_faddr.port = 0;
@@ -484,12 +482,12 @@ dispatch(void *handle,
if (ret != 0) {
krb5_klog_syslog(LOG_ERR, _("chpw: Couldn't open admin keytab %s"),
krb5_get_error_message(server_handle->context, ret));
- goto cleanup;
+ goto egress;
}
response = k5alloc(sizeof(krb5_data), &ret);
if (response == NULL)
- goto cleanup;
+ goto egress;
ret = process_chpw_request(server_handle->context,
handle,
@@ -499,15 +497,10 @@ dispatch(void *handle,
remote_faddr,
request,
response);
+egress:
if (ret)
- goto cleanup;
-
- *response_out = response;
- response = NULL;
-
-cleanup:
+ krb5_free_data(server_handle->context, response);
krb5_free_addresses(server_handle->context, local_kaddrs);
- krb5_free_data(server_handle->context, response);
krb5_kt_close(server_handle->context, kt);
- return ret;
+ (*respond)(arg, ret, ret == 0 ? response : NULL);
}