sendmail - pre-fork in daemon mode to avoid stall (2)
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 22 Aug 2014 18:41:54 +0000 (11:41 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 22 Aug 2014 18:41:54 +0000 (11:41 -0700)
* disconnect() and set CurrentPid on pre-fork.  This fixes an issue where
  the boot console is revoked and enters getty before the backgrounded
  sendmail disconnects from the foreground process and tty, causing sendmail
  to complain in /var/log/maillog.

  This issue can occur due to myhostname() stalls when the internet is not
  available (e.g. /etc/resolv.conf is present but wifi-only system has not
  yet associated), or has other connectivity issues during boot.

Reported-by: Rolinh
usr.sbin/sendmail/main.c.patch

index 78ed075..2e03a64 100644 (file)
@@ -1,5 +1,5 @@
---- /usr/src/contrib/sendmail-8.14/sendmail/main.c     2014-08-20 09:45:52.585530000 -0700
-+++ main.c     2014-08-20 09:48:38.388533000 -0700
+--- main.c     2014-08-20 09:45:52.585530000 -0700
++++ main.c     2014-08-22 11:29:54.792973000 -0700
 @@ -169,6 +169,7 @@
        char warn_f_flag = '\0';
        bool run_in_foreground = false; /* -bD mode */
@@ -17,7 +17,7 @@
                        break;
                }
        }
-@@ -707,6 +710,23 @@
+@@ -707,6 +710,25 @@
        /* version */
        macdefine(&BlankEnvelope.e_macro, A_PERM, 'v', Version);
  
 +                      finis(false, true, EX_OK);
 +                      /* NOTREACHED */
 +              }
++              disconnect(2, CurEnv);
++              CurrentPid = getpid();
 +      }
 +
        /* hostname */
        hp = myhostname(jbuf, sizeof(jbuf));
        if (jbuf[0] != '\0')
-@@ -2305,6 +2325,7 @@
+@@ -2305,6 +2327,7 @@
        **              doing it in background.
        **      We check for any errors that might have happened
        **              during startup.
@@ -49,7 +51,7 @@
        */
  
        if (OpMode == MD_DAEMON || QueueIntvl > 0)
-@@ -2315,6 +2336,7 @@
+@@ -2315,6 +2338,7 @@
                DaemonPid = 0;
                if (!run_in_foreground && !tTd(99, 100))
                {
@@ -57,7 +59,7 @@
                        /* put us in background */
                        i = fork();
                        if (i < 0)
-@@ -2324,6 +2346,7 @@
+@@ -2324,6 +2348,7 @@
                                finis(false, true, EX_OK);
                                /* NOTREACHED */
                        }
@@ -65,7 +67,7 @@
  
                        /*
                        **  Initialize exception stack and default exception
-@@ -2563,9 +2586,12 @@
+@@ -2563,9 +2588,12 @@
                macdefine(&BlankEnvelope.e_macro, A_TEMP, '_', authinfo);
  
                /* at this point we are in a child: reset state */