if ((ret = krb5_init_context(&context))) {
                printerr(0, "ERROR: initializing krb5_context: %s\n",
-                       error_message(ret));
+                       gssd_k5_err_msg(NULL, ret));
                goto out_err;
        }
 
        if ((ret = krb5_auth_con_getlocalsubkey(context,
                                                ctx->auth_context, &key))){
                printerr(0, "ERROR: getting auth_context key: %s\n",
-                       error_message(ret));
+                       gssd_k5_err_msg(context, ret));
                goto out_err_free_context;
        }
 
                                calloc(1, enc_key.keyvalue.length)) == NULL) {
 
                printerr(0, "ERROR: allocating memory for enc key: %s\n",
-                       error_message(ENOMEM));
+                       gssd_k5_err_msg(context, ENOMEM));
                goto out_err_free_key;
        }
        skd = (char *) key->keyvalue.data;
 
        if ((ret = krb5_init_context(&context))) {
                printerr(0, "ERROR: initializing krb5_context: %s\n",
-                       error_message(ret));
+                       gssd_k5_err_msg(NULL, ret));
                goto out_err;
        }
 
        if ((ret = krb5_auth_con_getlocalsubkey(context,
                                                ctx->auth_context, &key))){
                printerr(0, "ERROR: getting auth_context key: %s\n",
-                       error_message(ret));
+                       gssd_k5_err_msg(context, ret));
                goto out_err_free_context;
        }
 
 
                                               kt, 0, NULL, &options))) {
                printerr(0, "WARNING: %s while getting initial ticket for "
                         "principal '%s' using keytab '%s'\n",
-                        error_message(code),
+                        gssd_k5_err_msg(context, code),
                         pname ? pname : "<unparsable>", kt_name);
                goto out;
        }
        }
        if ((code = krb5_cc_resolve(context, cc_name, &ccache))) {
                printerr(0, "ERROR: %s while opening credential cache '%s'\n",
-                        error_message(code), cc_name);
+                        gssd_k5_err_msg(context, code), cc_name);
                goto out;
        }
        if ((code = krb5_cc_initialize(context, ccache, ple->princ))) {
                printerr(0, "ERROR: %s while initializing credential "
-                        "cache '%s'\n", error_message(code), cc_name);
+                        "cache '%s'\n", gssd_k5_err_msg(context, code),
+                        cc_name);
                goto out;
        }
        if ((code = krb5_cc_store_cred(context, ccache, &my_creds))) {
                printerr(0, "ERROR: %s while storing credentials in '%s'\n",
-                        error_message(code), cc_name);
+                        gssd_k5_err_msg(context, code), cc_name);
                goto out;
        }
 
         */
        if ((code = krb5_kt_get_name(context, kt, kt_name, BUFSIZ))) {
                printerr(0, "ERROR: %s attempting to get keytab name\n",
-                        error_message(code));
+                        gssd_k5_err_msg(context, code));
                retval = code;
                goto out;
        }
        if ((code = krb5_kt_start_seq_get(context, kt, &cursor))) {
                printerr(0, "ERROR: %s while beginning keytab scan "
                            "for keytab '%s'\n",
-                       error_message(code), kt_name);
+                       gssd_k5_err_msg(context, code), kt_name);
                retval = code;
                goto out;
        }
                                              &pname))) {
                        printerr(0, "WARNING: Skipping keytab entry because "
                                 "we failed to unparse principal name: %s\n",
-                                error_message(code));
+                                gssd_k5_err_msg(context, code));
                        k5_free_kt_entry(context, kte);
                        continue;
                }
        if ((code = krb5_kt_end_seq_get(context, kt, &cursor))) {
                printerr(0, "WARNING: %s while ending keytab scan for "
                            "keytab '%s'\n",
-                        error_message(code), kt_name);
+                        gssd_k5_err_msg(context, code), kt_name);
        }
 
        retval = 0;
        retval = gethostname(myhostname, sizeof(myhostname));
        if (retval) {
                printerr(1, "%s while getting local hostname\n",
-                        error_message(retval));
+                        gssd_k5_err_msg(context, retval));
                goto out;
        }
        retval = get_full_hostname(myhostname, myhostname, sizeof(myhostname));
        if (code) {
                retval = code;
                printerr(1, "%s while getting default realm name\n",
-                        error_message(code));
+                        gssd_k5_err_msg(context, code));
                goto out;
        }
 
        code = krb5_get_host_realm(context, targethostname, &realmnames);
        if (code) {
                printerr(0, "ERROR: %s while getting realm(s) for host '%s'\n",
-                        error_message(code), targethostname);
+                        gssd_k5_err_msg(context, code), targethostname);
                retval = code;
                goto out;
        }
                                                        NULL);
                        if (code) {
                                printerr(1, "%s while building principal for "
-                                        "'%s/%s@%s'\n", error_message(code),
+                                        "'%s/%s@%s'\n",
+                                        gssd_k5_err_msg(context, code),
                                         svcnames[j], myhostname, realm);
                                continue;
                        }
                        krb5_free_principal(context, princ);
                        if (code) {
                                printerr(3, "%s while getting keytab entry for "
-                                        "'%s/%s@%s'\n", error_message(code),
+                                        "'%s/%s@%s'\n",
+                                        gssd_k5_err_msg(context, code),
                                         svcnames[j], myhostname, realm);
                        } else {
                                printerr(3, "Success getting keytab entry for "
        code = krb5_init_context(&context);
        if (code) {
                printerr(0, "ERROR: %s while initializing krb5\n",
-                        error_message(code));
+                        gssd_k5_err_msg(NULL, code));
                goto out;
        }
 
                if ((code = krb5_cc_resolve(context, ple->ccname, &ccache))) {
                        printerr(0, "WARNING: %s while resolving credential "
                                    "cache '%s' for destruction\n",
-                                error_message(code), ple->ccname);
+                                gssd_k5_err_msg(context, code), ple->ccname);
                        continue;
                }
 
                if ((code = krb5_cc_destroy(context, ccache))) {
                        printerr(0, "WARNING: %s while destroying credential "
                                    "cache '%s'\n",
-                                error_message(code), ple->ccname);
+                                gssd_k5_err_msg(context, code), ple->ccname);
                }
        }
   out:
        code = krb5_init_context(&context);
        if (code) {
                printerr(0, "ERROR: %s: %s while initializing krb5 context\n",
-                        __FUNCTION__, error_message(code));
+                        __FUNCTION__, gssd_k5_err_msg(NULL, code));
                retval = code;
                goto out;
        }
 
        if ((code = krb5_kt_resolve(context, keytabfile, &kt))) {
                printerr(0, "ERROR: %s: %s while resolving keytab '%s'\n",
-                        __FUNCTION__, error_message(code), keytabfile);
+                        __FUNCTION__, gssd_k5_err_msg(context, code),
+                        keytabfile);
                goto out;
        }
 
        return retval;
 }
 
+/*
+ * A common routine for getting the Kerberos error message
+ */
+const char *
+gssd_k5_err_msg(krb5_context context, krb5_error_code code)
+{
+       const char *msg = NULL;
+#if HAVE_KRB5_GET_ERROR_MESSAGE
+       if (context != NULL)
+               msg = krb5_get_error_message(context, code);
+#endif
+       if (msg != NULL)
+               return msg;
+#if HAVE_KRB5
+       return error_message(code);
+#else
+       if (context != NULL)
+               return krb5_get_err_text(context, code);
+       else
+               return error_message(code);
+#endif
+}