1: /* 2: * Copyright (c) 1985 Regents of the University of California. 3: * All rights reserved. 4: * 5: * Redistribution and use in source and binary forms are permitted 6: * provided that this notice is preserved and that due credit is given 7: * to the University of California at Berkeley. The name of the University 8: * may not be used to endorse or promote products derived from this 9: * software without specific prior written permission. This software 10: * is provided ``as is'' without express or implied warranty. 11: */ 12: 13: #if defined(LIBC_SCCS) && !defined(lint) 14: static char sccsid[] = "@(#)res_init.c 6.8 (Berkeley) 3/7/88"; 15: #endif /* LIBC_SCCS and not lint */ 16: 17: #include <sys/types.h> 18: #include <sys/socket.h> 19: #include <netinet/in.h> 20: #include <stdio.h> 21: #include <arpa/nameser.h> 22: #include <resolv.h> 23: 24: /* 25: * Resolver configuration file. Contains the address of the 26: * inital name server to query and the default domain for 27: * non fully qualified domain names. 28: */ 29: 30: #ifndef CONFFILE 31: #define CONFFILE "/etc/resolv.conf" 32: #endif 33: 34: /* 35: * Resolver state default settings 36: */ 37: 38: struct state _res = { 39: RES_TIMEOUT, /* retransmition time interval */ 40: 4, /* number of times to retransmit */ 41: RES_DEFAULT, /* options flags */ 42: 1, /* number of name servers */ 43: }; 44: 45: /* 46: * Set up default settings. If the configuration file exist, the values 47: * there will have precedence. Otherwise, the server address is set to 48: * INADDR_ANY and the default domain name comes from the gethostname(). 49: * 50: * The configuration file should only be used if you want to redefine your 51: * domain or run without a server on your machine. 52: * 53: * Return 0 if completes successfully, -1 on error 54: */ 55: res_init() 56: { 57: register FILE *fp; 58: register char *cp, **pp; 59: char buf[BUFSIZ]; 60: extern u_long inet_addr(); 61: extern char *index(); 62: extern char *strcpy(), *strncpy(); 63: extern char *getenv(); 64: int n = 0; /* number of nameserver records read from file */ 65: 66: _res.nsaddr.sin_addr.s_addr = INADDR_ANY; 67: _res.nsaddr.sin_family = AF_INET; 68: _res.nsaddr.sin_port = htons(NAMESERVER_PORT); 69: _res.nscount = 1; 70: _res.defdname[0] = '\0'; 71: 72: if ((fp = fopen(CONFFILE, "r")) != NULL) { 73: /* read the config file */ 74: while (fgets(buf, sizeof(buf), fp) != NULL) { 75: /* read default domain name */ 76: if (!strncmp(buf, "domain", sizeof("domain") - 1)) { 77: cp = buf + sizeof("domain") - 1; 78: while (*cp == ' ' || *cp == '\t') 79: cp++; 80: if (*cp == '\0') 81: continue; 82: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 83: _res.defdname[sizeof(_res.defdname) - 1] = '\0'; 84: if ((cp = index(_res.defdname, '\n')) != NULL) 85: *cp = '\0'; 86: continue; 87: } 88: /* read nameservers to query */ 89: if (!strncmp(buf, "nameserver", 90: sizeof("nameserver") - 1) && (n < MAXNS)) { 91: cp = buf + sizeof("nameserver") - 1; 92: while (*cp == ' ' || *cp == '\t') 93: cp++; 94: if (*cp == '\0') 95: continue; 96: _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp); 97: if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) 98: _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY; 99: _res.nsaddr_list[n].sin_family = AF_INET; 100: _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT); 101: if ( ++n >= MAXNS) { 102: n = MAXNS; 103: #ifdef DEBUG 104: if ( _res.options & RES_DEBUG ) 105: printf("MAXNS reached, reading resolv.conf\n"); 106: #endif DEBUG 107: } 108: continue; 109: } 110: } 111: if ( n > 1 ) 112: _res.nscount = n; 113: (void) fclose(fp); 114: } 115: if (_res.defdname[0] == 0) { 116: if (gethostname(buf, sizeof(_res.defdname)) == 0 && 117: (cp = index(buf, '.'))) 118: (void)strcpy(_res.defdname, cp + 1); 119: } 120: 121: /* Allow user to override the local domain definition */ 122: if ((cp = getenv("LOCALDOMAIN")) != NULL) 123: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 124: 125: /* find components of local domain that might be searched */ 126: pp = _res.dnsrch; 127: *pp++ = _res.defdname; 128: for (cp = _res.defdname, n = 0; *cp; cp++) 129: if (*cp == '.') 130: n++; 131: cp = _res.defdname; 132: for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; n--) { 133: cp = index(cp, '.'); 134: *pp++ = ++cp; 135: } 136: _res.options |= RES_INIT; 137: return(0); 138: }