diff options
author | Greg Hudson <ghudson@mit.edu> | 2011-10-03 19:13:39 +0000 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2011-10-03 19:13:39 +0000 |
commit | aded0f894fce27ee7fd94f8ff204517160d67423 (patch) | |
tree | dcf8c88637110bdb346c5b93988fab2fadf0e656 /src/kadmin/server | |
parent | 41944ee6ad71cb6f3c443bba77f184e335388b64 (diff) | |
download | krb5-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.c | 27 |
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); } |