xref: /csrg-svn/lib/libc/net/res_init.c (revision 25537)
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*25537Skjd static char sccsid[] = "@(#)res_init.c	6.2 (Berkeley) 11/26/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
2525242Skjd char    *conffile = CONFFILE;
2624111Skjd #else
2725242Skjd char    *conffile = "/etc/resolv.conf";
2824111Skjd #endif
2924111Skjd 
3024111Skjd /*
3118142Sralph  * Resolver state default settings
3218142Sralph  */
3325242Skjd 
3425242Skjd #ifndef RES_TIMEOUT
3525242Skjd #define RES_TIMEOUT 10
3625242Skjd #endif
3725242Skjd 
3818142Sralph struct state _res = {
3925242Skjd     RES_TIMEOUT,                 /* retransmition time interval */
4025242Skjd     4,                           /* number of times to retransmit */
4125242Skjd     RES_RECURSE|RES_DEFNAMES,    /* options flags */
4225242Skjd     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 {
5725242Skjd     register FILE *fp;
5825242Skjd     char buf[BUFSIZ], *cp;
5925242Skjd     extern u_long inet_addr();
6025242Skjd     extern char *index();
6125242Skjd     extern char *strcpy(), *strncpy();
6224736Sbloom #ifdef DEBUG
6325242Skjd     extern char *getenv();
6425242Skjd #endif DEBUG
6525242Skjd     int n = 0;    /* number of nameserver records read from file */
6618142Sralph 
6725242Skjd     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
6825242Skjd     _res.nsaddr.sin_family = AF_INET;
6925242Skjd     _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
7025242Skjd     _res.nscount = 1;
7125242Skjd     _res.defdname[0] = '\0';
7218142Sralph 
7325242Skjd     if ((fp = fopen(conffile, "r")) != NULL) {
7425242Skjd         /* read the config file */
7525242Skjd         while (fgets(buf, sizeof(buf), fp) != NULL) {
7625242Skjd             /* read default domain name */
7725242Skjd             if (!strncmp(buf, "domain", sizeof("domain") - 1)) {
7825242Skjd                 cp = buf + sizeof("domain") - 1;
7925242Skjd                 while (*cp == ' ' || *cp == '\t')
8025242Skjd                     cp++;
8125242Skjd                 if (*cp == '\0')
8225242Skjd                     continue;
8325242Skjd                 (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
8425242Skjd                 _res.defdname[sizeof(_res.defdname) - 1] = '\0';
8525242Skjd                 if ((cp = index(_res.defdname, '\n')) != NULL)
8625242Skjd                     *cp = '\0';
8725242Skjd                 continue;
8825242Skjd             }
8925242Skjd             /* read nameservers to query */
9025242Skjd             if (!strncmp(buf, "nameserver",
9125242Skjd                sizeof("nameserver") - 1) && (n < MAXNS)) {
9225242Skjd                 cp = buf + sizeof("nameserver") - 1;
9325242Skjd                 while (*cp == ' ' || *cp == '\t')
9425242Skjd                     cp++;
9525242Skjd                 if (*cp == '\0')
9625242Skjd                     continue;
9725242Skjd                 _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp);
9825242Skjd                 if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1)
9925242Skjd                     _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY;
10025242Skjd                     _res.nsaddr_list[n].sin_family = AF_INET;
10125242Skjd                     _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT);
10225242Skjd                     if ( ++n >= MAXNS) {
10325242Skjd                        n = MAXNS;
10425242Skjd #ifdef DEBUG
10525265Sbloom                        if ( _res.options & RES_DEBUG )
106*25537Skjd                           printf("MAXNS reached, reading resolv.conf\n");
10725242Skjd #endif DEBUG
10825242Skjd                 }
10925242Skjd                 continue;
11025242Skjd             }
11125242Skjd         }
11225242Skjd         if ( n > 1 )
11325242Skjd             _res.nscount = n;
11425242Skjd         (void) fclose(fp);
11525242Skjd     }
11625242Skjd     if (_res.defdname[0] == 0) {
11725242Skjd         if (gethostname(buf, sizeof(_res.defdname)) == 0 &&
11825242Skjd            (cp = index(buf, '.')))
11925242Skjd              (void)strcpy(_res.defdname, cp + 1);
12025242Skjd     }
12118142Sralph 
12224736Sbloom #ifdef DEBUG
12325242Skjd     /* Allow user to override the local domain definition */
12425242Skjd     if ((cp = getenv("LOCALDOMAIN")) != NULL)
12525242Skjd         (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
12625242Skjd #endif DEBUG
12725242Skjd     _res.options |= RES_INIT;
12825242Skjd     return(0);
12918142Sralph }
130