|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1985, 1989 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #if defined(LIBC_SCCS) && !defined(lint) ! 21: static char sccsid[] = "@(#)res_init.c 6.14 (Berkeley) 6/27/90"; ! 22: #endif /* LIBC_SCCS and not lint */ ! 23: ! 24: #include <sys/types.h> ! 25: #include <sys/socket.h> ! 26: #include <netinet/in.h> ! 27: #include <stdio.h> ! 28: #include <arpa/nameser.h> ! 29: #include <resolv.h> ! 30: ! 31: /* ! 32: * Resolver state default settings ! 33: */ ! 34: ! 35: struct state _res = { ! 36: RES_TIMEOUT, /* retransmition time interval */ ! 37: 4, /* number of times to retransmit */ ! 38: RES_DEFAULT, /* options flags */ ! 39: 1, /* number of name servers */ ! 40: }; ! 41: ! 42: /* ! 43: * Set up default settings. If the configuration file exist, the values ! 44: * there will have precedence. Otherwise, the server address is set to ! 45: * INADDR_ANY and the default domain name comes from the gethostname(). ! 46: * ! 47: * The configuration file should only be used if you want to redefine your ! 48: * domain or run without a server on your machine. ! 49: * ! 50: * Return 0 if completes successfully, -1 on error ! 51: */ ! 52: res_init() ! 53: { ! 54: register FILE *fp; ! 55: register char *cp, **pp; ! 56: register int n; ! 57: char buf[BUFSIZ]; ! 58: extern u_long inet_addr(); ! 59: extern char *index(); ! 60: extern char *strcpy(), *strncpy(); ! 61: extern char *getenv(); ! 62: int nserv = 0; /* number of nameserver records read from file */ ! 63: int haveenv = 0; ! 64: int havesearch = 0; ! 65: ! 66: _res.nsaddr.sin_addr.s_addr = INADDR_ANY; ! 67: _res.nsaddr.sin_family = AF_INET; ! 68: _res.nsaddr.sin_port = htons(NAMESERVER_PORT); ! 69: _res.nscount = 1; ! 70: ! 71: /* Allow user to override the local domain definition */ ! 72: if ((cp = getenv("LOCALDOMAIN")) != NULL) { ! 73: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); ! 74: haveenv++; ! 75: } ! 76: ! 77: if ((fp = fopen(_PATH_RESCONF, "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: if (haveenv) /* skip if have from environ */ ! 83: continue; ! 84: cp = buf + sizeof("domain") - 1; ! 85: while (*cp == ' ' || *cp == '\t') ! 86: cp++; ! 87: if ((*cp == '\0') || (*cp == '\n')) ! 88: continue; ! 89: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); ! 90: if ((cp = index(_res.defdname, '\n')) != NULL) ! 91: *cp = '\0'; ! 92: havesearch = 0; ! 93: continue; ! 94: } ! 95: /* set search list */ ! 96: if (!strncmp(buf, "search", sizeof("search") - 1)) { ! 97: if (haveenv) /* skip if have from environ */ ! 98: continue; ! 99: cp = buf + sizeof("search") - 1; ! 100: while (*cp == ' ' || *cp == '\t') ! 101: cp++; ! 102: if ((*cp == '\0') || (*cp == '\n')) ! 103: continue; ! 104: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); ! 105: if ((cp = index(_res.defdname, '\n')) != NULL) ! 106: *cp = '\0'; ! 107: /* ! 108: * Set search list to be blank-separated strings ! 109: * on rest of line. ! 110: */ ! 111: cp = _res.defdname; ! 112: pp = _res.dnsrch; ! 113: *pp++ = cp; ! 114: for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) { ! 115: if (*cp == ' ' || *cp == '\t') { ! 116: *cp = 0; ! 117: n = 1; ! 118: } else if (n) { ! 119: *pp++ = cp; ! 120: n = 0; ! 121: } ! 122: } ! 123: /* null terminate last domain if there are excess */ ! 124: while (*cp != '\0' && *cp != ' ' && *cp != '\t') ! 125: cp++; ! 126: *cp = '\0'; ! 127: *pp++ = 0; ! 128: havesearch = 1; ! 129: continue; ! 130: } ! 131: /* read nameservers to query */ ! 132: if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) && ! 133: nserv < MAXNS) { ! 134: cp = buf + sizeof("nameserver") - 1; ! 135: while (*cp == ' ' || *cp == '\t') ! 136: cp++; ! 137: if ((*cp == '\0') || (*cp == '\n')) ! 138: continue; ! 139: if ((_res.nsaddr_list[nserv].sin_addr.s_addr = ! 140: inet_addr(cp)) == (unsigned)-1) { ! 141: _res.nsaddr_list[nserv].sin_addr.s_addr ! 142: = INADDR_ANY; ! 143: continue; ! 144: } ! 145: _res.nsaddr_list[nserv].sin_family = AF_INET; ! 146: _res.nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT); ! 147: nserv++; ! 148: continue; ! 149: } ! 150: } ! 151: if (nserv > 1) ! 152: _res.nscount = nserv; ! 153: (void) fclose(fp); ! 154: } ! 155: if (_res.defdname[0] == 0) { ! 156: if (gethostname(buf, sizeof(_res.defdname)) == 0 && ! 157: (cp = index(buf, '.'))) ! 158: (void)strcpy(_res.defdname, cp + 1); ! 159: } ! 160: ! 161: /* find components of local domain that might be searched */ ! 162: if (havesearch == 0) { ! 163: pp = _res.dnsrch; ! 164: *pp++ = _res.defdname; ! 165: for (cp = _res.defdname, n = 0; *cp; cp++) ! 166: if (*cp == '.') ! 167: n++; ! 168: cp = _res.defdname; ! 169: for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; ! 170: n--) { ! 171: cp = index(cp, '.'); ! 172: *pp++ = ++cp; ! 173: } ! 174: *pp++ = 0; ! 175: } ! 176: _res.options |= RES_INIT; ! 177: return (0); ! 178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.