118548Sralph /* 2*39708Skarels * Copyright (c) 1985, 1989 Regents of the University of California. 333679Sbostic * All rights reserved. 433679Sbostic * 533679Sbostic * Redistribution and use in source and binary forms are permitted 634817Sbostic * provided that the above copyright notice and this paragraph are 734817Sbostic * duplicated in all such forms and that any documentation, 834817Sbostic * advertising materials, and other materials related to such 934817Sbostic * distribution and use acknowledge that the software was developed 1034817Sbostic * by the University of California, Berkeley. The name of the 1134817Sbostic * University may not be used to endorse or promote products derived 1234817Sbostic * from this software without specific prior written permission. 1334817Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434817Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534817Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1618548Sralph */ 1718548Sralph 1826633Sdonn #if defined(LIBC_SCCS) && !defined(lint) 19*39708Skarels static char sccsid[] = "@(#)res_init.c 6.10 (Berkeley) 12/14/89"; 2033679Sbostic #endif /* LIBC_SCCS and not lint */ 2121386Sdist 2218142Sralph #include <sys/types.h> 2318142Sralph #include <sys/socket.h> 2418142Sralph #include <netinet/in.h> 2518142Sralph #include <stdio.h> 2624081Skjd #include <arpa/nameser.h> 2726902Skjd #include <resolv.h> 2818142Sralph 2918142Sralph /* 3018142Sralph * Resolver state default settings 3118142Sralph */ 3225242Skjd 3318142Sralph struct state _res = { 34*39708Skarels RES_TIMEOUT, /* retransmition time interval */ 35*39708Skarels 4, /* number of times to retransmit */ 36*39708Skarels RES_DEFAULT, /* options flags */ 37*39708Skarels 1, /* number of name servers */ 3818142Sralph }; 3918142Sralph 4018142Sralph /* 4124736Sbloom * Set up default settings. If the configuration file exist, the values 4224736Sbloom * there will have precedence. Otherwise, the server address is set to 4324736Sbloom * INADDR_ANY and the default domain name comes from the gethostname(). 4424736Sbloom * 4524736Sbloom * The configuration file should only be used if you want to redefine your 4624736Sbloom * domain or run without a server on your machine. 4724736Sbloom * 4824736Sbloom * Return 0 if completes successfully, -1 on error 4918142Sralph */ 5018142Sralph res_init() 5118142Sralph { 52*39708Skarels register FILE *fp; 53*39708Skarels register char *cp, **pp; 54*39708Skarels register int n; 55*39708Skarels char buf[BUFSIZ]; 56*39708Skarels extern u_long inet_addr(); 57*39708Skarels extern char *index(); 58*39708Skarels extern char *strcpy(), *strncpy(); 59*39708Skarels extern char *getenv(); 60*39708Skarels int nserv = 0; /* number of nameserver records read from file */ 61*39708Skarels int havesearch = 0; 6218142Sralph 63*39708Skarels _res.nsaddr.sin_addr.s_addr = INADDR_ANY; 64*39708Skarels _res.nsaddr.sin_family = AF_INET; 65*39708Skarels _res.nsaddr.sin_port = htons(NAMESERVER_PORT); 66*39708Skarels _res.nscount = 1; 6718142Sralph 68*39708Skarels /* Allow user to override the local domain definition */ 69*39708Skarels if ((cp = getenv("LOCALDOMAIN")) != NULL) 70*39708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 7118142Sralph 72*39708Skarels if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { 73*39708Skarels /* read the config file */ 74*39708Skarels while (fgets(buf, sizeof(buf), fp) != NULL) { 75*39708Skarels /* read default domain name */ 76*39708Skarels if (!strncmp(buf, "domain", sizeof("domain") - 1)) { 77*39708Skarels if (_res.defdname[0]) /* skip if have from environ */ 78*39708Skarels continue; 79*39708Skarels cp = buf + sizeof("domain") - 1; 80*39708Skarels while (*cp == ' ' || *cp == '\t') 81*39708Skarels cp++; 82*39708Skarels if (*cp == '\0') 83*39708Skarels continue; 84*39708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); 85*39708Skarels if ((cp = index(_res.defdname, '\n')) != NULL) 86*39708Skarels *cp = '\0'; 87*39708Skarels havesearch = 0; 88*39708Skarels continue; 89*39708Skarels } 90*39708Skarels /* set search list */ 91*39708Skarels if (!strncmp(buf, "search", sizeof("search") - 1)) { 92*39708Skarels cp = buf + sizeof("search") - 1; 93*39708Skarels while (*cp == ' ' || *cp == '\t') 94*39708Skarels cp++; 95*39708Skarels if (*cp == '\0') 96*39708Skarels continue; 97*39708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); 98*39708Skarels if ((cp = index(_res.defdname, '\n')) != NULL) 99*39708Skarels *cp = '\0'; 100*39708Skarels /* 101*39708Skarels * Set search list to be blank-separated strings 102*39708Skarels * on rest of line. 103*39708Skarels */ 104*39708Skarels cp = _res.defdname; 105*39708Skarels pp = _res.dnsrch; 106*39708Skarels *pp++ = cp; 107*39708Skarels for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) { 108*39708Skarels if (*cp == ' ' || *cp == '\t') { 109*39708Skarels *cp = 0; 110*39708Skarels n = 1; 111*39708Skarels } else if (n) { 112*39708Skarels *pp++ = cp; 113*39708Skarels n = 0; 114*39708Skarels } 115*39708Skarels } 116*39708Skarels havesearch = 1; 117*39708Skarels continue; 118*39708Skarels } 119*39708Skarels /* read nameservers to query */ 120*39708Skarels if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) && 121*39708Skarels nserv < MAXNS) { 122*39708Skarels cp = buf + sizeof("nameserver") - 1; 123*39708Skarels while (*cp == ' ' || *cp == '\t') 124*39708Skarels cp++; 125*39708Skarels if (*cp == '\0') 126*39708Skarels continue; 127*39708Skarels if ((_res.nsaddr_list[nserv].sin_addr.s_addr = 128*39708Skarels inet_addr(cp)) == (unsigned)-1) 129*39708Skarels continue; 130*39708Skarels _res.nsaddr_list[nserv].sin_family = AF_INET; 131*39708Skarels _res.nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT); 132*39708Skarels nserv++; 133*39708Skarels continue; 134*39708Skarels } 135*39708Skarels } 136*39708Skarels if (nserv > 1) 137*39708Skarels _res.nscount = nserv; 138*39708Skarels (void) fclose(fp); 139*39708Skarels } 140*39708Skarels if (_res.defdname[0] == 0) { 141*39708Skarels if (gethostname(buf, sizeof(_res.defdname)) == 0 && 142*39708Skarels (cp = index(buf, '.'))) 143*39708Skarels (void)strcpy(_res.defdname, cp + 1); 144*39708Skarels } 14531112Skarels 146*39708Skarels /* find components of local domain that might be searched */ 147*39708Skarels if (havesearch == 0) { 148*39708Skarels pp = _res.dnsrch; 149*39708Skarels *pp++ = _res.defdname; 150*39708Skarels for (cp = _res.defdname, n = 0; *cp; cp++) 151*39708Skarels if (*cp == '.') 152*39708Skarels n++; 153*39708Skarels cp = _res.defdname; 154*39708Skarels for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; 155*39708Skarels n--) { 156*39708Skarels cp = index(cp, '.'); 157*39708Skarels *pp++ = ++cp; 158*39708Skarels } 159*39708Skarels } 160*39708Skarels _res.options |= RES_INIT; 161*39708Skarels return (0); 16218142Sralph } 163