-/*
- * $Source$
- * $Author$
- * $Header$
- *
- * Copyright (C) 1987 by the Massachusetts Institute of Technology
+/* $Id$
*
- * $Log$
- * Revision 1.2 1988-08-02 21:12:18 mar
- * don't change hostname if it contains wildcards
+ * Canonicalize a hostname
*
- * Revision 1.1 87/09/03 03:12:45 wesommer
- * Initial revision
- *
+ * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
*/
-#ifndef lint
-static char *rcsid_fixhost_c = "$Header$";
-#endif lint
+#include <mit-copyright.h>
+#include <moira.h>
#include <sys/types.h>
#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/resolv.h>
+#include <sys/utsname.h>
+
#include <netdb.h>
-#include <stdio.h>
-#include <strings.h>
+#include <netinet/in.h>
+
#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
-extern char *malloc();
-extern char *realloc();
-extern char *strsave();
+RCSID("$Header$");
/*
- * Canonicalize hostname; if it is in the namespace, call the
- * nameserver to expand it; otherwise uppercase it and append the
- * default domain (using an, er, undocumented global of the
- * nameserver).
+ * Canonicalize hostname:
+ * if it is in double-quotes, then strip the quotes and return the name.
+ * if it is in the namespace, call the nameserver to expand it
+ * otherwise uppercase it and append the default domain (using an, er,
+ * undocumented global of the nameserver).
*
* Assumes that host was allocated using malloc(); it may be freed or
* realloc'ed, so the old pointer should not be considered valid.
*/
-char *
-canonicalize_hostname(host)
- char *host;
+char *canonicalize_hostname(char *host)
{
- register struct hostent *hp;
- int n_len;
- int has_dot = 0;
- char tbuf[BUFSIZ];
- register char *cp;
-
- if (index(host, '*') || index(host, '?'))
- return(host);
+ struct hostent *hp;
+ int len;
+ int has_dot = 0;
+ char *tbuf, *cp;
+
+ len = strlen(host);
+ if (len > 2 && host[0] == '"' && host[len - 1] == '"')
+ {
+ tbuf = malloc(len - 1);
+ if (!tbuf)
+ return NULL;
+ strncpy(tbuf, host + 1, len - 2);
+ tbuf[len - 2] = '\0';
+ free(host);
+ return tbuf;
+ }
+
+ if (strchr(host, '*') || strchr(host, '?') || *host == '[')
+ return host;
- hp = gethostbyname(host);
+ hp = gethostbyname(host);
- if (hp) {
- n_len = strlen(hp->h_name) + 1;
- host = realloc(host, (unsigned)n_len);
-
- (void) strcpy(host, hp->h_name);
- return host;
- } else {
- /* can't get name from nameserver; fix up the format a bit */
- for (cp = host; *cp; cp++) {
- register int c; /* pcc doesn't like register char */
- if (islower(c = *cp)) *cp = toupper(c);
- has_dot |= (c == '.');
+ if (hp)
+ {
+ host = realloc(host, strlen(hp->h_name) + 1);
+ if (host)
+ strcpy(host, hp->h_name);
+ return host;
+ }
+ else
+ {
+ /* can't get name from nameserver; fix up the format a bit */
+ for (cp = host; *cp; cp++)
+ {
+ if (islower(*cp))
+ *cp = toupper(*cp);
+ has_dot |= (*cp == '.');
}
- if (!has_dot) {
- (void) sprintf(tbuf, "%s.%s", host, _res.defdname);
- free(host);
- host = strsave(tbuf);
+ if (!has_dot)
+ {
+ static char *domain = NULL;
+
+ if (domain == NULL)
+ {
+ char hostbuf[256];
+
+ if (mr_host(hostbuf, sizeof(hostbuf)) == MR_SUCCESS)
+ {
+ cp = strchr(hostbuf, '.');
+ if (cp)
+ domain = strdup(++cp);
+ }
+ else
+ {
+ struct utsname name;
+ uname(&name);
+ hp = gethostbyname(name.nodename);
+ if (hp)
+ {
+ cp = strchr(hp->h_name, '.');
+ if (cp)
+ domain = strdup(++cp);
+ }
+ }
+ if (!domain)
+ domain = "";
+ }
+ tbuf = malloc(strlen(host) + strlen(domain) + 2);
+ if (!tbuf)
+ return NULL;
+ sprintf(tbuf, "%s.%s", host, domain);
+ free(host);
+ host = tbuf;
}
- return host;
+ return host;
}
}