- FILE *fp;
- char buf[BUFSIZ], *cp;
- int n;
- extern u_long inet_addr();
- extern char *index(), *getenv();
-
- _res.options |= RES_INIT;
- _res.nsaddr.sin_family = AF_INET;
- _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
- _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
-
- /* first try reading the config file */
- if ((fp = fopen(CONFFILE, "r")) != NULL) {
- if (fgets(_res.defdname, sizeof(_res.defdname), fp) == NULL)
- _res.defdname[0] = '\0';
- else if ((cp = index(_res.defdname, '\n')) != NULL)
- *cp = '\0';
- if (fgets(buf, sizeof (buf), fp) != NULL)
- _res.nsaddr.sin_addr.s_addr = inet_addr(buf);
- (void) fclose(fp);
- }
-
- /* Allow user to override the local domain definition */
- if ((cp = getenv("LOCALDOMAIN")) != NULL)
- strncpy(_res.defdname, cp, sizeof(_res.defdname));
+ register FILE *fp;
+ register char *cp, **pp;
+ char buf[BUFSIZ];
+ extern u_long inet_addr();
+ extern char *index();
+ extern char *strcpy(), *strncpy();
+ extern char *getenv();
+ int n = 0; /* number of nameserver records read from file */
+
+ _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
+ _res.nsaddr.sin_family = AF_INET;
+ _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
+ _res.nscount = 1;
+ _res.defdname[0] = '\0';
+
+ if ((fp = fopen(CONFFILE, "r")) != NULL) {
+ /* read the config file */
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ /* read default domain name */
+ if (!strncmp(buf, "domain", sizeof("domain") - 1)) {
+ cp = buf + sizeof("domain") - 1;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if (*cp == '\0')
+ continue;
+ (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
+ _res.defdname[sizeof(_res.defdname) - 1] = '\0';
+ if ((cp = index(_res.defdname, '\n')) != NULL)
+ *cp = '\0';
+ continue;
+ }
+ /* read nameservers to query */
+ if (!strncmp(buf, "nameserver",
+ sizeof("nameserver") - 1) && (n < MAXNS)) {
+ cp = buf + sizeof("nameserver") - 1;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if (*cp == '\0')
+ continue;
+ _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp);
+ if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1)
+ _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY;
+ _res.nsaddr_list[n].sin_family = AF_INET;
+ _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT);
+ if ( ++n >= MAXNS) {
+ n = MAXNS;
+#ifdef DEBUG
+ if ( _res.options & RES_DEBUG )
+ printf("MAXNS reached, reading resolv.conf\n");
+#endif DEBUG
+ }
+ continue;
+ }
+ }
+ if ( n > 1 )
+ _res.nscount = n;
+ (void) fclose(fp);
+ }
+ if (_res.defdname[0] == 0) {
+ if (gethostname(buf, sizeof(_res.defdname)) == 0 &&
+ (cp = index(buf, '.')))
+ (void)strcpy(_res.defdname, cp + 1);
+ }
+
+ /* Allow user to override the local domain definition */
+ if ((cp = getenv("LOCALDOMAIN")) != NULL)
+ (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
+
+ /* find components of local domain that might be searched */
+ pp = _res.dnsrch;
+ *pp++ = _res.defdname;
+ for (cp = _res.defdname, n = 0; *cp; cp++)
+ if (*cp == '.')
+ n++;
+ cp = _res.defdname;
+ for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDNSRCH; n--) {
+ cp = index(cp, '.');
+ *pp++ = ++cp;
+ }
+ _res.options |= RES_INIT;
+ return(0);