1 /* 2 * Copyright (c) 1985 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #if defined(LIBC_SCCS) && !defined(lint) 19 static char sccsid[] = "@(#)res_init.c 6.9 (Berkeley) 06/27/88"; 20 #endif /* LIBC_SCCS and not lint */ 21 22 #include <sys/types.h> 23 #include <sys/socket.h> 24 #include <netinet/in.h> 25 #include <stdio.h> 26 #include <arpa/nameser.h> 27 #include <resolv.h> 28 29 /* 30 * Resolver configuration file. Contains the address of the 31 * inital name server to query and the default domain for 32 * non fully qualified domain names. 33 */ 34 35 #ifndef CONFFILE 36 #define CONFFILE "/etc/resolv.conf" 37 #endif 38 39 /* 40 * Resolver state default settings 41 */ 42 43 struct state _res = { 44 RES_TIMEOUT, /* retransmition time interval */ 45 4, /* number of times to retransmit */ 46 RES_DEFAULT, /* options flags */ 47 1, /* number of name servers */ 48 }; 49 50 /* 51 * Set up default settings. If the configuration file exist, the values 52 * there will have precedence. Otherwise, the server address is set to 53 * INADDR_ANY and the default domain name comes from the gethostname(). 54 * 55 * The configuration file should only be used if you want to redefine your 56 * domain or run without a server on your machine. 57 * 58 * Return 0 if completes successfully, -1 on error 59 */ 60 res_init() 61 { 62 register FILE *fp; 63 register char *cp, **pp; 64 char buf[BUFSIZ]; 65 extern u_long inet_addr(); 66 extern char *index(); 67 extern char *strcpy(), *strncpy(); 68 extern char *getenv(); 69 int n = 0; /* number of nameserver records read from file */ 70 71 _res.nsaddr.sin_addr.s_addr = INADDR_ANY; 72 _res.nsaddr.sin_family = AF_INET; 73 _res.nsaddr.sin_port = htons(NAMESERVER_PORT); 74 _res.nscount = 1; 75 _res.defdname[0] = '\0'; 76 77 if ((fp = fopen(CONFFILE, "r")) != NULL) { 78 /* read the config file */ 79 while (fgets(buf, sizeof(buf), fp) != NULL) { 80 /* read default domain name */ 81 if (!strncmp(buf, "domain", sizeof("domain") - 1)) { 82 cp = buf + sizeof("domain") - 1; 83 while (*cp == ' ' || *cp == '\t') 84 cp++; 85 if (*cp == '\0') 86 continue; 87 (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 88 _res.defdname[sizeof(_res.defdname) - 1] = '\0'; 89 if ((cp = index(_res.defdname, '\n')) != NULL) 90 *cp = '\0'; 91 continue; 92 } 93 /* read nameservers to query */ 94 if (!strncmp(buf, "nameserver", 95 sizeof("nameserver") - 1) && (n < MAXNS)) { 96 cp = buf + sizeof("nameserver") - 1; 97 while (*cp == ' ' || *cp == '\t') 98 cp++; 99 if (*cp == '\0') 100 continue; 101 _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp); 102 if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) 103 _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY; 104 _res.nsaddr_list[n].sin_family = AF_INET; 105 _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT); 106 if ( ++n >= MAXNS) { 107 n = MAXNS; 108 #ifdef DEBUG 109 if ( _res.options & RES_DEBUG ) 110 printf("MAXNS reached, reading resolv.conf\n"); 111 #endif DEBUG 112 } 113 continue; 114 } 115 } 116 if ( n > 1 ) 117 _res.nscount = n; 118 (void) fclose(fp); 119 } 120 if (_res.defdname[0] == 0) { 121 if (gethostname(buf, sizeof(_res.defdname)) == 0 && 122 (cp = index(buf, '.'))) 123 (void)strcpy(_res.defdname, cp + 1); 124 } 125 126 /* Allow user to override the local domain definition */ 127 if ((cp = getenv("LOCALDOMAIN")) != NULL) 128 (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); 129 130 /* find components of local domain that might be searched */ 131 pp = _res.dnsrch; 132 *pp++ = _res.defdname; 133 for (cp = _res.defdname, n = 0; *cp; cp++) 134 if (*cp == '.') 135 n++; 136 cp = _res.defdname; 137 for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; n--) { 138 cp = index(cp, '.'); 139 *pp++ = ++cp; 140 } 141 _res.options |= RES_INIT; 142 return(0); 143 } 144