BSD 4_3_Tahoe release
[unix-history] / usr / src / lib / libc / net / res_init.c
index 2389f66..afdbce3 100644 (file)
@@ -1,12 +1,23 @@
 /*
  * Copyright (c) 1985 Regents of the University of California.
 /*
  * Copyright (c) 1985 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)res_init.c 6.4 (Berkeley) %G%";
-#endif LIBC_SCCS and not lint
+static char sccsid[] = "@(#)res_init.c 6.9 (Berkeley) 6/27/88";
+#endif /* LIBC_SCCS and not lint */
 
 #include <sys/types.h>
 #include <sys/socket.h>
 
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -21,25 +32,19 @@ static char sccsid[] = "@(#)res_init.c      6.4 (Berkeley) %G%";
  * non fully qualified domain names.
  */
 
  * non fully qualified domain names.
  */
 
-#ifdef CONFFILE
-char    *conffile = CONFFILE;
-#else
-char    *conffile = "/etc/resolv.conf";
+#ifndef        CONFFILE
+#define        CONFFILE        "/etc/resolv.conf"
 #endif
 
 /*
  * Resolver state default settings
  */
 
 #endif
 
 /*
  * Resolver state default settings
  */
 
-#ifndef RES_TIMEOUT
-#define RES_TIMEOUT 10
-#endif
-
 struct state _res = {
 struct state _res = {
-    RES_TIMEOUT,                 /* retransmition time interval */
-    4,                           /* number of times to retransmit */
-    RES_RECURSE|RES_DEFNAMES,    /* options flags */
-    1,                           /* number of name servers */
+    RES_TIMEOUT,                       /* retransmition time interval */
+    4,                                 /* number of times to retransmit */
+    RES_DEFAULT,               /* options flags */
+    1,                                 /* number of name servers */
 };
 
 /*
 };
 
 /*
@@ -55,13 +60,12 @@ struct state _res = {
 res_init()
 {
     register FILE *fp;
 res_init()
 {
     register FILE *fp;
-    char buf[BUFSIZ], *cp;
+    register char *cp, **pp;
+    char buf[BUFSIZ];
     extern u_long inet_addr();
     extern char *index();
     extern char *strcpy(), *strncpy();
     extern u_long inet_addr();
     extern char *index();
     extern char *strcpy(), *strncpy();
-#ifdef DEBUG
     extern char *getenv();
     extern char *getenv();
-#endif DEBUG
     int n = 0;    /* number of nameserver records read from file */
 
     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
     int n = 0;    /* number of nameserver records read from file */
 
     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
@@ -70,7 +74,7 @@ res_init()
     _res.nscount = 1;
     _res.defdname[0] = '\0';
 
     _res.nscount = 1;
     _res.defdname[0] = '\0';
 
-    if ((fp = fopen(conffile, "r")) != NULL) {
+    if ((fp = fopen(CONFFILE, "r")) != NULL) {
         /* read the config file */
         while (fgets(buf, sizeof(buf), fp) != NULL) {
             /* read default domain name */
         /* read the config file */
         while (fgets(buf, sizeof(buf), fp) != NULL) {
             /* read default domain name */
@@ -119,11 +123,21 @@ res_init()
              (void)strcpy(_res.defdname, cp + 1);
     }
 
              (void)strcpy(_res.defdname, cp + 1);
     }
 
-#ifdef DEBUG
     /* Allow user to override the local domain definition */
     if ((cp = getenv("LOCALDOMAIN")) != NULL)
         (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
     /* Allow user to override the local domain definition */
     if ((cp = getenv("LOCALDOMAIN")) != NULL)
         (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
-#endif DEBUG
+
+    /* 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);
 }
     _res.options |= RES_INIT;
     return(0);
 }