allow I option to arbitrarily set and clear resolver options
authorEric Allman <eric@ucbvax.Berkeley.EDU>
Sat, 19 Dec 1992 02:06:37 +0000 (18:06 -0800)
committerEric Allman <eric@ucbvax.Berkeley.EDU>
Sat, 19 Dec 1992 02:06:37 +0000 (18:06 -0800)
SCCS-vsn: usr.sbin/sendmail/src/domain.c 5.38
SCCS-vsn: usr.sbin/sendmail/src/version.c 5.140
SCCS-vsn: usr.sbin/sendmail/src/readcf.c 5.55

usr/src/usr.sbin/sendmail/src/domain.c
usr/src/usr.sbin/sendmail/src/readcf.c
usr/src/usr.sbin/sendmail/src/version.c

index bafd2ec..0d7b97c 100644 (file)
@@ -10,9 +10,9 @@
 
 #ifndef lint
 #ifdef NAMED_BIND
 
 #ifndef lint
 #ifdef NAMED_BIND
-static char sccsid[] = "@(#)domain.c   5.37 (Berkeley) %G% (with name server)";
+static char sccsid[] = "@(#)domain.c   5.38 (Berkeley) %G% (with name server)";
 #else
 #else
-static char sccsid[] = "@(#)domain.c   5.37 (Berkeley) %G% (without name server)";
+static char sccsid[] = "@(#)domain.c   5.38 (Berkeley) %G% (without name server)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -262,15 +262,11 @@ loop:
        }
 
        /*
        }
 
        /*
-       **  We do at least one level of search if
-       **      - there is no dot and RES_DEFNAME is set, or
-       **      - there is at least one dot, there is no trailing dot,
-       **        and RES_DNSRCH is set.
+       **  We assume that RES_DEFNAMES and RES_DNSRCH are set -- if we
+       **  don't want this behaviour, don't use $[ ... $] at all!
        */
 
        */
 
-       if (ret < 0 &&
-               ((n == 0 && _res.options & RES_DEFNAMES) ||
-                (n > 0 && *--cp != '.' && _res.options & RES_DNSRCH)))
+       if (ret < 0 && (n == 0 || (n > 0 && *--cp != '.')))
        {
                for (domain = _res.dnsrch; *domain; domain++)
                {
        {
                for (domain = _res.dnsrch; *domain; domain++)
                {
index 1334288..ea155a3 100644 (file)
@@ -7,12 +7,16 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)readcf.c   5.54 (Berkeley) %G%";
+static char sccsid[] = "@(#)readcf.c   5.55 (Berkeley) %G%";
 #endif /* not lint */
 
 # include "sendmail.h"
 # include <sys/stat.h>
 # include <unistd.h>
 #endif /* not lint */
 
 # include "sendmail.h"
 # include <sys/stat.h>
 # include <unistd.h>
+#ifdef NAMED_BIND
+# include <arpa/nameser.h>
+# include <resolv.h>
+#endif
 
 /*
 **  READCF -- read control file.
 
 /*
 **  READCF -- read control file.
@@ -768,11 +772,35 @@ printrules()
 
 static BITMAP  StickyOpt;              /* set if option is stuck */
 
 
 static BITMAP  StickyOpt;              /* set if option is stuck */
 
+
+#ifdef NAMED_BIND
+
+struct resolverflags
+{
+       char    *rf_name;       /* name of the flag */
+       long    rf_bits;        /* bits to set/clear */
+} ResolverFlags[] =
+{
+       "debug",        RES_DEBUG,
+       "aaonly",       RES_AAONLY,
+       "usevc",        RES_USEVC,
+       "primary",      RES_PRIMARY,
+       "igntc",        RES_IGNTC,
+       "recurse",      RES_RECURSE,
+       "defnames",     RES_DEFNAMES,
+       "stayopen",     RES_STAYOPEN,
+       "dnsrch",       RES_DNSRCH,
+       NULL,           0
+};
+
+#endif
+
 setoption(opt, val, sticky)
        char opt;
        char *val;
        bool sticky;
 {
 setoption(opt, val, sticky)
        char opt;
        char *val;
        bool sticky;
 {
+       register char *p;
        extern bool atobool();
        extern time_t convtime();
        extern int QueueLA;
        extern bool atobool();
        extern time_t convtime();
        extern int QueueLA;
@@ -908,7 +936,44 @@ setoption(opt, val, sticky)
                break;
 
          case 'I':             /* use internet domain name server */
                break;
 
          case 'I':             /* use internet domain name server */
-               UseNameServer = atobool(val);
+#ifdef NAMED_BIND
+               UseNameServer = TRUE;
+               for (p = val; *p != 0; )
+               {
+                       bool clearmode;
+                       char *q;
+                       struct resolverflags *rfp;
+
+                       while (*p == ' ')
+                               p++;
+                       if (*p == '\0')
+                               break;
+                       clearmode = FALSE;
+                       if (*p == '-')
+                               clearmode = TRUE;
+                       else if (*p != '+')
+                               p--;
+                       p++;
+                       q = p;
+                       while (*p != '\0' && !isspace(*p))
+                               p++;
+                       if (*p != '\0')
+                               *p++ = '\0';
+                       for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++)
+                       {
+                               if (strcasecmp(q, rfp->rf_name) == 0)
+                                       break;
+                       }
+                       if (clearmode)
+                               _res.options &= ~rfp->rf_bits;
+                       else
+                               _res.options |= rfp->rf_bits;
+               }
+               if (tTd(8, 2))
+                       printf("_res.options = %x\n", _res.options);
+#else
+               usrerr("name server (I option) specified but BIND not compiled in");
+#endif
                break;
 
          case 'i':             /* ignore dot lines in message */
                break;
 
          case 'i':             /* ignore dot lines in message */
index c5eaa55..c8547b4 100644 (file)
@@ -7,7 +7,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)version.c  5.139 (Berkeley) %G%";
+static char sccsid[] = "@(#)version.c  5.140 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
-char   Version[] = "ALPHA-5.139";
+char   Version[] = "ALPHA-5.140";