118548Sralph /* 221386Sdist * Copyright (c) 1985 Regents of the University of California. 321386Sdist * All rights reserved. The Berkeley software License Agreement 421386Sdist * specifies the terms and conditions for redistribution. 518548Sralph */ 618548Sralph 721386Sdist #ifndef lint 8*25242Skjd static char sccsid[] = "@(#)res_init.c 5.9 (Berkeley) 10/21/85"; 921386Sdist #endif not lint 1021386Sdist 1118142Sralph #include <sys/types.h> 1218142Sralph #include <sys/socket.h> 1318142Sralph #include <netinet/in.h> 1418142Sralph #include <stdio.h> 1524081Skjd #include <arpa/nameser.h> 1624081Skjd #include <arpa/resolv.h> 1718142Sralph 1818142Sralph /* 1924111Skjd * Resolver configuration file. Contains the address of the 2024111Skjd * inital name server to query and the default domain for 2124111Skjd * non fully qualified domain names. 2224111Skjd */ 2324111Skjd 2424111Skjd #ifdef CONFFILE 25*25242Skjd char *conffile = CONFFILE; 2624111Skjd #else 27*25242Skjd char *conffile = "/etc/resolv.conf"; 2824111Skjd #endif 2924111Skjd 3024111Skjd /* 3118142Sralph * Resolver state default settings 3218142Sralph */ 33*25242Skjd 34*25242Skjd #ifndef RES_TIMEOUT 35*25242Skjd #define RES_TIMEOUT 10 36*25242Skjd #endif 37*25242Skjd 3818142Sralph struct state _res = { 39*25242Skjd RES_TIMEOUT, /* retransmition time interval */ 40*25242Skjd 4, /* number of times to retransmit */ 41*25242Skjd RES_RECURSE|RES_DEFNAMES, /* options flags */ 42*25242Skjd 1, /* number of name servers */ 4318142Sralph }; 4418142Sralph 4518142Sralph /* 4624736Sbloom * Set up default settings. If the configuration file exist, the values 4724736Sbloom * there will have precedence. Otherwise, the server address is set to 4824736Sbloom * INADDR_ANY and the default domain name comes from the gethostname(). 4924736Sbloom * 5024736Sbloom * The configuration file should only be used if you want to redefine your 5124736Sbloom * domain or run without a server on your machine. 5224736Sbloom * 5324736Sbloom * Return 0 if completes successfully, -1 on error 5418142Sralph */ 5518142Sralph res_init() 5618142Sralph { 57*25242Skjd register FILE *fp; 58*25242Skjd char buf[BUFSIZ], *cp; 59*25242Skjd extern u_long inet_addr(); 60*25242Skjd extern char *index(); 61*25242Skjd extern char *strcpy(), *strncpy(); 6224736Sbloom #ifdef DEBUG 63*25242Skjd extern char *getenv(); 64*25242Skjd #endif DEBUG 65*25242Skjd int n = 0; /* number of nameserver records read from file */ 6618142Sralph 67*25242Skjd _res.nsaddr.sin_addr.s_addr = INADDR_ANY; 68*25242Skjd _res.nsaddr.sin_family = AF_INET; 69*25242Skjd _res.nsaddr.sin_port = htons(NAMESERVER_PORT); 70*25242Skjd _res.nscount = 1; 71*25242Skjd _res.defdname[0] = '\0'; 7218142Sralph 73*25242Skjd if ((fp = fopen(conffile, "r")) != NULL) { 74*25242Skjd /* read the config file */ 75*25242Skjd while (fgets(buf, sizeof(buf), fp) != NULL) { 76*25242Skjd /* read default domain name */ 77*25242Skjd if (!strncmp(buf, "domain", sizeof("domain") - 1)) { 78*25242Skjd cp = buf + sizeof("domain") - 1; 79*25242Skjd while (*cp == ' ' || *cp == '\t') 80*25242Skjd cp++; 81*25242Skjd if (*cp == '\0') 82*25242Skjd continue; 83*25242Skjd (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 84*25242Skjd _res.defdname[sizeof(_res.defdname) - 1] = '\0'; 85*25242Skjd if ((cp = index(_res.defdname, '\n')) != NULL) 86*25242Skjd *cp = '\0'; 87*25242Skjd continue; 88*25242Skjd } 89*25242Skjd /* read nameservers to query */ 90*25242Skjd if (!strncmp(buf, "nameserver", 91*25242Skjd sizeof("nameserver") - 1) && (n < MAXNS)) { 92*25242Skjd cp = buf + sizeof("nameserver") - 1; 93*25242Skjd while (*cp == ' ' || *cp == '\t') 94*25242Skjd cp++; 95*25242Skjd if (*cp == '\0') 96*25242Skjd continue; 97*25242Skjd _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp); 98*25242Skjd if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) 99*25242Skjd _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY; 100*25242Skjd _res.nsaddr_list[n].sin_family = AF_INET; 101*25242Skjd _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT); 102*25242Skjd #ifdef DEBUG 103*25242Skjd if ( _res.options && RES_DEBUG ) 104*25242Skjd printf("Server #%d address = %s\n", n+1, 105*25242Skjd inet_ntoa(_res.nsaddr_list[n].sin_addr.s_addr)); 106*25242Skjd #endif DEBUG 107*25242Skjd if ( ++n >= MAXNS) { 108*25242Skjd n = MAXNS; 109*25242Skjd #ifdef DEBUG 110*25242Skjd if ( _res.options && RES_DEBUG ) 111*25242Skjd printf("MAXNS reached\n"); 112*25242Skjd #endif DEBUG 113*25242Skjd } 114*25242Skjd continue; 115*25242Skjd } 116*25242Skjd } 117*25242Skjd if ( n > 1 ) 118*25242Skjd _res.nscount = n; 119*25242Skjd (void) fclose(fp); 120*25242Skjd } 121*25242Skjd if (_res.defdname[0] == 0) { 122*25242Skjd if (gethostname(buf, sizeof(_res.defdname)) == 0 && 123*25242Skjd (cp = index(buf, '.'))) 124*25242Skjd (void)strcpy(_res.defdname, cp + 1); 125*25242Skjd } 12618142Sralph 12724736Sbloom #ifdef DEBUG 128*25242Skjd /* Allow user to override the local domain definition */ 129*25242Skjd if ((cp = getenv("LOCALDOMAIN")) != NULL) 130*25242Skjd (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 131*25242Skjd #endif DEBUG 132*25242Skjd _res.options |= RES_INIT; 133*25242Skjd return(0); 13418142Sralph } 135