xref: /csrg-svn/lib/libc/net/res_init.c (revision 25242)
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