diff options
author | Günther Deschner <gdeschner@redhat.com> | 2012-06-18 13:45:07 +0200 |
---|---|---|
committer | Simo Sorce <simo@redhat.com> | 2012-06-25 16:49:28 -0400 |
commit | 50373d731e4e89adc59977c162b62bf091ee436f (patch) | |
tree | fc0888f6f8e646a3d2725f860f2d8386261e8935 | |
parent | 250bb053f1a0a24784346524280e56a69dd023c9 (diff) | |
download | gss-proxy-50373d731e4e89adc59977c162b62bf091ee436f.tar.gz gss-proxy-50373d731e4e89adc59977c162b62bf091ee436f.tar.xz gss-proxy-50373d731e4e89adc59977c162b62bf091ee436f.zip |
Add gp_read_gss_creds_from_ring_buffer/gp_write_gss_creds_to_ring_buffer.
Guenther
Signed-off-by: Simo Sorce <simo@redhat.com>
-rw-r--r-- | proxy/src/gp_export.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/proxy/src/gp_export.c b/proxy/src/gp_export.c index 57caf39..93f3460 100644 --- a/proxy/src/gp_export.c +++ b/proxy/src/gp_export.c @@ -71,6 +71,11 @@ struct gp_ring_buffer { uint32_t num_creds; }; +struct gp_credential_handle { + uint32_t index; + uint64_t count; +}; + static void gp_free_ring_buffer_cred(struct gp_ring_buffer_cred *cred) { uint32_t ret_min; @@ -160,6 +165,94 @@ done: return ret_maj; } +static uint32_t gp_write_gss_cred_to_ring_buffer(uint32_t *min, + struct gp_ring_buffer *buffer, + gss_cred_id_t *cred, + struct gp_credential_handle *handle) +{ + struct gp_ring_buffer_cred *bcred = NULL; + + if (!buffer || !cred) { + *min = EINVAL; + return GSS_S_FAILURE; + } + + bcred = calloc(1, sizeof(struct gp_ring_buffer_cred)); + if (!bcred) { + *min = ENOMEM; + return GSS_S_FAILURE; + } + + /* ======> LOCK */ + pthread_mutex_lock(&buffer->lock); + + /* setup ring buffer credential */ + bcred->count = buffer->count; + bcred->cred = *cred; + + /* setup credential handle */ + handle->count = buffer->count; + handle->index = buffer->end; + + /* store ring buffer credential */ + gp_free_ring_buffer_cred(buffer->creds[buffer->end]); + + buffer->creds[buffer->end] = bcred; + buffer->end = (buffer->end + 1) % buffer->num_creds; + + buffer->count++; + + /* <====== LOCK */ + pthread_mutex_unlock(&buffer->lock); + + *min = 0; + + return GSS_S_COMPLETE; +} + +static uint32_t gp_read_gss_creds_from_ring_buffer(uint32_t *min, + struct gp_ring_buffer *buffer, + struct gp_credential_handle *handle, + gss_cred_id_t *cred) +{ + struct gp_ring_buffer_cred *bcred; + + if (!buffer || !cred || !handle) { + *min = EINVAL; + return GSS_S_FAILURE; + } + + /* some basic sanity checks */ + if (handle->index > buffer->num_creds) { + *min = EINVAL; + return GSS_S_FAILURE; + } + + /* ======> LOCK */ + pthread_mutex_lock(&buffer->lock); + + /* pick ring buffer credential */ + bcred = buffer->creds[handle->index]; + if (bcred && + (bcred->count == handle->count)) { + *cred = bcred->cred; + } else { + *cred = NULL; + } + + /* <====== LOCK */ + pthread_mutex_unlock(&buffer->lock); + + if (*cred == NULL) { + *min = GSS_S_CRED_UNAVAIL; + return GSS_S_FAILURE; + } + + *min = 0; + + return GSS_S_COMPLETE; +} + uint32_t gp_export_gssx_cred(uint32_t *min, gss_cred_id_t *in, gssx_cred *out) { |