2
Copyright (C) 2003-2004 Douglas Thain and the University of Wisconsin
3
Copyright (C) 2005- The University of Notre Dame
4
This software is distributed under the GNU General Public License.
5
See the file COPYING for details.
8
#include "domain_name_cache.h"
9
#include "hash_cache.h"
17
#include <sys/utsname.h>
19
/* cache domain names for up to five minutes */
20
#define DOMAIN_NAME_CACHE_LIFETIME 300
22
static struct hash_cache *name_to_addr=0;
23
static struct hash_cache *addr_to_name=0;
25
static int domain_name_cache_init()
28
name_to_addr = hash_cache_create(127,hash_string,free);
35
addr_to_name = hash_cache_create(127,hash_string,free);
44
int domain_name_cache_canonical( const char *name_or_addr, char *cname )
46
char addr[DOMAIN_NAME_MAX];
47
return domain_name_cache_lookup(name_or_addr,addr) &&
48
domain_name_cache_lookup_reverse(addr,cname);
51
int domain_name_cache_lookup( const char *name, char *addr )
56
if(!domain_name_cache_init()) return 0;
58
found = hash_cache_lookup(name_to_addr,name);
64
success = domain_name_lookup(name,addr);
65
if(!success) return 0;
70
success = hash_cache_insert(name_to_addr,name,copy,DOMAIN_NAME_CACHE_LIFETIME);
75
int domain_name_cache_lookup_reverse( const char *addr, char *name )
80
if(!domain_name_cache_init()) return 0;
82
found = hash_cache_lookup(addr_to_name,addr);
88
success = domain_name_lookup_reverse(addr,name);
89
if(!success) return 0;
94
success = hash_cache_insert(addr_to_name,addr,copy,DOMAIN_NAME_CACHE_LIFETIME);
99
static int guess_dns_domain( char *domain )
101
char line[DOMAIN_NAME_MAX];
104
file = fopen("/etc/resolv.conf","r");
107
while(fgets(line,sizeof(line),file)) {
108
if(sscanf(line,"search %[^ \t\n]",domain)==1) {
112
if(sscanf(line,"domain %[^ \t\n]",domain)==1) {
122
int domain_name_cache_guess( char *name )
125
char addr[DOMAIN_NAME_MAX];
126
char domain[DOMAIN_NAME_MAX];
128
if(uname(&n)<0) return 0;
130
if(!domain_name_cache_lookup(n.nodename,addr)) return 0;
131
if(!domain_name_cache_lookup_reverse(addr,name)) return 0;
133
debug(D_DNS,"finding my hostname: uname = %s, address = %s, hostname = %s",n.nodename,addr,name);
135
if(!strncmp(name,"localhost",9) || !strcmp(addr,"127.0.0.1") ) {
136
debug(D_DNS,"local address of '%s' (%s) is not very useful.",name,addr);
137
if(guess_dns_domain(domain)) {
138
sprintf(name,"%s.%s",n.nodename,domain);
139
debug(D_DNS,"but /etc/resolv.conf says domain = %s so hostname = %s",domain,name);
140
if (!domain_name_cache_lookup(name,addr)) {
141
debug(D_DNS,"unfortunately %s is meaningless, so going back to %s",name,n.nodename);
142
sprintf(name,"%s",n.nodename);
145
strcpy(name,n.nodename);
146
debug(D_DNS,"cannot find any more info, so use hostname = %s",n.nodename);
153
static char shortname[DOMAIN_NAME_MAX];
154
static int got_shortname = 0;
156
int domain_name_cache_guess_short( char *name )
161
strcpy(name,shortname);
165
if(uname(&n)<0) return 0;
167
strcpy(shortname,n.nodename);
169
char *p = strchr(shortname,'.');
172
strcpy(name,shortname);