diff options
author | Russ Allbery <rra@stanford.edu> | 2008-04-24 01:17:48 +0000 |
---|---|---|
committer | Russ Allbery <rra@stanford.edu> | 2008-04-24 01:17:48 +0000 |
commit | 23b711ebacb2371915bfa4d9e0d386fa4e7cb35e (patch) | |
tree | 5041a42d5d48526322d827ef0e956f061e8064cc /util | |
parent | d509c915c9c3adc3b61eae84bdca0b612f25df96 (diff) |
Switch to messages-krb5 in util instead of the one built in the client
library and start the transition of coding style.
Diffstat (limited to 'util')
-rw-r--r-- | util/messages-krb5.c | 119 | ||||
-rw-r--r-- | util/util.h | 145 |
2 files changed, 196 insertions, 68 deletions
diff --git a/util/messages-krb5.c b/util/messages-krb5.c new file mode 100644 index 0000000..314f96a --- /dev/null +++ b/util/messages-krb5.c @@ -0,0 +1,119 @@ +/* $Id$ + * + * Error handling for Kerberos v5. + * + * Provides versions of die and warn that take a Kerberos context and a + * Kerberos error code and append the Kerberos error message to the provided + * formatted message. + * + * Written by Russ Allbery <rra@stanford.edu> + * Copyright 2006, 2007, 2008 + * Board of Trustees, Leland Stanford Jr. University + * + * See LICENSE for licensing terms. + */ + +#include <config.h> +#include <system.h> + +#include <krb5.h> +#if !defined(HAVE_KRB5_GET_ERROR_MESSAGE) && !defined(HAVE_KRB5_GET_ERR_TEXT) +# if defined(HAVE_IBM_SVC_KRB5_SVC_H) +# include <ibm_svc/krb5_svc.h> +# elif defined(HAVE_ET_COM_ERR_H) +# include <et/com_err.h> +# else +# include <com_err.h> +# endif +#endif + +#include <util/util.h> + +/* + * This string is returned for unknown error messages. We use a static + * variable so that we can be sure not to free it. + */ +static const char error_unknown[] = "unknown error"; + + +/* + * Given a Kerberos error code, return the corresponding error. Prefer the + * Kerberos interface if available since it will provide context-specific + * error information, whereas the error_message() call will only provide a + * fixed message. + */ +static const char * +get_error(krb5_context ctx UNUSED, krb5_error_code code) +{ + const char *msg = NULL; + +#if defined(HAVE_KRB5_GET_ERROR_MESSAGE) + msg = krb5_get_error_message(ctx, code); +#elif defined(HAVE_KRB5_GET_ERR_TEXT) + msg = krb5_get_err_text(ctx, code); +#elif defined(HAVE_KRB5_SVC_GET_MSG) + krb5_svc_get_msg(code, &msg); +#else + msg = error_message(code); +#endif + if (msg == NULL) + return error_unknown; + else + return msg; +} + + +/* + * Free an error string if necessary. + */ +static void +free_error(krb5_context ctx UNUSED, const char *msg) +{ + if (msg == error_unknown) + return; +#if defined(HAVE_KRB5_FREE_ERROR_MESSAGE) + krb5_free_error_message(ctx, msg); +#elif defined(HAVE_KRB5_SVC_GET_MSG) + krb5_free_string((char *) msg); +#endif +} + + +/* + * Report a Kerberos error and exit. + */ +void +die_krb5(krb5_context ctx, krb5_error_code code, const char *format, ...) +{ + const char *k5_msg = NULL; + char *message; + va_list args; + + k5_msg = get_error(ctx, code); + va_start(args, format); + if (xvasprintf(&message, format, args) < 0) + die("internal error: unable to format error message"); + va_end(args); + die("%s: %s", message, k5_msg); +} + + +/* + * Report a Kerberos error. + */ +void +warn_krb5(krb5_context ctx, krb5_error_code code, const char *format, ...) +{ + const char *k5_msg = NULL; + char *message; + va_list args; + + k5_msg = get_error(ctx, code); + va_start(args, format); + if (xvasprintf(&message, format, args) < 0) + die("internal error: unable to format error message"); + va_end(args); + warn("%s: %s", message, k5_msg); + free(message); + free_error(ctx, k5_msg); +} diff --git a/util/util.h b/util/util.h index 7fc4c96..0a45c73 100644 --- a/util/util.h +++ b/util/util.h @@ -1,61 +1,51 @@ -/* $Id$ -** -** Utility functions. -** -** This is a variety of utility functions that are used internally by the -** wallet client. Many of them came originally from INN. -** -** Written by Russ Allbery <rra@stanford.edu> -** Copyright 2002, 2003, 2004, 2005, 2006, 2007 -** Board of Trustees, Leland Stanford Jr. University -** Copyright (c) 2004, 2005, 2006, 2007 -** by Internet Systems Consortium, Inc. ("ISC") -** Copyright (c) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -** 2002, 2003 by The Internet Software Consortium and Rich Salz -** -** This code is derived from software contributed to the Internet Software -** Consortium by Rich Salz. -** -** Permission to use, copy, modify, and distribute this software for any -** purpose with or without fee is hereby granted, provided that the above -** copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH -** REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY -** SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ +/* $Id$ + * + * Utility functions. + * + * This is a variety of utility functions that are used internally by pieces + * of remctl. Many of them came originally from INN. + * + * Written by Russ Allbery <rra@stanford.edu> + * Copyright 2005, 2006, 2007, 2008 + * Board of Trustees, Leland Stanford Jr. University + * Copyright 2004, 2005, 2006, 2007 + * by Internet Systems Consortium, Inc. ("ISC") + * Copyright 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + * 2003 by The Internet Software Consortium and Rich Salz + * + * See LICENSE for licensing terms. + */ #ifndef UTIL_UTIL_H #define UTIL_UTIL_H 1 #include <config.h> -#include <system.h> +#include <portable/macros.h> + +#include <krb5.h> +#include <stdarg.h> +#include <sys/types.h> /* Used for unused parameters to silence gcc warnings. */ #define UNUSED __attribute__((__unused__)) BEGIN_DECLS -/* Forward declarations to avoid includes. */ -struct addrinfo; -struct iovec; -struct sockaddr; - /* Concatenate NULL-terminated strings into a newly allocated string. */ extern char *concat(const char *first, ...); -/* Given a base path and a file name, create a newly allocated path string. - The name will be appended to base with a / between them. Exceptionally, if - name begins with a slash, it will be strdup'd and returned as-is. */ +/* + * Given a base path and a file name, create a newly allocated path string. + * The name will be appended to base with a / between them. Exceptionally, if + * name begins with a slash, it will be strdup'd and returned as-is. + */ extern char *concatpath(const char *base, const char *name); -/* The reporting functions. The ones prefaced by "sys" add a colon, a space, - and the results of strerror(errno) to the output and are intended for - reporting failures of system calls. */ +/* + * The reporting functions. The ones prefaced by "sys" add a colon, a space, + * and the results of strerror(errno) to the output and are intended for + * reporting failures of system calls. + */ extern void debug(const char *, ...) __attribute__((__format__(printf, 1, 2))); extern void notice(const char *, ...) @@ -71,18 +61,31 @@ extern void die(const char *, ...) extern void sysdie(const char *, ...) __attribute__((__noreturn__, __format__(printf, 1, 2))); -/* Set the handlers for various message functions. All of these functions - take a count of the number of handlers and then function pointers for each - of those handlers. These functions are not thread-safe; they set global - variables. */ +/* + * The Kerberos versions of the reporting functions. These take a context and + * an error code to get the Kerberos error. + */ +void die_krb5(krb5_context, krb5_error_code, const char *, ...) + __attribute__((__noreturn__, __format__(printf, 3, 4))); +void warn_krb5(krb5_context, krb5_error_code, const char *, ...) + __attribute__((__format__(printf, 3, 4))); + +/* + * Set the handlers for various message functions. All of these functions + * take a count of the number of handlers and then function pointers for each + * of those handlers. These functions are not thread-safe; they set global + * variables. + */ extern void message_handlers_debug(int count, ...); extern void message_handlers_notice(int count, ...); extern void message_handlers_warn(int count, ...); extern void message_handlers_die(int count, ...); -/* Some useful handlers, intended to be passed to message_handlers_*. All - handlers take the length of the formatted message, the format, a variadic - argument list, and the errno setting if any. */ +/* + * Some useful handlers, intended to be passed to message_handlers_*. All + * handlers take the length of the formatted message, the format, a variadic + * argument list, and the errno setting if any. + */ extern void message_log_stdout(int, const char *, va_list, int); extern void message_log_stderr(int, const char *, va_list, int); extern void message_log_syslog_debug(int, const char *, va_list, int); @@ -98,13 +101,17 @@ typedef void (*message_handler_func)(int, const char *, va_list, int); /* If non-NULL, called before exit and its return value passed to exit. */ extern int (*message_fatal_cleanup)(void); -/* If non-NULL, prepended (followed by ": ") to all messages printed by either - message_log_stdout or message_log_stderr. */ +/* + * If non-NULL, prepended (followed by ": ") to all messages printed by either + * message_log_stdout or message_log_stderr. + */ extern const char *message_program_name; -/* The functions are actually macros so that we can pick up the file and line - number information for debugging error messages without the user having to - pass those in every time. */ +/* + * The functions are actually macros so that we can pick up the file and line + * number information for debugging error messages without the user having to + * pass those in every time. + */ #define xcalloc(n, size) x_calloc((n), (size), __FILE__, __LINE__) #define xmalloc(size) x_malloc((size), __FILE__, __LINE__) #define xrealloc(p, size) x_realloc((p), (size), __FILE__, __LINE__) @@ -112,12 +119,14 @@ extern const char *message_program_name; #define xstrndup(p, size) x_strndup((p), (size), __FILE__, __LINE__) #define xvasprintf(p, f, a) x_vasprintf((p), (f), (a), __FILE__, __LINE__) -/* asprintf is a special case since it takes variable arguments. If we have - support for variadic macros, we can still pass in the file and line and - just need to put them somewhere else in the argument list than last. - Otherwise, just call x_asprintf directly. This means that the number of - arguments x_asprintf takes must vary depending on whether variadic macros - are supported. */ +/* + * asprintf is a special case since it takes variable arguments. If we have + * support for variadic macros, we can still pass in the file and line and + * just need to put them somewhere else in the argument list than last. + * Otherwise, just call x_asprintf directly. This means that the number of + * arguments x_asprintf takes must vary depending on whether variadic macros + * are supported. + */ #ifdef HAVE_C99_VAMACROS # define xasprintf(p, f, ...) \ x_asprintf((p), __FILE__, __LINE__, (f), __VA_ARGS__) @@ -128,12 +137,10 @@ extern const char *message_program_name; # define xasprintf x_asprintf #endif -/* Last two arguments are always file and line number. These are internal - implementations that should not be called directly. ISO C99 says that - identifiers beginning with _ and a lowercase letter are reserved for - identifiers of file scope, so while the position of libraries in the - standard isn't clear, it's probably not entirely kosher to use _xmalloc - here. Use x_malloc instead. */ +/* + * Last two arguments are always file and line number. These are internal + * implementations that should not be called directly. + */ extern void *x_calloc(size_t, size_t, const char *, int); extern void *x_malloc(size_t, const char *, int); extern void *x_realloc(void *, size_t, const char *, int); @@ -154,8 +161,10 @@ typedef void (*xmalloc_handler_type)(const char *, size_t, const char *, int); /* The default error handler. */ void xmalloc_fail(const char *, size_t, const char *, int); -/* Assign to this variable to choose a handler other than the default, which - just calls sysdie. */ +/* + * Assign to this variable to choose a handler other than the default, which + * just calls sysdie. + */ extern xmalloc_handler_type xmalloc_error_handler; END_DECLS |