|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #if defined(LIBC_SCCS) && !defined(lint) ! 8: static char sccsid[] = "@(#)res_init.c 6.5 (Berkeley) 4/11/86"; ! 9: #endif LIBC_SCCS and not lint ! 10: ! 11: #include <sys/types.h> ! 12: #include <sys/socket.h> ! 13: #include <netinet/in.h> ! 14: #include <stdio.h> ! 15: #include <arpa/nameser.h> ! 16: #include <resolv.h> ! 17: ! 18: /* ! 19: * Resolver configuration file. Contains the address of the ! 20: * inital name server to query and the default domain for ! 21: * non fully qualified domain names. ! 22: */ ! 23: ! 24: #ifdef CONFFILE ! 25: char *conffile = CONFFILE; ! 26: #else ! 27: char *conffile = "/etc/resolv.conf"; ! 28: #endif ! 29: ! 30: /* ! 31: * Resolver state default settings ! 32: */ ! 33: ! 34: #ifndef RES_TIMEOUT ! 35: #define RES_TIMEOUT 4 ! 36: #endif ! 37: ! 38: struct state _res = { ! 39: RES_TIMEOUT, /* retransmition time interval */ ! 40: 4, /* number of times to retransmit */ ! 41: RES_RECURSE|RES_DEFNAMES, /* options flags */ ! 42: 1, /* number of name servers */ ! 43: }; ! 44: ! 45: /* ! 46: * Set up default settings. If the configuration file exist, the values ! 47: * there will have precedence. Otherwise, the server address is set to ! 48: * INADDR_ANY and the default domain name comes from the gethostname(). ! 49: * ! 50: * The configuration file should only be used if you want to redefine your ! 51: * domain or run without a server on your machine. ! 52: * ! 53: * Return 0 if completes successfully, -1 on error ! 54: */ ! 55: res_init() ! 56: { ! 57: register FILE *fp; ! 58: char buf[BUFSIZ], *cp; ! 59: extern u_long inet_addr(); ! 60: extern char *index(); ! 61: extern char *strcpy(), *strncpy(); ! 62: #ifdef DEBUG ! 63: extern char *getenv(); ! 64: #endif DEBUG ! 65: int n = 0; /* number of nameserver records read from file */ ! 66: ! 67: _res.nsaddr.sin_addr.s_addr = INADDR_ANY; ! 68: _res.nsaddr.sin_family = AF_INET; ! 69: _res.nsaddr.sin_port = htons(NAMESERVER_PORT); ! 70: _res.nscount = 1; ! 71: _res.defdname[0] = '\0'; ! 72: ! 73: if ((fp = fopen(conffile, "r")) != NULL) { ! 74: /* read the config file */ ! 75: while (fgets(buf, sizeof(buf), fp) != NULL) { ! 76: /* read default domain name */ ! 77: if (!strncmp(buf, "domain", sizeof("domain") - 1)) { ! 78: cp = buf + sizeof("domain") - 1; ! 79: while (*cp == ' ' || *cp == '\t') ! 80: cp++; ! 81: if (*cp == '\0') ! 82: continue; ! 83: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); ! 84: _res.defdname[sizeof(_res.defdname) - 1] = '\0'; ! 85: if ((cp = index(_res.defdname, '\n')) != NULL) ! 86: *cp = '\0'; ! 87: continue; ! 88: } ! 89: /* read nameservers to query */ ! 90: if (!strncmp(buf, "nameserver", ! 91: sizeof("nameserver") - 1) && (n < MAXNS)) { ! 92: cp = buf + sizeof("nameserver") - 1; ! 93: while (*cp == ' ' || *cp == '\t') ! 94: cp++; ! 95: if (*cp == '\0') ! 96: continue; ! 97: _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp); ! 98: if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) ! 99: _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY; ! 100: _res.nsaddr_list[n].sin_family = AF_INET; ! 101: _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT); ! 102: if ( ++n >= MAXNS) { ! 103: n = MAXNS; ! 104: #ifdef DEBUG ! 105: if ( _res.options & RES_DEBUG ) ! 106: printf("MAXNS reached, reading resolv.conf\n"); ! 107: #endif DEBUG ! 108: } ! 109: continue; ! 110: } ! 111: } ! 112: if ( n > 1 ) ! 113: _res.nscount = n; ! 114: (void) fclose(fp); ! 115: } ! 116: if (_res.defdname[0] == 0) { ! 117: if (gethostname(buf, sizeof(_res.defdname)) == 0 && ! 118: (cp = index(buf, '.'))) ! 119: (void)strcpy(_res.defdname, cp + 1); ! 120: } ! 121: ! 122: #ifdef DEBUG ! 123: /* Allow user to override the local domain definition */ ! 124: if ((cp = getenv("LOCALDOMAIN")) != NULL) ! 125: (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); ! 126: #endif DEBUG ! 127: _res.options |= RES_INIT; ! 128: return(0); ! 129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.