#include <libintl.h>
#include <locale.h>
#include "dh_gssapi.h"
OM_uint32
__dh_gss_display_status(void *ctx,
OM_uint32 *minor,
OM_uint32 status_value,
int status_type,
gss_OID mech,
OM_uint32* mesg_ctx,
gss_buffer_t status_str )
{
char *str;
OM_uint32 major = GSS_S_COMPLETE;
if (!minor)
return (GSS_S_CALL_INACCESSIBLE_WRITE);
*minor = DH_SUCCESS;
if (!mesg_ctx)
return (GSS_S_CALL_INACCESSIBLE_WRITE);
*mesg_ctx = 0;
if (status_type != GSS_C_MECH_CODE)
return ((status_type == GSS_C_GSS_CODE ?
GSS_S_FAILURE : GSS_S_BAD_STATUS));
if (mech != GSS_C_NO_OID &&
!__OID_equal(((dh_context_t)ctx)->mech, mech))
return (GSS_S_BAD_MECH);
switch (status_value) {
case DH_SUCCESS:
str = dgettext(TEXT_DOMAIN, "mech_dh: Success");
break;
case DH_NOMEM_FAILURE:
str = dgettext(TEXT_DOMAIN, "mech_dh: No memory");
break;
case DH_ENCODE_FAILURE:
str = dgettext(TEXT_DOMAIN,
"mech_dh: Could not encode token");
break;
case DH_DECODE_FAILURE:
str = dgettext(TEXT_DOMAIN,
"mech_dh: Could not decode token");
break;
case DH_BADARG_FAILURE:
str = dgettext(TEXT_DOMAIN, "mech_dh: Bad argument");
break;
case DH_CIPHER_FAILURE:
str = dgettext(TEXT_DOMAIN, "mech_dh: Cipher failure");
break;
case DH_VERIFIER_FAILURE:
str = dgettext(TEXT_DOMAIN, "mech_dh: Verifier failure");
break;
case DH_SESSION_CIPHER_FAILURE:
str = dgettext(TEXT_DOMAIN, "mech_dh: Session cipher failure");
break;
case DH_NO_SECRET:
str = dgettext(TEXT_DOMAIN, "mech_dh: No secret key");
break;
case DH_NO_PRINCIPAL:
str = dgettext(TEXT_DOMAIN, "mech_dh: No principal");
break;
case DH_NOT_LOCAL:
str = dgettext(TEXT_DOMAIN, "mech_dh: Not local principal");
break;
case DH_UNKNOWN_QOP:
str = dgettext(TEXT_DOMAIN, "mech_dh: Unkown QOP");
break;
case DH_VERIFIER_MISMATCH:
str = dgettext(TEXT_DOMAIN, "mech_dh: Verifier mismatch");
break;
case DH_NO_SUCH_USER:
str = dgettext(TEXT_DOMAIN, "mech_dh: No such user");
break;
case DH_NETNAME_FAILURE:
str = dgettext(TEXT_DOMAIN,
"mech_dh: Could not generate netname");
break;
case DH_BAD_CRED:
str = dgettext(TEXT_DOMAIN, "mech_dh: Invalid credential");
break;
case DH_BAD_CONTEXT:
str = dgettext(TEXT_DOMAIN, "mech_dh: Invalid GSS context");
break;
case DH_PROTO_MISMATCH:
str = dgettext(TEXT_DOMAIN, "mech_dh: Diffie-Hellman protocol "
"mismatch");
break;
default:
str = dgettext(TEXT_DOMAIN, "mech_dh: Invalid or "
"unknown error");
major = GSS_S_BAD_STATUS;
break;
}
status_str->value = strdup(str);
if (status_str == 0) {
*minor = DH_NOMEM_FAILURE;
return (GSS_S_FAILURE);
}
status_str->length = strlen(str);
return (major);
}