summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/krb5/error_tables/krb5_err.et6
-rw-r--r--src/lib/krb5/os/ChangeLog8
-rw-r--r--src/lib/krb5/os/def_realm.c20
-rw-r--r--src/lib/krb5/os/hst_realm.c92
4 files changed, 92 insertions, 34 deletions
diff --git a/src/lib/krb5/error_tables/krb5_err.et b/src/lib/krb5/error_tables/krb5_err.et
index 6135a9dfa..a7ff6eaf1 100644
--- a/src/lib/krb5/error_tables/krb5_err.et
+++ b/src/lib/krb5/error_tables/krb5_err.et
@@ -323,4 +323,10 @@ error_code KRB5_NOPERM_ETYPE, "Encryption type not permitted"
error_code KRB5_CONFIG_ETYPE_NOSUPP, "No supported encryption types (config file error?)"
error_code KRB5_OBSOLETE_FN, "Program called an obsolete, deleted function"
+# translated versions of getaddrinfo errors
+error_code KRB5_EAI_FAIL, "unknown getaddrinfo failure"
+error_code KRB5_EAI_NODATA, "no data available for host/domain name"
+error_code KRB5_EAI_NONAME, "host/domain name not found"
+error_code KRB5_EAI_SERVICE, "service name unknown"
+
end
diff --git a/src/lib/krb5/os/ChangeLog b/src/lib/krb5/os/ChangeLog
index a5914451d..603c0ab04 100644
--- a/src/lib/krb5/os/ChangeLog
+++ b/src/lib/krb5/os/ChangeLog
@@ -1,3 +1,11 @@
+2002-01-08 Ken Raeburn <raeburn@mit.edu>
+
+ * hst_realm.c (krb5int_get_fq_hostname): New function. Use
+ getaddrinfo instead of gethostbyname.
+ (krb5int_get_fq_local_hostname): New function.
+ (krb5_get_host_realm): Call it.
+ * def_realm.c (krb5_get_default_realm): Call it.
+
2001-12-05 Ezra Peisach <epeisach@mit.edu>
* sendto_kdc.c (krb5_sendto_kdc): Get rid of unecessary casts.
diff --git a/src/lib/krb5/os/def_realm.c b/src/lib/krb5/os/def_realm.c
index 9b9ca49b4..0f0a40ad8 100644
--- a/src/lib/krb5/os/def_realm.c
+++ b/src/lib/krb5/os/def_realm.c
@@ -119,26 +119,10 @@ krb5_get_default_realm(context, lrealm)
*/
char localhost[MAX_DNS_NAMELEN+1];
char * p;
- struct hostent * h;
- localhost[0] = 0;
- gethostname(localhost, sizeof(localhost));
- localhost[sizeof(localhost) - 1] = 0;
+ krb5int_get_fq_local_hostname (localhost, sizeof(localhost));
if ( localhost[0] ) {
- /*
- * Try to make sure that we have a fully qualified
- * name if possible. We want to be able to handle
- * the case where gethostname returns a partial
- * name (i.e., it has a dot, but it is not a
- * FQDN).
- */
- h = gethostbyname(localhost);
- if (h) {
- strncpy(localhost, h->h_name, sizeof(localhost));
- localhost[sizeof(localhost) - 1] = '\0';
- }
-
p = localhost;
do {
retval = krb5_try_realm_txt_rr("_kerberos", p,
@@ -147,7 +131,7 @@ krb5_get_default_realm(context, lrealm)
if (p)
p++;
} while (retval && p && p[0]);
-
+
if (retval)
retval = krb5_try_realm_txt_rr("_kerberos", "",
&context->default_realm);
diff --git a/src/lib/krb5/os/hst_realm.c b/src/lib/krb5/os/hst_realm.c
index c973ba3f4..568178f76 100644
--- a/src/lib/krb5/os/hst_realm.c
+++ b/src/lib/krb5/os/hst_realm.c
@@ -90,6 +90,9 @@
#endif /* WSHELPER */
#endif /* KRB5_DNS_LOOKUP */
+#define FAI_PREFIX krb5int
+#include "fake-addrinfo.h"
+
/* for old Unixes and friends ... */
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 64
@@ -231,6 +234,39 @@ krb5_try_realm_txt_rr(prefix, name, realm)
}
#endif /* KRB5_DNS_LOOKUP */
+krb5_error_code krb5int_translate_gai_error (int);
+
+static krb5_error_code
+krb5int_get_fq_hostname (char *buf, size_t bufsize, const char *name)
+{
+ struct addrinfo *ai, hints;
+ int err;
+
+ memset (&hints, 0, sizeof (hints));
+ hints.ai_flags = AI_CANONNAME;
+ err = getaddrinfo (name, 0, &hints, &ai);
+ if (err)
+ return krb5int_translate_gai_error (err);
+ if (ai->ai_canonname == 0)
+ return KRB5_EAI_FAIL;
+ strncpy (buf, ai->ai_canonname, bufsize);
+ buf[bufsize-1] = 0;
+ freeaddrinfo (ai);
+ return 0;
+}
+
+/* Get the local host name, try to make it fully-qualified.
+ Always return a null-terminated string.
+ Might return an error if gethostname fails. */
+krb5_error_code
+krb5int_get_fq_local_hostname (char *buf, size_t bufsiz)
+{
+ buf[0] = 0;
+ if (gethostname (buf, bufsiz) == -1)
+ return SOCKET_ERRNO;
+ buf[bufsiz - 1] = 0;
+ return krb5int_get_fq_hostname (buf, bufsiz, buf);
+}
krb5_error_code KRB5_CALLCONV
krb5_get_host_realm(context, host, realmsp)
@@ -243,25 +279,17 @@ krb5_get_host_realm(context, host, realmsp)
krb5_error_code retval;
int l;
char local_host[MAX_DNS_NAMELEN+1];
- struct hostent *h;
-
- if (host)
+ if (host) {
+ /* Should probably error out if strlen(host) > MAX_DNS_NAMELEN. */
strncpy(local_host, host, sizeof(local_host));
- else {
- if (gethostname(local_host, sizeof(local_host)) == -1)
- return SOCKET_ERRNO;
- /*
- * Try to make sure that we have a fully qualified name if
- * possible. We need to handle the case where the host has a
- * dot but is not FQDN, so we call gethostbyname.
- */
- h = gethostbyname(local_host);
- if (h) {
- strncpy(local_host, h->h_name, sizeof(local_host));
- }
+ local_host[sizeof(local_host) - 1] = '\0';
+ } else {
+ retval = krb5int_get_fq_local_hostname (local_host,
+ sizeof (local_host));
+ if (retval)
+ return retval;
}
- local_host[sizeof(local_host) - 1] = '\0';
for (cp = local_host; *cp; cp++) {
if (isupper((int) (*cp)))
@@ -369,3 +397,35 @@ krb5_get_host_realm(context, host, realmsp)
*realmsp = retrealms;
return 0;
}
+
+
+krb5_error_code
+krb5int_translate_gai_error (int num)
+{
+ switch (num) {
+ case EAI_ADDRFAMILY:
+ return EAFNOSUPPORT;
+ case EAI_AGAIN:
+ return EAGAIN;
+ case EAI_BADFLAGS:
+ return EINVAL;
+ case EAI_FAIL:
+ return KRB5_EAI_FAIL;
+ case EAI_FAMILY:
+ return EAFNOSUPPORT;
+ case EAI_MEMORY:
+ return ENOMEM;
+ case EAI_NODATA:
+ return KRB5_EAI_NODATA;
+ case EAI_NONAME:
+ return KRB5_EAI_NONAME;
+ case EAI_SERVICE:
+ return KRB5_EAI_SERVICE;
+ case EAI_SOCKTYPE:
+ return EINVAL;
+ case EAI_SYSTEM:
+ return errno;
+ }
+ abort ();
+ return -1;
+}