diff options
Diffstat (limited to 'lib/ZInit.c')
-rw-r--r-- | lib/ZInit.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/ZInit.c b/lib/ZInit.c index 401f6db..16d266e 100644 --- a/lib/ZInit.c +++ b/lib/ZInit.c @@ -21,6 +21,12 @@ static char rcsid_ZInitialize_c[] = #ifdef HAVE_KRB4 #include <krb_err.h> #endif +#ifdef HAVE_KRB5 +#include <krb5.h> +#endif +#ifdef HAVE_KRB5_ERR_H +#include <krb5_err.h> +#endif #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff @@ -36,13 +42,22 @@ Code_t ZInitialize() int s, sinsize = sizeof(sin); Code_t code; ZNotice_t notice; +#ifdef HAVE_KRB5 + char **krealms = NULL; +#else #ifdef HAVE_KRB4 char *krealm = NULL; int krbval; char d1[ANAME_SZ], d2[INST_SZ]; +#endif +#endif +#ifdef HAVE_KRB4 initialize_krb_error_table(); #endif +#ifdef HAVE_KRB5 + initialize_krb5_error_table(); +#endif initialize_zeph_error_table(); @@ -67,6 +82,11 @@ Code_t ZInitialize() __Q_Tail = NULL; __Q_Head = NULL; +#ifdef HAVE_KRB5 + if ((code = krb5_init_context(&Z_krb5_ctx))) + return(code); +#endif + /* if the application is a server, there might not be a zhm. The code will fall back to something which might not be "right", but this is is ok, since none of the servers call krb_rd_req. */ @@ -85,9 +105,15 @@ Code_t ZInitialize() If this code ever support a multiplexing zhm, this will have to be made smarter, and probably per-message */ +#ifdef HAVE_KRB5 + code = krb5_get_host_realm(Z_krb5_ctx, notice.z_message, &krealms); + if (code) + return(code); +#else #ifdef HAVE_KRB4 krealm = krb_realmofhost(notice.z_message); #endif +#endif hostent = gethostbyname(notice.z_message); if (hostent && hostent->h_addrtype == AF_INET) memcpy(&servaddr, hostent->h_addr, sizeof(servaddr)); @@ -95,6 +121,24 @@ Code_t ZInitialize() ZFreeNotice(¬ice); } +#ifdef HAVE_KRB5 + if (krealms) { + strcpy(__Zephyr_realm, krealms[0]); + krb5_free_host_realm(Z_krb5_ctx, krealms); + } else { + char *p; /* XXX define this somewhere portable */ + /* XXX check ticket file here */ + code = krb5_get_default_realm(Z_krb5_ctx, &p); + strcpy(__Zephyr_realm, p); +#ifdef HAVE_KRB5_FREE_DEFAULT_REALM + krb5_free_default_realm(Z_krb5_ctx, p); +#else + free(p); +#endif + if (code) + return code; + } +#else #ifdef HAVE_KRB4 if (krealm) { strcpy(__Zephyr_realm, krealm); @@ -106,6 +150,7 @@ Code_t ZInitialize() #else strcpy(__Zephyr_realm, "local-realm"); #endif +#endif __My_addr.s_addr = INADDR_NONE; if (servaddr.s_addr != INADDR_NONE) { |