144329Sbloom /*- 239708Skarels * Copyright (c) 1985, 1989 Regents of the University of California. 333679Sbostic * All rights reserved. 433679Sbostic * 544329Sbloom * %sccs.include.redist.c% 618548Sralph */ 718548Sralph 826633Sdonn #if defined(LIBC_SCCS) && !defined(lint) 9*46604Sbostic static char sccsid[] = "@(#)res_init.c 6.15 (Berkeley) 02/24/91"; 1033679Sbostic #endif /* LIBC_SCCS and not lint */ 1121386Sdist 12*46604Sbostic #include <sys/param.h> 1318142Sralph #include <sys/socket.h> 1418142Sralph #include <netinet/in.h> 15*46604Sbostic #include <arpa/inet.h> 1624081Skjd #include <arpa/nameser.h> 1726902Skjd #include <resolv.h> 18*46604Sbostic #include <unistd.h> 19*46604Sbostic #include <stdio.h> 20*46604Sbostic #include <stdlib.h> 21*46604Sbostic #include <string.h> 2218142Sralph 2318142Sralph /* 2418142Sralph * Resolver state default settings 2518142Sralph */ 2625242Skjd 2718142Sralph struct state _res = { 2839708Skarels RES_TIMEOUT, /* retransmition time interval */ 2939708Skarels 4, /* number of times to retransmit */ 3039708Skarels RES_DEFAULT, /* options flags */ 3139708Skarels 1, /* number of name servers */ 3218142Sralph }; 3318142Sralph 3418142Sralph /* 3524736Sbloom * Set up default settings. If the configuration file exist, the values 3624736Sbloom * there will have precedence. Otherwise, the server address is set to 3724736Sbloom * INADDR_ANY and the default domain name comes from the gethostname(). 3824736Sbloom * 3924736Sbloom * The configuration file should only be used if you want to redefine your 4024736Sbloom * domain or run without a server on your machine. 4124736Sbloom * 4224736Sbloom * Return 0 if completes successfully, -1 on error 4318142Sralph */ 4418142Sralph res_init() 4518142Sralph { 4639708Skarels register FILE *fp; 4739708Skarels register char *cp, **pp; 4839708Skarels register int n; 4939708Skarels char buf[BUFSIZ]; 5039708Skarels int nserv = 0; /* number of nameserver records read from file */ 5139717Skarels int haveenv = 0; 5239708Skarels int havesearch = 0; 5318142Sralph 5439708Skarels _res.nsaddr.sin_addr.s_addr = INADDR_ANY; 5539708Skarels _res.nsaddr.sin_family = AF_INET; 5639708Skarels _res.nsaddr.sin_port = htons(NAMESERVER_PORT); 5739708Skarels _res.nscount = 1; 5818142Sralph 5939708Skarels /* Allow user to override the local domain definition */ 6039717Skarels if ((cp = getenv("LOCALDOMAIN")) != NULL) { 6139708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 6239717Skarels haveenv++; 6339717Skarels } 6418142Sralph 6539708Skarels if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { 6639708Skarels /* read the config file */ 6739708Skarels while (fgets(buf, sizeof(buf), fp) != NULL) { 6839708Skarels /* read default domain name */ 6939708Skarels if (!strncmp(buf, "domain", sizeof("domain") - 1)) { 7039717Skarels if (haveenv) /* skip if have from environ */ 7139708Skarels continue; 7239708Skarels cp = buf + sizeof("domain") - 1; 7339708Skarels while (*cp == ' ' || *cp == '\t') 7439708Skarels cp++; 7539791Sbloom if ((*cp == '\0') || (*cp == '\n')) 7639708Skarels continue; 7739708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); 7839708Skarels if ((cp = index(_res.defdname, '\n')) != NULL) 7939708Skarels *cp = '\0'; 8039708Skarels havesearch = 0; 8139708Skarels continue; 8239708Skarels } 8339708Skarels /* set search list */ 8439708Skarels if (!strncmp(buf, "search", sizeof("search") - 1)) { 8539717Skarels if (haveenv) /* skip if have from environ */ 8639717Skarels continue; 8739708Skarels cp = buf + sizeof("search") - 1; 8839708Skarels while (*cp == ' ' || *cp == '\t') 8939708Skarels cp++; 9039791Sbloom if ((*cp == '\0') || (*cp == '\n')) 9139708Skarels continue; 9239708Skarels (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); 9339708Skarels if ((cp = index(_res.defdname, '\n')) != NULL) 9439708Skarels *cp = '\0'; 9539708Skarels /* 9639708Skarels * Set search list to be blank-separated strings 9739708Skarels * on rest of line. 9839708Skarels */ 9939708Skarels cp = _res.defdname; 10039708Skarels pp = _res.dnsrch; 10139708Skarels *pp++ = cp; 10239708Skarels for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) { 10339708Skarels if (*cp == ' ' || *cp == '\t') { 10439708Skarels *cp = 0; 10539708Skarels n = 1; 10639708Skarels } else if (n) { 10739708Skarels *pp++ = cp; 10839708Skarels n = 0; 10939708Skarels } 11039708Skarels } 11144329Sbloom /* null terminate last domain if there are excess */ 11244329Sbloom while (*cp != '\0' && *cp != ' ' && *cp != '\t') 11344329Sbloom cp++; 11444329Sbloom *cp = '\0'; 11539717Skarels *pp++ = 0; 11639708Skarels havesearch = 1; 11739708Skarels continue; 11839708Skarels } 11939708Skarels /* read nameservers to query */ 12039708Skarels if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) && 12139708Skarels nserv < MAXNS) { 12239708Skarels cp = buf + sizeof("nameserver") - 1; 12339708Skarels while (*cp == ' ' || *cp == '\t') 12439708Skarels cp++; 12539791Sbloom if ((*cp == '\0') || (*cp == '\n')) 12639708Skarels continue; 12739708Skarels if ((_res.nsaddr_list[nserv].sin_addr.s_addr = 12842258Sbloom inet_addr(cp)) == (unsigned)-1) { 12942258Sbloom _res.nsaddr_list[nserv].sin_addr.s_addr 13042258Sbloom = INADDR_ANY; 13139708Skarels continue; 13242258Sbloom } 13339708Skarels _res.nsaddr_list[nserv].sin_family = AF_INET; 13439708Skarels _res.nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT); 13539708Skarels nserv++; 13639708Skarels continue; 13739708Skarels } 13839708Skarels } 13939708Skarels if (nserv > 1) 14039708Skarels _res.nscount = nserv; 14139708Skarels (void) fclose(fp); 14239708Skarels } 14339708Skarels if (_res.defdname[0] == 0) { 14439708Skarels if (gethostname(buf, sizeof(_res.defdname)) == 0 && 14539708Skarels (cp = index(buf, '.'))) 14639708Skarels (void)strcpy(_res.defdname, cp + 1); 14739708Skarels } 14831112Skarels 14939708Skarels /* find components of local domain that might be searched */ 15039708Skarels if (havesearch == 0) { 15139708Skarels pp = _res.dnsrch; 15239708Skarels *pp++ = _res.defdname; 15339708Skarels for (cp = _res.defdname, n = 0; *cp; cp++) 15439708Skarels if (*cp == '.') 15539708Skarels n++; 15639708Skarels cp = _res.defdname; 15739717Skarels for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; 15839708Skarels n--) { 15939708Skarels cp = index(cp, '.'); 16039708Skarels *pp++ = ++cp; 16139708Skarels } 16239717Skarels *pp++ = 0; 16339708Skarels } 16439708Skarels _res.options |= RES_INIT; 16539708Skarels return (0); 16618142Sralph } 167