]> andersk Git - moira.git/blame - lib/fixhost.c
lint
[moira.git] / lib / fixhost.c
CommitLineData
56a69e4e 1/*
2 * $Source$
3 * $Author$
4 * $Header$
5 *
6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
babbc197 7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
56a69e4e 9 */
10
11#ifndef lint
12static char *rcsid_fixhost_c = "$Header$";
13#endif lint
14
babbc197 15#include <mit-copyright.h>
56a69e4e 16#include <sys/types.h>
17#include <sys/socket.h>
18#include <netinet/in.h>
19#include <arpa/nameser.h>
acb489e2 20#if defined(sun) || defined(AIX386)
730c1d1a 21#include <resolv.h>
22#else
56a69e4e 23#include <arpa/resolv.h>
acb489e2 24#endif
56a69e4e 25#include <netdb.h>
26#include <stdio.h>
27#include <strings.h>
28#include <ctype.h>
29
30extern char *malloc();
31extern char *realloc();
32extern char *strsave();
33
34/*
00bfb581 35 * Canonicalize hostname:
36 * if it is in double-quotes, then strip the quotes and return the name.
37 * if it is in the namespace, call the nameserver to expand it
38 * otherwise uppercase it and append the default domain (using an, er,
39 * undocumented global of the nameserver).
56a69e4e 40 *
41 * Assumes that host was allocated using malloc(); it may be freed or
42 * realloc'ed, so the old pointer should not be considered valid.
43 */
44
45char *
46canonicalize_hostname(host)
47 char *host;
48{
49 register struct hostent *hp;
50 int n_len;
51 int has_dot = 0;
52 char tbuf[BUFSIZ];
53 register char *cp;
54
00bfb581 55 if (strlen(host) > 2 && host[0] == '"' && host[strlen(host)-1] == '"') {
7fb8be7f 56 strcpy(tbuf, host+1);
00bfb581 57 free(host);
58 tbuf[strlen(tbuf)-1] = 0;
59 return(strsave(tbuf));
60 }
61
93431049 62 if (index(host, '*') || index(host, '?') || index(host, '['))
277817a5 63 return(host);
64
56a69e4e 65 hp = gethostbyname(host);
66
67 if (hp) {
68 n_len = strlen(hp->h_name) + 1;
69 host = realloc(host, (unsigned)n_len);
70
71 (void) strcpy(host, hp->h_name);
72 return host;
73 } else {
74 /* can't get name from nameserver; fix up the format a bit */
75 for (cp = host; *cp; cp++) {
76 register int c; /* pcc doesn't like register char */
77 if (islower(c = *cp)) *cp = toupper(c);
78 has_dot |= (c == '.');
79 }
80 if (!has_dot) {
81 (void) sprintf(tbuf, "%s.%s", host, _res.defdname);
82 free(host);
83 host = strsave(tbuf);
84 }
85 return host;
86 }
87}
This page took 0.504465 seconds and 5 git commands to generate.