warn of the sins of wildcard MX records
[unix-history] / usr / src / usr.sbin / sendmail / src / main.c
index 4374f49..e106c59 100644 (file)
@@ -13,7 +13,7 @@ static char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     8.128 (Berkeley) %G%";
+static char sccsid[] = "@(#)main.c     8.133 (Berkeley) %G%";
 #endif /* not lint */
 
 #define        _DEFINE
 #endif /* not lint */
 
 #define        _DEFINE
@@ -698,7 +698,7 @@ main(argc, argv, envp)
        **      Extract special fields for local use.
        */
 
        **      Extract special fields for local use.
        */
 
-#ifdef XDEBUG
+#if XDEBUG
        checkfd012("before readcf");
 #endif
        vendor_pre_defaults(CurEnv);
        checkfd012("before readcf");
 #endif
        vendor_pre_defaults(CurEnv);
@@ -881,6 +881,9 @@ main(argc, argv, envp)
        /* MIME Content-Types that cannot be transfer encoded */
        setclass('n', "multipart/signed");
 
        /* MIME Content-Types that cannot be transfer encoded */
        setclass('n', "multipart/signed");
 
+       /* MIME message/* subtypes that can be treated as messages */
+       setclass('m', "rfc822");
+
        /* MIME Content-Transfer-Encodings that can be encoded */
        setclass('e', "7bit");
        setclass('e', "8bit");
        /* MIME Content-Transfer-Encodings that can be encoded */
        setclass('e', "7bit");
        setclass('e', "8bit");
@@ -917,7 +920,7 @@ main(argc, argv, envp)
                exit(ExitStat);
        }
 
                exit(ExitStat);
        }
 
-#ifdef XDEBUG
+#if XDEBUG
        checkfd012("before main() initmaps");
 #endif
 
        checkfd012("before main() initmaps");
 #endif
 
@@ -1412,7 +1415,7 @@ disconnect(droplev, e)
                errno = 0;
        }
 
                errno = 0;
        }
 
-#ifdef XDEBUG
+#if XDEBUG
        checkfd012("disconnect");
 #endif
 
        checkfd012("disconnect");
 #endif
 
@@ -1519,7 +1522,7 @@ auth_warning(e, msg, va_alist)
                vsprintf(p, msg, ap);
                VA_END;
                addheader("X-Authentication-Warning", buf, &e->e_header);
                vsprintf(p, msg, ap);
                VA_END;
                addheader("X-Authentication-Warning", buf, &e->e_header);
-#if LOG
+#ifdef LOG
                if (LogLevel > 3)
                        syslog(LOG_INFO, "%s: Authentication-Warning: %s",
                                e->e_id == NULL ? "[NOQUEUE]" : e->e_id, buf);
                if (LogLevel > 3)
                        syslog(LOG_INFO, "%s: Authentication-Warning: %s",
                                e->e_id == NULL ? "[NOQUEUE]" : e->e_id, buf);
@@ -1636,6 +1639,7 @@ sighup()
        if (LogLevel > 3)
                syslog(LOG_INFO, "restarting %s on signal", SaveArgv[0]);
 #endif
        if (LogLevel > 3)
                syslog(LOG_INFO, "restarting %s on signal", SaveArgv[0]);
 #endif
+       releasesignal(SIGHUP);
        execv(SaveArgv[0], (ARGV_T) SaveArgv);
 #ifdef LOG
        if (LogLevel > 0)
        execv(SaveArgv[0], (ARGV_T) SaveArgv);
 #ifdef LOG
        if (LogLevel > 0)
@@ -1661,6 +1665,7 @@ testmodeline(line, e)
        auto char *delimptr;
        int mid;
        ADDRESS a;
        auto char *delimptr;
        int mid;
        ADDRESS a;
+       static int tryflags = RF_COPYNONE;
        extern bool invalidaddr();
        extern char *crackaddr();
 
        extern bool invalidaddr();
        extern char *crackaddr();
 
@@ -1793,8 +1798,10 @@ testmodeline(line, e)
                        q = crackaddr(p);
                        printf("Cracked address = ");
                        xputs(q);
                        q = crackaddr(p);
                        printf("Cracked address = ");
                        xputs(q);
-                       printf("\n");
-                       if (parseaddr(p, &a, RF_COPYNONE, '\0', NULL, e) == NULL)
+                       printf("\nParsing %s %s address\n",
+                               bitset(RF_HEADERADDR, tryflags) ? "header" : "envelope",
+                               bitset(RF_SENDERADDR, tryflags) ? "sender" : "recipient");
+                       if (parseaddr(p, &a, tryflags, '\0', NULL, e) == NULL)
                                printf("Cannot parse\n");
                        else if (a.q_host != NULL && a.q_host[0] != '\0')
                                printf("mailer %s, host %s, user %s\n",
                                printf("Cannot parse\n");
                        else if (a.q_host != NULL && a.q_host[0] != '\0')
                                printf("mailer %s, host %s, user %s\n",
@@ -1803,6 +1810,34 @@ testmodeline(line, e)
                                printf("mailer %s, user %s\n",
                                        a.q_mailer->m_name, a.q_user);
                }
                                printf("mailer %s, user %s\n",
                                        a.q_mailer->m_name, a.q_user);
                }
+               else if (strcasecmp(&line[1], "tryflags") == 0)
+               {
+                       while (*p != '\n')
+                       {
+                               switch (*p)
+                               {
+                                 case 'H':
+                                 case 'h':
+                                       tryflags |= RF_HEADERADDR;
+                                       break;
+
+                                 case 'E':
+                                 case 'e':
+                                       tryflags &= ~RF_HEADERADDR;
+                                       break;
+
+                                 case 'S':
+                                 case 's':
+                                       tryflags |= RF_SENDERADDR;
+                                       break;
+
+                                 case 'R':
+                                 case 'r':
+                                       tryflags &= ~RF_SENDERADDR;
+                                       break;
+                               }
+                       }
+               }
                else
                {
                        printf("Unknown test command %s\n", line);
                else
                {
                        printf("Unknown test command %s\n", line);