54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#pragma ident "%Z%%M% %I% %E% SMI"
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* Can't include krb5.h here, or k5-int.h which includes it, because
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf krb5.h needs to be generated with error tables, after util/et,
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf which builds after this directory. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* It would be nice to just use error_message() always. Pity that
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf it's defined in a library that depends on this one, and we're not
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf allowed to make circular dependencies. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf/* We really want a rwlock here, since we should hold it while calling
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf the function and copying out its results. But I haven't
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf implemented shims for rwlock yet. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfstatic const char *(KRB5_CALLCONV *fptr)(long); /* = &error_message */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf return k5_mutex_finish_init (&krb5int_error_info_support_mutex);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define initialize() krb5int_call_thread_support_init()
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define lock() k5_mutex_lock(&krb5int_error_info_support_mutex)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf#define unlock() k5_mutex_unlock(&krb5int_error_info_support_mutex)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5int_set_error (struct errinfo *ep, long code, const char *fmt, ...)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf vsnprintf(ep->scratch_buf, sizeof(ep->scratch_buf), fmt, args);
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfconst char *
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (r == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (initialize() != 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf strncpy(ep->scratch_buf, _("Kerberos library initialization failure"),
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (strerror_r (code, ep->scratch_buf, sizeof(ep->scratch_buf)) == 0) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf /* If strerror_r didn't work with the 1K buffer, we can try a
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf really big one. This seems kind of gratuitous though. */
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf strncpy (ep->scratch_buf, r, sizeof(ep->scratch_buf));
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillf if (r == NULL) {
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5int_free_error (struct errinfo *ep, const char *msg)
54925bf60766fbb4f1f2d7c843721406a7b7a3fbwillfkrb5int_set_error_info_callout_fn (const char *(KRB5_CALLCONV *f)(long))