BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.sbin / sendmail / src / conf.c
index 2b1bb95..48a978c 100644 (file)
@@ -1,29 +1,46 @@
 /*
 /*
+ * Copyright (c) 1983 Eric P. Allman
  * Copyright (c) 1988 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1988 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at 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'' without express or implied warranty.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
  *
- *  Sendmail
- *  Copyright (c) 1983  Eric P. Allman
- *  Berkeley, California
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)conf.c     5.16 (Berkeley) %G%";
+static char sccsid[] = "@(#)conf.c     5.28 (Berkeley) 3/12/91";
 #endif /* not lint */
 
 #endif /* not lint */
 
-# include <pwd.h>
 # include <sys/ioctl.h>
 # include <sys/ioctl.h>
-# ifdef sun
 # include <sys/param.h>
 # include <sys/param.h>
-# endif sun
+# include <pwd.h>
 # include "sendmail.h"
 # include "sendmail.h"
+# include "pathnames.h"
 
 /*
 **  CONF.C -- Sendmail Configuration Tables.
 
 /*
 **  CONF.C -- Sendmail Configuration Tables.
@@ -52,7 +69,7 @@ static char sccsid[] = "@(#)conf.c    5.16 (Berkeley) %G%";
 
 
 
 
 
 
-\f/*
+/*
 **  Header info table
 **     Final (null) entry contains the flags used for any other field.
 **
 **  Header info table
 **     Final (null) entry contains the flags used for any other field.
 **
@@ -113,8 +130,8 @@ char        Arpa_Usrerr[] =         "554";  /* some (fatal) user error */
 **  Location of system files/databases/etc.
 */
 
 **  Location of system files/databases/etc.
 */
 
-char   *ConfFile =     "/usr/lib/sendmail.cf"; /* runtime configuration */
-char   *FreezeFile =   "/usr/lib/sendmail.fc"; /* frozen version of above */
+char   *ConfFile =     _PATH_SENDMAILCF;       /* runtime configuration */
+char   *FreezeFile =   _PATH_SENDMAILFC;       /* frozen version of above */
 
 
 
 
 
 
@@ -123,6 +140,7 @@ char        *FreezeFile =   "/usr/lib/sendmail.fc"; /* frozen version of above */
 */
 
 int    DtableSize =    50;             /* max open files; reset in 4.2bsd */
 */
 
 int    DtableSize =    50;             /* max open files; reset in 4.2bsd */
+extern int la;                         /* load average */
 \f/*
 **  SETDEFAULTS -- set default values
 **
 \f/*
 **  SETDEFAULTS -- set default values
 **
@@ -152,8 +170,28 @@ setdefaults()
        FileMode = 0644;
        DefUid = 1;
        DefGid = 1;
        FileMode = 0644;
        DefUid = 1;
        DefGid = 1;
+       CheckpointInterval = 10;
+       setdefuser();
+}
+
+
+/*
+**  SETDEFUSER -- set/reset DefUser using DefUid (for initgroups())
+*/
+
+setdefuser()
+{
+       struct passwd *defpwent;
+
+       if (DefUser != NULL)
+               free(DefUser);
+       if ((defpwent = getpwuid(DefUid)) != NULL)
+               DefUser = newstr(defpwent->pw_name);
+       else
+               DefUser = newstr("nobody");
 }
 
 }
 
+
 /*
 **  GETRUID -- get real user id (V7)
 */
 /*
 **  GETRUID -- get real user id (V7)
 */
@@ -201,7 +239,6 @@ username()
        static char *myname = NULL;
        extern char *getlogin();
        register struct passwd *pw;
        static char *myname = NULL;
        extern char *getlogin();
        register struct passwd *pw;
-       extern struct passwd *getpwuid();
 
        /* cache the result */
        if (myname == NULL)
 
        /* cache the result */
        if (myname == NULL)
@@ -212,17 +249,18 @@ username()
 
                        pw = getpwuid(getruid());
                        if (pw != NULL)
 
                        pw = getpwuid(getruid());
                        if (pw != NULL)
-                               myname = pw->pw_name;
+                               myname = newstr(pw->pw_name);
                }
                else
                {
 
                }
                else
                {
 
-                       pw = getpwnam(myname);
-                       if(getuid() != pw->pw_uid)
+                       myname = newstr(myname);
+                       if ((pw = getpwnam(myname)) == NULL ||
+                             getuid() != pw->pw_uid)
                        {
                                pw = getpwuid(getuid());
                                if (pw != NULL)
                        {
                                pw = getpwuid(getuid());
                                if (pw != NULL)
-                                       myname = pw->pw_name;
+                                       myname = newstr(pw->pw_name);
                        }
                }
                if (myname == NULL || myname[0] == '\0')
                        }
                }
                if (myname == NULL || myname[0] == '\0')
@@ -388,7 +426,18 @@ rlsesigs()
 **             none.
 */
 
 **             none.
 */
 
-#ifdef VMUNIX
+#ifndef sun
+
+getla()
+{
+       double avenrun[3];
+
+       if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) < 0)
+               return (0);
+       return ((int) (avenrun[0] + 0.5));
+}
+
+#else /* sun */
 
 #include <nlist.h>
 
 
 #include <nlist.h>
 
@@ -399,14 +448,13 @@ struct    nlist Nl[] =
        { 0 },
 };
 
        { 0 },
 };
 
+
+extern int la;
+
 getla()
 {
        static int kmem = -1;
 getla()
 {
        static int kmem = -1;
-# ifdef sun
        long avenrun[3];
        long avenrun[3];
-# else
-       double avenrun[3];
-# endif
        extern off_t lseek();
 
        if (kmem < 0)
        extern off_t lseek();
 
        if (kmem < 0)
@@ -425,21 +473,10 @@ getla()
                /* thank you Ian */
                return (-1);
        }
                /* thank you Ian */
                return (-1);
        }
-# ifdef sun
        return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
        return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
-# else
-       return ((int) (avenrun[0] + 0.5));
-# endif
-}
-
-#else VMUNIX
-
-getla()
-{
-       return (0);
 }
 
 }
 
-#endif VMUNIX
+#endif /* sun */
 \f/*
 **  SHOULDQUEUE -- should this message be queued or sent?
 **
 \f/*
 **  SHOULDQUEUE -- should this message be queued or sent?
 **
@@ -461,9 +498,6 @@ bool
 shouldqueue(pri)
        long pri;
 {
 shouldqueue(pri)
        long pri;
 {
-       int la;
-
-       la = getla();
        if (la < QueueLA)
                return (FALSE);
        return (pri > (QueueFactor / (la - QueueLA + 1)));
        if (la < QueueLA)
                return (FALSE);
        return (pri > (QueueFactor / (la - QueueLA + 1)));
@@ -529,17 +563,18 @@ setproctitle(fmt, a, b, c)
 # include <sys/wait.h>
 # endif VMUNIX
 
 # include <sys/wait.h>
 # endif VMUNIX
 
+void
 reapchild()
 {
 # ifdef WNOHANG
        union wait status;
 
 reapchild()
 {
 # ifdef WNOHANG
        union wait status;
 
-       while (wait3(&status, WNOHANG, (struct rusage *) NULL) > 0)
+       while (wait3((int *)&status, WNOHANG, (struct rusage *) NULL) > 0)
                continue;
 # else WNOHANG
        auto int status;
 
                continue;
 # else WNOHANG
        auto int status;
 
-       while (wait(&status) > 0)
+       while (wait((int *)&status) > 0)
                continue;
 # endif WNOHANG
 }
                continue;
 # endif WNOHANG
 }