summaryrefslogtreecommitdiff
path: root/src/lib/krb5/ccache/cccopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/krb5/ccache/cccopy.c')
-rw-r--r--src/lib/krb5/ccache/cccopy.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/lib/krb5/ccache/cccopy.c b/src/lib/krb5/ccache/cccopy.c
new file mode 100644
index 000000000000..d71d439ddd51
--- /dev/null
+++ b/src/lib/krb5/ccache/cccopy.c
@@ -0,0 +1,37 @@
+/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+#include "k5-int.h"
+
+krb5_error_code KRB5_CALLCONV
+krb5_cc_copy_creds(krb5_context context, krb5_ccache incc, krb5_ccache outcc)
+{
+ krb5_error_code code;
+ krb5_cc_cursor cur = 0;
+ krb5_creds creds;
+
+ if ((code = krb5_cc_start_seq_get(context, incc, &cur)))
+ goto cleanup;
+
+ while (!(code = krb5_cc_next_cred(context, incc, &cur, &creds))) {
+ code = krb5_cc_store_cred(context, outcc, &creds);
+ krb5_free_cred_contents(context, &creds);
+ if (code)
+ goto cleanup;
+ }
+
+ if (code != KRB5_CC_END)
+ goto cleanup;
+
+ code = krb5_cc_end_seq_get(context, incc, &cur);
+ cur = 0;
+ if (code)
+ goto cleanup;
+
+ code = 0;
+
+cleanup:
+ /* If set then we are in an error pathway */
+ if (cur)
+ krb5_cc_end_seq_get(context, incc, &cur);
+
+ return(code);
+}