summaryrefslogtreecommitdiffstats
path: root/proxy/src/gp_export.c
diff options
context:
space:
mode:
authorGünther Deschner <gdeschner@redhat.com>2012-06-18 13:44:28 +0200
committerSimo Sorce <simo@redhat.com>2012-06-25 16:49:20 -0400
commit9b8e141b8e5286e4323df16557763e2a0be71c9e (patch)
treefa88769fd13122987d8cc06e9642fca715cd9c85 /proxy/src/gp_export.c
parent06748b94c376ca680e6a7c80708618dc136f1fe1 (diff)
downloadgss-proxy-9b8e141b8e5286e4323df16557763e2a0be71c9e.tar.gz
gss-proxy-9b8e141b8e5286e4323df16557763e2a0be71c9e.tar.xz
gss-proxy-9b8e141b8e5286e4323df16557763e2a0be71c9e.zip
Add gp_init_ring_buffer/gp_free_ring_buffer.
Guenther Signed-off-by: Simo Sorce <simo@redhat.com>
Diffstat (limited to 'proxy/src/gp_export.c')
-rw-r--r--proxy/src/gp_export.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/proxy/src/gp_export.c b/proxy/src/gp_export.c
index c0dfebe..57caf39 100644
--- a/proxy/src/gp_export.c
+++ b/proxy/src/gp_export.c
@@ -1,8 +1,9 @@
/*
GSS-PROXY
- Copyright (C) 2011 Red Hat, Inc.
+ Copyright (C) 2011-2012 Red Hat, Inc.
Copyright (C) 2011 Simo Sorce <simo.sorce@redhat.com>
+ Copyright (C) 2012 Guenther Deschner <guenther.deschner@redhat.com>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
@@ -33,6 +34,7 @@
#include <gssapi/gssapi_krb5.h>
#include <pwd.h>
#include <grp.h>
+#include <pthread.h>
/* FIXME: F I X M E
*
@@ -55,6 +57,109 @@
* *MUST* BE FIXED BEFORE ANY OFFICIAL RELEASE.
*/
+struct gp_ring_buffer_cred {
+ uint64_t count;
+ gss_cred_id_t cred;
+};
+
+struct gp_ring_buffer {
+ char *name;
+ uint32_t end;
+ uint64_t count;
+ pthread_mutex_t lock;
+ struct gp_ring_buffer_cred **creds;
+ uint32_t num_creds;
+};
+
+static void gp_free_ring_buffer_cred(struct gp_ring_buffer_cred *cred)
+{
+ uint32_t ret_min;
+
+ if (!cred) {
+ return;
+ }
+
+ gss_release_cred(&ret_min, &cred->cred);
+
+ free(cred);
+}
+
+void gp_free_ring_buffer(struct gp_ring_buffer *buffer)
+{
+ uint32_t i;
+
+ if (!buffer) {
+ return;
+ }
+
+ free(buffer->name);
+
+ for (i=0; i < buffer->num_creds; i++) {
+ gp_free_ring_buffer_cred(buffer->creds[i]);
+ }
+
+ free(buffer->creds);
+
+ pthread_mutex_destroy(&buffer->lock);
+
+ free(buffer);
+}
+
+uint32_t gp_init_ring_buffer(uint32_t *min,
+ const char *name,
+ uint32_t ring_size,
+ struct gp_ring_buffer **buffer_out)
+{
+ struct gp_ring_buffer *buffer;
+ uint32_t ret_maj = 0;
+ uint32_t ret_min = 0;
+ int ret;
+
+ GPDEBUG("gp_init_ring_buffer %s (size: %d)\n", name, ring_size);
+
+ buffer = calloc(1, sizeof(struct gp_ring_buffer));
+ if (!buffer) {
+ ret_min = ENOMEM;
+ ret_maj = GSS_S_FAILURE;
+ goto done;
+ }
+
+ buffer->name = strdup(name);
+ if (!buffer->name) {
+ ret_min = ENOMEM;
+ ret_maj = GSS_S_FAILURE;
+ goto done;
+ }
+
+ buffer->num_creds = ring_size;
+
+ buffer->creds = calloc(sizeof(struct gp_ring_buffer_cred *), buffer->num_creds);
+ if (!buffer->creds) {
+ ret_min = ENOMEM;
+ ret_maj = GSS_S_FAILURE;
+ goto done;
+ }
+
+ ret = pthread_mutex_init(&buffer->lock, NULL);
+ if (ret) {
+ ret_min = ret;
+ ret_maj = GSS_S_FAILURE;
+ goto done;
+ }
+
+ ret_maj = GSS_S_COMPLETE;
+ ret_min = 0;
+
+done:
+ *min = ret_min;
+ if (ret_maj) {
+ gp_free_ring_buffer(buffer);
+ }
+ *buffer_out = buffer;
+
+ return ret_maj;
+}
+
uint32_t gp_export_gssx_cred(uint32_t *min,
gss_cred_id_t *in, gssx_cred *out)
{