diff options
author | Greg Hudson <ghudson@mit.edu> | 2012-07-24 16:26:27 -0400 |
---|---|---|
committer | Greg Hudson <ghudson@mit.edu> | 2012-07-24 16:26:27 -0400 |
commit | 8fbbfd7e2d2cd19f708b1944b75c60595fc65ec2 (patch) | |
tree | d17c22e128bbfeeca11ee49176c2f862a69fc1e5 /src/lib/krb5/os | |
parent | fc3e8c660d98b134767c574d899528dfd29d7a16 (diff) | |
download | krb5-8fbbfd7e2d2cd19f708b1944b75c60595fc65ec2.tar.gz krb5-8fbbfd7e2d2cd19f708b1944b75c60595fc65ec2.tar.xz krb5-8fbbfd7e2d2cd19f708b1944b75c60595fc65ec2.zip |
Rearrange ccdefname.c slightly
Eliminate the USE_CCAPI variant of get_from_os() which was only used
in KfM. Make get_from_os() allocate its result (wrapping the Windows
implementation so it can continue to use a fixed-size buffer).
Simplify krb5_cc_set_default_name() and krb5_cc_default_name(). Make
some minor style adjustments.
Diffstat (limited to 'src/lib/krb5/os')
-rw-r--r-- | src/lib/krb5/os/ccdefname.c | 144 |
1 files changed, 53 insertions, 91 deletions
diff --git a/src/lib/krb5/os/ccdefname.c b/src/lib/krb5/os/ccdefname.c index 47a0620d48..56e7af8639 100644 --- a/src/lib/krb5/os/ccdefname.c +++ b/src/lib/krb5/os/ccdefname.c @@ -28,10 +28,6 @@ #include "k5-int.h" #include <stdio.h> -#if defined(USE_CCAPI) -#include <CredentialsCache.h> -#endif - #if defined(_WIN32) static int get_from_registry_indirect(char *name_buf, int name_size) { @@ -161,10 +157,9 @@ try_dir( buffer[buf_len-1] = '\0'; return 1; } -#endif -#if defined(_WIN32) -static krb5_error_code get_from_os(char *name_buf, unsigned int name_size) +static krb5_error_code +get_from_os_buffer(char *name_buf, unsigned int name_size) { char *prefix = krb5_cc_dfl_ops->prefix; unsigned int size; @@ -214,60 +209,39 @@ static krb5_error_code get_from_os(char *name_buf, unsigned int name_size) name_buf[name_size - 1] = 0; return 0; } -#endif - -#if defined(USE_CCAPI) -static krb5_error_code get_from_os(char *name_buf, unsigned int name_size) +static void +get_from_os(krb5_context context) { - krb5_error_code result = 0; - cc_context_t cc_context = NULL; - cc_string_t default_name = NULL; - - cc_int32 ccerr = cc_initialize (&cc_context, ccapi_version_3, NULL, NULL); - if (ccerr == ccNoError) { - ccerr = cc_context_get_default_ccache_name (cc_context, &default_name); - } + krb5_error_code err; + char buf[1024]; - if (ccerr == ccNoError) { - if (strlen (default_name -> data) + 5 > name_size) { - result = ENOMEM; - goto cleanup; - } else { - snprintf (name_buf, name_size, "API:%s", - default_name -> data); - } - } + if (get_from_os_buffer(buf, sizeof(buf)) == 0) + context->os_context.default_ccname = strdup(buf); +} -cleanup: - if (cc_context != NULL) { - cc_context_release (cc_context); - } +#else /* not _WIN32 */ - if (default_name != NULL) { - cc_string_release (default_name); - } +static void +get_from_os(krb5_context context) +{ + char *name; - return result; + if (asprintf(&name, "FILE:/tmp/krb5cc_%ld", (long)getuid()) >= 0) + context->os_context.default_ccname = name; } -#else -#if !(defined(_WIN32)) -static krb5_error_code get_from_os(char *name_buf, unsigned int name_size) -{ - snprintf(name_buf, name_size, "FILE:/tmp/krb5cc_%ld", (long) getuid()); - return 0; -} -#endif -#endif +#endif /* not _WIN32 */ #if defined(_WIN32) -static void set_for_os(const char *name) +static void +set_for_os(const char *name) { set_to_registry(HKEY_CURRENT_USER, name); } #else -static void set_for_os(const char *name) +static void +set_for_os(const char *name) { /* No implementation at present. */ } @@ -280,71 +254,59 @@ static void set_for_os(const char *name) krb5_error_code KRB5_CALLCONV krb5int_cc_user_set_default_name(krb5_context context, const char *name) { - krb5_error_code code = 0; - if ((code = krb5_cc_set_default_name(context, name))) - return code; + krb5_error_code err; + + err = krb5_cc_set_default_name(context, name); + if (err) + return err; set_for_os(name); - return code; + return 0; } krb5_error_code KRB5_CALLCONV krb5_cc_set_default_name(krb5_context context, const char *name) { - krb5_error_code err = 0; + krb5_os_context os_ctx; char *new_ccname = NULL; - if (!context || context->magic != KV5M_CONTEXT) { err = KV5M_CONTEXT; } + if (!context || context->magic != KV5M_CONTEXT) + return KV5M_CONTEXT; if (name != NULL) { - if (!err) { - /* If the name isn't NULL, make a copy of it */ - new_ccname = strdup (name); - if (new_ccname == NULL) { err = ENOMEM; } - } + new_ccname = strdup(name); + if (new_ccname == NULL) + return ENOMEM; } - if (!err) { - /* free the old ccname and store the new one */ - krb5_os_context os_ctx = &context->os_context; - if (os_ctx->default_ccname) { free (os_ctx->default_ccname); } - os_ctx->default_ccname = new_ccname; - new_ccname = NULL; /* don't free */ - } - - return err; + /* Free the old ccname and store the new one. */ + os_ctx = &context->os_context; + free(os_ctx->default_ccname); + os_ctx->default_ccname = new_ccname; + return 0; } const char * KRB5_CALLCONV krb5_cc_default_name(krb5_context context) { - krb5_error_code err = 0; - krb5_os_context os_ctx = NULL; - - if (!context || context->magic != KV5M_CONTEXT) { err = KV5M_CONTEXT; } + krb5_os_context os_ctx; + char *envstr; - if (!err) { - os_ctx = &context->os_context; + if (!context || context->magic != KV5M_CONTEXT) + return NULL; - if (os_ctx->default_ccname == NULL) { - /* Default ccache name has not been set yet */ - char *new_ccname = NULL; - char new_ccbuf[1024]; + os_ctx = &context->os_context; + if (os_ctx->default_ccname != NULL) + return os_ctx->default_ccname; - /* try the environment variable first */ - new_ccname = getenv(KRB5_ENV_CCNAME); - - if (new_ccname == NULL) { - /* fall back on the default ccache name for the OS */ - new_ccname = new_ccbuf; - err = get_from_os (new_ccbuf, sizeof (new_ccbuf)); - } - - if (!err) { - err = krb5_cc_set_default_name (context, new_ccname); - } - } + /* Try the environment variable first. */ + envstr = getenv(KRB5_ENV_CCNAME); + if (envstr != NULL) { + os_ctx->default_ccname = strdup(envstr); + return os_ctx->default_ccname; } - return err ? NULL : os_ctx->default_ccname; + /* Fall back on the default ccache name for the OS. */ + get_from_os(context); + return os_ctx->default_ccname; } |