1c2aa98e2SPeter Wemm /* 2567a2fc9SGregory Neil Shapiro * Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers. 33299c2f1SGregory Neil Shapiro * All rights reserved. 4c2aa98e2SPeter Wemm * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm * Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm * The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm * 8c2aa98e2SPeter Wemm * By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm * forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm * the sendmail distribution. 11c2aa98e2SPeter Wemm * 127660b554SGregory Neil Shapiro * $FreeBSD$ 13c2aa98e2SPeter Wemm */ 14c2aa98e2SPeter Wemm 1512ed1c7cSGregory Neil Shapiro #include <sendmail.h> 1612ed1c7cSGregory Neil Shapiro 17355d91e3SGregory Neil Shapiro SM_RCSID("@(#)$Id: conf.c,v 8.1082 2006/03/22 22:49:33 ca Exp $") 18c2aa98e2SPeter Wemm 193299c2f1SGregory Neil Shapiro #include <sendmail/pathnames.h> 207660b554SGregory Neil Shapiro #if NEWDB 217660b554SGregory Neil Shapiro # include "sm/bdb.h" 227660b554SGregory Neil Shapiro #endif /* NEWDB */ 233299c2f1SGregory Neil Shapiro 24567a2fc9SGregory Neil Shapiro #ifdef DEC 25567a2fc9SGregory Neil Shapiro # if NETINET6 26567a2fc9SGregory Neil Shapiro /* for the IPv6 device lookup */ 27567a2fc9SGregory Neil Shapiro # define _SOCKADDR_LEN 28567a2fc9SGregory Neil Shapiro # include <macros.h> 29567a2fc9SGregory Neil Shapiro # endif /* NETINET6 */ 30567a2fc9SGregory Neil Shapiro #endif /* DEC */ 31567a2fc9SGregory Neil Shapiro 32c2aa98e2SPeter Wemm # include <sys/ioctl.h> 33c2aa98e2SPeter Wemm # include <sys/param.h> 343299c2f1SGregory Neil Shapiro 35c2aa98e2SPeter Wemm #include <limits.h> 363299c2f1SGregory Neil Shapiro #if NETINET || NETINET6 373299c2f1SGregory Neil Shapiro # include <arpa/inet.h> 383299c2f1SGregory Neil Shapiro #endif /* NETINET || NETINET6 */ 393299c2f1SGregory Neil Shapiro #if HASULIMIT && defined(HPUX11) 403299c2f1SGregory Neil Shapiro # include <ulimit.h> 413299c2f1SGregory Neil Shapiro #endif /* HASULIMIT && defined(HPUX11) */ 423299c2f1SGregory Neil Shapiro 433299c2f1SGregory Neil Shapiro static void setupmaps __P((void)); 443299c2f1SGregory Neil Shapiro static void setupmailers __P((void)); 4512ed1c7cSGregory Neil Shapiro static void setupqueues __P((void)); 463299c2f1SGregory Neil Shapiro static int get_num_procs_online __P((void)); 47684b2a5fSGregory Neil Shapiro static int add_hostnames __P((SOCKADDR *)); 48684b2a5fSGregory Neil Shapiro 49684b2a5fSGregory Neil Shapiro #if NETINET6 && NEEDSGETIPNODE 50684b2a5fSGregory Neil Shapiro static struct hostent *getipnodebyname __P((char *, int, int, int *)); 51684b2a5fSGregory Neil Shapiro static struct hostent *getipnodebyaddr __P((char *, int, int, int *)); 52684b2a5fSGregory Neil Shapiro #endif /* NETINET6 && NEEDSGETIPNODE */ 533299c2f1SGregory Neil Shapiro 54c2aa98e2SPeter Wemm 55c2aa98e2SPeter Wemm /* 56c2aa98e2SPeter Wemm ** CONF.C -- Sendmail Configuration Tables. 57c2aa98e2SPeter Wemm ** 58c2aa98e2SPeter Wemm ** Defines the configuration of this installation. 59c2aa98e2SPeter Wemm ** 60c2aa98e2SPeter Wemm ** Configuration Variables: 61c2aa98e2SPeter Wemm ** HdrInfo -- a table describing well-known header fields. 62c2aa98e2SPeter Wemm ** Each entry has the field name and some flags, 63c2aa98e2SPeter Wemm ** which are described in sendmail.h. 64c2aa98e2SPeter Wemm ** 65c2aa98e2SPeter Wemm ** Notes: 66c2aa98e2SPeter Wemm ** I have tried to put almost all the reasonable 67c2aa98e2SPeter Wemm ** configuration information into the configuration 68c2aa98e2SPeter Wemm ** file read at runtime. My intent is that anything 69c2aa98e2SPeter Wemm ** here is a function of the version of UNIX you 70c2aa98e2SPeter Wemm ** are running, or is really static -- for example 71c2aa98e2SPeter Wemm ** the headers are a superset of widely used 72c2aa98e2SPeter Wemm ** protocols. If you find yourself playing with 73c2aa98e2SPeter Wemm ** this file too much, you may be making a mistake! 74c2aa98e2SPeter Wemm */ 75c2aa98e2SPeter Wemm 76c2aa98e2SPeter Wemm 77c2aa98e2SPeter Wemm /* 78c2aa98e2SPeter Wemm ** Header info table 79c2aa98e2SPeter Wemm ** Final (null) entry contains the flags used for any other field. 80c2aa98e2SPeter Wemm ** 81c2aa98e2SPeter Wemm ** Not all of these are actually handled specially by sendmail 82c2aa98e2SPeter Wemm ** at this time. They are included as placeholders, to let 83c2aa98e2SPeter Wemm ** you know that "someday" I intend to have sendmail do 84c2aa98e2SPeter Wemm ** something with them. 85c2aa98e2SPeter Wemm */ 86c2aa98e2SPeter Wemm 87c2aa98e2SPeter Wemm struct hdrinfo HdrInfo[] = 88c2aa98e2SPeter Wemm { 89c2aa98e2SPeter Wemm /* originator fields, most to least significant */ 903299c2f1SGregory Neil Shapiro { "resent-sender", H_FROM|H_RESENT, NULL }, 913299c2f1SGregory Neil Shapiro { "resent-from", H_FROM|H_RESENT, NULL }, 923299c2f1SGregory Neil Shapiro { "resent-reply-to", H_FROM|H_RESENT, NULL }, 933299c2f1SGregory Neil Shapiro { "sender", H_FROM, NULL }, 943299c2f1SGregory Neil Shapiro { "from", H_FROM, NULL }, 953299c2f1SGregory Neil Shapiro { "reply-to", H_FROM, NULL }, 963299c2f1SGregory Neil Shapiro { "errors-to", H_FROM|H_ERRORSTO, NULL }, 973299c2f1SGregory Neil Shapiro { "full-name", H_ACHECK, NULL }, 983299c2f1SGregory Neil Shapiro { "return-receipt-to", H_RECEIPTTO, NULL }, 99bfb62e91SGregory Neil Shapiro { "delivery-receipt-to", H_RECEIPTTO, NULL }, 10012ed1c7cSGregory Neil Shapiro { "disposition-notification-to", H_FROM, NULL }, 101c2aa98e2SPeter Wemm 102c2aa98e2SPeter Wemm /* destination fields */ 1033299c2f1SGregory Neil Shapiro { "to", H_RCPT, NULL }, 1043299c2f1SGregory Neil Shapiro { "resent-to", H_RCPT|H_RESENT, NULL }, 1053299c2f1SGregory Neil Shapiro { "cc", H_RCPT, NULL }, 1063299c2f1SGregory Neil Shapiro { "resent-cc", H_RCPT|H_RESENT, NULL }, 1073299c2f1SGregory Neil Shapiro { "bcc", H_RCPT|H_BCC, NULL }, 1083299c2f1SGregory Neil Shapiro { "resent-bcc", H_RCPT|H_BCC|H_RESENT, NULL }, 1093299c2f1SGregory Neil Shapiro { "apparently-to", H_RCPT, NULL }, 110c2aa98e2SPeter Wemm 111c2aa98e2SPeter Wemm /* message identification and control */ 1123299c2f1SGregory Neil Shapiro { "message-id", 0, NULL }, 1133299c2f1SGregory Neil Shapiro { "resent-message-id", H_RESENT, NULL }, 1143299c2f1SGregory Neil Shapiro { "message", H_EOH, NULL }, 1153299c2f1SGregory Neil Shapiro { "text", H_EOH, NULL }, 116c2aa98e2SPeter Wemm 117c2aa98e2SPeter Wemm /* date fields */ 1183299c2f1SGregory Neil Shapiro { "date", 0, NULL }, 1193299c2f1SGregory Neil Shapiro { "resent-date", H_RESENT, NULL }, 120c2aa98e2SPeter Wemm 121c2aa98e2SPeter Wemm /* trace fields */ 1223299c2f1SGregory Neil Shapiro { "received", H_TRACE|H_FORCE, NULL }, 1233299c2f1SGregory Neil Shapiro { "x400-received", H_TRACE|H_FORCE, NULL }, 1243299c2f1SGregory Neil Shapiro { "via", H_TRACE|H_FORCE, NULL }, 1253299c2f1SGregory Neil Shapiro { "mail-from", H_TRACE|H_FORCE, NULL }, 126c2aa98e2SPeter Wemm 127c2aa98e2SPeter Wemm /* miscellaneous fields */ 1283299c2f1SGregory Neil Shapiro { "comments", H_FORCE|H_ENCODABLE, NULL }, 1293299c2f1SGregory Neil Shapiro { "return-path", H_FORCE|H_ACHECK|H_BINDLATE, NULL }, 1303299c2f1SGregory Neil Shapiro { "content-transfer-encoding", H_CTE, NULL }, 1313299c2f1SGregory Neil Shapiro { "content-type", H_CTYPE, NULL }, 1323299c2f1SGregory Neil Shapiro { "content-length", H_ACHECK, NULL }, 1333299c2f1SGregory Neil Shapiro { "subject", H_ENCODABLE, NULL }, 1343299c2f1SGregory Neil Shapiro { "x-authentication-warning", H_FORCE, NULL }, 135c2aa98e2SPeter Wemm 1363299c2f1SGregory Neil Shapiro { NULL, 0, NULL } 137c2aa98e2SPeter Wemm }; 138c2aa98e2SPeter Wemm 139c2aa98e2SPeter Wemm 140c2aa98e2SPeter Wemm 141c2aa98e2SPeter Wemm /* 142c2aa98e2SPeter Wemm ** Privacy values 143c2aa98e2SPeter Wemm */ 144c2aa98e2SPeter Wemm 145c2aa98e2SPeter Wemm struct prival PrivacyValues[] = 146c2aa98e2SPeter Wemm { 147c2aa98e2SPeter Wemm { "public", PRIV_PUBLIC }, 148c2aa98e2SPeter Wemm { "needmailhelo", PRIV_NEEDMAILHELO }, 149c2aa98e2SPeter Wemm { "needexpnhelo", PRIV_NEEDEXPNHELO }, 150c2aa98e2SPeter Wemm { "needvrfyhelo", PRIV_NEEDVRFYHELO }, 151c2aa98e2SPeter Wemm { "noexpn", PRIV_NOEXPN }, 152c2aa98e2SPeter Wemm { "novrfy", PRIV_NOVRFY }, 15312ed1c7cSGregory Neil Shapiro { "restrictexpand", PRIV_RESTRICTEXPAND }, 154c2aa98e2SPeter Wemm { "restrictmailq", PRIV_RESTRICTMAILQ }, 155c2aa98e2SPeter Wemm { "restrictqrun", PRIV_RESTRICTQRUN }, 156c2aa98e2SPeter Wemm { "noetrn", PRIV_NOETRN }, 157c2aa98e2SPeter Wemm { "noverb", PRIV_NOVERB }, 158c2aa98e2SPeter Wemm { "authwarnings", PRIV_AUTHWARNINGS }, 159c2aa98e2SPeter Wemm { "noreceipts", PRIV_NORECEIPTS }, 1603299c2f1SGregory Neil Shapiro { "nobodyreturn", PRIV_NOBODYRETN }, 161c2aa98e2SPeter Wemm { "goaway", PRIV_GOAWAY }, 162684b2a5fSGregory Neil Shapiro #if _FFR_PRIV_NOACTUALRECIPIENT 163684b2a5fSGregory Neil Shapiro { "noactualrecipient", PRIV_NOACTUALRECIPIENT }, 164684b2a5fSGregory Neil Shapiro #endif /* _FFR_PRIV_NOACTUALRECIPIENT */ 165c2aa98e2SPeter Wemm { NULL, 0 } 166c2aa98e2SPeter Wemm }; 167c2aa98e2SPeter Wemm 168c2aa98e2SPeter Wemm /* 169c2aa98e2SPeter Wemm ** DontBlameSendmail values 170c2aa98e2SPeter Wemm */ 17112ed1c7cSGregory Neil Shapiro 172c2aa98e2SPeter Wemm struct dbsval DontBlameSendmailValues[] = 173c2aa98e2SPeter Wemm { 174c2aa98e2SPeter Wemm { "safe", DBS_SAFE }, 175c2aa98e2SPeter Wemm { "assumesafechown", DBS_ASSUMESAFECHOWN }, 176c2aa98e2SPeter Wemm { "groupwritabledirpathsafe", DBS_GROUPWRITABLEDIRPATHSAFE }, 177c2aa98e2SPeter Wemm { "groupwritableforwardfilesafe", 178c2aa98e2SPeter Wemm DBS_GROUPWRITABLEFORWARDFILESAFE }, 179c2aa98e2SPeter Wemm { "groupwritableincludefilesafe", 180c2aa98e2SPeter Wemm DBS_GROUPWRITABLEINCLUDEFILESAFE }, 181c2aa98e2SPeter Wemm { "groupwritablealiasfile", DBS_GROUPWRITABLEALIASFILE }, 182c2aa98e2SPeter Wemm { "worldwritablealiasfile", DBS_WORLDWRITABLEALIASFILE }, 183c2aa98e2SPeter Wemm { "forwardfileinunsafedirpath", DBS_FORWARDFILEINUNSAFEDIRPATH }, 184c2aa98e2SPeter Wemm { "includefileinunsafedirpath", DBS_INCLUDEFILEINUNSAFEDIRPATH }, 185c2aa98e2SPeter Wemm { "mapinunsafedirpath", DBS_MAPINUNSAFEDIRPATH }, 186c2aa98e2SPeter Wemm { "linkedaliasfileinwritabledir", 187c2aa98e2SPeter Wemm DBS_LINKEDALIASFILEINWRITABLEDIR }, 188c2aa98e2SPeter Wemm { "linkedclassfileinwritabledir", 189c2aa98e2SPeter Wemm DBS_LINKEDCLASSFILEINWRITABLEDIR }, 190c2aa98e2SPeter Wemm { "linkedforwardfileinwritabledir", 191c2aa98e2SPeter Wemm DBS_LINKEDFORWARDFILEINWRITABLEDIR }, 192c2aa98e2SPeter Wemm { "linkedincludefileinwritabledir", 193c2aa98e2SPeter Wemm DBS_LINKEDINCLUDEFILEINWRITABLEDIR }, 194c2aa98e2SPeter Wemm { "linkedmapinwritabledir", DBS_LINKEDMAPINWRITABLEDIR }, 195c2aa98e2SPeter Wemm { "linkedserviceswitchfileinwritabledir", 196c2aa98e2SPeter Wemm DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR }, 197c2aa98e2SPeter Wemm { "filedeliverytohardlink", DBS_FILEDELIVERYTOHARDLINK }, 198c2aa98e2SPeter Wemm { "filedeliverytosymlink", DBS_FILEDELIVERYTOSYMLINK }, 199c2aa98e2SPeter Wemm { "writemaptohardlink", DBS_WRITEMAPTOHARDLINK }, 200c2aa98e2SPeter Wemm { "writemaptosymlink", DBS_WRITEMAPTOSYMLINK }, 201c2aa98e2SPeter Wemm { "writestatstohardlink", DBS_WRITESTATSTOHARDLINK }, 202c2aa98e2SPeter Wemm { "writestatstosymlink", DBS_WRITESTATSTOSYMLINK }, 203c2aa98e2SPeter Wemm { "forwardfileingroupwritabledirpath", 204c2aa98e2SPeter Wemm DBS_FORWARDFILEINGROUPWRITABLEDIRPATH }, 205c2aa98e2SPeter Wemm { "includefileingroupwritabledirpath", 206c2aa98e2SPeter Wemm DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH }, 207c2aa98e2SPeter Wemm { "classfileinunsafedirpath", DBS_CLASSFILEINUNSAFEDIRPATH }, 208c2aa98e2SPeter Wemm { "errorheaderinunsafedirpath", DBS_ERRORHEADERINUNSAFEDIRPATH }, 209c2aa98e2SPeter Wemm { "helpfileinunsafedirpath", DBS_HELPFILEINUNSAFEDIRPATH }, 210c2aa98e2SPeter Wemm { "forwardfileinunsafedirpathsafe", 211c2aa98e2SPeter Wemm DBS_FORWARDFILEINUNSAFEDIRPATHSAFE }, 212c2aa98e2SPeter Wemm { "includefileinunsafedirpathsafe", 213c2aa98e2SPeter Wemm DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE }, 214c2aa98e2SPeter Wemm { "runprograminunsafedirpath", DBS_RUNPROGRAMINUNSAFEDIRPATH }, 215c2aa98e2SPeter Wemm { "runwritableprogram", DBS_RUNWRITABLEPROGRAM }, 2163299c2f1SGregory Neil Shapiro { "nonrootsafeaddr", DBS_NONROOTSAFEADDR }, 2173299c2f1SGregory Neil Shapiro { "truststickybit", DBS_TRUSTSTICKYBIT }, 2183299c2f1SGregory Neil Shapiro { "dontwarnforwardfileinunsafedirpath", 2193299c2f1SGregory Neil Shapiro DBS_DONTWARNFORWARDFILEINUNSAFEDIRPATH }, 2203299c2f1SGregory Neil Shapiro { "insufficiententropy", DBS_INSUFFICIENTENTROPY }, 22112ed1c7cSGregory Neil Shapiro { "groupreadablesasldbfile", DBS_GROUPREADABLESASLDBFILE }, 22212ed1c7cSGregory Neil Shapiro { "groupwritablesasldbfile", DBS_GROUPWRITABLESASLDBFILE }, 223d995d2baSGregory Neil Shapiro { "groupwritableforwardfile", DBS_GROUPWRITABLEFORWARDFILE }, 224d995d2baSGregory Neil Shapiro { "groupwritableincludefile", DBS_GROUPWRITABLEINCLUDEFILE }, 225d995d2baSGregory Neil Shapiro { "worldwritableforwardfile", DBS_WORLDWRITABLEFORWARDFILE }, 226d995d2baSGregory Neil Shapiro { "worldwritableincludefile", DBS_WORLDWRITABLEINCLUDEFILE }, 22712ed1c7cSGregory Neil Shapiro { "groupreadablekeyfile", DBS_GROUPREADABLEKEYFILE }, 22812ed1c7cSGregory Neil Shapiro #if _FFR_GROUPREADABLEAUTHINFOFILE 22912ed1c7cSGregory Neil Shapiro { "groupreadableadefaultauthinfofile", 23012ed1c7cSGregory Neil Shapiro DBS_GROUPREADABLEAUTHINFOFILE }, 23112ed1c7cSGregory Neil Shapiro #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */ 232c2aa98e2SPeter Wemm { NULL, 0 } 233c2aa98e2SPeter Wemm }; 234c2aa98e2SPeter Wemm 235c2aa98e2SPeter Wemm /* 236c2aa98e2SPeter Wemm ** Miscellaneous stuff. 237c2aa98e2SPeter Wemm */ 238c2aa98e2SPeter Wemm 239c2aa98e2SPeter Wemm int DtableSize = 50; /* max open files; reset in 4.2bsd */ 24012ed1c7cSGregory Neil Shapiro /* 241c2aa98e2SPeter Wemm ** SETDEFAULTS -- set default values 242c2aa98e2SPeter Wemm ** 24312ed1c7cSGregory Neil Shapiro ** Some of these must be initialized using direct code since they 24412ed1c7cSGregory Neil Shapiro ** depend on run-time values. So let's do all of them this way. 245c2aa98e2SPeter Wemm ** 246c2aa98e2SPeter Wemm ** Parameters: 247c2aa98e2SPeter Wemm ** e -- the default envelope. 248c2aa98e2SPeter Wemm ** 249c2aa98e2SPeter Wemm ** Returns: 250c2aa98e2SPeter Wemm ** none. 251c2aa98e2SPeter Wemm ** 252c2aa98e2SPeter Wemm ** Side Effects: 253c2aa98e2SPeter Wemm ** Initializes a bunch of global variables to their 254c2aa98e2SPeter Wemm ** default values. 255c2aa98e2SPeter Wemm */ 256c2aa98e2SPeter Wemm 257c2aa98e2SPeter Wemm #define MINUTES * 60 258c2aa98e2SPeter Wemm #define HOURS * 60 MINUTES 259c2aa98e2SPeter Wemm #define DAYS * 24 HOURS 260c2aa98e2SPeter Wemm 261c2aa98e2SPeter Wemm #ifndef MAXRULERECURSION 262c2aa98e2SPeter Wemm # define MAXRULERECURSION 50 /* max ruleset recursion depth */ 2633299c2f1SGregory Neil Shapiro #endif /* ! MAXRULERECURSION */ 264c2aa98e2SPeter Wemm 265c2aa98e2SPeter Wemm void 266c2aa98e2SPeter Wemm setdefaults(e) 267c2aa98e2SPeter Wemm register ENVELOPE *e; 268c2aa98e2SPeter Wemm { 269c2aa98e2SPeter Wemm int i; 2703299c2f1SGregory Neil Shapiro int numprocs; 271c2aa98e2SPeter Wemm struct passwd *pw; 272c2aa98e2SPeter Wemm 2733299c2f1SGregory Neil Shapiro numprocs = get_num_procs_online(); 274c2aa98e2SPeter Wemm SpaceSub = ' '; /* option B */ 2753299c2f1SGregory Neil Shapiro QueueLA = 8 * numprocs; /* option x */ 2763299c2f1SGregory Neil Shapiro RefuseLA = 12 * numprocs; /* option X */ 277c2aa98e2SPeter Wemm WkRecipFact = 30000L; /* option y */ 278c2aa98e2SPeter Wemm WkClassFact = 1800L; /* option z */ 279c2aa98e2SPeter Wemm WkTimeFact = 90000L; /* option Z */ 280c2aa98e2SPeter Wemm QueueFactor = WkRecipFact * 20; /* option q */ 28112ed1c7cSGregory Neil Shapiro QueueMode = QM_NORMAL; /* what queue items to act upon */ 282c2aa98e2SPeter Wemm FileMode = (RealUid != geteuid()) ? 0644 : 0600; 283c2aa98e2SPeter Wemm /* option F */ 2843299c2f1SGregory Neil Shapiro QueueFileMode = (RealUid != geteuid()) ? 0644 : 0600; 2853299c2f1SGregory Neil Shapiro /* option QueueFileMode */ 286c2aa98e2SPeter Wemm 2873299c2f1SGregory Neil Shapiro if (((pw = sm_getpwnam("mailnull")) != NULL && pw->pw_uid != 0) || 2883299c2f1SGregory Neil Shapiro ((pw = sm_getpwnam("sendmail")) != NULL && pw->pw_uid != 0) || 2893299c2f1SGregory Neil Shapiro ((pw = sm_getpwnam("daemon")) != NULL && pw->pw_uid != 0)) 290c2aa98e2SPeter Wemm { 291c2aa98e2SPeter Wemm DefUid = pw->pw_uid; /* option u */ 292c2aa98e2SPeter Wemm DefGid = pw->pw_gid; /* option g */ 293c2aa98e2SPeter Wemm DefUser = newstr(pw->pw_name); 294c2aa98e2SPeter Wemm } 295c2aa98e2SPeter Wemm else 296c2aa98e2SPeter Wemm { 297c2aa98e2SPeter Wemm DefUid = 1; /* option u */ 298c2aa98e2SPeter Wemm DefGid = 1; /* option g */ 299c2aa98e2SPeter Wemm setdefuser(); 300c2aa98e2SPeter Wemm } 30176b7bf71SPeter Wemm TrustedUid = 0; 302c2aa98e2SPeter Wemm if (tTd(37, 4)) 30312ed1c7cSGregory Neil Shapiro sm_dprintf("setdefaults: DefUser=%s, DefUid=%d, DefGid=%d\n", 304c2aa98e2SPeter Wemm DefUser != NULL ? DefUser : "<1:1>", 305c2aa98e2SPeter Wemm (int) DefUid, (int) DefGid); 306c2aa98e2SPeter Wemm CheckpointInterval = 10; /* option C */ 307c2aa98e2SPeter Wemm MaxHopCount = 25; /* option h */ 3083299c2f1SGregory Neil Shapiro set_delivery_mode(SM_FORK, e); /* option d */ 309c2aa98e2SPeter Wemm e->e_errormode = EM_PRINT; /* option e */ 31012ed1c7cSGregory Neil Shapiro e->e_qgrp = NOQGRP; 31112ed1c7cSGregory Neil Shapiro e->e_qdir = NOQDIR; 31212ed1c7cSGregory Neil Shapiro e->e_xfqgrp = NOQGRP; 31312ed1c7cSGregory Neil Shapiro e->e_xfqdir = NOQDIR; 3143299c2f1SGregory Neil Shapiro e->e_ctime = curtime(); 31512ed1c7cSGregory Neil Shapiro SevenBitInput = false; /* option 7 */ 316c2aa98e2SPeter Wemm MaxMciCache = 1; /* option k */ 317c2aa98e2SPeter Wemm MciCacheTimeout = 5 MINUTES; /* option K */ 318c2aa98e2SPeter Wemm LogLevel = 9; /* option L */ 31912ed1c7cSGregory Neil Shapiro #if MILTER 32012ed1c7cSGregory Neil Shapiro MilterLogLevel = -1; 32112ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 32212ed1c7cSGregory Neil Shapiro inittimeouts(NULL, false); /* option r */ 323c2aa98e2SPeter Wemm PrivacyFlags = PRIV_PUBLIC; /* option p */ 32412ed1c7cSGregory Neil Shapiro MeToo = true; /* option m */ 32512ed1c7cSGregory Neil Shapiro SendMIMEErrors = true; /* option f */ 32612ed1c7cSGregory Neil Shapiro SuperSafe = SAFE_REALLY; /* option s */ 3273299c2f1SGregory Neil Shapiro clrbitmap(DontBlameSendmail); /* DontBlameSendmail option */ 328c2aa98e2SPeter Wemm #if MIME8TO7 329c2aa98e2SPeter Wemm MimeMode = MM_CVTMIME|MM_PASS8BIT; /* option 8 */ 3303299c2f1SGregory Neil Shapiro #else /* MIME8TO7 */ 331c2aa98e2SPeter Wemm MimeMode = MM_PASS8BIT; 3323299c2f1SGregory Neil Shapiro #endif /* MIME8TO7 */ 333c2aa98e2SPeter Wemm for (i = 0; i < MAXTOCLASS; i++) 334c2aa98e2SPeter Wemm { 335c2aa98e2SPeter Wemm TimeOuts.to_q_return[i] = 5 DAYS; /* option T */ 336c2aa98e2SPeter Wemm TimeOuts.to_q_warning[i] = 0; /* option T */ 337c2aa98e2SPeter Wemm } 3383299c2f1SGregory Neil Shapiro ServiceSwitchFile = "/etc/mail/service.switch"; 339c2aa98e2SPeter Wemm ServiceCacheMaxAge = (time_t) 10; 340c2aa98e2SPeter Wemm HostsFile = _PATH_HOSTS; 341c2aa98e2SPeter Wemm PidFile = newstr(_PATH_SENDMAILPID); 342c2aa98e2SPeter Wemm MustQuoteChars = "@,;:\\()[].'"; 343c2aa98e2SPeter Wemm MciInfoTimeout = 30 MINUTES; 344c2aa98e2SPeter Wemm MaxRuleRecursion = MAXRULERECURSION; 345c2aa98e2SPeter Wemm MaxAliasRecursion = 10; 346c2aa98e2SPeter Wemm MaxMacroRecursion = 10; 34712ed1c7cSGregory Neil Shapiro ColonOkInAddr = true; 34812ed1c7cSGregory Neil Shapiro DontLockReadFiles = true; 34912ed1c7cSGregory Neil Shapiro DontProbeInterfaces = DPI_PROBEALL; 350c2aa98e2SPeter Wemm DoubleBounceAddr = "postmaster"; 351e01d6f61SPeter Wemm MaxHeadersLength = MAXHDRSLEN; 35272936242SGregory Neil Shapiro MaxMimeHeaderLength = MAXLINE; 35372936242SGregory Neil Shapiro MaxMimeFieldLength = MaxMimeHeaderLength / 2; 3543299c2f1SGregory Neil Shapiro MaxForwardEntries = 0; 35512ed1c7cSGregory Neil Shapiro FastSplit = 1; 356567a2fc9SGregory Neil Shapiro MaxNOOPCommands = MAXNOOPCOMMANDS; 3573299c2f1SGregory Neil Shapiro #if SASL 3583299c2f1SGregory Neil Shapiro AuthMechanisms = newstr(AUTH_MECHANISMS); 359bfb62e91SGregory Neil Shapiro AuthRealm = NULL; 36012ed1c7cSGregory Neil Shapiro MaxSLBits = INT_MAX; 3613299c2f1SGregory Neil Shapiro #endif /* SASL */ 36212ed1c7cSGregory Neil Shapiro #if STARTTLS 36312ed1c7cSGregory Neil Shapiro TLS_Srv_Opts = TLS_I_SRV; 36412ed1c7cSGregory Neil Shapiro #endif /* STARTTLS */ 365c2aa98e2SPeter Wemm #ifdef HESIOD_INIT 366c2aa98e2SPeter Wemm HesiodContext = NULL; 3673299c2f1SGregory Neil Shapiro #endif /* HESIOD_INIT */ 3683299c2f1SGregory Neil Shapiro #if NETINET6 3693299c2f1SGregory Neil Shapiro /* Detect if IPv6 is available at run time */ 3703299c2f1SGregory Neil Shapiro i = socket(AF_INET6, SOCK_STREAM, 0); 3713299c2f1SGregory Neil Shapiro if (i >= 0) 3723299c2f1SGregory Neil Shapiro { 3733299c2f1SGregory Neil Shapiro InetMode = AF_INET6; 3743299c2f1SGregory Neil Shapiro (void) close(i); 3753299c2f1SGregory Neil Shapiro } 3763299c2f1SGregory Neil Shapiro else 3773299c2f1SGregory Neil Shapiro InetMode = AF_INET; 3783299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 3793299c2f1SGregory Neil Shapiro InetMode = AF_INET; 3803299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 38176b7bf71SPeter Wemm ControlSocketName = NULL; 3823299c2f1SGregory Neil Shapiro memset(&ConnectOnlyTo, '\0', sizeof ConnectOnlyTo); 3833299c2f1SGregory Neil Shapiro DataFileBufferSize = 4096; 3843299c2f1SGregory Neil Shapiro XscriptFileBufferSize = 4096; 3853299c2f1SGregory Neil Shapiro for (i = 0; i < MAXRWSETS; i++) 3863299c2f1SGregory Neil Shapiro RuleSetNames[i] = NULL; 38712ed1c7cSGregory Neil Shapiro #if MILTER 3883299c2f1SGregory Neil Shapiro InputFilters[0] = NULL; 38912ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 3902ef40764SGregory Neil Shapiro RejectLogInterval = 3 HOURS; 391bfb62e91SGregory Neil Shapiro #if REQUIRES_DIR_FSYNC 3922ef40764SGregory Neil Shapiro RequiresDirfsync = true; 393bfb62e91SGregory Neil Shapiro #endif /* REQUIRES_DIR_FSYNC */ 394bfb62e91SGregory Neil Shapiro ConnectionRateWindowSize = 60; 395c2aa98e2SPeter Wemm setupmaps(); 39612ed1c7cSGregory Neil Shapiro setupqueues(); 397c2aa98e2SPeter Wemm setupmailers(); 398c2aa98e2SPeter Wemm setupheaders(); 399c2aa98e2SPeter Wemm } 400c2aa98e2SPeter Wemm 401c2aa98e2SPeter Wemm 402c2aa98e2SPeter Wemm /* 403c2aa98e2SPeter Wemm ** SETDEFUSER -- set/reset DefUser using DefUid (for initgroups()) 404c2aa98e2SPeter Wemm */ 405c2aa98e2SPeter Wemm 406c2aa98e2SPeter Wemm void 407c2aa98e2SPeter Wemm setdefuser() 408c2aa98e2SPeter Wemm { 409c2aa98e2SPeter Wemm struct passwd *defpwent; 410c2aa98e2SPeter Wemm static char defuserbuf[40]; 411c2aa98e2SPeter Wemm 412c2aa98e2SPeter Wemm DefUser = defuserbuf; 413c2aa98e2SPeter Wemm defpwent = sm_getpwuid(DefUid); 41412ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(defuserbuf, 41512ed1c7cSGregory Neil Shapiro (defpwent == NULL || defpwent->pw_name == NULL) 41612ed1c7cSGregory Neil Shapiro ? "nobody" : defpwent->pw_name, 41712ed1c7cSGregory Neil Shapiro sizeof defuserbuf); 418c2aa98e2SPeter Wemm if (tTd(37, 4)) 41912ed1c7cSGregory Neil Shapiro sm_dprintf("setdefuser: DefUid=%d, DefUser=%s\n", 420c2aa98e2SPeter Wemm (int) DefUid, DefUser); 421c2aa98e2SPeter Wemm } 42212ed1c7cSGregory Neil Shapiro /* 42312ed1c7cSGregory Neil Shapiro ** SETUPQUEUES -- initialize default queues 42412ed1c7cSGregory Neil Shapiro ** 42512ed1c7cSGregory Neil Shapiro ** The mqueue QUEUE structure gets filled in after readcf() but 42612ed1c7cSGregory Neil Shapiro ** we need something to point to now for the mailer setup, 42712ed1c7cSGregory Neil Shapiro ** which use "mqueue" as default queue. 42812ed1c7cSGregory Neil Shapiro */ 42912ed1c7cSGregory Neil Shapiro 43012ed1c7cSGregory Neil Shapiro static void 43112ed1c7cSGregory Neil Shapiro setupqueues() 43212ed1c7cSGregory Neil Shapiro { 43312ed1c7cSGregory Neil Shapiro char buf[100]; 43412ed1c7cSGregory Neil Shapiro 43512ed1c7cSGregory Neil Shapiro MaxRunnersPerQueue = 1; 43612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof buf); 43712ed1c7cSGregory Neil Shapiro makequeue(buf, false); 43812ed1c7cSGregory Neil Shapiro } 43912ed1c7cSGregory Neil Shapiro /* 440c2aa98e2SPeter Wemm ** SETUPMAILERS -- initialize default mailers 441c2aa98e2SPeter Wemm */ 442c2aa98e2SPeter Wemm 4433299c2f1SGregory Neil Shapiro static void 444c2aa98e2SPeter Wemm setupmailers() 445c2aa98e2SPeter Wemm { 446c2aa98e2SPeter Wemm char buf[100]; 447c2aa98e2SPeter Wemm 44812ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u", 4493299c2f1SGregory Neil Shapiro sizeof buf); 450c2aa98e2SPeter Wemm makemailer(buf); 451c2aa98e2SPeter Wemm 45212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=X-Unix/X-Unix/X-Unix, A=FILE \201u", 4533299c2f1SGregory Neil Shapiro sizeof buf); 454c2aa98e2SPeter Wemm makemailer(buf); 455c2aa98e2SPeter Wemm 45612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u", 4573299c2f1SGregory Neil Shapiro sizeof buf); 458c2aa98e2SPeter Wemm makemailer(buf); 4593299c2f1SGregory Neil Shapiro initerrmailers(); 460c2aa98e2SPeter Wemm } 46112ed1c7cSGregory Neil Shapiro /* 462c2aa98e2SPeter Wemm ** SETUPMAPS -- set up map classes 463c2aa98e2SPeter Wemm */ 464c2aa98e2SPeter Wemm 465c2aa98e2SPeter Wemm #define MAPDEF(name, ext, flags, parse, open, close, lookup, store) \ 466c2aa98e2SPeter Wemm { \ 467c2aa98e2SPeter Wemm extern bool parse __P((MAP *, char *)); \ 468c2aa98e2SPeter Wemm extern bool open __P((MAP *, int)); \ 469c2aa98e2SPeter Wemm extern void close __P((MAP *)); \ 470c2aa98e2SPeter Wemm extern char *lookup __P((MAP *, char *, char **, int *)); \ 471c2aa98e2SPeter Wemm extern void store __P((MAP *, char *, char *)); \ 472c2aa98e2SPeter Wemm s = stab(name, ST_MAPCLASS, ST_ENTER); \ 473c2aa98e2SPeter Wemm s->s_mapclass.map_cname = name; \ 474c2aa98e2SPeter Wemm s->s_mapclass.map_ext = ext; \ 475c2aa98e2SPeter Wemm s->s_mapclass.map_cflags = flags; \ 476c2aa98e2SPeter Wemm s->s_mapclass.map_parse = parse; \ 477c2aa98e2SPeter Wemm s->s_mapclass.map_open = open; \ 478c2aa98e2SPeter Wemm s->s_mapclass.map_close = close; \ 479c2aa98e2SPeter Wemm s->s_mapclass.map_lookup = lookup; \ 480c2aa98e2SPeter Wemm s->s_mapclass.map_store = store; \ 481c2aa98e2SPeter Wemm } 482c2aa98e2SPeter Wemm 4833299c2f1SGregory Neil Shapiro static void 484c2aa98e2SPeter Wemm setupmaps() 485c2aa98e2SPeter Wemm { 486c2aa98e2SPeter Wemm register STAB *s; 487c2aa98e2SPeter Wemm 48812ed1c7cSGregory Neil Shapiro #if NEWDB 4897660b554SGregory Neil Shapiro # if DB_VERSION_MAJOR > 1 4907660b554SGregory Neil Shapiro int major_v, minor_v, patch_v; 4917660b554SGregory Neil Shapiro 4927660b554SGregory Neil Shapiro (void) db_version(&major_v, &minor_v, &patch_v); 4937660b554SGregory Neil Shapiro if (major_v != DB_VERSION_MAJOR || minor_v != DB_VERSION_MINOR) 4947660b554SGregory Neil Shapiro { 4957660b554SGregory Neil Shapiro errno = 0; 4967660b554SGregory Neil Shapiro syserr("Berkeley DB version mismatch: compiled against %d.%d.%d, run-time linked against %d.%d.%d", 4977660b554SGregory Neil Shapiro DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH, 4987660b554SGregory Neil Shapiro major_v, minor_v, patch_v); 4997660b554SGregory Neil Shapiro } 5007660b554SGregory Neil Shapiro # endif /* DB_VERSION_MAJOR > 1 */ 5017660b554SGregory Neil Shapiro 502c2aa98e2SPeter Wemm MAPDEF("hash", ".db", MCF_ALIASOK|MCF_REBUILDABLE, 503c2aa98e2SPeter Wemm map_parseargs, hash_map_open, db_map_close, 504c2aa98e2SPeter Wemm db_map_lookup, db_map_store); 505c2aa98e2SPeter Wemm 506c2aa98e2SPeter Wemm MAPDEF("btree", ".db", MCF_ALIASOK|MCF_REBUILDABLE, 507c2aa98e2SPeter Wemm map_parseargs, bt_map_open, db_map_close, 508c2aa98e2SPeter Wemm db_map_lookup, db_map_store); 5093299c2f1SGregory Neil Shapiro #endif /* NEWDB */ 510c2aa98e2SPeter Wemm 51112ed1c7cSGregory Neil Shapiro #if NDBM 512c2aa98e2SPeter Wemm MAPDEF("dbm", ".dir", MCF_ALIASOK|MCF_REBUILDABLE, 513c2aa98e2SPeter Wemm map_parseargs, ndbm_map_open, ndbm_map_close, 514c2aa98e2SPeter Wemm ndbm_map_lookup, ndbm_map_store); 5153299c2f1SGregory Neil Shapiro #endif /* NDBM */ 516c2aa98e2SPeter Wemm 51712ed1c7cSGregory Neil Shapiro #if NIS 518c2aa98e2SPeter Wemm MAPDEF("nis", NULL, MCF_ALIASOK, 519c2aa98e2SPeter Wemm map_parseargs, nis_map_open, null_map_close, 520c2aa98e2SPeter Wemm nis_map_lookup, null_map_store); 5213299c2f1SGregory Neil Shapiro #endif /* NIS */ 522c2aa98e2SPeter Wemm 52312ed1c7cSGregory Neil Shapiro #if NISPLUS 524c2aa98e2SPeter Wemm MAPDEF("nisplus", NULL, MCF_ALIASOK, 525c2aa98e2SPeter Wemm map_parseargs, nisplus_map_open, null_map_close, 526c2aa98e2SPeter Wemm nisplus_map_lookup, null_map_store); 5273299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 5283299c2f1SGregory Neil Shapiro 52912ed1c7cSGregory Neil Shapiro #if LDAPMAP 53012ed1c7cSGregory Neil Shapiro MAPDEF("ldap", NULL, MCF_ALIASOK|MCF_NOTPERSIST, 5313299c2f1SGregory Neil Shapiro ldapmap_parseargs, ldapmap_open, ldapmap_close, 5323299c2f1SGregory Neil Shapiro ldapmap_lookup, null_map_store); 5333299c2f1SGregory Neil Shapiro #endif /* LDAPMAP */ 5343299c2f1SGregory Neil Shapiro 53512ed1c7cSGregory Neil Shapiro #if PH_MAP 53612ed1c7cSGregory Neil Shapiro MAPDEF("ph", NULL, MCF_NOTPERSIST, 5373299c2f1SGregory Neil Shapiro ph_map_parseargs, ph_map_open, ph_map_close, 5383299c2f1SGregory Neil Shapiro ph_map_lookup, null_map_store); 5393299c2f1SGregory Neil Shapiro #endif /* PH_MAP */ 5403299c2f1SGregory Neil Shapiro 5413299c2f1SGregory Neil Shapiro #if MAP_NSD 5423299c2f1SGregory Neil Shapiro /* IRIX 6.5 nsd support */ 5433299c2f1SGregory Neil Shapiro MAPDEF("nsd", NULL, MCF_ALIASOK, 5443299c2f1SGregory Neil Shapiro map_parseargs, null_map_open, null_map_close, 5453299c2f1SGregory Neil Shapiro nsd_map_lookup, null_map_store); 5463299c2f1SGregory Neil Shapiro #endif /* MAP_NSD */ 547c2aa98e2SPeter Wemm 54812ed1c7cSGregory Neil Shapiro #if HESIOD 549c2aa98e2SPeter Wemm MAPDEF("hesiod", NULL, MCF_ALIASOK|MCF_ALIASONLY, 55012ed1c7cSGregory Neil Shapiro map_parseargs, hes_map_open, hes_map_close, 551c2aa98e2SPeter Wemm hes_map_lookup, null_map_store); 5523299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 553c2aa98e2SPeter Wemm 554c2aa98e2SPeter Wemm #if NETINFO 555c2aa98e2SPeter Wemm MAPDEF("netinfo", NULL, MCF_ALIASOK, 556c2aa98e2SPeter Wemm map_parseargs, ni_map_open, null_map_close, 557c2aa98e2SPeter Wemm ni_map_lookup, null_map_store); 5583299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 559c2aa98e2SPeter Wemm 560c2aa98e2SPeter Wemm #if 0 561c2aa98e2SPeter Wemm MAPDEF("dns", NULL, 0, 562c2aa98e2SPeter Wemm dns_map_init, null_map_open, null_map_close, 563c2aa98e2SPeter Wemm dns_map_lookup, null_map_store); 5643299c2f1SGregory Neil Shapiro #endif /* 0 */ 565c2aa98e2SPeter Wemm 566c2aa98e2SPeter Wemm #if NAMED_BIND 56712ed1c7cSGregory Neil Shapiro # if DNSMAP 568320f00e7SGregory Neil Shapiro # if _FFR_DNSMAP_ALIASABLE 569320f00e7SGregory Neil Shapiro MAPDEF("dns", NULL, MCF_ALIASOK, 570320f00e7SGregory Neil Shapiro dns_map_parseargs, dns_map_open, null_map_close, 571320f00e7SGregory Neil Shapiro dns_map_lookup, null_map_store); 572320f00e7SGregory Neil Shapiro # else /* _FFR_DNSMAP_ALIASABLE */ 57312ed1c7cSGregory Neil Shapiro MAPDEF("dns", NULL, 0, 57412ed1c7cSGregory Neil Shapiro dns_map_parseargs, dns_map_open, null_map_close, 57512ed1c7cSGregory Neil Shapiro dns_map_lookup, null_map_store); 576320f00e7SGregory Neil Shapiro # endif /* _FFR_DNSMAP_ALIASABLE */ 57712ed1c7cSGregory Neil Shapiro # endif /* DNSMAP */ 57812ed1c7cSGregory Neil Shapiro #endif /* NAMED_BIND */ 57912ed1c7cSGregory Neil Shapiro 58012ed1c7cSGregory Neil Shapiro #if NAMED_BIND 581c2aa98e2SPeter Wemm /* best MX DNS lookup */ 582c2aa98e2SPeter Wemm MAPDEF("bestmx", NULL, MCF_OPTFILE, 583c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 584c2aa98e2SPeter Wemm bestmx_map_lookup, null_map_store); 5853299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 586c2aa98e2SPeter Wemm 587c2aa98e2SPeter Wemm MAPDEF("host", NULL, 0, 588c2aa98e2SPeter Wemm host_map_init, null_map_open, null_map_close, 589c2aa98e2SPeter Wemm host_map_lookup, null_map_store); 590c2aa98e2SPeter Wemm 591c2aa98e2SPeter Wemm MAPDEF("text", NULL, MCF_ALIASOK, 592c2aa98e2SPeter Wemm map_parseargs, text_map_open, null_map_close, 593c2aa98e2SPeter Wemm text_map_lookup, null_map_store); 594c2aa98e2SPeter Wemm 595c2aa98e2SPeter Wemm MAPDEF("stab", NULL, MCF_ALIASOK|MCF_ALIASONLY, 596c2aa98e2SPeter Wemm map_parseargs, stab_map_open, null_map_close, 597c2aa98e2SPeter Wemm stab_map_lookup, stab_map_store); 598c2aa98e2SPeter Wemm 599c2aa98e2SPeter Wemm MAPDEF("implicit", NULL, MCF_ALIASOK|MCF_ALIASONLY|MCF_REBUILDABLE, 600c2aa98e2SPeter Wemm map_parseargs, impl_map_open, impl_map_close, 601c2aa98e2SPeter Wemm impl_map_lookup, impl_map_store); 602c2aa98e2SPeter Wemm 603c2aa98e2SPeter Wemm /* access to system passwd file */ 604c2aa98e2SPeter Wemm MAPDEF("user", NULL, MCF_OPTFILE, 605c2aa98e2SPeter Wemm map_parseargs, user_map_open, null_map_close, 606c2aa98e2SPeter Wemm user_map_lookup, null_map_store); 607c2aa98e2SPeter Wemm 608c2aa98e2SPeter Wemm /* dequote map */ 609c2aa98e2SPeter Wemm MAPDEF("dequote", NULL, 0, 610c2aa98e2SPeter Wemm dequote_init, null_map_open, null_map_close, 611c2aa98e2SPeter Wemm dequote_map, null_map_store); 612c2aa98e2SPeter Wemm 61312ed1c7cSGregory Neil Shapiro #if MAP_REGEX 614c2aa98e2SPeter Wemm MAPDEF("regex", NULL, 0, 615c2aa98e2SPeter Wemm regex_map_init, null_map_open, null_map_close, 616c2aa98e2SPeter Wemm regex_map_lookup, null_map_store); 6173299c2f1SGregory Neil Shapiro #endif /* MAP_REGEX */ 618c2aa98e2SPeter Wemm 619c2aa98e2SPeter Wemm #if USERDB 620c2aa98e2SPeter Wemm /* user database */ 621c2aa98e2SPeter Wemm MAPDEF("userdb", ".db", 0, 622c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 623c2aa98e2SPeter Wemm udb_map_lookup, null_map_store); 6243299c2f1SGregory Neil Shapiro #endif /* USERDB */ 625c2aa98e2SPeter Wemm 626c2aa98e2SPeter Wemm /* arbitrary programs */ 627c2aa98e2SPeter Wemm MAPDEF("program", NULL, MCF_ALIASOK, 628c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 629c2aa98e2SPeter Wemm prog_map_lookup, null_map_store); 630c2aa98e2SPeter Wemm 631c2aa98e2SPeter Wemm /* sequenced maps */ 632c2aa98e2SPeter Wemm MAPDEF("sequence", NULL, MCF_ALIASOK, 633c2aa98e2SPeter Wemm seq_map_parse, null_map_open, null_map_close, 634c2aa98e2SPeter Wemm seq_map_lookup, seq_map_store); 635c2aa98e2SPeter Wemm 636c2aa98e2SPeter Wemm /* switched interface to sequenced maps */ 637c2aa98e2SPeter Wemm MAPDEF("switch", NULL, MCF_ALIASOK, 638c2aa98e2SPeter Wemm map_parseargs, switch_map_open, null_map_close, 639c2aa98e2SPeter Wemm seq_map_lookup, seq_map_store); 640c2aa98e2SPeter Wemm 641c2aa98e2SPeter Wemm /* null map lookup -- really for internal use only */ 642c2aa98e2SPeter Wemm MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE, 643c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 644c2aa98e2SPeter Wemm null_map_lookup, null_map_store); 645c2aa98e2SPeter Wemm 646c2aa98e2SPeter Wemm /* syslog map -- logs information to syslog */ 647c2aa98e2SPeter Wemm MAPDEF("syslog", NULL, 0, 648c2aa98e2SPeter Wemm syslog_map_parseargs, null_map_open, null_map_close, 649c2aa98e2SPeter Wemm syslog_map_lookup, null_map_store); 6503299c2f1SGregory Neil Shapiro 6513299c2f1SGregory Neil Shapiro /* macro storage map -- rulesets can set macros */ 6523299c2f1SGregory Neil Shapiro MAPDEF("macro", NULL, 0, 6533299c2f1SGregory Neil Shapiro dequote_init, null_map_open, null_map_close, 6543299c2f1SGregory Neil Shapiro macro_map_lookup, null_map_store); 6553299c2f1SGregory Neil Shapiro 6563299c2f1SGregory Neil Shapiro /* arithmetic map -- add/subtract/compare */ 6573299c2f1SGregory Neil Shapiro MAPDEF("arith", NULL, 0, 6583299c2f1SGregory Neil Shapiro dequote_init, null_map_open, null_map_close, 6593299c2f1SGregory Neil Shapiro arith_map_lookup, null_map_store); 6603299c2f1SGregory Neil Shapiro 661bfb62e91SGregory Neil Shapiro #if SOCKETMAP 662bfb62e91SGregory Neil Shapiro /* arbitrary daemons */ 663bfb62e91SGregory Neil Shapiro MAPDEF("socket", NULL, MCF_ALIASOK, 664bfb62e91SGregory Neil Shapiro map_parseargs, socket_map_open, socket_map_close, 665bfb62e91SGregory Neil Shapiro socket_map_lookup, null_map_store); 666bfb62e91SGregory Neil Shapiro #endif /* SOCKETMAP */ 667bfb62e91SGregory Neil Shapiro 6683299c2f1SGregory Neil Shapiro if (tTd(38, 2)) 6693299c2f1SGregory Neil Shapiro { 6703299c2f1SGregory Neil Shapiro /* bogus map -- always return tempfail */ 6713299c2f1SGregory Neil Shapiro MAPDEF("bogus", NULL, MCF_ALIASOK|MCF_OPTFILE, 6723299c2f1SGregory Neil Shapiro map_parseargs, null_map_open, null_map_close, 6733299c2f1SGregory Neil Shapiro bogus_map_lookup, null_map_store); 6743299c2f1SGregory Neil Shapiro } 675c2aa98e2SPeter Wemm } 676c2aa98e2SPeter Wemm 677c2aa98e2SPeter Wemm #undef MAPDEF 67812ed1c7cSGregory Neil Shapiro /* 679c2aa98e2SPeter Wemm ** INITHOSTMAPS -- initial host-dependent maps 680c2aa98e2SPeter Wemm ** 681c2aa98e2SPeter Wemm ** This should act as an interface to any local service switch 682c2aa98e2SPeter Wemm ** provided by the host operating system. 683c2aa98e2SPeter Wemm ** 684c2aa98e2SPeter Wemm ** Parameters: 685c2aa98e2SPeter Wemm ** none 686c2aa98e2SPeter Wemm ** 687c2aa98e2SPeter Wemm ** Returns: 688c2aa98e2SPeter Wemm ** none 689c2aa98e2SPeter Wemm ** 690c2aa98e2SPeter Wemm ** Side Effects: 691c2aa98e2SPeter Wemm ** Should define maps "host" and "users" as necessary 692c2aa98e2SPeter Wemm ** for this OS. If they are not defined, they will get 693c2aa98e2SPeter Wemm ** a default value later. It should check to make sure 694c2aa98e2SPeter Wemm ** they are not defined first, since it's possible that 695c2aa98e2SPeter Wemm ** the config file has provided an override. 696c2aa98e2SPeter Wemm */ 697c2aa98e2SPeter Wemm 698c2aa98e2SPeter Wemm void 699c2aa98e2SPeter Wemm inithostmaps() 700c2aa98e2SPeter Wemm { 701c2aa98e2SPeter Wemm register int i; 702c2aa98e2SPeter Wemm int nmaps; 703c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 704c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 705c2aa98e2SPeter Wemm char buf[MAXLINE]; 706c2aa98e2SPeter Wemm 707c2aa98e2SPeter Wemm /* 708c2aa98e2SPeter Wemm ** Set up default hosts maps. 709c2aa98e2SPeter Wemm */ 710c2aa98e2SPeter Wemm 711c2aa98e2SPeter Wemm #if 0 712c2aa98e2SPeter Wemm nmaps = switch_map_find("hosts", maptype, mapreturn); 713c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 714c2aa98e2SPeter Wemm { 715c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 716c2aa98e2SPeter Wemm stab("hosts.files", ST_MAP, ST_FIND) == NULL) 717c2aa98e2SPeter Wemm { 71812ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts", 7193299c2f1SGregory Neil Shapiro sizeof buf); 720c2aa98e2SPeter Wemm (void) makemapentry(buf); 721c2aa98e2SPeter Wemm } 722c2aa98e2SPeter Wemm # if NAMED_BIND 723c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "dns") == 0 && 724c2aa98e2SPeter Wemm stab("hosts.dns", ST_MAP, ST_FIND) == NULL) 725c2aa98e2SPeter Wemm { 72612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.dns dns A", sizeof buf); 727c2aa98e2SPeter Wemm (void) makemapentry(buf); 728c2aa98e2SPeter Wemm } 7293299c2f1SGregory Neil Shapiro # endif /* NAMED_BIND */ 73012ed1c7cSGregory Neil Shapiro # if NISPLUS 731c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 732c2aa98e2SPeter Wemm stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL) 733c2aa98e2SPeter Wemm { 73412ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.nisplus nisplus -k name -v address hosts.org_dir", 7353299c2f1SGregory Neil Shapiro sizeof buf); 736c2aa98e2SPeter Wemm (void) makemapentry(buf); 737c2aa98e2SPeter Wemm } 7383299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 73912ed1c7cSGregory Neil Shapiro # if NIS 740c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 741c2aa98e2SPeter Wemm stab("hosts.nis", ST_MAP, ST_FIND) == NULL) 742c2aa98e2SPeter Wemm { 74312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.nis nis -k 0 -v 1 hosts.byname", 7443299c2f1SGregory Neil Shapiro sizeof buf); 745c2aa98e2SPeter Wemm (void) makemapentry(buf); 746c2aa98e2SPeter Wemm } 7473299c2f1SGregory Neil Shapiro # endif /* NIS */ 748c2aa98e2SPeter Wemm # if NETINFO 74912ed1c7cSGregory Neil Shapiro else if (strcmp(maptype[i], "netinfo") == 0 && 750c2aa98e2SPeter Wemm stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL) 751c2aa98e2SPeter Wemm { 75212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.netinfo netinfo -v name /machines", 7533299c2f1SGregory Neil Shapiro sizeof buf); 754c2aa98e2SPeter Wemm (void) makemapentry(buf); 755c2aa98e2SPeter Wemm } 7563299c2f1SGregory Neil Shapiro # endif /* NETINFO */ 757c2aa98e2SPeter Wemm } 7583299c2f1SGregory Neil Shapiro #endif /* 0 */ 759c2aa98e2SPeter Wemm 760c2aa98e2SPeter Wemm /* 761c2aa98e2SPeter Wemm ** Make sure we have a host map. 762c2aa98e2SPeter Wemm */ 763c2aa98e2SPeter Wemm 764c2aa98e2SPeter Wemm if (stab("host", ST_MAP, ST_FIND) == NULL) 765c2aa98e2SPeter Wemm { 766c2aa98e2SPeter Wemm /* user didn't initialize: set up host map */ 76712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "host host", sizeof buf); 768c2aa98e2SPeter Wemm #if NAMED_BIND 769c2aa98e2SPeter Wemm if (ConfigLevel >= 2) 77012ed1c7cSGregory Neil Shapiro (void) sm_strlcat(buf, " -a. -D", sizeof buf); 7713299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 772c2aa98e2SPeter Wemm (void) makemapentry(buf); 773c2aa98e2SPeter Wemm } 774c2aa98e2SPeter Wemm 775c2aa98e2SPeter Wemm /* 776c2aa98e2SPeter Wemm ** Set up default aliases maps 777c2aa98e2SPeter Wemm */ 778c2aa98e2SPeter Wemm 779c2aa98e2SPeter Wemm nmaps = switch_map_find("aliases", maptype, mapreturn); 780c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 781c2aa98e2SPeter Wemm { 782c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 783c2aa98e2SPeter Wemm stab("aliases.files", ST_MAP, ST_FIND) == NULL) 784c2aa98e2SPeter Wemm { 78512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.files null", 78612ed1c7cSGregory Neil Shapiro sizeof buf); 787c2aa98e2SPeter Wemm (void) makemapentry(buf); 788c2aa98e2SPeter Wemm } 78912ed1c7cSGregory Neil Shapiro #if NISPLUS 790c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 791c2aa98e2SPeter Wemm stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL) 792c2aa98e2SPeter Wemm { 79312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion mail_aliases.org_dir", 7943299c2f1SGregory Neil Shapiro sizeof buf); 795c2aa98e2SPeter Wemm (void) makemapentry(buf); 796c2aa98e2SPeter Wemm } 7973299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 79812ed1c7cSGregory Neil Shapiro #if NIS 799c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 800c2aa98e2SPeter Wemm stab("aliases.nis", ST_MAP, ST_FIND) == NULL) 801c2aa98e2SPeter Wemm { 80212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.nis nis mail.aliases", 8033299c2f1SGregory Neil Shapiro sizeof buf); 804c2aa98e2SPeter Wemm (void) makemapentry(buf); 805c2aa98e2SPeter Wemm } 8063299c2f1SGregory Neil Shapiro #endif /* NIS */ 8073299c2f1SGregory Neil Shapiro #if NETINFO 808c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "netinfo") == 0 && 809c2aa98e2SPeter Wemm stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL) 810c2aa98e2SPeter Wemm { 81112ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.netinfo netinfo -z, /aliases", 8123299c2f1SGregory Neil Shapiro sizeof buf); 813c2aa98e2SPeter Wemm (void) makemapentry(buf); 814c2aa98e2SPeter Wemm } 8153299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 81612ed1c7cSGregory Neil Shapiro #if HESIOD 817c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "hesiod") == 0 && 818c2aa98e2SPeter Wemm stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL) 819c2aa98e2SPeter Wemm { 82012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.hesiod hesiod aliases", 8213299c2f1SGregory Neil Shapiro sizeof buf); 822c2aa98e2SPeter Wemm (void) makemapentry(buf); 823c2aa98e2SPeter Wemm } 8243299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 825c2aa98e2SPeter Wemm } 826c2aa98e2SPeter Wemm if (stab("aliases", ST_MAP, ST_FIND) == NULL) 827c2aa98e2SPeter Wemm { 82812ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases switch aliases", sizeof buf); 829c2aa98e2SPeter Wemm (void) makemapentry(buf); 830c2aa98e2SPeter Wemm } 831c2aa98e2SPeter Wemm 832c2aa98e2SPeter Wemm #if 0 /* "user" map class is a better choice */ 833c2aa98e2SPeter Wemm /* 834c2aa98e2SPeter Wemm ** Set up default users maps. 835c2aa98e2SPeter Wemm */ 836c2aa98e2SPeter Wemm 837c2aa98e2SPeter Wemm nmaps = switch_map_find("passwd", maptype, mapreturn); 838c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 839c2aa98e2SPeter Wemm { 840c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 841c2aa98e2SPeter Wemm stab("users.files", ST_MAP, ST_FIND) == NULL) 842c2aa98e2SPeter Wemm { 84312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd", 8443299c2f1SGregory Neil Shapiro sizeof buf); 845c2aa98e2SPeter Wemm (void) makemapentry(buf); 846c2aa98e2SPeter Wemm } 84712ed1c7cSGregory Neil Shapiro # if NISPLUS 848c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 849c2aa98e2SPeter Wemm stab("users.nisplus", ST_MAP, ST_FIND) == NULL) 850c2aa98e2SPeter Wemm { 85112ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.nisplus nisplus -m -kname -vhome passwd.org_dir", 8523299c2f1SGregory Neil Shapiro sizeof buf); 853c2aa98e2SPeter Wemm (void) makemapentry(buf); 854c2aa98e2SPeter Wemm } 8553299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 85612ed1c7cSGregory Neil Shapiro # if NIS 857c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 858c2aa98e2SPeter Wemm stab("users.nis", ST_MAP, ST_FIND) == NULL) 859c2aa98e2SPeter Wemm { 86012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.nis nis -m passwd.byname", 8613299c2f1SGregory Neil Shapiro sizeof buf); 862c2aa98e2SPeter Wemm (void) makemapentry(buf); 863c2aa98e2SPeter Wemm } 8643299c2f1SGregory Neil Shapiro # endif /* NIS */ 86512ed1c7cSGregory Neil Shapiro # if HESIOD 86612ed1c7cSGregory Neil Shapiro else if (strcmp(maptype[i], "hesiod") == 0 && 867c2aa98e2SPeter Wemm stab("users.hesiod", ST_MAP, ST_FIND) == NULL) 868c2aa98e2SPeter Wemm { 86912ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.hesiod hesiod", sizeof buf); 870c2aa98e2SPeter Wemm (void) makemapentry(buf); 871c2aa98e2SPeter Wemm } 8723299c2f1SGregory Neil Shapiro # endif /* HESIOD */ 873c2aa98e2SPeter Wemm } 874c2aa98e2SPeter Wemm if (stab("users", ST_MAP, ST_FIND) == NULL) 875c2aa98e2SPeter Wemm { 87612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users switch -m passwd", sizeof buf); 877c2aa98e2SPeter Wemm (void) makemapentry(buf); 878c2aa98e2SPeter Wemm } 8793299c2f1SGregory Neil Shapiro #endif /* 0 */ 880c2aa98e2SPeter Wemm } 88112ed1c7cSGregory Neil Shapiro /* 882c2aa98e2SPeter Wemm ** SWITCH_MAP_FIND -- find the list of types associated with a map 883c2aa98e2SPeter Wemm ** 884c2aa98e2SPeter Wemm ** This is the system-dependent interface to the service switch. 885c2aa98e2SPeter Wemm ** 886c2aa98e2SPeter Wemm ** Parameters: 887c2aa98e2SPeter Wemm ** service -- the name of the service of interest. 888c2aa98e2SPeter Wemm ** maptype -- an out-array of strings containing the types 889c2aa98e2SPeter Wemm ** of access to use for this service. There can 890c2aa98e2SPeter Wemm ** be at most MAXMAPSTACK types for a single service. 891c2aa98e2SPeter Wemm ** mapreturn -- an out-array of return information bitmaps 892c2aa98e2SPeter Wemm ** for the map. 893c2aa98e2SPeter Wemm ** 894c2aa98e2SPeter Wemm ** Returns: 895c2aa98e2SPeter Wemm ** The number of map types filled in, or -1 for failure. 8963299c2f1SGregory Neil Shapiro ** 8973299c2f1SGregory Neil Shapiro ** Side effects: 8983299c2f1SGregory Neil Shapiro ** Preserves errno so nothing in the routine clobbers it. 899c2aa98e2SPeter Wemm */ 900c2aa98e2SPeter Wemm 901c2aa98e2SPeter Wemm #if defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) 902c2aa98e2SPeter Wemm # define _USE_SUN_NSSWITCH_ 9033299c2f1SGregory Neil Shapiro #endif /* defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) */ 904c2aa98e2SPeter Wemm 90512ed1c7cSGregory Neil Shapiro #if _FFR_HPUX_NSSWITCH 90612ed1c7cSGregory Neil Shapiro # ifdef __hpux 90712ed1c7cSGregory Neil Shapiro # define _USE_SUN_NSSWITCH_ 90812ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 90912ed1c7cSGregory Neil Shapiro #endif /* _FFR_HPUX_NSSWITCH */ 91012ed1c7cSGregory Neil Shapiro 911c2aa98e2SPeter Wemm #ifdef _USE_SUN_NSSWITCH_ 912c2aa98e2SPeter Wemm # include <nsswitch.h> 9133299c2f1SGregory Neil Shapiro #endif /* _USE_SUN_NSSWITCH_ */ 914c2aa98e2SPeter Wemm 915c2aa98e2SPeter Wemm #if defined(ultrix) || (defined(__osf__) && defined(__alpha)) 916c2aa98e2SPeter Wemm # define _USE_DEC_SVC_CONF_ 9173299c2f1SGregory Neil Shapiro #endif /* defined(ultrix) || (defined(__osf__) && defined(__alpha)) */ 918c2aa98e2SPeter Wemm 919c2aa98e2SPeter Wemm #ifdef _USE_DEC_SVC_CONF_ 920c2aa98e2SPeter Wemm # include <sys/svcinfo.h> 9213299c2f1SGregory Neil Shapiro #endif /* _USE_DEC_SVC_CONF_ */ 922c2aa98e2SPeter Wemm 923c2aa98e2SPeter Wemm int 924c2aa98e2SPeter Wemm switch_map_find(service, maptype, mapreturn) 925c2aa98e2SPeter Wemm char *service; 926c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 927c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 928c2aa98e2SPeter Wemm { 929c46d91b7SGregory Neil Shapiro int svcno = 0; 9303299c2f1SGregory Neil Shapiro int save_errno = errno; 931c2aa98e2SPeter Wemm 932c2aa98e2SPeter Wemm #ifdef _USE_SUN_NSSWITCH_ 933c2aa98e2SPeter Wemm struct __nsw_switchconfig *nsw_conf; 934c2aa98e2SPeter Wemm enum __nsw_parse_err pserr; 935c2aa98e2SPeter Wemm struct __nsw_lookup *lk; 936c2aa98e2SPeter Wemm static struct __nsw_lookup lkp0 = 937c2aa98e2SPeter Wemm { "files", {1, 0, 0, 0}, NULL, NULL }; 938c2aa98e2SPeter Wemm static struct __nsw_switchconfig lkp_default = 939c2aa98e2SPeter Wemm { 0, "sendmail", 3, &lkp0 }; 940c2aa98e2SPeter Wemm 941c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 942c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 943c2aa98e2SPeter Wemm 944c2aa98e2SPeter Wemm if ((nsw_conf = __nsw_getconfig(service, &pserr)) == NULL) 945c2aa98e2SPeter Wemm lk = lkp_default.lookups; 946c2aa98e2SPeter Wemm else 947c2aa98e2SPeter Wemm lk = nsw_conf->lookups; 948c2aa98e2SPeter Wemm svcno = 0; 949c46d91b7SGregory Neil Shapiro while (lk != NULL && svcno < MAXMAPSTACK) 950c2aa98e2SPeter Wemm { 951c2aa98e2SPeter Wemm maptype[svcno] = lk->service_name; 952c2aa98e2SPeter Wemm if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN) 953c2aa98e2SPeter Wemm mapreturn[MA_NOTFOUND] |= 1 << svcno; 954c2aa98e2SPeter Wemm if (lk->actions[__NSW_TRYAGAIN] == __NSW_RETURN) 955c2aa98e2SPeter Wemm mapreturn[MA_TRYAGAIN] |= 1 << svcno; 956c2aa98e2SPeter Wemm if (lk->actions[__NSW_UNAVAIL] == __NSW_RETURN) 957c2aa98e2SPeter Wemm mapreturn[MA_TRYAGAIN] |= 1 << svcno; 958c2aa98e2SPeter Wemm svcno++; 959c2aa98e2SPeter Wemm lk = lk->next; 960c2aa98e2SPeter Wemm } 9613299c2f1SGregory Neil Shapiro errno = save_errno; 962c2aa98e2SPeter Wemm return svcno; 9633299c2f1SGregory Neil Shapiro #endif /* _USE_SUN_NSSWITCH_ */ 964c2aa98e2SPeter Wemm 965c2aa98e2SPeter Wemm #ifdef _USE_DEC_SVC_CONF_ 966c2aa98e2SPeter Wemm struct svcinfo *svcinfo; 967c2aa98e2SPeter Wemm int svc; 968c2aa98e2SPeter Wemm 969c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 970c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 971c2aa98e2SPeter Wemm 972c2aa98e2SPeter Wemm svcinfo = getsvc(); 973c2aa98e2SPeter Wemm if (svcinfo == NULL) 974c2aa98e2SPeter Wemm goto punt; 975c2aa98e2SPeter Wemm if (strcmp(service, "hosts") == 0) 976c2aa98e2SPeter Wemm svc = SVC_HOSTS; 977c2aa98e2SPeter Wemm else if (strcmp(service, "aliases") == 0) 978c2aa98e2SPeter Wemm svc = SVC_ALIASES; 979c2aa98e2SPeter Wemm else if (strcmp(service, "passwd") == 0) 980c2aa98e2SPeter Wemm svc = SVC_PASSWD; 981c2aa98e2SPeter Wemm else 9823299c2f1SGregory Neil Shapiro { 9833299c2f1SGregory Neil Shapiro errno = save_errno; 984c2aa98e2SPeter Wemm return -1; 9853299c2f1SGregory Neil Shapiro } 986c46d91b7SGregory Neil Shapiro for (svcno = 0; svcno < SVC_PATHSIZE && svcno < MAXMAPSTACK; svcno++) 987c2aa98e2SPeter Wemm { 988c2aa98e2SPeter Wemm switch (svcinfo->svcpath[svc][svcno]) 989c2aa98e2SPeter Wemm { 990c2aa98e2SPeter Wemm case SVC_LOCAL: 991c2aa98e2SPeter Wemm maptype[svcno] = "files"; 992c2aa98e2SPeter Wemm break; 993c2aa98e2SPeter Wemm 994c2aa98e2SPeter Wemm case SVC_YP: 995c2aa98e2SPeter Wemm maptype[svcno] = "nis"; 996c2aa98e2SPeter Wemm break; 997c2aa98e2SPeter Wemm 998c2aa98e2SPeter Wemm case SVC_BIND: 999c2aa98e2SPeter Wemm maptype[svcno] = "dns"; 1000c2aa98e2SPeter Wemm break; 1001c2aa98e2SPeter Wemm 1002c2aa98e2SPeter Wemm # ifdef SVC_HESIOD 1003c2aa98e2SPeter Wemm case SVC_HESIOD: 1004c2aa98e2SPeter Wemm maptype[svcno] = "hesiod"; 1005c2aa98e2SPeter Wemm break; 10063299c2f1SGregory Neil Shapiro # endif /* SVC_HESIOD */ 1007c2aa98e2SPeter Wemm 1008c2aa98e2SPeter Wemm case SVC_LAST: 10093299c2f1SGregory Neil Shapiro errno = save_errno; 1010c2aa98e2SPeter Wemm return svcno; 1011c2aa98e2SPeter Wemm } 1012c2aa98e2SPeter Wemm } 10133299c2f1SGregory Neil Shapiro errno = save_errno; 1014c2aa98e2SPeter Wemm return svcno; 10153299c2f1SGregory Neil Shapiro #endif /* _USE_DEC_SVC_CONF_ */ 1016c2aa98e2SPeter Wemm 1017c2aa98e2SPeter Wemm #if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) 1018c2aa98e2SPeter Wemm /* 1019c2aa98e2SPeter Wemm ** Fall-back mechanism. 1020c2aa98e2SPeter Wemm */ 1021c2aa98e2SPeter Wemm 1022c2aa98e2SPeter Wemm STAB *st; 102312ed1c7cSGregory Neil Shapiro static time_t servicecachetime; /* time service switch was cached */ 1024c2aa98e2SPeter Wemm time_t now = curtime(); 1025c2aa98e2SPeter Wemm 1026c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 1027c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 1028c2aa98e2SPeter Wemm 102912ed1c7cSGregory Neil Shapiro if ((now - servicecachetime) > (time_t) ServiceCacheMaxAge) 1030c2aa98e2SPeter Wemm { 1031c2aa98e2SPeter Wemm /* (re)read service switch */ 103212ed1c7cSGregory Neil Shapiro register SM_FILE_T *fp; 10333299c2f1SGregory Neil Shapiro long sff = SFF_REGONLY|SFF_OPENASROOT|SFF_NOLOCK; 1034c2aa98e2SPeter Wemm 10353299c2f1SGregory Neil Shapiro if (!bitnset(DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR, 10363299c2f1SGregory Neil Shapiro DontBlameSendmail)) 1037c2aa98e2SPeter Wemm sff |= SFF_NOWLINK; 1038c2aa98e2SPeter Wemm 1039c2aa98e2SPeter Wemm if (ConfigFileRead) 104012ed1c7cSGregory Neil Shapiro servicecachetime = now; 1041c2aa98e2SPeter Wemm fp = safefopen(ServiceSwitchFile, O_RDONLY, 0, sff); 1042c2aa98e2SPeter Wemm if (fp != NULL) 1043c2aa98e2SPeter Wemm { 1044c2aa98e2SPeter Wemm char buf[MAXLINE]; 1045c2aa98e2SPeter Wemm 104612ed1c7cSGregory Neil Shapiro while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, 104712ed1c7cSGregory Neil Shapiro sizeof buf) != NULL) 1048c2aa98e2SPeter Wemm { 1049c2aa98e2SPeter Wemm register char *p; 1050c2aa98e2SPeter Wemm 1051c2aa98e2SPeter Wemm p = strpbrk(buf, "#\n"); 1052c2aa98e2SPeter Wemm if (p != NULL) 1053c2aa98e2SPeter Wemm *p = '\0'; 1054c2aa98e2SPeter Wemm p = strpbrk(buf, " \t"); 1055c2aa98e2SPeter Wemm if (p != NULL) 1056c2aa98e2SPeter Wemm *p++ = '\0'; 1057c2aa98e2SPeter Wemm if (buf[0] == '\0') 1058c2aa98e2SPeter Wemm continue; 105976b7bf71SPeter Wemm if (p == NULL) 106076b7bf71SPeter Wemm { 106176b7bf71SPeter Wemm sm_syslog(LOG_ERR, NOQID, 106276b7bf71SPeter Wemm "Bad line on %.100s: %.100s", 106376b7bf71SPeter Wemm ServiceSwitchFile, 106476b7bf71SPeter Wemm buf); 106576b7bf71SPeter Wemm continue; 106676b7bf71SPeter Wemm } 1067c2aa98e2SPeter Wemm while (isspace(*p)) 1068c2aa98e2SPeter Wemm p++; 1069c2aa98e2SPeter Wemm if (*p == '\0') 1070c2aa98e2SPeter Wemm continue; 1071c2aa98e2SPeter Wemm 1072c2aa98e2SPeter Wemm /* 1073c2aa98e2SPeter Wemm ** Find/allocate space for this service entry. 1074c2aa98e2SPeter Wemm ** Space for all of the service strings 1075c2aa98e2SPeter Wemm ** are allocated at once. This means 1076c2aa98e2SPeter Wemm ** that we only have to free the first 1077c2aa98e2SPeter Wemm ** one to free all of them. 1078c2aa98e2SPeter Wemm */ 1079c2aa98e2SPeter Wemm 1080c2aa98e2SPeter Wemm st = stab(buf, ST_SERVICE, ST_ENTER); 1081c2aa98e2SPeter Wemm if (st->s_service[0] != NULL) 108212ed1c7cSGregory Neil Shapiro sm_free((void *) st->s_service[0]); /* XXX */ 1083c2aa98e2SPeter Wemm p = newstr(p); 1084c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPSTACK; ) 1085c2aa98e2SPeter Wemm { 1086c2aa98e2SPeter Wemm if (*p == '\0') 1087c2aa98e2SPeter Wemm break; 1088c2aa98e2SPeter Wemm st->s_service[svcno++] = p; 1089c2aa98e2SPeter Wemm p = strpbrk(p, " \t"); 1090c2aa98e2SPeter Wemm if (p == NULL) 1091c2aa98e2SPeter Wemm break; 1092c2aa98e2SPeter Wemm *p++ = '\0'; 1093c2aa98e2SPeter Wemm while (isspace(*p)) 1094c2aa98e2SPeter Wemm p++; 1095c2aa98e2SPeter Wemm } 1096c2aa98e2SPeter Wemm if (svcno < MAXMAPSTACK) 1097c2aa98e2SPeter Wemm st->s_service[svcno] = NULL; 1098c2aa98e2SPeter Wemm } 109912ed1c7cSGregory Neil Shapiro (void) sm_io_close(fp, SM_TIME_DEFAULT); 1100c2aa98e2SPeter Wemm } 1101c2aa98e2SPeter Wemm } 1102c2aa98e2SPeter Wemm 1103c2aa98e2SPeter Wemm /* look up entry in cache */ 1104c2aa98e2SPeter Wemm st = stab(service, ST_SERVICE, ST_FIND); 1105c2aa98e2SPeter Wemm if (st != NULL && st->s_service[0] != NULL) 1106c2aa98e2SPeter Wemm { 1107c2aa98e2SPeter Wemm /* extract data */ 1108c2aa98e2SPeter Wemm svcno = 0; 1109c2aa98e2SPeter Wemm while (svcno < MAXMAPSTACK) 1110c2aa98e2SPeter Wemm { 1111c2aa98e2SPeter Wemm maptype[svcno] = st->s_service[svcno]; 1112c2aa98e2SPeter Wemm if (maptype[svcno++] == NULL) 1113c2aa98e2SPeter Wemm break; 1114c2aa98e2SPeter Wemm } 11153299c2f1SGregory Neil Shapiro errno = save_errno; 1116c2aa98e2SPeter Wemm return --svcno; 1117c2aa98e2SPeter Wemm } 11183299c2f1SGregory Neil Shapiro #endif /* !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) */ 1119c2aa98e2SPeter Wemm 1120c2aa98e2SPeter Wemm #if !defined(_USE_SUN_NSSWITCH_) 1121c2aa98e2SPeter Wemm /* if the service file doesn't work, use an absolute fallback */ 1122c2aa98e2SPeter Wemm # ifdef _USE_DEC_SVC_CONF_ 1123c2aa98e2SPeter Wemm punt: 11243299c2f1SGregory Neil Shapiro # endif /* _USE_DEC_SVC_CONF_ */ 1125c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 1126c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 1127c2aa98e2SPeter Wemm svcno = 0; 1128c2aa98e2SPeter Wemm if (strcmp(service, "aliases") == 0) 1129c2aa98e2SPeter Wemm { 1130c2aa98e2SPeter Wemm maptype[svcno++] = "files"; 11313299c2f1SGregory Neil Shapiro # if defined(AUTO_NETINFO_ALIASES) && defined (NETINFO) 11323299c2f1SGregory Neil Shapiro maptype[svcno++] = "netinfo"; 11333299c2f1SGregory Neil Shapiro # endif /* defined(AUTO_NETINFO_ALIASES) && defined (NETINFO) */ 1134c2aa98e2SPeter Wemm # ifdef AUTO_NIS_ALIASES 113512ed1c7cSGregory Neil Shapiro # if NISPLUS 1136c2aa98e2SPeter Wemm maptype[svcno++] = "nisplus"; 11373299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 113812ed1c7cSGregory Neil Shapiro # if NIS 1139c2aa98e2SPeter Wemm maptype[svcno++] = "nis"; 11403299c2f1SGregory Neil Shapiro # endif /* NIS */ 11413299c2f1SGregory Neil Shapiro # endif /* AUTO_NIS_ALIASES */ 11423299c2f1SGregory Neil Shapiro errno = save_errno; 1143c2aa98e2SPeter Wemm return svcno; 1144c2aa98e2SPeter Wemm } 1145c2aa98e2SPeter Wemm if (strcmp(service, "hosts") == 0) 1146c2aa98e2SPeter Wemm { 1147c2aa98e2SPeter Wemm # if NAMED_BIND 1148c2aa98e2SPeter Wemm maptype[svcno++] = "dns"; 11493299c2f1SGregory Neil Shapiro # else /* NAMED_BIND */ 1150c2aa98e2SPeter Wemm # if defined(sun) && !defined(BSD) 1151c2aa98e2SPeter Wemm /* SunOS */ 1152c2aa98e2SPeter Wemm maptype[svcno++] = "nis"; 11533299c2f1SGregory Neil Shapiro # endif /* defined(sun) && !defined(BSD) */ 11543299c2f1SGregory Neil Shapiro # endif /* NAMED_BIND */ 11553299c2f1SGregory Neil Shapiro # if defined(AUTO_NETINFO_HOSTS) && defined (NETINFO) 11563299c2f1SGregory Neil Shapiro maptype[svcno++] = "netinfo"; 11573299c2f1SGregory Neil Shapiro # endif /* defined(AUTO_NETINFO_HOSTS) && defined (NETINFO) */ 1158c2aa98e2SPeter Wemm maptype[svcno++] = "files"; 11593299c2f1SGregory Neil Shapiro errno = save_errno; 1160c2aa98e2SPeter Wemm return svcno; 1161c2aa98e2SPeter Wemm } 11623299c2f1SGregory Neil Shapiro errno = save_errno; 1163c2aa98e2SPeter Wemm return -1; 11643299c2f1SGregory Neil Shapiro #endif /* !defined(_USE_SUN_NSSWITCH_) */ 1165c2aa98e2SPeter Wemm } 116612ed1c7cSGregory Neil Shapiro /* 1167c2aa98e2SPeter Wemm ** USERNAME -- return the user id of the logged in user. 1168c2aa98e2SPeter Wemm ** 1169c2aa98e2SPeter Wemm ** Parameters: 1170c2aa98e2SPeter Wemm ** none. 1171c2aa98e2SPeter Wemm ** 1172c2aa98e2SPeter Wemm ** Returns: 1173c2aa98e2SPeter Wemm ** The login name of the logged in user. 1174c2aa98e2SPeter Wemm ** 1175c2aa98e2SPeter Wemm ** Side Effects: 1176c2aa98e2SPeter Wemm ** none. 1177c2aa98e2SPeter Wemm ** 1178c2aa98e2SPeter Wemm ** Notes: 1179c2aa98e2SPeter Wemm ** The return value is statically allocated. 1180c2aa98e2SPeter Wemm */ 1181c2aa98e2SPeter Wemm 1182c2aa98e2SPeter Wemm char * 1183c2aa98e2SPeter Wemm username() 1184c2aa98e2SPeter Wemm { 1185c2aa98e2SPeter Wemm static char *myname = NULL; 1186c2aa98e2SPeter Wemm extern char *getlogin(); 1187c2aa98e2SPeter Wemm register struct passwd *pw; 1188c2aa98e2SPeter Wemm 1189c2aa98e2SPeter Wemm /* cache the result */ 1190c2aa98e2SPeter Wemm if (myname == NULL) 1191c2aa98e2SPeter Wemm { 1192c2aa98e2SPeter Wemm myname = getlogin(); 1193c2aa98e2SPeter Wemm if (myname == NULL || myname[0] == '\0') 1194c2aa98e2SPeter Wemm { 1195c2aa98e2SPeter Wemm pw = sm_getpwuid(RealUid); 1196c2aa98e2SPeter Wemm if (pw != NULL) 119712ed1c7cSGregory Neil Shapiro myname = pw->pw_name; 1198c2aa98e2SPeter Wemm } 1199c2aa98e2SPeter Wemm else 1200c2aa98e2SPeter Wemm { 1201c2aa98e2SPeter Wemm uid_t uid = RealUid; 1202c2aa98e2SPeter Wemm 1203c2aa98e2SPeter Wemm if ((pw = sm_getpwnam(myname)) == NULL || 1204c2aa98e2SPeter Wemm (uid != 0 && uid != pw->pw_uid)) 1205c2aa98e2SPeter Wemm { 1206c2aa98e2SPeter Wemm pw = sm_getpwuid(uid); 1207c2aa98e2SPeter Wemm if (pw != NULL) 120812ed1c7cSGregory Neil Shapiro myname = pw->pw_name; 1209c2aa98e2SPeter Wemm } 1210c2aa98e2SPeter Wemm } 1211c2aa98e2SPeter Wemm if (myname == NULL || myname[0] == '\0') 1212c2aa98e2SPeter Wemm { 12133299c2f1SGregory Neil Shapiro syserr("554 5.3.0 Who are you?"); 1214c2aa98e2SPeter Wemm myname = "postmaster"; 1215c2aa98e2SPeter Wemm } 121612ed1c7cSGregory Neil Shapiro else if (strpbrk(myname, ",;:/|\"\\") != NULL) 121712ed1c7cSGregory Neil Shapiro myname = addquotes(myname, NULL); 121812ed1c7cSGregory Neil Shapiro else 121912ed1c7cSGregory Neil Shapiro myname = sm_pstrdup_x(myname); 1220c2aa98e2SPeter Wemm } 12213299c2f1SGregory Neil Shapiro return myname; 1222c2aa98e2SPeter Wemm } 122312ed1c7cSGregory Neil Shapiro /* 1224c2aa98e2SPeter Wemm ** TTYPATH -- Get the path of the user's tty 1225c2aa98e2SPeter Wemm ** 1226c2aa98e2SPeter Wemm ** Returns the pathname of the user's tty. Returns NULL if 1227c2aa98e2SPeter Wemm ** the user is not logged in or if s/he has write permission 1228c2aa98e2SPeter Wemm ** denied. 1229c2aa98e2SPeter Wemm ** 1230c2aa98e2SPeter Wemm ** Parameters: 1231c2aa98e2SPeter Wemm ** none 1232c2aa98e2SPeter Wemm ** 1233c2aa98e2SPeter Wemm ** Returns: 1234c2aa98e2SPeter Wemm ** pathname of the user's tty. 1235c2aa98e2SPeter Wemm ** NULL if not logged in or write permission denied. 1236c2aa98e2SPeter Wemm ** 1237c2aa98e2SPeter Wemm ** Side Effects: 1238c2aa98e2SPeter Wemm ** none. 1239c2aa98e2SPeter Wemm ** 1240c2aa98e2SPeter Wemm ** WARNING: 1241c2aa98e2SPeter Wemm ** Return value is in a local buffer. 1242c2aa98e2SPeter Wemm ** 1243c2aa98e2SPeter Wemm ** Called By: 1244c2aa98e2SPeter Wemm ** savemail 1245c2aa98e2SPeter Wemm */ 1246c2aa98e2SPeter Wemm 1247c2aa98e2SPeter Wemm char * 1248c2aa98e2SPeter Wemm ttypath() 1249c2aa98e2SPeter Wemm { 1250c2aa98e2SPeter Wemm struct stat stbuf; 1251c2aa98e2SPeter Wemm register char *pathn; 1252c2aa98e2SPeter Wemm extern char *ttyname(); 1253c2aa98e2SPeter Wemm extern char *getlogin(); 1254c2aa98e2SPeter Wemm 1255c2aa98e2SPeter Wemm /* compute the pathname of the controlling tty */ 1256c2aa98e2SPeter Wemm if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && 1257c2aa98e2SPeter Wemm (pathn = ttyname(0)) == NULL) 1258c2aa98e2SPeter Wemm { 1259c2aa98e2SPeter Wemm errno = 0; 12603299c2f1SGregory Neil Shapiro return NULL; 1261c2aa98e2SPeter Wemm } 1262c2aa98e2SPeter Wemm 1263c2aa98e2SPeter Wemm /* see if we have write permission */ 1264c2aa98e2SPeter Wemm if (stat(pathn, &stbuf) < 0 || !bitset(S_IWOTH, stbuf.st_mode)) 1265c2aa98e2SPeter Wemm { 1266c2aa98e2SPeter Wemm errno = 0; 12673299c2f1SGregory Neil Shapiro return NULL; 1268c2aa98e2SPeter Wemm } 1269c2aa98e2SPeter Wemm 1270c2aa98e2SPeter Wemm /* see if the user is logged in */ 1271c2aa98e2SPeter Wemm if (getlogin() == NULL) 12723299c2f1SGregory Neil Shapiro return NULL; 1273c2aa98e2SPeter Wemm 1274c2aa98e2SPeter Wemm /* looks good */ 12753299c2f1SGregory Neil Shapiro return pathn; 1276c2aa98e2SPeter Wemm } 127712ed1c7cSGregory Neil Shapiro /* 1278c2aa98e2SPeter Wemm ** CHECKCOMPAT -- check for From and To person compatible. 1279c2aa98e2SPeter Wemm ** 1280c2aa98e2SPeter Wemm ** This routine can be supplied on a per-installation basis 1281c2aa98e2SPeter Wemm ** to determine whether a person is allowed to send a message. 1282c2aa98e2SPeter Wemm ** This allows restriction of certain types of internet 1283c2aa98e2SPeter Wemm ** forwarding or registration of users. 1284c2aa98e2SPeter Wemm ** 1285c2aa98e2SPeter Wemm ** If the hosts are found to be incompatible, an error 1286c2aa98e2SPeter Wemm ** message should be given using "usrerr" and an EX_ code 1287c2aa98e2SPeter Wemm ** should be returned. You can also set to->q_status to 1288c2aa98e2SPeter Wemm ** a DSN-style status code. 1289c2aa98e2SPeter Wemm ** 1290c2aa98e2SPeter Wemm ** EF_NO_BODY_RETN can be set in e->e_flags to suppress the 1291c2aa98e2SPeter Wemm ** body during the return-to-sender function; this should be done 1292c2aa98e2SPeter Wemm ** on huge messages. This bit may already be set by the ESMTP 1293c2aa98e2SPeter Wemm ** protocol. 1294c2aa98e2SPeter Wemm ** 1295c2aa98e2SPeter Wemm ** Parameters: 1296c2aa98e2SPeter Wemm ** to -- the person being sent to. 1297c2aa98e2SPeter Wemm ** 1298c2aa98e2SPeter Wemm ** Returns: 1299c2aa98e2SPeter Wemm ** an exit status 1300c2aa98e2SPeter Wemm ** 1301c2aa98e2SPeter Wemm ** Side Effects: 1302c2aa98e2SPeter Wemm ** none (unless you include the usrerr stuff) 1303c2aa98e2SPeter Wemm */ 1304c2aa98e2SPeter Wemm 1305c2aa98e2SPeter Wemm int 1306c2aa98e2SPeter Wemm checkcompat(to, e) 1307c2aa98e2SPeter Wemm register ADDRESS *to; 1308c2aa98e2SPeter Wemm register ENVELOPE *e; 1309c2aa98e2SPeter Wemm { 1310c2aa98e2SPeter Wemm if (tTd(49, 1)) 131112ed1c7cSGregory Neil Shapiro sm_dprintf("checkcompat(to=%s, from=%s)\n", 1312c2aa98e2SPeter Wemm to->q_paddr, e->e_from.q_paddr); 1313c2aa98e2SPeter Wemm 1314c2aa98e2SPeter Wemm #ifdef EXAMPLE_CODE 1315c2aa98e2SPeter Wemm /* this code is intended as an example only */ 1316c2aa98e2SPeter Wemm register STAB *s; 1317c2aa98e2SPeter Wemm 1318c2aa98e2SPeter Wemm s = stab("arpa", ST_MAILER, ST_FIND); 1319c2aa98e2SPeter Wemm if (s != NULL && strcmp(e->e_from.q_mailer->m_name, "local") != 0 && 1320c2aa98e2SPeter Wemm to->q_mailer == s->s_mailer) 1321c2aa98e2SPeter Wemm { 1322c2aa98e2SPeter Wemm usrerr("553 No ARPA mail through this machine: see your system administration"); 13233299c2f1SGregory Neil Shapiro /* e->e_flags |= EF_NO_BODY_RETN; to suppress body on return */ 1324c2aa98e2SPeter Wemm to->q_status = "5.7.1"; 13253299c2f1SGregory Neil Shapiro return EX_UNAVAILABLE; 1326c2aa98e2SPeter Wemm } 1327c2aa98e2SPeter Wemm #endif /* EXAMPLE_CODE */ 13283299c2f1SGregory Neil Shapiro return EX_OK; 1329c2aa98e2SPeter Wemm } 13303299c2f1SGregory Neil Shapiro /* 1331c2aa98e2SPeter Wemm ** INIT_MD -- do machine dependent initializations 1332c2aa98e2SPeter Wemm ** 1333c2aa98e2SPeter Wemm ** Systems that have global modes that should be set should do 1334c2aa98e2SPeter Wemm ** them here rather than in main. 1335c2aa98e2SPeter Wemm */ 1336c2aa98e2SPeter Wemm 1337c2aa98e2SPeter Wemm #ifdef _AUX_SOURCE 1338c2aa98e2SPeter Wemm # include <compat.h> 13393299c2f1SGregory Neil Shapiro #endif /* _AUX_SOURCE */ 1340c2aa98e2SPeter Wemm 1341c2aa98e2SPeter Wemm #if SHARE_V1 1342c2aa98e2SPeter Wemm # include <shares.h> 13433299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 1344c2aa98e2SPeter Wemm 1345c2aa98e2SPeter Wemm void 1346c2aa98e2SPeter Wemm init_md(argc, argv) 1347c2aa98e2SPeter Wemm int argc; 1348c2aa98e2SPeter Wemm char **argv; 1349c2aa98e2SPeter Wemm { 1350c2aa98e2SPeter Wemm #ifdef _AUX_SOURCE 1351c2aa98e2SPeter Wemm setcompat(getcompat() | COMPAT_BSDPROT); 13523299c2f1SGregory Neil Shapiro #endif /* _AUX_SOURCE */ 1353c2aa98e2SPeter Wemm 1354c2aa98e2SPeter Wemm #ifdef SUN_EXTENSIONS 1355c2aa98e2SPeter Wemm init_md_sun(); 13563299c2f1SGregory Neil Shapiro #endif /* SUN_EXTENSIONS */ 1357c2aa98e2SPeter Wemm 1358c2aa98e2SPeter Wemm #if _CONVEX_SOURCE 1359c2aa98e2SPeter Wemm /* keep gethostby*() from stripping the local domain name */ 1360c2aa98e2SPeter Wemm set_domain_trim_off(); 13613299c2f1SGregory Neil Shapiro #endif /* _CONVEX_SOURCE */ 1362c2aa98e2SPeter Wemm #ifdef __QNX__ 1363c2aa98e2SPeter Wemm /* 1364c2aa98e2SPeter Wemm ** Due to QNX's network distributed nature, you can target a tcpip 1365c2aa98e2SPeter Wemm ** stack on a different node in the qnx network; this patch lets 1366c2aa98e2SPeter Wemm ** this feature work. The __sock_locate() must be done before the 1367c2aa98e2SPeter Wemm ** environment is clear. 1368c2aa98e2SPeter Wemm */ 1369c2aa98e2SPeter Wemm __sock_locate(); 13703299c2f1SGregory Neil Shapiro #endif /* __QNX__ */ 1371c2aa98e2SPeter Wemm #if SECUREWARE || defined(_SCO_unix_) 1372c2aa98e2SPeter Wemm set_auth_parameters(argc, argv); 1373c2aa98e2SPeter Wemm 1374c2aa98e2SPeter Wemm # ifdef _SCO_unix_ 1375c2aa98e2SPeter Wemm /* 1376c2aa98e2SPeter Wemm ** This is required for highest security levels (the kernel 1377c2aa98e2SPeter Wemm ** won't let it call set*uid() or run setuid binaries without 1378c2aa98e2SPeter Wemm ** it). It may be necessary on other SECUREWARE systems. 1379c2aa98e2SPeter Wemm */ 1380c2aa98e2SPeter Wemm 1381c2aa98e2SPeter Wemm if (getluid() == -1) 1382c2aa98e2SPeter Wemm setluid(0); 13833299c2f1SGregory Neil Shapiro # endif /* _SCO_unix_ */ 13843299c2f1SGregory Neil Shapiro #endif /* SECUREWARE || defined(_SCO_unix_) */ 13853299c2f1SGregory Neil Shapiro 1386c2aa98e2SPeter Wemm 1387c2aa98e2SPeter Wemm #ifdef VENDOR_DEFAULT 1388c2aa98e2SPeter Wemm VendorCode = VENDOR_DEFAULT; 13893299c2f1SGregory Neil Shapiro #else /* VENDOR_DEFAULT */ 1390c2aa98e2SPeter Wemm VendorCode = VENDOR_BERKELEY; 13913299c2f1SGregory Neil Shapiro #endif /* VENDOR_DEFAULT */ 1392c2aa98e2SPeter Wemm } 139312ed1c7cSGregory Neil Shapiro /* 1394c2aa98e2SPeter Wemm ** INIT_VENDOR_MACROS -- vendor-dependent macro initializations 1395c2aa98e2SPeter Wemm ** 1396c2aa98e2SPeter Wemm ** Called once, on startup. 1397c2aa98e2SPeter Wemm ** 1398c2aa98e2SPeter Wemm ** Parameters: 1399c2aa98e2SPeter Wemm ** e -- the global envelope. 1400c2aa98e2SPeter Wemm ** 1401c2aa98e2SPeter Wemm ** Returns: 1402c2aa98e2SPeter Wemm ** none. 1403c2aa98e2SPeter Wemm ** 1404c2aa98e2SPeter Wemm ** Side Effects: 1405c2aa98e2SPeter Wemm ** vendor-dependent. 1406c2aa98e2SPeter Wemm */ 1407c2aa98e2SPeter Wemm 1408c2aa98e2SPeter Wemm void 1409c2aa98e2SPeter Wemm init_vendor_macros(e) 1410c2aa98e2SPeter Wemm register ENVELOPE *e; 1411c2aa98e2SPeter Wemm { 1412c2aa98e2SPeter Wemm } 141312ed1c7cSGregory Neil Shapiro /* 1414c2aa98e2SPeter Wemm ** GETLA -- get the current load average 1415c2aa98e2SPeter Wemm ** 1416c2aa98e2SPeter Wemm ** This code stolen from la.c. 1417c2aa98e2SPeter Wemm ** 1418c2aa98e2SPeter Wemm ** Parameters: 1419c2aa98e2SPeter Wemm ** none. 1420c2aa98e2SPeter Wemm ** 1421c2aa98e2SPeter Wemm ** Returns: 1422c2aa98e2SPeter Wemm ** The current load average as an integer. 1423c2aa98e2SPeter Wemm ** 1424c2aa98e2SPeter Wemm ** Side Effects: 1425c2aa98e2SPeter Wemm ** none. 1426c2aa98e2SPeter Wemm */ 1427c2aa98e2SPeter Wemm 1428c2aa98e2SPeter Wemm /* try to guess what style of load average we have */ 1429c2aa98e2SPeter Wemm #define LA_ZERO 1 /* always return load average as zero */ 1430c2aa98e2SPeter Wemm #define LA_INT 2 /* read kmem for avenrun; interpret as long */ 1431c2aa98e2SPeter Wemm #define LA_FLOAT 3 /* read kmem for avenrun; interpret as float */ 1432c2aa98e2SPeter Wemm #define LA_SUBR 4 /* call getloadavg */ 1433c2aa98e2SPeter Wemm #define LA_MACH 5 /* MACH load averages (as on NeXT boxes) */ 1434c2aa98e2SPeter Wemm #define LA_SHORT 6 /* read kmem for avenrun; interpret as short */ 1435c2aa98e2SPeter Wemm #define LA_PROCSTR 7 /* read string ("1.17") from /proc/loadavg */ 1436c2aa98e2SPeter Wemm #define LA_READKSYM 8 /* SVR4: use MIOC_READKSYM ioctl call */ 1437c2aa98e2SPeter Wemm #define LA_DGUX 9 /* special DGUX implementation */ 1438c2aa98e2SPeter Wemm #define LA_HPUX 10 /* special HPUX implementation */ 1439c2aa98e2SPeter Wemm #define LA_IRIX6 11 /* special IRIX 6.2 implementation */ 1440c2aa98e2SPeter Wemm #define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */ 1441c2aa98e2SPeter Wemm #define LA_DEVSHORT 13 /* read short from a device */ 1442c2aa98e2SPeter Wemm #define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */ 1443c46d91b7SGregory Neil Shapiro #define LA_PSET 15 /* Solaris per-processor-set load average */ 1444188b7d28SGregory Neil Shapiro #define LA_LONGLONG 17 /* read kmem for avenrun; interpret as long long */ 1445c2aa98e2SPeter Wemm 1446c2aa98e2SPeter Wemm /* do guesses based on general OS type */ 1447c2aa98e2SPeter Wemm #ifndef LA_TYPE 1448c2aa98e2SPeter Wemm # define LA_TYPE LA_ZERO 14493299c2f1SGregory Neil Shapiro #endif /* ! LA_TYPE */ 1450c2aa98e2SPeter Wemm 1451c2aa98e2SPeter Wemm #ifndef FSHIFT 1452c2aa98e2SPeter Wemm # if defined(unixpc) 1453c2aa98e2SPeter Wemm # define FSHIFT 5 14543299c2f1SGregory Neil Shapiro # endif /* defined(unixpc) */ 1455c2aa98e2SPeter Wemm 1456c2aa98e2SPeter Wemm # if defined(__alpha) || defined(IRIX) 1457c2aa98e2SPeter Wemm # define FSHIFT 10 14583299c2f1SGregory Neil Shapiro # endif /* defined(__alpha) || defined(IRIX) */ 1459c2aa98e2SPeter Wemm 14603299c2f1SGregory Neil Shapiro #endif /* ! FSHIFT */ 1461c2aa98e2SPeter Wemm 1462c2aa98e2SPeter Wemm #ifndef FSHIFT 1463c2aa98e2SPeter Wemm # define FSHIFT 8 14643299c2f1SGregory Neil Shapiro #endif /* ! FSHIFT */ 1465c2aa98e2SPeter Wemm 1466c2aa98e2SPeter Wemm #ifndef FSCALE 1467c2aa98e2SPeter Wemm # define FSCALE (1 << FSHIFT) 14683299c2f1SGregory Neil Shapiro #endif /* ! FSCALE */ 1469c2aa98e2SPeter Wemm 1470c2aa98e2SPeter Wemm #ifndef LA_AVENRUN 1471c2aa98e2SPeter Wemm # ifdef SYSTEM5 1472c2aa98e2SPeter Wemm # define LA_AVENRUN "avenrun" 14733299c2f1SGregory Neil Shapiro # else /* SYSTEM5 */ 1474c2aa98e2SPeter Wemm # define LA_AVENRUN "_avenrun" 14753299c2f1SGregory Neil Shapiro # endif /* SYSTEM5 */ 14763299c2f1SGregory Neil Shapiro #endif /* ! LA_AVENRUN */ 1477c2aa98e2SPeter Wemm 1478c2aa98e2SPeter Wemm /* _PATH_KMEM should be defined in <paths.h> */ 1479c2aa98e2SPeter Wemm #ifndef _PATH_KMEM 1480c2aa98e2SPeter Wemm # define _PATH_KMEM "/dev/kmem" 14813299c2f1SGregory Neil Shapiro #endif /* ! _PATH_KMEM */ 1482c2aa98e2SPeter Wemm 1483188b7d28SGregory Neil Shapiro #if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) 1484c2aa98e2SPeter Wemm 1485c2aa98e2SPeter Wemm # include <nlist.h> 1486c2aa98e2SPeter Wemm 1487c2aa98e2SPeter Wemm /* _PATH_UNIX should be defined in <paths.h> */ 1488c2aa98e2SPeter Wemm # ifndef _PATH_UNIX 1489c2aa98e2SPeter Wemm # if defined(SYSTEM5) 1490c2aa98e2SPeter Wemm # define _PATH_UNIX "/unix" 14913299c2f1SGregory Neil Shapiro # else /* defined(SYSTEM5) */ 1492c2aa98e2SPeter Wemm # define _PATH_UNIX "/vmunix" 14933299c2f1SGregory Neil Shapiro # endif /* defined(SYSTEM5) */ 14943299c2f1SGregory Neil Shapiro # endif /* ! _PATH_UNIX */ 1495c2aa98e2SPeter Wemm 1496c2aa98e2SPeter Wemm # ifdef _AUX_SOURCE 1497c2aa98e2SPeter Wemm struct nlist Nl[2]; 14983299c2f1SGregory Neil Shapiro # else /* _AUX_SOURCE */ 1499c2aa98e2SPeter Wemm struct nlist Nl[] = 1500c2aa98e2SPeter Wemm { 1501c2aa98e2SPeter Wemm { LA_AVENRUN }, 1502c2aa98e2SPeter Wemm { 0 }, 1503c2aa98e2SPeter Wemm }; 15043299c2f1SGregory Neil Shapiro # endif /* _AUX_SOURCE */ 1505c2aa98e2SPeter Wemm # define X_AVENRUN 0 1506c2aa98e2SPeter Wemm 150712ed1c7cSGregory Neil Shapiro int 1508c2aa98e2SPeter Wemm getla() 1509c2aa98e2SPeter Wemm { 151012ed1c7cSGregory Neil Shapiro int j; 1511c2aa98e2SPeter Wemm static int kmem = -1; 1512c2aa98e2SPeter Wemm # if LA_TYPE == LA_INT 1513c2aa98e2SPeter Wemm long avenrun[3]; 15143299c2f1SGregory Neil Shapiro # else /* LA_TYPE == LA_INT */ 1515c2aa98e2SPeter Wemm # if LA_TYPE == LA_SHORT 1516c2aa98e2SPeter Wemm short avenrun[3]; 1517188b7d28SGregory Neil Shapiro # else 1518188b7d28SGregory Neil Shapiro # if LA_TYPE == LA_LONGLONG 1519188b7d28SGregory Neil Shapiro long long avenrun[3]; 1520188b7d28SGregory Neil Shapiro # else /* LA_TYPE == LA_LONGLONG */ 1521c2aa98e2SPeter Wemm double avenrun[3]; 1522188b7d28SGregory Neil Shapiro # endif /* LA_TYPE == LA_LONGLONG */ 15233299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_SHORT */ 15243299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_INT */ 1525c2aa98e2SPeter Wemm extern off_t lseek(); 1526c2aa98e2SPeter Wemm 1527c2aa98e2SPeter Wemm if (kmem < 0) 1528c2aa98e2SPeter Wemm { 1529c2aa98e2SPeter Wemm # ifdef _AUX_SOURCE 153012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN, 15313299c2f1SGregory Neil Shapiro sizeof Nl[X_AVENRUN].n_name); 1532c2aa98e2SPeter Wemm Nl[1].n_name[0] = '\0'; 15333299c2f1SGregory Neil Shapiro # endif /* _AUX_SOURCE */ 1534c2aa98e2SPeter Wemm 1535c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 1536c2aa98e2SPeter Wemm if (knlist(Nl, 1, sizeof Nl[0]) < 0) 15373299c2f1SGregory Neil Shapiro # else /* defined(_AIX3) || defined(_AIX4) */ 1538c2aa98e2SPeter Wemm if (nlist(_PATH_UNIX, Nl) < 0) 15393299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 1540c2aa98e2SPeter Wemm { 1541c2aa98e2SPeter Wemm if (tTd(3, 1)) 154212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: nlist(%s): %s\n", _PATH_UNIX, 154312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15443299c2f1SGregory Neil Shapiro return -1; 1545c2aa98e2SPeter Wemm } 1546c2aa98e2SPeter Wemm if (Nl[X_AVENRUN].n_value == 0) 1547c2aa98e2SPeter Wemm { 1548c2aa98e2SPeter Wemm if (tTd(3, 1)) 154912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: nlist(%s, %s) ==> 0\n", 1550c2aa98e2SPeter Wemm _PATH_UNIX, LA_AVENRUN); 15513299c2f1SGregory Neil Shapiro return -1; 1552c2aa98e2SPeter Wemm } 1553c2aa98e2SPeter Wemm # ifdef NAMELISTMASK 1554c2aa98e2SPeter Wemm Nl[X_AVENRUN].n_value &= NAMELISTMASK; 15553299c2f1SGregory Neil Shapiro # endif /* NAMELISTMASK */ 1556c2aa98e2SPeter Wemm 1557c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, 0, 0); 1558c2aa98e2SPeter Wemm if (kmem < 0) 1559c2aa98e2SPeter Wemm { 1560c2aa98e2SPeter Wemm if (tTd(3, 1)) 156112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(/dev/kmem): %s\n", 156212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15633299c2f1SGregory Neil Shapiro return -1; 1564c2aa98e2SPeter Wemm } 156512ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 156612ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 156712ed1c7cSGregory Neil Shapiro { 156812ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 156912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 157012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 157112ed1c7cSGregory Neil Shapiro (void) close(kmem); 157212ed1c7cSGregory Neil Shapiro kmem = -1; 157312ed1c7cSGregory Neil Shapiro return -1; 157412ed1c7cSGregory Neil Shapiro } 1575c2aa98e2SPeter Wemm } 1576c2aa98e2SPeter Wemm if (tTd(3, 20)) 157712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: symbol address = %#lx\n", 157812ed1c7cSGregory Neil Shapiro (unsigned long) Nl[X_AVENRUN].n_value); 1579c2aa98e2SPeter Wemm if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 || 1580c2aa98e2SPeter Wemm read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) 1581c2aa98e2SPeter Wemm { 1582c2aa98e2SPeter Wemm /* thank you Ian */ 1583c2aa98e2SPeter Wemm if (tTd(3, 1)) 158412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: lseek or read: %s\n", 158512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15863299c2f1SGregory Neil Shapiro return -1; 1587c2aa98e2SPeter Wemm } 1588188b7d28SGregory Neil Shapiro # if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) 1589c2aa98e2SPeter Wemm if (tTd(3, 5)) 1590c2aa98e2SPeter Wemm { 1591c2aa98e2SPeter Wemm # if LA_TYPE == LA_SHORT 159212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d", avenrun[0]); 1593c2aa98e2SPeter Wemm if (tTd(3, 15)) 159412ed1c7cSGregory Neil Shapiro sm_dprintf(", %d, %d", avenrun[1], avenrun[2]); 15953299c2f1SGregory Neil Shapiro # else /* LA_TYPE == LA_SHORT */ 1596188b7d28SGregory Neil Shapiro # if LA_TYPE == LA_LONGLONG 1597188b7d28SGregory Neil Shapiro sm_dprintf("getla: avenrun = %lld", avenrun[0]); 1598188b7d28SGregory Neil Shapiro if (tTd(3, 15)) 1599188b7d28SGregory Neil Shapiro sm_dprintf(", %lld, %lld", avenrun[1], avenrun[2]); 1600188b7d28SGregory Neil Shapiro # else /* LA_TYPE == LA_LONGLONG */ 160112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %ld", avenrun[0]); 1602c2aa98e2SPeter Wemm if (tTd(3, 15)) 160312ed1c7cSGregory Neil Shapiro sm_dprintf(", %ld, %ld", avenrun[1], avenrun[2]); 1604188b7d28SGregory Neil Shapiro # endif /* LA_TYPE == LA_LONGLONG */ 16053299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_SHORT */ 160612ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1607c2aa98e2SPeter Wemm } 1608c2aa98e2SPeter Wemm if (tTd(3, 1)) 160912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 16103299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1611c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1612188b7d28SGregory Neil Shapiro # else /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */ 1613c2aa98e2SPeter Wemm if (tTd(3, 5)) 1614c2aa98e2SPeter Wemm { 161512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %g", avenrun[0]); 1616c2aa98e2SPeter Wemm if (tTd(3, 15)) 161712ed1c7cSGregory Neil Shapiro sm_dprintf(", %g, %g", avenrun[1], avenrun[2]); 161812ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1619c2aa98e2SPeter Wemm } 1620c2aa98e2SPeter Wemm if (tTd(3, 1)) 162112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 1622c2aa98e2SPeter Wemm return ((int) (avenrun[0] + 0.5)); 1623188b7d28SGregory Neil Shapiro # endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */ 1624c2aa98e2SPeter Wemm } 1625c2aa98e2SPeter Wemm 1626188b7d28SGregory Neil Shapiro #endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */ 1627c2aa98e2SPeter Wemm 1628c2aa98e2SPeter Wemm #if LA_TYPE == LA_READKSYM 1629c2aa98e2SPeter Wemm 1630c2aa98e2SPeter Wemm # include <sys/ksym.h> 1631c2aa98e2SPeter Wemm 163212ed1c7cSGregory Neil Shapiro int 1633c2aa98e2SPeter Wemm getla() 1634c2aa98e2SPeter Wemm { 163512ed1c7cSGregory Neil Shapiro int j; 1636c2aa98e2SPeter Wemm static int kmem = -1; 1637c2aa98e2SPeter Wemm long avenrun[3]; 1638c2aa98e2SPeter Wemm struct mioc_rksym mirk; 1639c2aa98e2SPeter Wemm 1640c2aa98e2SPeter Wemm if (kmem < 0) 1641c2aa98e2SPeter Wemm { 1642c2aa98e2SPeter Wemm kmem = open("/dev/kmem", 0, 0); 1643c2aa98e2SPeter Wemm if (kmem < 0) 1644c2aa98e2SPeter Wemm { 1645c2aa98e2SPeter Wemm if (tTd(3, 1)) 164612ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(/dev/kmem): %s\n", 164712ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 16483299c2f1SGregory Neil Shapiro return -1; 1649c2aa98e2SPeter Wemm } 165012ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 165112ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 165212ed1c7cSGregory Neil Shapiro { 165312ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 165412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 165512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 165612ed1c7cSGregory Neil Shapiro (void) close(kmem); 165712ed1c7cSGregory Neil Shapiro kmem = -1; 165812ed1c7cSGregory Neil Shapiro return -1; 165912ed1c7cSGregory Neil Shapiro } 1660c2aa98e2SPeter Wemm } 1661c2aa98e2SPeter Wemm mirk.mirk_symname = LA_AVENRUN; 1662c2aa98e2SPeter Wemm mirk.mirk_buf = avenrun; 1663c2aa98e2SPeter Wemm mirk.mirk_buflen = sizeof(avenrun); 1664c2aa98e2SPeter Wemm if (ioctl(kmem, MIOC_READKSYM, &mirk) < 0) 1665c2aa98e2SPeter Wemm { 1666c2aa98e2SPeter Wemm if (tTd(3, 1)) 166712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: ioctl(MIOC_READKSYM) failed: %s\n", 166812ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1669c2aa98e2SPeter Wemm return -1; 1670c2aa98e2SPeter Wemm } 1671c2aa98e2SPeter Wemm if (tTd(3, 5)) 1672c2aa98e2SPeter Wemm { 167312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d", avenrun[0]); 1674c2aa98e2SPeter Wemm if (tTd(3, 15)) 167512ed1c7cSGregory Neil Shapiro sm_dprintf(", %d, %d", avenrun[1], avenrun[2]); 167612ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1677c2aa98e2SPeter Wemm } 1678c2aa98e2SPeter Wemm if (tTd(3, 1)) 167912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 16803299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1681c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1682c2aa98e2SPeter Wemm } 1683c2aa98e2SPeter Wemm 1684c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_READKSYM */ 1685c2aa98e2SPeter Wemm 1686c2aa98e2SPeter Wemm #if LA_TYPE == LA_DGUX 1687c2aa98e2SPeter Wemm 1688c2aa98e2SPeter Wemm # include <sys/dg_sys_info.h> 1689c2aa98e2SPeter Wemm 169012ed1c7cSGregory Neil Shapiro int 1691c2aa98e2SPeter Wemm getla() 1692c2aa98e2SPeter Wemm { 1693c2aa98e2SPeter Wemm struct dg_sys_info_load_info load_info; 1694c2aa98e2SPeter Wemm 1695c2aa98e2SPeter Wemm dg_sys_info((long *)&load_info, 1696c2aa98e2SPeter Wemm DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0); 1697c2aa98e2SPeter Wemm 1698c2aa98e2SPeter Wemm if (tTd(3, 1)) 169912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (load_info.one_minute + 0.5)); 1700c2aa98e2SPeter Wemm 1701c2aa98e2SPeter Wemm return ((int) (load_info.one_minute + 0.5)); 1702c2aa98e2SPeter Wemm } 1703c2aa98e2SPeter Wemm 1704c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_DGUX */ 1705c2aa98e2SPeter Wemm 1706c2aa98e2SPeter Wemm #if LA_TYPE == LA_HPUX 1707c2aa98e2SPeter Wemm 1708c2aa98e2SPeter Wemm /* forward declarations to keep gcc from complaining */ 1709c2aa98e2SPeter Wemm struct pst_dynamic; 1710c2aa98e2SPeter Wemm struct pst_status; 1711c2aa98e2SPeter Wemm struct pst_static; 1712c2aa98e2SPeter Wemm struct pst_vminfo; 1713c2aa98e2SPeter Wemm struct pst_diskinfo; 1714c2aa98e2SPeter Wemm struct pst_processor; 1715c2aa98e2SPeter Wemm struct pst_lv; 1716c2aa98e2SPeter Wemm struct pst_swapinfo; 1717c2aa98e2SPeter Wemm 1718c2aa98e2SPeter Wemm # include <sys/param.h> 1719c2aa98e2SPeter Wemm # include <sys/pstat.h> 1720c2aa98e2SPeter Wemm 172112ed1c7cSGregory Neil Shapiro int 1722c2aa98e2SPeter Wemm getla() 1723c2aa98e2SPeter Wemm { 1724c2aa98e2SPeter Wemm struct pst_dynamic pstd; 1725c2aa98e2SPeter Wemm 1726c2aa98e2SPeter Wemm if (pstat_getdynamic(&pstd, sizeof(struct pst_dynamic), 1727c2aa98e2SPeter Wemm (size_t) 1, 0) == -1) 1728c2aa98e2SPeter Wemm return 0; 1729c2aa98e2SPeter Wemm 1730c2aa98e2SPeter Wemm if (tTd(3, 1)) 173112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (pstd.psd_avg_1_min + 0.5)); 1732c2aa98e2SPeter Wemm 1733c2aa98e2SPeter Wemm return (int) (pstd.psd_avg_1_min + 0.5); 1734c2aa98e2SPeter Wemm } 1735c2aa98e2SPeter Wemm 1736c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_HPUX */ 1737c2aa98e2SPeter Wemm 1738c2aa98e2SPeter Wemm #if LA_TYPE == LA_SUBR 1739c2aa98e2SPeter Wemm 174012ed1c7cSGregory Neil Shapiro int 1741c2aa98e2SPeter Wemm getla() 1742c2aa98e2SPeter Wemm { 1743c2aa98e2SPeter Wemm double avenrun[3]; 1744c2aa98e2SPeter Wemm 1745c2aa98e2SPeter Wemm if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) < 0) 1746c2aa98e2SPeter Wemm { 1747c2aa98e2SPeter Wemm if (tTd(3, 1)) 174812ed1c7cSGregory Neil Shapiro sm_dprintf("getla: getloadavg failed: %s", 174912ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 17503299c2f1SGregory Neil Shapiro return -1; 1751c2aa98e2SPeter Wemm } 1752c2aa98e2SPeter Wemm if (tTd(3, 1)) 175312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 1754c2aa98e2SPeter Wemm return ((int) (avenrun[0] + 0.5)); 1755c2aa98e2SPeter Wemm } 1756c2aa98e2SPeter Wemm 1757c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_SUBR */ 1758c2aa98e2SPeter Wemm 1759c2aa98e2SPeter Wemm #if LA_TYPE == LA_MACH 1760c2aa98e2SPeter Wemm 1761c2aa98e2SPeter Wemm /* 1762c2aa98e2SPeter Wemm ** This has been tested on NEXTSTEP release 2.1/3.X. 1763c2aa98e2SPeter Wemm */ 1764c2aa98e2SPeter Wemm 1765c2aa98e2SPeter Wemm # if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 1766c2aa98e2SPeter Wemm # include <mach/mach.h> 17673299c2f1SGregory Neil Shapiro # else /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */ 1768c2aa98e2SPeter Wemm # include <mach.h> 17693299c2f1SGregory Neil Shapiro # endif /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */ 1770c2aa98e2SPeter Wemm 177112ed1c7cSGregory Neil Shapiro int 1772c2aa98e2SPeter Wemm getla() 1773c2aa98e2SPeter Wemm { 1774c2aa98e2SPeter Wemm processor_set_t default_set; 1775c2aa98e2SPeter Wemm kern_return_t error; 1776c2aa98e2SPeter Wemm unsigned int info_count; 1777c2aa98e2SPeter Wemm struct processor_set_basic_info info; 1778c2aa98e2SPeter Wemm host_t host; 1779c2aa98e2SPeter Wemm 1780c2aa98e2SPeter Wemm error = processor_set_default(host_self(), &default_set); 1781c2aa98e2SPeter Wemm if (error != KERN_SUCCESS) 1782c2aa98e2SPeter Wemm { 1783c2aa98e2SPeter Wemm if (tTd(3, 1)) 178412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: processor_set_default failed: %s", 178512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1786c2aa98e2SPeter Wemm return -1; 1787c2aa98e2SPeter Wemm } 1788c2aa98e2SPeter Wemm info_count = PROCESSOR_SET_BASIC_INFO_COUNT; 1789c2aa98e2SPeter Wemm if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO, 1790c2aa98e2SPeter Wemm &host, (processor_set_info_t)&info, 1791c2aa98e2SPeter Wemm &info_count) != KERN_SUCCESS) 1792c2aa98e2SPeter Wemm { 1793c2aa98e2SPeter Wemm if (tTd(3, 1)) 179412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: processor_set_info failed: %s", 179512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1796c2aa98e2SPeter Wemm return -1; 1797c2aa98e2SPeter Wemm } 1798c2aa98e2SPeter Wemm if (tTd(3, 1)) 179912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 18003299c2f1SGregory Neil Shapiro (int) ((info.load_average + (LOAD_SCALE / 2)) / 18013299c2f1SGregory Neil Shapiro LOAD_SCALE)); 1802c2aa98e2SPeter Wemm return (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE; 1803c2aa98e2SPeter Wemm } 1804c2aa98e2SPeter Wemm 1805c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_MACH */ 1806c2aa98e2SPeter Wemm 1807c2aa98e2SPeter Wemm #if LA_TYPE == LA_PROCSTR 180812ed1c7cSGregory Neil Shapiro # if SM_CONF_BROKEN_STRTOD 180912ed1c7cSGregory Neil Shapiro ERROR: This OS has most likely a broken strtod() implemenentation. 181012ed1c7cSGregory Neil Shapiro ERROR: The function is required for getla(). 181112ed1c7cSGregory Neil Shapiro ERROR: Check the compilation options _LA_PROCSTR and 181212ed1c7cSGregory Neil Shapiro ERROR: _SM_CONF_BROKEN_STRTOD (without the leading _). 181312ed1c7cSGregory Neil Shapiro # endif /* SM_CONF_BROKEN_STRTOD */ 1814c2aa98e2SPeter Wemm 1815c2aa98e2SPeter Wemm /* 1816c2aa98e2SPeter Wemm ** Read /proc/loadavg for the load average. This is assumed to be 1817c2aa98e2SPeter Wemm ** in a format like "0.15 0.12 0.06". 1818c2aa98e2SPeter Wemm ** 1819c2aa98e2SPeter Wemm ** Initially intended for Linux. This has been in the kernel 1820c2aa98e2SPeter Wemm ** since at least 0.99.15. 1821c2aa98e2SPeter Wemm */ 1822c2aa98e2SPeter Wemm 1823c2aa98e2SPeter Wemm # ifndef _PATH_LOADAVG 1824c2aa98e2SPeter Wemm # define _PATH_LOADAVG "/proc/loadavg" 18253299c2f1SGregory Neil Shapiro # endif /* ! _PATH_LOADAVG */ 1826c2aa98e2SPeter Wemm 182712ed1c7cSGregory Neil Shapiro int 1828c2aa98e2SPeter Wemm getla() 1829c2aa98e2SPeter Wemm { 1830c2aa98e2SPeter Wemm double avenrun; 1831c2aa98e2SPeter Wemm register int result; 183212ed1c7cSGregory Neil Shapiro SM_FILE_T *fp; 1833c2aa98e2SPeter Wemm 183412ed1c7cSGregory Neil Shapiro fp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_LOADAVG, SM_IO_RDONLY, 183512ed1c7cSGregory Neil Shapiro NULL); 1836c2aa98e2SPeter Wemm if (fp == NULL) 1837c2aa98e2SPeter Wemm { 1838c2aa98e2SPeter Wemm if (tTd(3, 1)) 183912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: sm_io_open(%s): %s\n", 184012ed1c7cSGregory Neil Shapiro _PATH_LOADAVG, sm_errstring(errno)); 1841c2aa98e2SPeter Wemm return -1; 1842c2aa98e2SPeter Wemm } 184312ed1c7cSGregory Neil Shapiro result = sm_io_fscanf(fp, SM_TIME_DEFAULT, "%lf", &avenrun); 184412ed1c7cSGregory Neil Shapiro (void) sm_io_close(fp, SM_TIME_DEFAULT); 1845c2aa98e2SPeter Wemm if (result != 1) 1846c2aa98e2SPeter Wemm { 1847c2aa98e2SPeter Wemm if (tTd(3, 1)) 184812ed1c7cSGregory Neil Shapiro sm_dprintf("getla: sm_io_fscanf() = %d: %s\n", 184912ed1c7cSGregory Neil Shapiro result, sm_errstring(errno)); 1850c2aa98e2SPeter Wemm return -1; 1851c2aa98e2SPeter Wemm } 1852c2aa98e2SPeter Wemm 1853c2aa98e2SPeter Wemm if (tTd(3, 1)) 185412ed1c7cSGregory Neil Shapiro sm_dprintf("getla(): %.2f\n", avenrun); 1855c2aa98e2SPeter Wemm 1856c2aa98e2SPeter Wemm return ((int) (avenrun + 0.5)); 1857c2aa98e2SPeter Wemm } 1858c2aa98e2SPeter Wemm 1859c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_PROCSTR */ 1860c2aa98e2SPeter Wemm 1861c2aa98e2SPeter Wemm #if LA_TYPE == LA_IRIX6 18623299c2f1SGregory Neil Shapiro 1863c2aa98e2SPeter Wemm # include <sys/sysmp.h> 1864c2aa98e2SPeter Wemm 1865bfb62e91SGregory Neil Shapiro # ifdef _UNICOSMP 1866bfb62e91SGregory Neil Shapiro # define CAST_SYSMP(x) (x) 1867bfb62e91SGregory Neil Shapiro # else /* _UNICOSMP */ 1868bfb62e91SGregory Neil Shapiro # define CAST_SYSMP(x) ((x) & 0x7fffffff) 1869bfb62e91SGregory Neil Shapiro # endif /* _UNICOSMP */ 1870bfb62e91SGregory Neil Shapiro 187112ed1c7cSGregory Neil Shapiro int 187212ed1c7cSGregory Neil Shapiro getla(void) 1873c2aa98e2SPeter Wemm { 187412ed1c7cSGregory Neil Shapiro int j; 1875c2aa98e2SPeter Wemm static int kmem = -1; 1876c2aa98e2SPeter Wemm int avenrun[3]; 1877c2aa98e2SPeter Wemm 1878c2aa98e2SPeter Wemm if (kmem < 0) 1879c2aa98e2SPeter Wemm { 1880c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, 0, 0); 1881c2aa98e2SPeter Wemm if (kmem < 0) 1882c2aa98e2SPeter Wemm { 1883c2aa98e2SPeter Wemm if (tTd(3, 1)) 188412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(%s): %s\n", _PATH_KMEM, 188512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1886c2aa98e2SPeter Wemm return -1; 1887c2aa98e2SPeter Wemm } 188812ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 188912ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 189012ed1c7cSGregory Neil Shapiro { 189112ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 189212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 189312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 189412ed1c7cSGregory Neil Shapiro (void) close(kmem); 189512ed1c7cSGregory Neil Shapiro kmem = -1; 189612ed1c7cSGregory Neil Shapiro return -1; 189712ed1c7cSGregory Neil Shapiro } 1898c2aa98e2SPeter Wemm } 1899c2aa98e2SPeter Wemm 1900bfb62e91SGregory Neil Shapiro if (lseek(kmem, CAST_SYSMP(sysmp(MP_KERNADDR, MPKA_AVENRUN)), SEEK_SET) 1901bfb62e91SGregory Neil Shapiro == -1 || 1902c2aa98e2SPeter Wemm read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) 1903c2aa98e2SPeter Wemm { 1904c2aa98e2SPeter Wemm if (tTd(3, 1)) 190512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: lseek or read: %s\n", 190612ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1907c2aa98e2SPeter Wemm return -1; 1908c2aa98e2SPeter Wemm } 1909c2aa98e2SPeter Wemm if (tTd(3, 5)) 1910c2aa98e2SPeter Wemm { 191112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %ld", (long int) avenrun[0]); 1912c2aa98e2SPeter Wemm if (tTd(3, 15)) 191312ed1c7cSGregory Neil Shapiro sm_dprintf(", %ld, %ld", 1914c2aa98e2SPeter Wemm (long int) avenrun[1], (long int) avenrun[2]); 191512ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1916c2aa98e2SPeter Wemm } 1917c2aa98e2SPeter Wemm 1918c2aa98e2SPeter Wemm if (tTd(3, 1)) 191912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 19203299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1921c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1922c2aa98e2SPeter Wemm 1923c2aa98e2SPeter Wemm } 19243299c2f1SGregory Neil Shapiro #endif /* LA_TYPE == LA_IRIX6 */ 1925c2aa98e2SPeter Wemm 1926c2aa98e2SPeter Wemm #if LA_TYPE == LA_KSTAT 1927c2aa98e2SPeter Wemm 1928c2aa98e2SPeter Wemm # include <kstat.h> 1929c2aa98e2SPeter Wemm 193012ed1c7cSGregory Neil Shapiro int 1931c2aa98e2SPeter Wemm getla() 1932c2aa98e2SPeter Wemm { 1933c2aa98e2SPeter Wemm static kstat_ctl_t *kc = NULL; 1934c2aa98e2SPeter Wemm static kstat_t *ksp = NULL; 1935c2aa98e2SPeter Wemm kstat_named_t *ksn; 1936c2aa98e2SPeter Wemm int la; 1937c2aa98e2SPeter Wemm 1938c2aa98e2SPeter Wemm if (kc == NULL) /* if not initialized before */ 1939c2aa98e2SPeter Wemm kc = kstat_open(); 1940c2aa98e2SPeter Wemm if (kc == NULL) 1941c2aa98e2SPeter Wemm { 1942c2aa98e2SPeter Wemm if (tTd(3, 1)) 194312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_open(): %s\n", 194412ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1945c2aa98e2SPeter Wemm return -1; 1946c2aa98e2SPeter Wemm } 1947c2aa98e2SPeter Wemm if (ksp == NULL) 1948c2aa98e2SPeter Wemm ksp = kstat_lookup(kc, "unix", 0, "system_misc"); 1949c2aa98e2SPeter Wemm if (ksp == NULL) 1950c2aa98e2SPeter Wemm { 1951c2aa98e2SPeter Wemm if (tTd(3, 1)) 195212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_lookup(): %s\n", 195312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1954c2aa98e2SPeter Wemm return -1; 1955c2aa98e2SPeter Wemm } 1956c2aa98e2SPeter Wemm if (kstat_read(kc, ksp, NULL) < 0) 1957c2aa98e2SPeter Wemm { 1958c2aa98e2SPeter Wemm if (tTd(3, 1)) 195912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_read(): %s\n", 196012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1961c2aa98e2SPeter Wemm return -1; 1962c2aa98e2SPeter Wemm } 1963c2aa98e2SPeter Wemm ksn = (kstat_named_t *) kstat_data_lookup(ksp, "avenrun_1min"); 1964c2aa98e2SPeter Wemm la = ((double) ksn->value.ul + FSCALE/2) / FSCALE; 1965c2aa98e2SPeter Wemm /* kstat_close(kc); /o do not close for fast access */ 1966c2aa98e2SPeter Wemm return la; 1967c2aa98e2SPeter Wemm } 1968c2aa98e2SPeter Wemm 1969c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_KSTAT */ 1970c2aa98e2SPeter Wemm 1971c2aa98e2SPeter Wemm #if LA_TYPE == LA_DEVSHORT 1972c2aa98e2SPeter Wemm 1973c2aa98e2SPeter Wemm /* 1974c2aa98e2SPeter Wemm ** Read /dev/table/avenrun for the load average. This should contain 1975c2aa98e2SPeter Wemm ** three shorts for the 1, 5, and 15 minute loads. We only read the 1976c2aa98e2SPeter Wemm ** first, since that's all we care about. 1977c2aa98e2SPeter Wemm ** 1978c2aa98e2SPeter Wemm ** Intended for SCO OpenServer 5. 1979c2aa98e2SPeter Wemm */ 1980c2aa98e2SPeter Wemm 1981c2aa98e2SPeter Wemm # ifndef _PATH_AVENRUN 1982c2aa98e2SPeter Wemm # define _PATH_AVENRUN "/dev/table/avenrun" 19833299c2f1SGregory Neil Shapiro # endif /* ! _PATH_AVENRUN */ 1984c2aa98e2SPeter Wemm 198512ed1c7cSGregory Neil Shapiro int 1986c2aa98e2SPeter Wemm getla() 1987c2aa98e2SPeter Wemm { 1988c2aa98e2SPeter Wemm static int afd = -1; 1989c2aa98e2SPeter Wemm short avenrun; 1990c2aa98e2SPeter Wemm int loadav; 1991c2aa98e2SPeter Wemm int r; 1992c2aa98e2SPeter Wemm 1993c2aa98e2SPeter Wemm errno = EBADF; 1994c2aa98e2SPeter Wemm 1995c2aa98e2SPeter Wemm if (afd == -1 || lseek(afd, 0L, SEEK_SET) == -1) 1996c2aa98e2SPeter Wemm { 1997c2aa98e2SPeter Wemm if (errno != EBADF) 1998c2aa98e2SPeter Wemm return -1; 1999c2aa98e2SPeter Wemm afd = open(_PATH_AVENRUN, O_RDONLY|O_SYNC); 2000c2aa98e2SPeter Wemm if (afd < 0) 2001c2aa98e2SPeter Wemm { 2002c2aa98e2SPeter Wemm sm_syslog(LOG_ERR, NOQID, 200312ed1c7cSGregory Neil Shapiro "can't open %s: %s", 200412ed1c7cSGregory Neil Shapiro _PATH_AVENRUN, sm_errstring(errno)); 2005c2aa98e2SPeter Wemm return -1; 2006c2aa98e2SPeter Wemm } 2007c2aa98e2SPeter Wemm } 2008c2aa98e2SPeter Wemm 2009c2aa98e2SPeter Wemm r = read(afd, &avenrun, sizeof avenrun); 2010c2aa98e2SPeter Wemm 2011c2aa98e2SPeter Wemm if (tTd(3, 5)) 201212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d\n", avenrun); 2013c2aa98e2SPeter Wemm loadav = (int) (avenrun + FSCALE/2) >> FSHIFT; 2014c2aa98e2SPeter Wemm if (tTd(3, 1)) 201512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", loadav); 2016c2aa98e2SPeter Wemm return loadav; 2017c2aa98e2SPeter Wemm } 2018c2aa98e2SPeter Wemm 2019c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_DEVSHORT */ 2020c2aa98e2SPeter Wemm 2021c2aa98e2SPeter Wemm #if LA_TYPE == LA_ALPHAOSF 2022c2aa98e2SPeter Wemm struct rtentry; 2023c2aa98e2SPeter Wemm struct mbuf; 2024c2aa98e2SPeter Wemm # include <sys/table.h> 2025c2aa98e2SPeter Wemm 202612ed1c7cSGregory Neil Shapiro int 202712ed1c7cSGregory Neil Shapiro getla() 2028c2aa98e2SPeter Wemm { 2029c2aa98e2SPeter Wemm int ave = 0; 2030c2aa98e2SPeter Wemm struct tbl_loadavg tab; 2031c2aa98e2SPeter Wemm 2032c2aa98e2SPeter Wemm if (table(TBL_LOADAVG, 0, &tab, 1, sizeof(tab)) == -1) 2033c2aa98e2SPeter Wemm { 2034c2aa98e2SPeter Wemm if (tTd(3, 1)) 203512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: table %s\n", sm_errstring(errno)); 20363299c2f1SGregory Neil Shapiro return -1; 2037c2aa98e2SPeter Wemm } 2038c2aa98e2SPeter Wemm 2039c2aa98e2SPeter Wemm if (tTd(3, 1)) 204012ed1c7cSGregory Neil Shapiro sm_dprintf("getla: scale = %d\n", tab.tl_lscale); 2041c2aa98e2SPeter Wemm 2042c2aa98e2SPeter Wemm if (tab.tl_lscale) 20433299c2f1SGregory Neil Shapiro ave = ((tab.tl_avenrun.l[2] + (tab.tl_lscale/2)) / 20443299c2f1SGregory Neil Shapiro tab.tl_lscale); 2045c2aa98e2SPeter Wemm else 20463299c2f1SGregory Neil Shapiro ave = (int) (tab.tl_avenrun.d[2] + 0.5); 2047c2aa98e2SPeter Wemm 2048c2aa98e2SPeter Wemm if (tTd(3, 1)) 204912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", ave); 2050c2aa98e2SPeter Wemm 2051c2aa98e2SPeter Wemm return ave; 2052c2aa98e2SPeter Wemm } 2053c2aa98e2SPeter Wemm 20543299c2f1SGregory Neil Shapiro #endif /* LA_TYPE == LA_ALPHAOSF */ 2055c2aa98e2SPeter Wemm 2056c46d91b7SGregory Neil Shapiro #if LA_TYPE == LA_PSET 2057c46d91b7SGregory Neil Shapiro 205812ed1c7cSGregory Neil Shapiro int 2059c46d91b7SGregory Neil Shapiro getla() 2060c46d91b7SGregory Neil Shapiro { 2061c46d91b7SGregory Neil Shapiro double avenrun[3]; 2062c46d91b7SGregory Neil Shapiro 2063c46d91b7SGregory Neil Shapiro if (pset_getloadavg(PS_MYID, avenrun, 2064c46d91b7SGregory Neil Shapiro sizeof(avenrun) / sizeof(avenrun[0])) < 0) 2065c46d91b7SGregory Neil Shapiro { 2066c46d91b7SGregory Neil Shapiro if (tTd(3, 1)) 206712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: pset_getloadavg failed: %s", 206812ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 2069c46d91b7SGregory Neil Shapiro return -1; 2070c46d91b7SGregory Neil Shapiro } 2071c46d91b7SGregory Neil Shapiro if (tTd(3, 1)) 207212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 2073c46d91b7SGregory Neil Shapiro return ((int) (avenrun[0] + 0.5)); 2074c46d91b7SGregory Neil Shapiro } 2075c46d91b7SGregory Neil Shapiro 2076c46d91b7SGregory Neil Shapiro #endif /* LA_TYPE == LA_PSET */ 2077c46d91b7SGregory Neil Shapiro 2078c2aa98e2SPeter Wemm #if LA_TYPE == LA_ZERO 2079c2aa98e2SPeter Wemm 208012ed1c7cSGregory Neil Shapiro int 2081c2aa98e2SPeter Wemm getla() 2082c2aa98e2SPeter Wemm { 2083c2aa98e2SPeter Wemm if (tTd(3, 1)) 208412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: ZERO\n"); 20853299c2f1SGregory Neil Shapiro return 0; 2086c2aa98e2SPeter Wemm } 2087c2aa98e2SPeter Wemm 2088c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_ZERO */ 2089c2aa98e2SPeter Wemm 2090c2aa98e2SPeter Wemm /* 2091c2aa98e2SPeter Wemm * Copyright 1989 Massachusetts Institute of Technology 2092c2aa98e2SPeter Wemm * 2093c2aa98e2SPeter Wemm * Permission to use, copy, modify, distribute, and sell this software and its 2094c2aa98e2SPeter Wemm * documentation for any purpose is hereby granted without fee, provided that 2095c2aa98e2SPeter Wemm * the above copyright notice appear in all copies and that both that 2096c2aa98e2SPeter Wemm * copyright notice and this permission notice appear in supporting 2097c2aa98e2SPeter Wemm * documentation, and that the name of M.I.T. not be used in advertising or 2098c2aa98e2SPeter Wemm * publicity pertaining to distribution of the software without specific, 2099c2aa98e2SPeter Wemm * written prior permission. M.I.T. makes no representations about the 2100c2aa98e2SPeter Wemm * suitability of this software for any purpose. It is provided "as is" 2101c2aa98e2SPeter Wemm * without express or implied warranty. 2102c2aa98e2SPeter Wemm * 2103c2aa98e2SPeter Wemm * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL 2104c2aa98e2SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. 2105c2aa98e2SPeter Wemm * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 2106c2aa98e2SPeter Wemm * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 2107c2aa98e2SPeter Wemm * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 2108c2aa98e2SPeter Wemm * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 2109c2aa98e2SPeter Wemm * 2110c2aa98e2SPeter Wemm * Authors: Many and varied... 2111c2aa98e2SPeter Wemm */ 2112c2aa98e2SPeter Wemm 2113c2aa98e2SPeter Wemm /* Non Apollo stuff removed by Don Lewis 11/15/93 */ 2114c2aa98e2SPeter Wemm #ifndef lint 211512ed1c7cSGregory Neil Shapiro SM_UNUSED(static char rcsid[]) = "@(#)$OrigId: getloadavg.c,v 1.16 1991/06/21 12:51:15 paul Exp $"; 2116c2aa98e2SPeter Wemm #endif /* ! lint */ 2117c2aa98e2SPeter Wemm 2118c2aa98e2SPeter Wemm #ifdef apollo 2119c2aa98e2SPeter Wemm # undef volatile 2120c2aa98e2SPeter Wemm # include <apollo/base.h> 2121c2aa98e2SPeter Wemm 2122c2aa98e2SPeter Wemm /* ARGSUSED */ 2123c2aa98e2SPeter Wemm int getloadavg( call_data ) 2124c2aa98e2SPeter Wemm caddr_t call_data; /* pointer to (double) return value */ 2125c2aa98e2SPeter Wemm { 2126c2aa98e2SPeter Wemm double *avenrun = (double *) call_data; 2127c2aa98e2SPeter Wemm int i; 2128c2aa98e2SPeter Wemm status_$t st; 2129c2aa98e2SPeter Wemm long loadav[3]; 213012ed1c7cSGregory Neil Shapiro 2131c2aa98e2SPeter Wemm proc1_$get_loadav(loadav, &st); 2132c2aa98e2SPeter Wemm *avenrun = loadav[0] / (double) (1 << 16); 21333299c2f1SGregory Neil Shapiro return 0; 2134c2aa98e2SPeter Wemm } 2135c2aa98e2SPeter Wemm #endif /* apollo */ 213612ed1c7cSGregory Neil Shapiro /* 213712ed1c7cSGregory Neil Shapiro ** SM_GETLA -- get the current load average 21383299c2f1SGregory Neil Shapiro ** 21393299c2f1SGregory Neil Shapiro ** Parameters: 214012ed1c7cSGregory Neil Shapiro ** none 21413299c2f1SGregory Neil Shapiro ** 21423299c2f1SGregory Neil Shapiro ** Returns: 214312ed1c7cSGregory Neil Shapiro ** none 21443299c2f1SGregory Neil Shapiro ** 21453299c2f1SGregory Neil Shapiro ** Side Effects: 214612ed1c7cSGregory Neil Shapiro ** Set CurrentLA to the current load average. 214712ed1c7cSGregory Neil Shapiro ** Set {load_avg} in GlobalMacros to the current load average. 21483299c2f1SGregory Neil Shapiro */ 21493299c2f1SGregory Neil Shapiro 215012ed1c7cSGregory Neil Shapiro void 215112ed1c7cSGregory Neil Shapiro sm_getla() 21523299c2f1SGregory Neil Shapiro { 21533299c2f1SGregory Neil Shapiro char labuf[8]; 21543299c2f1SGregory Neil Shapiro 215512ed1c7cSGregory Neil Shapiro CurrentLA = getla(); 215612ed1c7cSGregory Neil Shapiro (void) sm_snprintf(labuf, sizeof labuf, "%d", CurrentLA); 215712ed1c7cSGregory Neil Shapiro macdefine(&GlobalMacros, A_TEMP, macid("{load_avg}"), labuf); 21583299c2f1SGregory Neil Shapiro } 215912ed1c7cSGregory Neil Shapiro /* 2160c2aa98e2SPeter Wemm ** SHOULDQUEUE -- should this message be queued or sent? 2161c2aa98e2SPeter Wemm ** 2162c2aa98e2SPeter Wemm ** Compares the message cost to the load average to decide. 2163c2aa98e2SPeter Wemm ** 216412ed1c7cSGregory Neil Shapiro ** Note: Do NOT change this API! It is documented in op.me 216512ed1c7cSGregory Neil Shapiro ** and theoretically the user can change this function... 216612ed1c7cSGregory Neil Shapiro ** 2167c2aa98e2SPeter Wemm ** Parameters: 2168c2aa98e2SPeter Wemm ** pri -- the priority of the message in question. 216912ed1c7cSGregory Neil Shapiro ** ct -- the message creation time (unused, but see above). 2170c2aa98e2SPeter Wemm ** 2171c2aa98e2SPeter Wemm ** Returns: 217212ed1c7cSGregory Neil Shapiro ** true -- if this message should be queued up for the 2173c2aa98e2SPeter Wemm ** time being. 217412ed1c7cSGregory Neil Shapiro ** false -- if the load is low enough to send this message. 2175c2aa98e2SPeter Wemm ** 2176c2aa98e2SPeter Wemm ** Side Effects: 2177c2aa98e2SPeter Wemm ** none. 2178c2aa98e2SPeter Wemm */ 2179c2aa98e2SPeter Wemm 21803299c2f1SGregory Neil Shapiro /* ARGSUSED1 */ 2181c2aa98e2SPeter Wemm bool 21823299c2f1SGregory Neil Shapiro shouldqueue(pri, ct) 2183c2aa98e2SPeter Wemm long pri; 21843299c2f1SGregory Neil Shapiro time_t ct; 2185c2aa98e2SPeter Wemm { 2186c2aa98e2SPeter Wemm bool rval; 2187567a2fc9SGregory Neil Shapiro #if _FFR_MEMSTAT 2188567a2fc9SGregory Neil Shapiro long memfree; 2189567a2fc9SGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 2190c2aa98e2SPeter Wemm 2191c2aa98e2SPeter Wemm if (tTd(3, 30)) 219212ed1c7cSGregory Neil Shapiro sm_dprintf("shouldqueue: CurrentLA=%d, pri=%ld: ", 21933299c2f1SGregory Neil Shapiro CurrentLA, pri); 2194567a2fc9SGregory Neil Shapiro 2195567a2fc9SGregory Neil Shapiro #if _FFR_MEMSTAT 2196567a2fc9SGregory Neil Shapiro if (QueueLowMem > 0 && 2197567a2fc9SGregory Neil Shapiro sm_memstat_get(MemoryResource, &memfree) >= 0 && 2198567a2fc9SGregory Neil Shapiro memfree < QueueLowMem) 2199567a2fc9SGregory Neil Shapiro { 2200567a2fc9SGregory Neil Shapiro if (tTd(3, 30)) 2201355d91e3SGregory Neil Shapiro sm_dprintf("true (memfree=%ld < QueueLowMem=%ld)\n", 2202567a2fc9SGregory Neil Shapiro memfree, QueueLowMem); 2203567a2fc9SGregory Neil Shapiro return true; 2204567a2fc9SGregory Neil Shapiro } 2205567a2fc9SGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 22063299c2f1SGregory Neil Shapiro if (CurrentLA < QueueLA) 2207c2aa98e2SPeter Wemm { 2208c2aa98e2SPeter Wemm if (tTd(3, 30)) 220912ed1c7cSGregory Neil Shapiro sm_dprintf("false (CurrentLA < QueueLA)\n"); 221012ed1c7cSGregory Neil Shapiro return false; 2211c2aa98e2SPeter Wemm } 2212c2aa98e2SPeter Wemm # if 0 /* this code is reported to cause oscillation around RefuseLA */ 2213c2aa98e2SPeter Wemm if (CurrentLA >= RefuseLA && QueueLA < RefuseLA) 2214c2aa98e2SPeter Wemm { 2215c2aa98e2SPeter Wemm if (tTd(3, 30)) 221612ed1c7cSGregory Neil Shapiro sm_dprintf("TRUE (CurrentLA >= RefuseLA)\n"); 221712ed1c7cSGregory Neil Shapiro return true; 2218c2aa98e2SPeter Wemm } 22193299c2f1SGregory Neil Shapiro # endif /* 0 */ 22203299c2f1SGregory Neil Shapiro rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1)); 2221c2aa98e2SPeter Wemm if (tTd(3, 30)) 222212ed1c7cSGregory Neil Shapiro sm_dprintf("%s (by calculation)\n", rval ? "true" : "false"); 2223c2aa98e2SPeter Wemm return rval; 2224c2aa98e2SPeter Wemm } 222512ed1c7cSGregory Neil Shapiro /* 2226c2aa98e2SPeter Wemm ** REFUSECONNECTIONS -- decide if connections should be refused 2227c2aa98e2SPeter Wemm ** 2228c2aa98e2SPeter Wemm ** Parameters: 22293299c2f1SGregory Neil Shapiro ** name -- daemon name (for error messages only) 22303299c2f1SGregory Neil Shapiro ** e -- the current envelope. 22313299c2f1SGregory Neil Shapiro ** d -- number of daemon 223212ed1c7cSGregory Neil Shapiro ** active -- was this daemon actually active? 2233c2aa98e2SPeter Wemm ** 2234c2aa98e2SPeter Wemm ** Returns: 223512ed1c7cSGregory Neil Shapiro ** true if incoming SMTP connections should be refused 2236c2aa98e2SPeter Wemm ** (for now). 223712ed1c7cSGregory Neil Shapiro ** false if we should accept new work. 2238c2aa98e2SPeter Wemm ** 2239c2aa98e2SPeter Wemm ** Side Effects: 2240c2aa98e2SPeter Wemm ** Sets process title when it is rejecting connections. 2241c2aa98e2SPeter Wemm */ 2242c2aa98e2SPeter Wemm 2243c2aa98e2SPeter Wemm bool 224412ed1c7cSGregory Neil Shapiro refuseconnections(name, e, d, active) 22453299c2f1SGregory Neil Shapiro char *name; 22463299c2f1SGregory Neil Shapiro ENVELOPE *e; 22473299c2f1SGregory Neil Shapiro int d; 224812ed1c7cSGregory Neil Shapiro bool active; 2249c2aa98e2SPeter Wemm { 225012ed1c7cSGregory Neil Shapiro static time_t lastconn[MAXDAEMONS]; 225112ed1c7cSGregory Neil Shapiro static int conncnt[MAXDAEMONS]; 22522ef40764SGregory Neil Shapiro static time_t firstrejtime[MAXDAEMONS]; 22532ef40764SGregory Neil Shapiro static time_t nextlogtime[MAXDAEMONS]; 2254567a2fc9SGregory Neil Shapiro #if _FFR_MEMSTAT 2255567a2fc9SGregory Neil Shapiro long memfree; 2256567a2fc9SGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 225712ed1c7cSGregory Neil Shapiro 225812ed1c7cSGregory Neil Shapiro #if XLA 2259c2aa98e2SPeter Wemm if (!xla_smtp_ok()) 226012ed1c7cSGregory Neil Shapiro return true; 22613299c2f1SGregory Neil Shapiro #endif /* XLA */ 2262c2aa98e2SPeter Wemm 2263bfb62e91SGregory Neil Shapiro SM_ASSERT(d >= 0); 2264bfb62e91SGregory Neil Shapiro SM_ASSERT(d < MAXDAEMONS); 226512ed1c7cSGregory Neil Shapiro if (ConnRateThrottle > 0) 226612ed1c7cSGregory Neil Shapiro { 226712ed1c7cSGregory Neil Shapiro time_t now; 226812ed1c7cSGregory Neil Shapiro 226912ed1c7cSGregory Neil Shapiro now = curtime(); 227012ed1c7cSGregory Neil Shapiro if (active) 227112ed1c7cSGregory Neil Shapiro { 227212ed1c7cSGregory Neil Shapiro if (now != lastconn[d]) 227312ed1c7cSGregory Neil Shapiro { 227412ed1c7cSGregory Neil Shapiro lastconn[d] = now; 227512ed1c7cSGregory Neil Shapiro conncnt[d] = 1; 227612ed1c7cSGregory Neil Shapiro } 227712ed1c7cSGregory Neil Shapiro else if (conncnt[d]++ > ConnRateThrottle) 227812ed1c7cSGregory Neil Shapiro { 227912ed1c7cSGregory Neil Shapiro #define D_MSG_CRT "deferring connections on daemon %s: %d per second" 228012ed1c7cSGregory Neil Shapiro /* sleep to flatten out connection load */ 228112ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, D_MSG_CRT, 228212ed1c7cSGregory Neil Shapiro name, ConnRateThrottle); 228312ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 228412ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, D_MSG_CRT, 228512ed1c7cSGregory Neil Shapiro name, ConnRateThrottle); 228612ed1c7cSGregory Neil Shapiro (void) sleep(1); 228712ed1c7cSGregory Neil Shapiro } 228812ed1c7cSGregory Neil Shapiro } 228912ed1c7cSGregory Neil Shapiro else if (now != lastconn[d]) 229012ed1c7cSGregory Neil Shapiro conncnt[d] = 0; 229112ed1c7cSGregory Neil Shapiro } 229212ed1c7cSGregory Neil Shapiro 2293567a2fc9SGregory Neil Shapiro 2294567a2fc9SGregory Neil Shapiro #if _FFR_MEMSTAT 2295567a2fc9SGregory Neil Shapiro if (RefuseLowMem > 0 && 2296567a2fc9SGregory Neil Shapiro sm_memstat_get(MemoryResource, &memfree) >= 0 && 2297567a2fc9SGregory Neil Shapiro memfree < RefuseLowMem) 2298567a2fc9SGregory Neil Shapiro { 2299567a2fc9SGregory Neil Shapiro # define R_MSG_LM "rejecting connections on daemon %s: free memory: %ld" 2300567a2fc9SGregory Neil Shapiro sm_setproctitle(true, e, R_MSG_LM, name, memfree); 2301567a2fc9SGregory Neil Shapiro if (LogLevel > 8) 2302567a2fc9SGregory Neil Shapiro sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM, name, memfree); 2303567a2fc9SGregory Neil Shapiro return true; 2304567a2fc9SGregory Neil Shapiro } 2305567a2fc9SGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 230612ed1c7cSGregory Neil Shapiro sm_getla(); 23073299c2f1SGregory Neil Shapiro if (RefuseLA > 0 && CurrentLA >= RefuseLA) 2308c2aa98e2SPeter Wemm { 23092ef40764SGregory Neil Shapiro time_t now; 23102ef40764SGregory Neil Shapiro 231112ed1c7cSGregory Neil Shapiro # define R_MSG_LA "rejecting connections on daemon %s: load average: %d" 2312bfb62e91SGregory Neil Shapiro # define R2_MSG_LA "have been rejecting connections on daemon %s for %s" 231312ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, R_MSG_LA, name, CurrentLA); 231412ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 23152ef40764SGregory Neil Shapiro sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA, name, CurrentLA); 23162ef40764SGregory Neil Shapiro now = curtime(); 23172ef40764SGregory Neil Shapiro if (firstrejtime[d] == 0) 23182ef40764SGregory Neil Shapiro { 23192ef40764SGregory Neil Shapiro firstrejtime[d] = now; 23202ef40764SGregory Neil Shapiro nextlogtime[d] = now + RejectLogInterval; 23212ef40764SGregory Neil Shapiro } 23222ef40764SGregory Neil Shapiro else if (nextlogtime[d] < now) 23232ef40764SGregory Neil Shapiro { 23242ef40764SGregory Neil Shapiro sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, name, 23252ef40764SGregory Neil Shapiro pintvl(now - firstrejtime[d], true)); 23262ef40764SGregory Neil Shapiro nextlogtime[d] = now + RejectLogInterval; 23272ef40764SGregory Neil Shapiro } 232812ed1c7cSGregory Neil Shapiro return true; 232912ed1c7cSGregory Neil Shapiro } 23302ef40764SGregory Neil Shapiro else 23312ef40764SGregory Neil Shapiro firstrejtime[d] = 0; 233212ed1c7cSGregory Neil Shapiro 233312ed1c7cSGregory Neil Shapiro if (DelayLA > 0 && CurrentLA >= DelayLA) 233412ed1c7cSGregory Neil Shapiro { 233512ed1c7cSGregory Neil Shapiro time_t now; 233612ed1c7cSGregory Neil Shapiro static time_t log_delay = (time_t) 0; 233712ed1c7cSGregory Neil Shapiro 233812ed1c7cSGregory Neil Shapiro # define MIN_DELAY_LOG 90 /* wait before logging this again */ 233912ed1c7cSGregory Neil Shapiro # define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d" 234012ed1c7cSGregory Neil Shapiro /* sleep to flatten out connection load */ 234112ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, D_MSG_LA, name, DelayLA); 234212ed1c7cSGregory Neil Shapiro if (LogLevel > 8 && (now = curtime()) > log_delay) 234312ed1c7cSGregory Neil Shapiro { 234412ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, D_MSG_LA, 234512ed1c7cSGregory Neil Shapiro name, CurrentLA, DelayLA); 234612ed1c7cSGregory Neil Shapiro log_delay = now + MIN_DELAY_LOG; 234712ed1c7cSGregory Neil Shapiro } 234812ed1c7cSGregory Neil Shapiro (void) sleep(1); 2349c2aa98e2SPeter Wemm } 2350c2aa98e2SPeter Wemm 2351c2aa98e2SPeter Wemm if (MaxChildren > 0 && CurChildren >= MaxChildren) 2352c2aa98e2SPeter Wemm { 2353c2aa98e2SPeter Wemm proc_list_probe(); 2354c2aa98e2SPeter Wemm if (CurChildren >= MaxChildren) 2355c2aa98e2SPeter Wemm { 235612ed1c7cSGregory Neil Shapiro #define R_MSG_CHILD "rejecting connections on daemon %s: %d children, max %d" 235712ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, R_MSG_CHILD, 23583299c2f1SGregory Neil Shapiro name, CurChildren, MaxChildren); 235912ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 236012ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, R_MSG_CHILD, 23613299c2f1SGregory Neil Shapiro name, CurChildren, MaxChildren); 236212ed1c7cSGregory Neil Shapiro return true; 2363c2aa98e2SPeter Wemm } 2364c2aa98e2SPeter Wemm } 236512ed1c7cSGregory Neil Shapiro return false; 2366c2aa98e2SPeter Wemm } 236712ed1c7cSGregory Neil Shapiro /* 2368c2aa98e2SPeter Wemm ** SETPROCTITLE -- set process title for ps 2369c2aa98e2SPeter Wemm ** 2370c2aa98e2SPeter Wemm ** Parameters: 2371c2aa98e2SPeter Wemm ** fmt -- a printf style format string. 2372c2aa98e2SPeter Wemm ** a, b, c -- possible parameters to fmt. 2373c2aa98e2SPeter Wemm ** 2374c2aa98e2SPeter Wemm ** Returns: 2375c2aa98e2SPeter Wemm ** none. 2376c2aa98e2SPeter Wemm ** 2377c2aa98e2SPeter Wemm ** Side Effects: 2378c2aa98e2SPeter Wemm ** Clobbers argv of our main procedure so ps(1) will 2379c2aa98e2SPeter Wemm ** display the title. 2380c2aa98e2SPeter Wemm */ 2381c2aa98e2SPeter Wemm 2382c2aa98e2SPeter Wemm #define SPT_NONE 0 /* don't use it at all */ 2383c2aa98e2SPeter Wemm #define SPT_REUSEARGV 1 /* cover argv with title information */ 2384c2aa98e2SPeter Wemm #define SPT_BUILTIN 2 /* use libc builtin */ 2385c2aa98e2SPeter Wemm #define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */ 2386c2aa98e2SPeter Wemm #define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */ 2387c2aa98e2SPeter Wemm #define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */ 2388c2aa98e2SPeter Wemm #define SPT_SCO 6 /* write kernel u. area */ 2389c2aa98e2SPeter Wemm #define SPT_CHANGEARGV 7 /* write our own strings into argv[] */ 2390c2aa98e2SPeter Wemm 2391c2aa98e2SPeter Wemm #ifndef SPT_TYPE 2392c2aa98e2SPeter Wemm # define SPT_TYPE SPT_REUSEARGV 23933299c2f1SGregory Neil Shapiro #endif /* ! SPT_TYPE */ 23943299c2f1SGregory Neil Shapiro 2395c2aa98e2SPeter Wemm 2396c2aa98e2SPeter Wemm #if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN 2397c2aa98e2SPeter Wemm 2398c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2399c2aa98e2SPeter Wemm # include <sys/pstat.h> 24003299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2401c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS 2402c2aa98e2SPeter Wemm # include <machine/vmparam.h> 2403c2aa98e2SPeter Wemm # include <sys/exec.h> 2404c2aa98e2SPeter Wemm # ifndef PS_STRINGS /* hmmmm.... apparently not available after all */ 2405c2aa98e2SPeter Wemm # undef SPT_TYPE 2406c2aa98e2SPeter Wemm # define SPT_TYPE SPT_REUSEARGV 24073299c2f1SGregory Neil Shapiro # else /* ! PS_STRINGS */ 2408c2aa98e2SPeter Wemm # ifndef NKPDE /* FreeBSD 2.0 */ 2409c2aa98e2SPeter Wemm # define NKPDE 63 2410c2aa98e2SPeter Wemm typedef unsigned int *pt_entry_t; 24113299c2f1SGregory Neil Shapiro # endif /* ! NKPDE */ 24123299c2f1SGregory Neil Shapiro # endif /* ! PS_STRINGS */ 24133299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS */ 2414c2aa98e2SPeter Wemm 2415c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV 2416c2aa98e2SPeter Wemm # define SETPROC_STATIC static 24173299c2f1SGregory Neil Shapiro # else /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */ 2418c2aa98e2SPeter Wemm # define SETPROC_STATIC 24193299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */ 2420c2aa98e2SPeter Wemm 2421c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SYSMIPS 2422c2aa98e2SPeter Wemm # include <sys/sysmips.h> 2423c2aa98e2SPeter Wemm # include <sys/sysnews.h> 24243299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SYSMIPS */ 2425c2aa98e2SPeter Wemm 2426c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 2427c2aa98e2SPeter Wemm # include <sys/immu.h> 2428c2aa98e2SPeter Wemm # include <sys/dir.h> 2429c2aa98e2SPeter Wemm # include <sys/user.h> 2430c2aa98e2SPeter Wemm # include <sys/fs/s5param.h> 2431c2aa98e2SPeter Wemm # if PSARGSZ > MAXLINE 2432c2aa98e2SPeter Wemm # define SPT_BUFSIZE PSARGSZ 24333299c2f1SGregory Neil Shapiro # endif /* PSARGSZ > MAXLINE */ 24343299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2435c2aa98e2SPeter Wemm 2436c2aa98e2SPeter Wemm # ifndef SPT_PADCHAR 2437c2aa98e2SPeter Wemm # define SPT_PADCHAR ' ' 24383299c2f1SGregory Neil Shapiro # endif /* ! SPT_PADCHAR */ 2439c2aa98e2SPeter Wemm 244076b7bf71SPeter Wemm #endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */ 244176b7bf71SPeter Wemm 2442c2aa98e2SPeter Wemm #ifndef SPT_BUFSIZE 2443c2aa98e2SPeter Wemm # define SPT_BUFSIZE MAXLINE 24443299c2f1SGregory Neil Shapiro #endif /* ! SPT_BUFSIZE */ 2445c2aa98e2SPeter Wemm 244688ad41d4SGregory Neil Shapiro #if _FFR_SPT_ALIGN 244788ad41d4SGregory Neil Shapiro 244888ad41d4SGregory Neil Shapiro /* 244988ad41d4SGregory Neil Shapiro ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 245088ad41d4SGregory Neil Shapiro ** 64 bit alignment, so unless each piece of argv and envp is a multiple 245188ad41d4SGregory Neil Shapiro ** of 8 bytes (including terminating NULL), initsetproctitle() won't use 245288ad41d4SGregory Neil Shapiro ** any of the space beyond argv[0]. Be sure to set SPT_ALIGN_SIZE if 245388ad41d4SGregory Neil Shapiro ** you use this FFR. 245488ad41d4SGregory Neil Shapiro */ 245588ad41d4SGregory Neil Shapiro 245688ad41d4SGregory Neil Shapiro # ifdef SPT_ALIGN_SIZE 2457f848909fSGregory Neil Shapiro # define SPT_ALIGN(x, align) (((((x) + SPT_ALIGN_SIZE) >> (align)) << (align)) - 1) 245888ad41d4SGregory Neil Shapiro # else /* SPT_ALIGN_SIZE */ 245988ad41d4SGregory Neil Shapiro # define SPT_ALIGN(x, align) (x) 246088ad41d4SGregory Neil Shapiro # endif /* SPT_ALIGN_SIZE */ 246188ad41d4SGregory Neil Shapiro #else /* _FFR_SPT_ALIGN */ 246288ad41d4SGregory Neil Shapiro # define SPT_ALIGN(x, align) (x) 246388ad41d4SGregory Neil Shapiro #endif /* _FFR_SPT_ALIGN */ 246488ad41d4SGregory Neil Shapiro 2465c2aa98e2SPeter Wemm /* 2466c2aa98e2SPeter Wemm ** Pointers for setproctitle. 2467c2aa98e2SPeter Wemm ** This allows "ps" listings to give more useful information. 2468c2aa98e2SPeter Wemm */ 2469c2aa98e2SPeter Wemm 24703299c2f1SGregory Neil Shapiro static char **Argv = NULL; /* pointer to argument vector */ 24713299c2f1SGregory Neil Shapiro static char *LastArgv = NULL; /* end of argv */ 24723299c2f1SGregory Neil Shapiro #if SPT_TYPE != SPT_BUILTIN 24733299c2f1SGregory Neil Shapiro static void setproctitle __P((const char *, ...)); 24743299c2f1SGregory Neil Shapiro #endif /* SPT_TYPE != SPT_BUILTIN */ 2475c2aa98e2SPeter Wemm 2476c2aa98e2SPeter Wemm void 2477c2aa98e2SPeter Wemm initsetproctitle(argc, argv, envp) 2478c2aa98e2SPeter Wemm int argc; 2479c2aa98e2SPeter Wemm char **argv; 2480c2aa98e2SPeter Wemm char **envp; 2481c2aa98e2SPeter Wemm { 248212ed1c7cSGregory Neil Shapiro register int i; 248388ad41d4SGregory Neil Shapiro int align; 2484c2aa98e2SPeter Wemm extern char **environ; 2485c2aa98e2SPeter Wemm 2486c2aa98e2SPeter Wemm /* 2487c2aa98e2SPeter Wemm ** Move the environment so setproctitle can use the space at 2488c2aa98e2SPeter Wemm ** the top of memory. 2489c2aa98e2SPeter Wemm */ 2490c2aa98e2SPeter Wemm 24919d8fddc1SGregory Neil Shapiro if (envp != NULL) 24929d8fddc1SGregory Neil Shapiro { 2493c2aa98e2SPeter Wemm for (i = 0; envp[i] != NULL; i++) 249412ed1c7cSGregory Neil Shapiro continue; 2495c2aa98e2SPeter Wemm environ = (char **) xalloc(sizeof (char *) * (i + 1)); 2496c2aa98e2SPeter Wemm for (i = 0; envp[i] != NULL; i++) 2497c2aa98e2SPeter Wemm environ[i] = newstr(envp[i]); 2498c2aa98e2SPeter Wemm environ[i] = NULL; 24999d8fddc1SGregory Neil Shapiro } 2500c2aa98e2SPeter Wemm 2501c2aa98e2SPeter Wemm /* 2502c2aa98e2SPeter Wemm ** Save start and extent of argv for setproctitle. 2503c2aa98e2SPeter Wemm */ 2504c2aa98e2SPeter Wemm 2505c2aa98e2SPeter Wemm Argv = argv; 2506c2aa98e2SPeter Wemm 2507c2aa98e2SPeter Wemm /* 2508c2aa98e2SPeter Wemm ** Determine how much space we can use for setproctitle. 2509c2aa98e2SPeter Wemm ** Use all contiguous argv and envp pointers starting at argv[0] 2510c2aa98e2SPeter Wemm */ 251188ad41d4SGregory Neil Shapiro 251288ad41d4SGregory Neil Shapiro align = -1; 251388ad41d4SGregory Neil Shapiro # if _FFR_SPT_ALIGN 251488ad41d4SGregory Neil Shapiro # ifdef SPT_ALIGN_SIZE 251588ad41d4SGregory Neil Shapiro for (i = SPT_ALIGN_SIZE; i > 0; i >>= 1) 251688ad41d4SGregory Neil Shapiro align++; 251788ad41d4SGregory Neil Shapiro # endif /* SPT_ALIGN_SIZE */ 251888ad41d4SGregory Neil Shapiro # endif /* _FFR_SPT_ALIGN */ 251988ad41d4SGregory Neil Shapiro 2520c2aa98e2SPeter Wemm for (i = 0; i < argc; i++) 2521c2aa98e2SPeter Wemm { 2522c2aa98e2SPeter Wemm if (i == 0 || LastArgv + 1 == argv[i]) 252388ad41d4SGregory Neil Shapiro LastArgv = argv[i] + SPT_ALIGN(strlen(argv[i]), align); 2524c2aa98e2SPeter Wemm } 25259d8fddc1SGregory Neil Shapiro for (i = 0; LastArgv != NULL && envp != NULL && envp[i] != NULL; i++) 2526c2aa98e2SPeter Wemm { 2527c2aa98e2SPeter Wemm if (LastArgv + 1 == envp[i]) 252888ad41d4SGregory Neil Shapiro LastArgv = envp[i] + SPT_ALIGN(strlen(envp[i]), align); 2529c2aa98e2SPeter Wemm } 2530c2aa98e2SPeter Wemm } 2531c2aa98e2SPeter Wemm 2532c2aa98e2SPeter Wemm #if SPT_TYPE != SPT_BUILTIN 2533c2aa98e2SPeter Wemm 2534c2aa98e2SPeter Wemm /*VARARGS1*/ 25353299c2f1SGregory Neil Shapiro static void 2536c2aa98e2SPeter Wemm # ifdef __STDC__ 2537c2aa98e2SPeter Wemm setproctitle(const char *fmt, ...) 25383299c2f1SGregory Neil Shapiro # else /* __STDC__ */ 2539c2aa98e2SPeter Wemm setproctitle(fmt, va_alist) 2540c2aa98e2SPeter Wemm const char *fmt; 2541c2aa98e2SPeter Wemm va_dcl 25423299c2f1SGregory Neil Shapiro # endif /* __STDC__ */ 2543c2aa98e2SPeter Wemm { 2544c2aa98e2SPeter Wemm # if SPT_TYPE != SPT_NONE 2545c2aa98e2SPeter Wemm register int i; 25463299c2f1SGregory Neil Shapiro register char *p; 2547c2aa98e2SPeter Wemm SETPROC_STATIC char buf[SPT_BUFSIZE]; 254812ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 2549c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2550c2aa98e2SPeter Wemm union pstun pst; 25513299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2552c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 255312ed1c7cSGregory Neil Shapiro int j; 2554c2aa98e2SPeter Wemm off_t seek_off; 2555c2aa98e2SPeter Wemm static int kmem = -1; 2556c0c4794dSGregory Neil Shapiro static pid_t kmempid = -1; 2557c2aa98e2SPeter Wemm struct user u; 25583299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2559c2aa98e2SPeter Wemm 2560c2aa98e2SPeter Wemm p = buf; 2561c2aa98e2SPeter Wemm 2562c2aa98e2SPeter Wemm /* print sendmail: heading for grep */ 256312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(p, "sendmail: ", SPACELEFT(buf, p)); 2564c2aa98e2SPeter Wemm p += strlen(p); 2565c2aa98e2SPeter Wemm 2566c2aa98e2SPeter Wemm /* print the argument string */ 256712ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 256812ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(p, SPACELEFT(buf, p), fmt, ap); 256912ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 2570c2aa98e2SPeter Wemm 257112ed1c7cSGregory Neil Shapiro i = (int) strlen(buf); 257212ed1c7cSGregory Neil Shapiro if (i < 0) 257312ed1c7cSGregory Neil Shapiro return; 2574c2aa98e2SPeter Wemm 2575c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2576c2aa98e2SPeter Wemm pst.pst_command = buf; 2577c2aa98e2SPeter Wemm pstat(PSTAT_SETCMD, pst, i, 0, 0); 25783299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2579c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS 2580c2aa98e2SPeter Wemm PS_STRINGS->ps_nargvstr = 1; 2581c2aa98e2SPeter Wemm PS_STRINGS->ps_argvstr = buf; 25823299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS */ 2583c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SYSMIPS 2584c2aa98e2SPeter Wemm sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf); 25853299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SYSMIPS */ 2586c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 258712ed1c7cSGregory Neil Shapiro if (kmem < 0 || kmempid != CurrentPid) 2588c2aa98e2SPeter Wemm { 2589c2aa98e2SPeter Wemm if (kmem >= 0) 2590c46d91b7SGregory Neil Shapiro (void) close(kmem); 2591c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, O_RDWR, 0); 2592c2aa98e2SPeter Wemm if (kmem < 0) 2593c2aa98e2SPeter Wemm return; 259412ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 259512ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 259612ed1c7cSGregory Neil Shapiro { 259712ed1c7cSGregory Neil Shapiro (void) close(kmem); 259812ed1c7cSGregory Neil Shapiro kmem = -1; 259912ed1c7cSGregory Neil Shapiro return; 260012ed1c7cSGregory Neil Shapiro } 260112ed1c7cSGregory Neil Shapiro kmempid = CurrentPid; 2602c2aa98e2SPeter Wemm } 2603c2aa98e2SPeter Wemm buf[PSARGSZ - 1] = '\0'; 2604c2aa98e2SPeter Wemm seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u; 2605c2aa98e2SPeter Wemm if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off) 2606c2aa98e2SPeter Wemm (void) write(kmem, buf, PSARGSZ); 26073299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2608c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_REUSEARGV 26093299c2f1SGregory Neil Shapiro if (LastArgv == NULL) 26103299c2f1SGregory Neil Shapiro return; 26113299c2f1SGregory Neil Shapiro 2612c2aa98e2SPeter Wemm if (i > LastArgv - Argv[0] - 2) 2613c2aa98e2SPeter Wemm { 2614c2aa98e2SPeter Wemm i = LastArgv - Argv[0] - 2; 2615c2aa98e2SPeter Wemm buf[i] = '\0'; 2616c2aa98e2SPeter Wemm } 261712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(Argv[0], buf, i + 1); 2618c2aa98e2SPeter Wemm p = &Argv[0][i]; 2619c2aa98e2SPeter Wemm while (p < LastArgv) 2620c2aa98e2SPeter Wemm *p++ = SPT_PADCHAR; 2621c2aa98e2SPeter Wemm Argv[1] = NULL; 26223299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_REUSEARGV */ 2623c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_CHANGEARGV 2624c2aa98e2SPeter Wemm Argv[0] = buf; 2625c2aa98e2SPeter Wemm Argv[1] = 0; 26263299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_CHANGEARGV */ 2627c2aa98e2SPeter Wemm # endif /* SPT_TYPE != SPT_NONE */ 2628c2aa98e2SPeter Wemm } 2629c2aa98e2SPeter Wemm 2630c2aa98e2SPeter Wemm #endif /* SPT_TYPE != SPT_BUILTIN */ 263112ed1c7cSGregory Neil Shapiro /* 263276b7bf71SPeter Wemm ** SM_SETPROCTITLE -- set process task and set process title for ps 263376b7bf71SPeter Wemm ** 263476b7bf71SPeter Wemm ** Possibly set process status and call setproctitle() to 263576b7bf71SPeter Wemm ** change the ps display. 263676b7bf71SPeter Wemm ** 263776b7bf71SPeter Wemm ** Parameters: 263876b7bf71SPeter Wemm ** status -- whether or not to store as process status 26393299c2f1SGregory Neil Shapiro ** e -- the current envelope. 264076b7bf71SPeter Wemm ** fmt -- a printf style format string. 264176b7bf71SPeter Wemm ** a, b, c -- possible parameters to fmt. 264276b7bf71SPeter Wemm ** 264376b7bf71SPeter Wemm ** Returns: 264476b7bf71SPeter Wemm ** none. 264576b7bf71SPeter Wemm */ 264676b7bf71SPeter Wemm 264776b7bf71SPeter Wemm /*VARARGS2*/ 264876b7bf71SPeter Wemm void 264976b7bf71SPeter Wemm #ifdef __STDC__ 26503299c2f1SGregory Neil Shapiro sm_setproctitle(bool status, ENVELOPE *e, const char *fmt, ...) 26513299c2f1SGregory Neil Shapiro #else /* __STDC__ */ 26523299c2f1SGregory Neil Shapiro sm_setproctitle(status, e, fmt, va_alist) 265376b7bf71SPeter Wemm bool status; 26543299c2f1SGregory Neil Shapiro ENVELOPE *e; 265576b7bf71SPeter Wemm const char *fmt; 265676b7bf71SPeter Wemm va_dcl 26573299c2f1SGregory Neil Shapiro #endif /* __STDC__ */ 265876b7bf71SPeter Wemm { 265976b7bf71SPeter Wemm char buf[SPT_BUFSIZE]; 266012ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 26613299c2f1SGregory Neil Shapiro 266276b7bf71SPeter Wemm /* print the argument string */ 266312ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 266412ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(buf, sizeof buf, fmt, ap); 266512ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 266676b7bf71SPeter Wemm 266776b7bf71SPeter Wemm if (status) 266812ed1c7cSGregory Neil Shapiro proc_list_set(CurrentPid, buf); 26693299c2f1SGregory Neil Shapiro 26703299c2f1SGregory Neil Shapiro if (ProcTitlePrefix != NULL) 26713299c2f1SGregory Neil Shapiro { 26723299c2f1SGregory Neil Shapiro char prefix[SPT_BUFSIZE]; 26733299c2f1SGregory Neil Shapiro 26743299c2f1SGregory Neil Shapiro expand(ProcTitlePrefix, prefix, sizeof prefix, e); 26753299c2f1SGregory Neil Shapiro setproctitle("%s: %s", prefix, buf); 26763299c2f1SGregory Neil Shapiro } 26773299c2f1SGregory Neil Shapiro else 267876b7bf71SPeter Wemm setproctitle("%s", buf); 267976b7bf71SPeter Wemm } 268012ed1c7cSGregory Neil Shapiro /* 2681c2aa98e2SPeter Wemm ** WAITFOR -- wait for a particular process id. 2682c2aa98e2SPeter Wemm ** 2683c2aa98e2SPeter Wemm ** Parameters: 2684c2aa98e2SPeter Wemm ** pid -- process id to wait for. 2685c2aa98e2SPeter Wemm ** 2686c2aa98e2SPeter Wemm ** Returns: 2687c2aa98e2SPeter Wemm ** status of pid. 2688c2aa98e2SPeter Wemm ** -1 if pid never shows up. 2689c2aa98e2SPeter Wemm ** 2690c2aa98e2SPeter Wemm ** Side Effects: 2691c2aa98e2SPeter Wemm ** none. 2692c2aa98e2SPeter Wemm */ 2693c2aa98e2SPeter Wemm 2694c2aa98e2SPeter Wemm int 2695c2aa98e2SPeter Wemm waitfor(pid) 2696c2aa98e2SPeter Wemm pid_t pid; 2697c2aa98e2SPeter Wemm { 269812ed1c7cSGregory Neil Shapiro int st; 269912ed1c7cSGregory Neil Shapiro pid_t i; 270012ed1c7cSGregory Neil Shapiro 270112ed1c7cSGregory Neil Shapiro do 270212ed1c7cSGregory Neil Shapiro { 270312ed1c7cSGregory Neil Shapiro errno = 0; 270412ed1c7cSGregory Neil Shapiro i = sm_wait(&st); 270512ed1c7cSGregory Neil Shapiro if (i > 0) 270612ed1c7cSGregory Neil Shapiro proc_list_drop(i, st, NULL); 270712ed1c7cSGregory Neil Shapiro } while ((i >= 0 || errno == EINTR) && i != pid); 270812ed1c7cSGregory Neil Shapiro if (i < 0) 270912ed1c7cSGregory Neil Shapiro return -1; 271012ed1c7cSGregory Neil Shapiro return st; 271112ed1c7cSGregory Neil Shapiro } 271212ed1c7cSGregory Neil Shapiro /* 271312ed1c7cSGregory Neil Shapiro ** SM_WAIT -- wait 271412ed1c7cSGregory Neil Shapiro ** 271512ed1c7cSGregory Neil Shapiro ** Parameters: 271612ed1c7cSGregory Neil Shapiro ** status -- pointer to status (return value) 271712ed1c7cSGregory Neil Shapiro ** 271812ed1c7cSGregory Neil Shapiro ** Returns: 271912ed1c7cSGregory Neil Shapiro ** pid 272012ed1c7cSGregory Neil Shapiro */ 272112ed1c7cSGregory Neil Shapiro 272212ed1c7cSGregory Neil Shapiro pid_t 272312ed1c7cSGregory Neil Shapiro sm_wait(status) 272412ed1c7cSGregory Neil Shapiro int *status; 272512ed1c7cSGregory Neil Shapiro { 2726c2aa98e2SPeter Wemm # ifdef WAITUNION 2727c2aa98e2SPeter Wemm union wait st; 27283299c2f1SGregory Neil Shapiro # else /* WAITUNION */ 2729c2aa98e2SPeter Wemm auto int st; 27303299c2f1SGregory Neil Shapiro # endif /* WAITUNION */ 2731c2aa98e2SPeter Wemm pid_t i; 2732c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 2733c2aa98e2SPeter Wemm int savesig; 27343299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2735c2aa98e2SPeter Wemm 2736c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 273712ed1c7cSGregory Neil Shapiro savesig = sm_releasesignal(SIGCHLD); 27383299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2739c2aa98e2SPeter Wemm i = wait(&st); 2740c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 2741c2aa98e2SPeter Wemm if (savesig > 0) 274212ed1c7cSGregory Neil Shapiro sm_blocksignal(SIGCHLD); 27433299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2744c2aa98e2SPeter Wemm # ifdef WAITUNION 274512ed1c7cSGregory Neil Shapiro *status = st.w_status; 27463299c2f1SGregory Neil Shapiro # else /* WAITUNION */ 274712ed1c7cSGregory Neil Shapiro *status = st; 27483299c2f1SGregory Neil Shapiro # endif /* WAITUNION */ 274912ed1c7cSGregory Neil Shapiro return i; 2750c2aa98e2SPeter Wemm } 275112ed1c7cSGregory Neil Shapiro /* 2752c2aa98e2SPeter Wemm ** REAPCHILD -- pick up the body of my child, lest it become a zombie 2753c2aa98e2SPeter Wemm ** 2754c2aa98e2SPeter Wemm ** Parameters: 2755c2aa98e2SPeter Wemm ** sig -- the signal that got us here (unused). 2756c2aa98e2SPeter Wemm ** 2757c2aa98e2SPeter Wemm ** Returns: 2758c2aa98e2SPeter Wemm ** none. 2759c2aa98e2SPeter Wemm ** 2760c2aa98e2SPeter Wemm ** Side Effects: 2761c2aa98e2SPeter Wemm ** Picks up extant zombies. 27623299c2f1SGregory Neil Shapiro ** Control socket exits may restart/shutdown daemon. 2763c0c4794dSGregory Neil Shapiro ** 2764c0c4794dSGregory Neil Shapiro ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD 2765c0c4794dSGregory Neil Shapiro ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE 2766c0c4794dSGregory Neil Shapiro ** DOING. 2767c2aa98e2SPeter Wemm */ 2768c2aa98e2SPeter Wemm 27693299c2f1SGregory Neil Shapiro /* ARGSUSED0 */ 2770c2aa98e2SPeter Wemm SIGFUNC_DECL 2771c2aa98e2SPeter Wemm reapchild(sig) 2772c2aa98e2SPeter Wemm int sig; 2773c2aa98e2SPeter Wemm { 27743299c2f1SGregory Neil Shapiro int save_errno = errno; 27753299c2f1SGregory Neil Shapiro int st; 2776c2aa98e2SPeter Wemm pid_t pid; 27773299c2f1SGregory Neil Shapiro # if HASWAITPID 2778c2aa98e2SPeter Wemm auto int status; 2779c2aa98e2SPeter Wemm int count; 2780c2aa98e2SPeter Wemm 2781c2aa98e2SPeter Wemm count = 0; 2782c2aa98e2SPeter Wemm while ((pid = waitpid(-1, &status, WNOHANG)) > 0) 2783c2aa98e2SPeter Wemm { 27843299c2f1SGregory Neil Shapiro st = status; 2785c2aa98e2SPeter Wemm if (count++ > 1000) 2786c2aa98e2SPeter Wemm break; 27873299c2f1SGregory Neil Shapiro # else /* HASWAITPID */ 2788c2aa98e2SPeter Wemm # ifdef WNOHANG 278912ed1c7cSGregory Neil Shapiro union wait status; 279012ed1c7cSGregory Neil Shapiro 2791c2aa98e2SPeter Wemm while ((pid = wait3(&status, WNOHANG, (struct rusage *) NULL)) > 0) 27923299c2f1SGregory Neil Shapiro { 27933299c2f1SGregory Neil Shapiro st = status.w_status; 2794c2aa98e2SPeter Wemm # else /* WNOHANG */ 279512ed1c7cSGregory Neil Shapiro auto int status; 279612ed1c7cSGregory Neil Shapiro 2797c2aa98e2SPeter Wemm /* 2798c2aa98e2SPeter Wemm ** Catch one zombie -- we will be re-invoked (we hope) if there 2799c2aa98e2SPeter Wemm ** are more. Unreliable signals probably break this, but this 2800c2aa98e2SPeter Wemm ** is the "old system" situation -- waitpid or wait3 are to be 2801c2aa98e2SPeter Wemm ** strongly preferred. 2802c2aa98e2SPeter Wemm */ 2803c2aa98e2SPeter Wemm 2804c2aa98e2SPeter Wemm if ((pid = wait(&status)) > 0) 28053299c2f1SGregory Neil Shapiro { 28063299c2f1SGregory Neil Shapiro st = status; 2807c2aa98e2SPeter Wemm # endif /* WNOHANG */ 28083299c2f1SGregory Neil Shapiro # endif /* HASWAITPID */ 28093299c2f1SGregory Neil Shapiro /* Drop PID and check if it was a control socket child */ 281012ed1c7cSGregory Neil Shapiro proc_list_drop(pid, st, NULL); 28113299c2f1SGregory Neil Shapiro } 2812c0c4794dSGregory Neil Shapiro FIX_SYSV_SIGNAL(sig, reapchild); 28133299c2f1SGregory Neil Shapiro errno = save_errno; 2814c2aa98e2SPeter Wemm return SIGFUNC_RETURN; 2815c2aa98e2SPeter Wemm } 2816c2aa98e2SPeter Wemm /* 2817c2aa98e2SPeter Wemm ** GETDTABLESIZE -- return number of file descriptors 2818c2aa98e2SPeter Wemm ** 2819c2aa98e2SPeter Wemm ** Only on non-BSD systems 2820c2aa98e2SPeter Wemm ** 2821c2aa98e2SPeter Wemm ** Parameters: 2822c2aa98e2SPeter Wemm ** none 2823c2aa98e2SPeter Wemm ** 2824c2aa98e2SPeter Wemm ** Returns: 2825c2aa98e2SPeter Wemm ** size of file descriptor table 2826c2aa98e2SPeter Wemm ** 2827c2aa98e2SPeter Wemm ** Side Effects: 2828c2aa98e2SPeter Wemm ** none 2829c2aa98e2SPeter Wemm */ 2830c2aa98e2SPeter Wemm 2831c2aa98e2SPeter Wemm #ifdef SOLARIS 2832c2aa98e2SPeter Wemm # include <sys/resource.h> 28333299c2f1SGregory Neil Shapiro #endif /* SOLARIS */ 2834c2aa98e2SPeter Wemm 2835c2aa98e2SPeter Wemm int 2836c2aa98e2SPeter Wemm getdtsize() 2837c2aa98e2SPeter Wemm { 2838c2aa98e2SPeter Wemm # ifdef RLIMIT_NOFILE 2839c2aa98e2SPeter Wemm struct rlimit rl; 2840c2aa98e2SPeter Wemm 2841c2aa98e2SPeter Wemm if (getrlimit(RLIMIT_NOFILE, &rl) >= 0) 2842c2aa98e2SPeter Wemm return rl.rlim_cur; 28433299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NOFILE */ 2844c2aa98e2SPeter Wemm 28453299c2f1SGregory Neil Shapiro # if HASGETDTABLESIZE 2846c2aa98e2SPeter Wemm return getdtablesize(); 28473299c2f1SGregory Neil Shapiro # else /* HASGETDTABLESIZE */ 2848c2aa98e2SPeter Wemm # ifdef _SC_OPEN_MAX 2849c2aa98e2SPeter Wemm return sysconf(_SC_OPEN_MAX); 28503299c2f1SGregory Neil Shapiro # else /* _SC_OPEN_MAX */ 2851c2aa98e2SPeter Wemm return NOFILE; 28523299c2f1SGregory Neil Shapiro # endif /* _SC_OPEN_MAX */ 28533299c2f1SGregory Neil Shapiro # endif /* HASGETDTABLESIZE */ 2854c2aa98e2SPeter Wemm } 285512ed1c7cSGregory Neil Shapiro /* 2856c2aa98e2SPeter Wemm ** UNAME -- get the UUCP name of this system. 2857c2aa98e2SPeter Wemm */ 2858c2aa98e2SPeter Wemm 28593299c2f1SGregory Neil Shapiro #if !HASUNAME 2860c2aa98e2SPeter Wemm 2861c2aa98e2SPeter Wemm int 2862c2aa98e2SPeter Wemm uname(name) 2863c2aa98e2SPeter Wemm struct utsname *name; 2864c2aa98e2SPeter Wemm { 286512ed1c7cSGregory Neil Shapiro SM_FILE_T *file; 2866c2aa98e2SPeter Wemm char *n; 2867c2aa98e2SPeter Wemm 2868c2aa98e2SPeter Wemm name->nodename[0] = '\0'; 2869c2aa98e2SPeter Wemm 2870c2aa98e2SPeter Wemm /* try /etc/whoami -- one line with the node name */ 287112ed1c7cSGregory Neil Shapiro if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, "/etc/whoami", 287212ed1c7cSGregory Neil Shapiro SM_IO_RDONLY, NULL)) != NULL) 2873c2aa98e2SPeter Wemm { 287412ed1c7cSGregory Neil Shapiro (void) sm_io_fgets(file, SM_TIME_DEFAULT, name->nodename, 287512ed1c7cSGregory Neil Shapiro NODE_LENGTH + 1); 287612ed1c7cSGregory Neil Shapiro (void) sm_io_close(file, SM_TIME_DEFAULT); 2877c2aa98e2SPeter Wemm n = strchr(name->nodename, '\n'); 2878c2aa98e2SPeter Wemm if (n != NULL) 2879c2aa98e2SPeter Wemm *n = '\0'; 2880c2aa98e2SPeter Wemm if (name->nodename[0] != '\0') 28813299c2f1SGregory Neil Shapiro return 0; 2882c2aa98e2SPeter Wemm } 2883c2aa98e2SPeter Wemm 2884c2aa98e2SPeter Wemm /* try /usr/include/whoami.h -- has a #define somewhere */ 288512ed1c7cSGregory Neil Shapiro if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, 288612ed1c7cSGregory Neil Shapiro "/usr/include/whoami.h", SM_IO_RDONLY, NULL)) 288712ed1c7cSGregory Neil Shapiro != NULL) 2888c2aa98e2SPeter Wemm { 2889c2aa98e2SPeter Wemm char buf[MAXLINE]; 2890c2aa98e2SPeter Wemm 289188ad41d4SGregory Neil Shapiro while (sm_io_fgets(file, SM_TIME_DEFAULT, 289288ad41d4SGregory Neil Shapiro buf, sizeof buf) != NULL) 28933299c2f1SGregory Neil Shapiro { 289412ed1c7cSGregory Neil Shapiro if (sm_io_sscanf(buf, "#define sysname \"%*[^\"]\"", 2895c2aa98e2SPeter Wemm NODE_LENGTH, name->nodename) > 0) 2896c2aa98e2SPeter Wemm break; 28973299c2f1SGregory Neil Shapiro } 289812ed1c7cSGregory Neil Shapiro (void) sm_io_close(file, SM_TIME_DEFAULT); 2899c2aa98e2SPeter Wemm if (name->nodename[0] != '\0') 29003299c2f1SGregory Neil Shapiro return 0; 2901c2aa98e2SPeter Wemm } 2902c2aa98e2SPeter Wemm 29033299c2f1SGregory Neil Shapiro return -1; 2904c2aa98e2SPeter Wemm } 29053299c2f1SGregory Neil Shapiro #endif /* !HASUNAME */ 290612ed1c7cSGregory Neil Shapiro /* 2907c2aa98e2SPeter Wemm ** INITGROUPS -- initialize groups 2908c2aa98e2SPeter Wemm ** 2909c2aa98e2SPeter Wemm ** Stub implementation for System V style systems 2910c2aa98e2SPeter Wemm */ 2911c2aa98e2SPeter Wemm 29123299c2f1SGregory Neil Shapiro #if !HASINITGROUPS 2913c2aa98e2SPeter Wemm 2914c2aa98e2SPeter Wemm initgroups(name, basegid) 2915c2aa98e2SPeter Wemm char *name; 2916c2aa98e2SPeter Wemm int basegid; 2917c2aa98e2SPeter Wemm { 2918c2aa98e2SPeter Wemm return 0; 2919c2aa98e2SPeter Wemm } 2920c2aa98e2SPeter Wemm 29213299c2f1SGregory Neil Shapiro #endif /* !HASINITGROUPS */ 292212ed1c7cSGregory Neil Shapiro /* 2923c2aa98e2SPeter Wemm ** SETGROUPS -- set group list 2924c2aa98e2SPeter Wemm ** 2925c2aa98e2SPeter Wemm ** Stub implementation for systems that don't have group lists 2926c2aa98e2SPeter Wemm */ 2927c2aa98e2SPeter Wemm 2928c2aa98e2SPeter Wemm #ifndef NGROUPS_MAX 2929c2aa98e2SPeter Wemm 2930c2aa98e2SPeter Wemm int 2931c2aa98e2SPeter Wemm setgroups(ngroups, grouplist) 2932c2aa98e2SPeter Wemm int ngroups; 2933c2aa98e2SPeter Wemm GIDSET_T grouplist[]; 2934c2aa98e2SPeter Wemm { 2935c2aa98e2SPeter Wemm return 0; 2936c2aa98e2SPeter Wemm } 2937c2aa98e2SPeter Wemm 29383299c2f1SGregory Neil Shapiro #endif /* ! NGROUPS_MAX */ 293912ed1c7cSGregory Neil Shapiro /* 2940c2aa98e2SPeter Wemm ** SETSID -- set session id (for non-POSIX systems) 2941c2aa98e2SPeter Wemm */ 2942c2aa98e2SPeter Wemm 29433299c2f1SGregory Neil Shapiro #if !HASSETSID 2944c2aa98e2SPeter Wemm 2945c2aa98e2SPeter Wemm pid_t 2946c2aa98e2SPeter Wemm setsid __P ((void)) 2947c2aa98e2SPeter Wemm { 2948c2aa98e2SPeter Wemm # ifdef TIOCNOTTY 2949c2aa98e2SPeter Wemm int fd; 2950c2aa98e2SPeter Wemm 2951c2aa98e2SPeter Wemm fd = open("/dev/tty", O_RDWR, 0); 2952c2aa98e2SPeter Wemm if (fd >= 0) 2953c2aa98e2SPeter Wemm { 2954d995d2baSGregory Neil Shapiro (void) ioctl(fd, TIOCNOTTY, (char *) 0); 2955c2aa98e2SPeter Wemm (void) close(fd); 2956c2aa98e2SPeter Wemm } 2957c2aa98e2SPeter Wemm # endif /* TIOCNOTTY */ 2958c2aa98e2SPeter Wemm # ifdef SYS5SETPGRP 2959c2aa98e2SPeter Wemm return setpgrp(); 29603299c2f1SGregory Neil Shapiro # else /* SYS5SETPGRP */ 296112ed1c7cSGregory Neil Shapiro return setpgid(0, CurrentPid); 29623299c2f1SGregory Neil Shapiro # endif /* SYS5SETPGRP */ 2963c2aa98e2SPeter Wemm } 2964c2aa98e2SPeter Wemm 29653299c2f1SGregory Neil Shapiro #endif /* !HASSETSID */ 296612ed1c7cSGregory Neil Shapiro /* 2967c2aa98e2SPeter Wemm ** FSYNC -- dummy fsync 2968c2aa98e2SPeter Wemm */ 2969c2aa98e2SPeter Wemm 29703299c2f1SGregory Neil Shapiro #if NEEDFSYNC 2971c2aa98e2SPeter Wemm 2972c2aa98e2SPeter Wemm fsync(fd) 2973c2aa98e2SPeter Wemm int fd; 2974c2aa98e2SPeter Wemm { 2975c2aa98e2SPeter Wemm # ifdef O_SYNC 2976c2aa98e2SPeter Wemm return fcntl(fd, F_SETFL, O_SYNC); 29773299c2f1SGregory Neil Shapiro # else /* O_SYNC */ 2978c2aa98e2SPeter Wemm /* nothing we can do */ 2979c2aa98e2SPeter Wemm return 0; 29803299c2f1SGregory Neil Shapiro # endif /* O_SYNC */ 2981c2aa98e2SPeter Wemm } 2982c2aa98e2SPeter Wemm 29833299c2f1SGregory Neil Shapiro #endif /* NEEDFSYNC */ 298412ed1c7cSGregory Neil Shapiro /* 2985c2aa98e2SPeter Wemm ** DGUX_INET_ADDR -- inet_addr for DG/UX 2986c2aa98e2SPeter Wemm ** 2987c2aa98e2SPeter Wemm ** Data General DG/UX version of inet_addr returns a struct in_addr 2988c2aa98e2SPeter Wemm ** instead of a long. This patches things. Only needed on versions 2989c2aa98e2SPeter Wemm ** prior to 5.4.3. 2990c2aa98e2SPeter Wemm */ 2991c2aa98e2SPeter Wemm 2992c2aa98e2SPeter Wemm #ifdef DGUX_5_4_2 2993c2aa98e2SPeter Wemm 2994c2aa98e2SPeter Wemm # undef inet_addr 2995c2aa98e2SPeter Wemm 2996c2aa98e2SPeter Wemm long 2997c2aa98e2SPeter Wemm dgux_inet_addr(host) 2998c2aa98e2SPeter Wemm char *host; 2999c2aa98e2SPeter Wemm { 3000c2aa98e2SPeter Wemm struct in_addr haddr; 3001c2aa98e2SPeter Wemm 3002c2aa98e2SPeter Wemm haddr = inet_addr(host); 3003c2aa98e2SPeter Wemm return haddr.s_addr; 3004c2aa98e2SPeter Wemm } 3005c2aa98e2SPeter Wemm 30063299c2f1SGregory Neil Shapiro #endif /* DGUX_5_4_2 */ 300712ed1c7cSGregory Neil Shapiro /* 3008c2aa98e2SPeter Wemm ** GETOPT -- for old systems or systems with bogus implementations 3009c2aa98e2SPeter Wemm */ 3010c2aa98e2SPeter Wemm 301112ed1c7cSGregory Neil Shapiro #if !SM_CONF_GETOPT 3012c2aa98e2SPeter Wemm 3013c2aa98e2SPeter Wemm /* 3014c2aa98e2SPeter Wemm * Copyright (c) 1985 Regents of the University of California. 3015c2aa98e2SPeter Wemm * All rights reserved. The Berkeley software License Agreement 3016c2aa98e2SPeter Wemm * specifies the terms and conditions for redistribution. 3017c2aa98e2SPeter Wemm */ 3018c2aa98e2SPeter Wemm 3019c2aa98e2SPeter Wemm 3020c2aa98e2SPeter Wemm /* 3021c2aa98e2SPeter Wemm ** this version hacked to add `atend' flag to allow state machine 3022c2aa98e2SPeter Wemm ** to reset if invoked by the program to scan args for a 2nd time 3023c2aa98e2SPeter Wemm */ 3024c2aa98e2SPeter Wemm 3025c2aa98e2SPeter Wemm # if defined(LIBC_SCCS) && !defined(lint) 3026c2aa98e2SPeter Wemm static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; 30273299c2f1SGregory Neil Shapiro # endif /* defined(LIBC_SCCS) && !defined(lint) */ 3028c2aa98e2SPeter Wemm 3029c2aa98e2SPeter Wemm /* 303012ed1c7cSGregory Neil Shapiro ** get option letter from argument vector 3031c2aa98e2SPeter Wemm */ 3032c2aa98e2SPeter Wemm # ifdef _CONVEX_SOURCE 3033c2aa98e2SPeter Wemm extern int optind, opterr, optopt; 3034c2aa98e2SPeter Wemm extern char *optarg; 30353299c2f1SGregory Neil Shapiro # else /* _CONVEX_SOURCE */ 3036c2aa98e2SPeter Wemm int opterr = 1; /* if error message should be printed */ 3037c2aa98e2SPeter Wemm int optind = 1; /* index into parent argv vector */ 3038c2aa98e2SPeter Wemm int optopt = 0; /* character checked for validity */ 3039c2aa98e2SPeter Wemm char *optarg = NULL; /* argument associated with option */ 30403299c2f1SGregory Neil Shapiro # endif /* _CONVEX_SOURCE */ 3041c2aa98e2SPeter Wemm 3042c2aa98e2SPeter Wemm # define BADCH (int)'?' 3043c2aa98e2SPeter Wemm # define EMSG "" 304412ed1c7cSGregory Neil Shapiro # define tell(s) if (opterr) \ 304512ed1c7cSGregory Neil Shapiro {sm_io_fputs(smioerr, SM_TIME_DEFAULT, *nargv); \ 304612ed1c7cSGregory Neil Shapiro (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, s); \ 304712ed1c7cSGregory Neil Shapiro (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, optopt); \ 304812ed1c7cSGregory Neil Shapiro (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, '\n'); \ 304912ed1c7cSGregory Neil Shapiro return BADCH;} 3050c2aa98e2SPeter Wemm 3051c2aa98e2SPeter Wemm int 3052c2aa98e2SPeter Wemm getopt(nargc,nargv,ostr) 3053c2aa98e2SPeter Wemm int nargc; 3054c2aa98e2SPeter Wemm char *const *nargv; 3055c2aa98e2SPeter Wemm const char *ostr; 3056c2aa98e2SPeter Wemm { 3057c2aa98e2SPeter Wemm static char *place = EMSG; /* option letter processing */ 3058c2aa98e2SPeter Wemm static char atend = 0; 3059c2aa98e2SPeter Wemm register char *oli = NULL; /* option letter list index */ 3060c2aa98e2SPeter Wemm 3061c2aa98e2SPeter Wemm if (atend) { 3062c2aa98e2SPeter Wemm atend = 0; 3063c2aa98e2SPeter Wemm place = EMSG; 3064c2aa98e2SPeter Wemm } 3065c2aa98e2SPeter Wemm if(!*place) { /* update scanning pointer */ 3066c2aa98e2SPeter Wemm if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) { 3067c2aa98e2SPeter Wemm atend++; 3068c2aa98e2SPeter Wemm return -1; 3069c2aa98e2SPeter Wemm } 3070c2aa98e2SPeter Wemm if (*place == '-') { /* found "--" */ 3071c2aa98e2SPeter Wemm ++optind; 3072c2aa98e2SPeter Wemm atend++; 3073c2aa98e2SPeter Wemm return -1; 3074c2aa98e2SPeter Wemm } 3075c2aa98e2SPeter Wemm } /* option letter okay? */ 3076c2aa98e2SPeter Wemm if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr,optopt))) { 3077c2aa98e2SPeter Wemm if (!*place) ++optind; 3078c2aa98e2SPeter Wemm tell(": illegal option -- "); 3079c2aa98e2SPeter Wemm } 3080c2aa98e2SPeter Wemm if (oli && *++oli != ':') { /* don't need argument */ 3081c2aa98e2SPeter Wemm optarg = NULL; 3082c2aa98e2SPeter Wemm if (!*place) ++optind; 3083c2aa98e2SPeter Wemm } 3084c2aa98e2SPeter Wemm else { /* need an argument */ 3085c2aa98e2SPeter Wemm if (*place) optarg = place; /* no white space */ 3086c2aa98e2SPeter Wemm else if (nargc <= ++optind) { /* no arg */ 3087c2aa98e2SPeter Wemm place = EMSG; 3088c2aa98e2SPeter Wemm tell(": option requires an argument -- "); 3089c2aa98e2SPeter Wemm } 3090c2aa98e2SPeter Wemm else optarg = nargv[optind]; /* white space */ 3091c2aa98e2SPeter Wemm place = EMSG; 3092c2aa98e2SPeter Wemm ++optind; 3093c2aa98e2SPeter Wemm } 309412ed1c7cSGregory Neil Shapiro return optopt; /* dump back option letter */ 3095c2aa98e2SPeter Wemm } 3096c2aa98e2SPeter Wemm 309712ed1c7cSGregory Neil Shapiro #endif /* !SM_CONF_GETOPT */ 309812ed1c7cSGregory Neil Shapiro /* 3099c2aa98e2SPeter Wemm ** USERSHELLOK -- tell if a user's shell is ok for unrestricted use 3100c2aa98e2SPeter Wemm ** 3101c2aa98e2SPeter Wemm ** Parameters: 3102c2aa98e2SPeter Wemm ** user -- the name of the user we are checking. 3103c2aa98e2SPeter Wemm ** shell -- the user's shell from /etc/passwd 3104c2aa98e2SPeter Wemm ** 3105c2aa98e2SPeter Wemm ** Returns: 310612ed1c7cSGregory Neil Shapiro ** true -- if it is ok to use this for unrestricted access. 310712ed1c7cSGregory Neil Shapiro ** false -- if the shell is restricted. 3108c2aa98e2SPeter Wemm */ 3109c2aa98e2SPeter Wemm 3110c2aa98e2SPeter Wemm #if !HASGETUSERSHELL 3111c2aa98e2SPeter Wemm 3112c2aa98e2SPeter Wemm # ifndef _PATH_SHELLS 3113c2aa98e2SPeter Wemm # define _PATH_SHELLS "/etc/shells" 31143299c2f1SGregory Neil Shapiro # endif /* ! _PATH_SHELLS */ 3115c2aa98e2SPeter Wemm 3116c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 3117c2aa98e2SPeter Wemm # include <userconf.h> 3118c2aa98e2SPeter Wemm # if _AIX4 >= 40200 3119c2aa98e2SPeter Wemm # include <userpw.h> 31203299c2f1SGregory Neil Shapiro # endif /* _AIX4 >= 40200 */ 3121c2aa98e2SPeter Wemm # include <usersec.h> 31223299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 3123c2aa98e2SPeter Wemm 31243299c2f1SGregory Neil Shapiro static char *DefaultUserShells[] = 3125c2aa98e2SPeter Wemm { 3126c2aa98e2SPeter Wemm "/bin/sh", /* standard shell */ 312712ed1c7cSGregory Neil Shapiro # ifdef MPE 312812ed1c7cSGregory Neil Shapiro "/SYS/PUB/CI", 312912ed1c7cSGregory Neil Shapiro # else /* MPE */ 3130c2aa98e2SPeter Wemm "/usr/bin/sh", 3131c2aa98e2SPeter Wemm "/bin/csh", /* C shell */ 3132c2aa98e2SPeter Wemm "/usr/bin/csh", 313312ed1c7cSGregory Neil Shapiro # endif /* MPE */ 3134c2aa98e2SPeter Wemm # ifdef __hpux 3135c2aa98e2SPeter Wemm # ifdef V4FS 3136c2aa98e2SPeter Wemm "/usr/bin/rsh", /* restricted Bourne shell */ 3137c2aa98e2SPeter Wemm "/usr/bin/ksh", /* Korn shell */ 3138c2aa98e2SPeter Wemm "/usr/bin/rksh", /* restricted Korn shell */ 3139c2aa98e2SPeter Wemm "/usr/bin/pam", 3140c2aa98e2SPeter Wemm "/usr/bin/keysh", /* key shell (extended Korn shell) */ 3141c2aa98e2SPeter Wemm "/usr/bin/posix/sh", 31423299c2f1SGregory Neil Shapiro # else /* V4FS */ 3143c2aa98e2SPeter Wemm "/bin/rsh", /* restricted Bourne shell */ 3144c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3145c2aa98e2SPeter Wemm "/bin/rksh", /* restricted Korn shell */ 3146c2aa98e2SPeter Wemm "/bin/pam", 3147c2aa98e2SPeter Wemm "/usr/bin/keysh", /* key shell (extended Korn shell) */ 3148c2aa98e2SPeter Wemm "/bin/posix/sh", 314972936242SGregory Neil Shapiro "/sbin/sh", 31503299c2f1SGregory Neil Shapiro # endif /* V4FS */ 31513299c2f1SGregory Neil Shapiro # endif /* __hpux */ 3152c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 3153c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3154c2aa98e2SPeter Wemm "/usr/bin/ksh", 3155c2aa98e2SPeter Wemm "/bin/tsh", /* trusted shell */ 3156c2aa98e2SPeter Wemm "/usr/bin/tsh", 3157c2aa98e2SPeter Wemm "/bin/bsh", /* Bourne shell */ 3158c2aa98e2SPeter Wemm "/usr/bin/bsh", 31593299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 316076b7bf71SPeter Wemm # if defined(__svr4__) || defined(__svr5__) 3161c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3162c2aa98e2SPeter Wemm "/usr/bin/ksh", 31633299c2f1SGregory Neil Shapiro # endif /* defined(__svr4__) || defined(__svr5__) */ 3164c2aa98e2SPeter Wemm # ifdef sgi 3165c2aa98e2SPeter Wemm "/sbin/sh", /* SGI's shells really live in /sbin */ 31669d8fddc1SGregory Neil Shapiro "/usr/bin/sh", 31672ef40764SGregory Neil Shapiro "/sbin/bsh", /* classic Bourne shell */ 31689d8fddc1SGregory Neil Shapiro "/bin/bsh", 31699d8fddc1SGregory Neil Shapiro "/usr/bin/bsh", 31709d8fddc1SGregory Neil Shapiro "/sbin/csh", /* standard csh */ 31719d8fddc1SGregory Neil Shapiro "/bin/csh", 31729d8fddc1SGregory Neil Shapiro "/usr/bin/csh", 31732ef40764SGregory Neil Shapiro "/sbin/jsh", /* classic Bourne shell w/ job control*/ 31749d8fddc1SGregory Neil Shapiro "/bin/jsh", 31759d8fddc1SGregory Neil Shapiro "/usr/bin/jsh", 3176c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3177c2aa98e2SPeter Wemm "/sbin/ksh", 3178c2aa98e2SPeter Wemm "/usr/bin/ksh", 31799d8fddc1SGregory Neil Shapiro "/sbin/tcsh", /* Extended csh */ 31809d8fddc1SGregory Neil Shapiro "/bin/tcsh", 3181c2aa98e2SPeter Wemm "/usr/bin/tcsh", 31823299c2f1SGregory Neil Shapiro # endif /* sgi */ 3183c2aa98e2SPeter Wemm NULL 3184c2aa98e2SPeter Wemm }; 3185c2aa98e2SPeter Wemm 31863299c2f1SGregory Neil Shapiro #endif /* !HASGETUSERSHELL */ 3187c2aa98e2SPeter Wemm 3188c2aa98e2SPeter Wemm #define WILDCARD_SHELL "/SENDMAIL/ANY/SHELL/" 3189c2aa98e2SPeter Wemm 3190c2aa98e2SPeter Wemm bool 3191c2aa98e2SPeter Wemm usershellok(user, shell) 3192c2aa98e2SPeter Wemm char *user; 3193c2aa98e2SPeter Wemm char *shell; 3194c2aa98e2SPeter Wemm { 3195c2aa98e2SPeter Wemm # if HASGETUSERSHELL 3196c2aa98e2SPeter Wemm register char *p; 3197c2aa98e2SPeter Wemm extern char *getusershell(); 3198c2aa98e2SPeter Wemm 3199c2aa98e2SPeter Wemm if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || 3200c2aa98e2SPeter Wemm ConfigLevel <= 1) 320112ed1c7cSGregory Neil Shapiro return true; 3202c2aa98e2SPeter Wemm 3203c2aa98e2SPeter Wemm setusershell(); 3204c2aa98e2SPeter Wemm while ((p = getusershell()) != NULL) 3205c2aa98e2SPeter Wemm if (strcmp(p, shell) == 0 || strcmp(p, WILDCARD_SHELL) == 0) 3206c2aa98e2SPeter Wemm break; 3207c2aa98e2SPeter Wemm endusershell(); 3208c2aa98e2SPeter Wemm return p != NULL; 32093299c2f1SGregory Neil Shapiro # else /* HASGETUSERSHELL */ 3210c2aa98e2SPeter Wemm # if USEGETCONFATTR 3211c2aa98e2SPeter Wemm auto char *v; 32123299c2f1SGregory Neil Shapiro # endif /* USEGETCONFATTR */ 321312ed1c7cSGregory Neil Shapiro register SM_FILE_T *shellf; 3214c2aa98e2SPeter Wemm char buf[MAXLINE]; 3215c2aa98e2SPeter Wemm 3216c2aa98e2SPeter Wemm if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || 3217c2aa98e2SPeter Wemm ConfigLevel <= 1) 321812ed1c7cSGregory Neil Shapiro return true; 3219c2aa98e2SPeter Wemm 3220c2aa98e2SPeter Wemm # if USEGETCONFATTR 3221c2aa98e2SPeter Wemm /* 3222c2aa98e2SPeter Wemm ** Naturally IBM has a "better" idea..... 3223c2aa98e2SPeter Wemm ** 3224c2aa98e2SPeter Wemm ** What a crock. This interface isn't documented, it is 3225c2aa98e2SPeter Wemm ** considered part of the security library (-ls), and it 3226c2aa98e2SPeter Wemm ** only works if you are running as root (since the list 3227c2aa98e2SPeter Wemm ** of valid shells is obviously a source of great concern). 3228c2aa98e2SPeter Wemm ** I recommend that you do NOT define USEGETCONFATTR, 3229c2aa98e2SPeter Wemm ** especially since you are going to have to set up an 3230c2aa98e2SPeter Wemm ** /etc/shells anyhow to handle the cases where getconfattr 3231c2aa98e2SPeter Wemm ** fails. 3232c2aa98e2SPeter Wemm */ 3233c2aa98e2SPeter Wemm 3234c2aa98e2SPeter Wemm if (getconfattr(SC_SYS_LOGIN, SC_SHELLS, &v, SEC_LIST) == 0 && v != NULL) 3235c2aa98e2SPeter Wemm { 3236c2aa98e2SPeter Wemm while (*v != '\0') 3237c2aa98e2SPeter Wemm { 3238c2aa98e2SPeter Wemm if (strcmp(v, shell) == 0 || strcmp(v, WILDCARD_SHELL) == 0) 323912ed1c7cSGregory Neil Shapiro return true; 3240c2aa98e2SPeter Wemm v += strlen(v) + 1; 3241c2aa98e2SPeter Wemm } 324212ed1c7cSGregory Neil Shapiro return false; 3243c2aa98e2SPeter Wemm } 32443299c2f1SGregory Neil Shapiro # endif /* USEGETCONFATTR */ 3245c2aa98e2SPeter Wemm 324612ed1c7cSGregory Neil Shapiro shellf = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_SHELLS, 324712ed1c7cSGregory Neil Shapiro SM_IO_RDONLY, NULL); 3248c2aa98e2SPeter Wemm if (shellf == NULL) 3249c2aa98e2SPeter Wemm { 3250c2aa98e2SPeter Wemm /* no /etc/shells; see if it is one of the std shells */ 3251c2aa98e2SPeter Wemm char **d; 3252c2aa98e2SPeter Wemm 3253c2aa98e2SPeter Wemm if (errno != ENOENT && LogLevel > 3) 3254c2aa98e2SPeter Wemm sm_syslog(LOG_ERR, NOQID, 3255c2aa98e2SPeter Wemm "usershellok: cannot open %s: %s", 325612ed1c7cSGregory Neil Shapiro _PATH_SHELLS, sm_errstring(errno)); 3257c2aa98e2SPeter Wemm 3258c2aa98e2SPeter Wemm for (d = DefaultUserShells; *d != NULL; d++) 3259c2aa98e2SPeter Wemm { 3260c2aa98e2SPeter Wemm if (strcmp(shell, *d) == 0) 326112ed1c7cSGregory Neil Shapiro return true; 3262c2aa98e2SPeter Wemm } 326312ed1c7cSGregory Neil Shapiro return false; 3264c2aa98e2SPeter Wemm } 3265c2aa98e2SPeter Wemm 326612ed1c7cSGregory Neil Shapiro while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) 3267c2aa98e2SPeter Wemm { 3268c2aa98e2SPeter Wemm register char *p, *q; 3269c2aa98e2SPeter Wemm 3270c2aa98e2SPeter Wemm p = buf; 3271c2aa98e2SPeter Wemm while (*p != '\0' && *p != '#' && *p != '/') 3272c2aa98e2SPeter Wemm p++; 3273c2aa98e2SPeter Wemm if (*p == '#' || *p == '\0') 3274c2aa98e2SPeter Wemm continue; 3275c2aa98e2SPeter Wemm q = p; 3276c2aa98e2SPeter Wemm while (*p != '\0' && *p != '#' && !(isascii(*p) && isspace(*p))) 3277c2aa98e2SPeter Wemm p++; 3278c2aa98e2SPeter Wemm *p = '\0'; 3279c2aa98e2SPeter Wemm if (strcmp(shell, q) == 0 || strcmp(WILDCARD_SHELL, q) == 0) 3280c2aa98e2SPeter Wemm { 328112ed1c7cSGregory Neil Shapiro (void) sm_io_close(shellf, SM_TIME_DEFAULT); 328212ed1c7cSGregory Neil Shapiro return true; 3283c2aa98e2SPeter Wemm } 3284c2aa98e2SPeter Wemm } 328512ed1c7cSGregory Neil Shapiro (void) sm_io_close(shellf, SM_TIME_DEFAULT); 328612ed1c7cSGregory Neil Shapiro return false; 32873299c2f1SGregory Neil Shapiro # endif /* HASGETUSERSHELL */ 3288c2aa98e2SPeter Wemm } 328912ed1c7cSGregory Neil Shapiro /* 3290c2aa98e2SPeter Wemm ** FREEDISKSPACE -- see how much free space is on the queue filesystem 3291c2aa98e2SPeter Wemm ** 3292c2aa98e2SPeter Wemm ** Only implemented if you have statfs. 3293c2aa98e2SPeter Wemm ** 3294c2aa98e2SPeter Wemm ** Parameters: 3295c2aa98e2SPeter Wemm ** dir -- the directory in question. 3296c2aa98e2SPeter Wemm ** bsize -- a variable into which the filesystem 3297c2aa98e2SPeter Wemm ** block size is stored. 3298c2aa98e2SPeter Wemm ** 3299c2aa98e2SPeter Wemm ** Returns: 33003299c2f1SGregory Neil Shapiro ** The number of blocks free on the queue filesystem. 3301c2aa98e2SPeter Wemm ** -1 if the statfs call fails. 3302c2aa98e2SPeter Wemm ** 3303c2aa98e2SPeter Wemm ** Side effects: 3304c2aa98e2SPeter Wemm ** Puts the filesystem block size into bsize. 3305c2aa98e2SPeter Wemm */ 3306c2aa98e2SPeter Wemm 3307c2aa98e2SPeter Wemm /* statfs types */ 3308c2aa98e2SPeter Wemm # define SFS_NONE 0 /* no statfs implementation */ 3309c2aa98e2SPeter Wemm # define SFS_USTAT 1 /* use ustat */ 3310c2aa98e2SPeter Wemm # define SFS_4ARGS 2 /* use four-argument statfs call */ 3311c2aa98e2SPeter Wemm # define SFS_VFS 3 /* use <sys/vfs.h> implementation */ 3312c2aa98e2SPeter Wemm # define SFS_MOUNT 4 /* use <sys/mount.h> implementation */ 3313c2aa98e2SPeter Wemm # define SFS_STATFS 5 /* use <sys/statfs.h> implementation */ 3314c2aa98e2SPeter Wemm # define SFS_STATVFS 6 /* use <sys/statvfs.h> implementation */ 3315c2aa98e2SPeter Wemm 3316c2aa98e2SPeter Wemm # ifndef SFS_TYPE 3317c2aa98e2SPeter Wemm # define SFS_TYPE SFS_NONE 33183299c2f1SGregory Neil Shapiro # endif /* ! SFS_TYPE */ 3319c2aa98e2SPeter Wemm 3320c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3321c2aa98e2SPeter Wemm # include <ustat.h> 33223299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3323c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS 3324c2aa98e2SPeter Wemm # include <sys/statfs.h> 33253299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS */ 3326c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_VFS 3327c2aa98e2SPeter Wemm # include <sys/vfs.h> 33283299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_VFS */ 3329c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_MOUNT 3330c2aa98e2SPeter Wemm # include <sys/mount.h> 33313299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_MOUNT */ 3332c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3333c2aa98e2SPeter Wemm # include <sys/statvfs.h> 33343299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 3335c2aa98e2SPeter Wemm 3336c2aa98e2SPeter Wemm long 3337c2aa98e2SPeter Wemm freediskspace(dir, bsize) 3338c2aa98e2SPeter Wemm char *dir; 3339c2aa98e2SPeter Wemm long *bsize; 3340c2aa98e2SPeter Wemm { 334112ed1c7cSGregory Neil Shapiro # if SFS_TYPE == SFS_NONE 334212ed1c7cSGregory Neil Shapiro if (bsize != NULL) 334312ed1c7cSGregory Neil Shapiro *bsize = 4096L; 334412ed1c7cSGregory Neil Shapiro 334512ed1c7cSGregory Neil Shapiro /* assume free space is plentiful */ 334612ed1c7cSGregory Neil Shapiro return (long) LONG_MAX; 334712ed1c7cSGregory Neil Shapiro # else /* SFS_TYPE == SFS_NONE */ 3348c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3349c2aa98e2SPeter Wemm struct ustat fs; 3350c2aa98e2SPeter Wemm struct stat statbuf; 3351c2aa98e2SPeter Wemm # define FSBLOCKSIZE DEV_BSIZE 3352c2aa98e2SPeter Wemm # define SFS_BAVAIL f_tfree 33533299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_USTAT */ 3354c2aa98e2SPeter Wemm # if defined(ultrix) 3355c2aa98e2SPeter Wemm struct fs_data fs; 3356c2aa98e2SPeter Wemm # define SFS_BAVAIL fd_bfreen 3357c2aa98e2SPeter Wemm # define FSBLOCKSIZE 1024L 33583299c2f1SGregory Neil Shapiro # else /* defined(ultrix) */ 3359c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3360c2aa98e2SPeter Wemm struct statvfs fs; 3361c2aa98e2SPeter Wemm # define FSBLOCKSIZE fs.f_frsize 33623299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_STATVFS */ 3363c2aa98e2SPeter Wemm struct statfs fs; 3364c2aa98e2SPeter Wemm # define FSBLOCKSIZE fs.f_bsize 33653299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 33663299c2f1SGregory Neil Shapiro # endif /* defined(ultrix) */ 33673299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3368c2aa98e2SPeter Wemm # ifndef SFS_BAVAIL 3369c2aa98e2SPeter Wemm # define SFS_BAVAIL f_bavail 33703299c2f1SGregory Neil Shapiro # endif /* ! SFS_BAVAIL */ 3371c2aa98e2SPeter Wemm 3372c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3373c2aa98e2SPeter Wemm if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0) 33743299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_USTAT */ 3375c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_4ARGS 3376c2aa98e2SPeter Wemm if (statfs(dir, &fs, sizeof fs, 0) == 0) 33773299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_4ARGS */ 3378c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3379c2aa98e2SPeter Wemm if (statvfs(dir, &fs) == 0) 33803299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_STATVFS */ 3381c2aa98e2SPeter Wemm # if defined(ultrix) 3382c2aa98e2SPeter Wemm if (statfs(dir, &fs) > 0) 33833299c2f1SGregory Neil Shapiro # else /* defined(ultrix) */ 3384c2aa98e2SPeter Wemm if (statfs(dir, &fs) == 0) 33853299c2f1SGregory Neil Shapiro # endif /* defined(ultrix) */ 33863299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 33873299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_4ARGS */ 33883299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3389c2aa98e2SPeter Wemm { 3390c2aa98e2SPeter Wemm if (bsize != NULL) 3391c2aa98e2SPeter Wemm *bsize = FSBLOCKSIZE; 3392c2aa98e2SPeter Wemm if (fs.SFS_BAVAIL <= 0) 3393c2aa98e2SPeter Wemm return 0; 3394c2aa98e2SPeter Wemm else if (fs.SFS_BAVAIL > LONG_MAX) 33953299c2f1SGregory Neil Shapiro return (long) LONG_MAX; 3396c2aa98e2SPeter Wemm else 3397c2aa98e2SPeter Wemm return (long) fs.SFS_BAVAIL; 3398c2aa98e2SPeter Wemm } 33993299c2f1SGregory Neil Shapiro return -1; 340012ed1c7cSGregory Neil Shapiro # endif /* SFS_TYPE == SFS_NONE */ 3401c2aa98e2SPeter Wemm } 340212ed1c7cSGregory Neil Shapiro /* 340312ed1c7cSGregory Neil Shapiro ** ENOUGHDISKSPACE -- is there enough free space on the queue file systems? 3404c2aa98e2SPeter Wemm ** 3405c2aa98e2SPeter Wemm ** Parameters: 3406c2aa98e2SPeter Wemm ** msize -- the size to check against. If zero, we don't yet 3407c2aa98e2SPeter Wemm ** know how big the message will be, so just check for 3408c2aa98e2SPeter Wemm ** a "reasonable" amount. 340912ed1c7cSGregory Neil Shapiro ** e -- envelope, or NULL -- controls logging 3410c2aa98e2SPeter Wemm ** 3411c2aa98e2SPeter Wemm ** Returns: 341212ed1c7cSGregory Neil Shapiro ** true if in every queue group there is at least one 341312ed1c7cSGregory Neil Shapiro ** queue directory whose file system contains enough free space. 341412ed1c7cSGregory Neil Shapiro ** false otherwise. 341512ed1c7cSGregory Neil Shapiro ** 341612ed1c7cSGregory Neil Shapiro ** Side Effects: 341712ed1c7cSGregory Neil Shapiro ** If there is not enough disk space and e != NULL 341812ed1c7cSGregory Neil Shapiro ** then sm_syslog is called. 3419c2aa98e2SPeter Wemm */ 3420c2aa98e2SPeter Wemm 3421c2aa98e2SPeter Wemm bool 342212ed1c7cSGregory Neil Shapiro enoughdiskspace(msize, e) 3423c2aa98e2SPeter Wemm long msize; 342412ed1c7cSGregory Neil Shapiro ENVELOPE *e; 3425c2aa98e2SPeter Wemm { 342612ed1c7cSGregory Neil Shapiro int i; 3427c2aa98e2SPeter Wemm 3428c2aa98e2SPeter Wemm if (MinBlocksFree <= 0 && msize <= 0) 3429c2aa98e2SPeter Wemm { 3430c2aa98e2SPeter Wemm if (tTd(4, 80)) 343112ed1c7cSGregory Neil Shapiro sm_dprintf("enoughdiskspace: no threshold\n"); 343212ed1c7cSGregory Neil Shapiro return true; 3433c2aa98e2SPeter Wemm } 3434c2aa98e2SPeter Wemm 343512ed1c7cSGregory Neil Shapiro filesys_update(); 343612ed1c7cSGregory Neil Shapiro for (i = 0; i < NumQueue; ++i) 3437c2aa98e2SPeter Wemm { 343812ed1c7cSGregory Neil Shapiro if (pickqdir(Queue[i], msize, e) < 0) 343912ed1c7cSGregory Neil Shapiro return false; 3440c2aa98e2SPeter Wemm } 344112ed1c7cSGregory Neil Shapiro return true; 3442c2aa98e2SPeter Wemm } 344312ed1c7cSGregory Neil Shapiro /* 3444c2aa98e2SPeter Wemm ** TRANSIENTERROR -- tell if an error code indicates a transient failure 3445c2aa98e2SPeter Wemm ** 3446c2aa98e2SPeter Wemm ** This looks at an errno value and tells if this is likely to 3447c2aa98e2SPeter Wemm ** go away if retried later. 3448c2aa98e2SPeter Wemm ** 3449c2aa98e2SPeter Wemm ** Parameters: 3450c2aa98e2SPeter Wemm ** err -- the errno code to classify. 3451c2aa98e2SPeter Wemm ** 3452c2aa98e2SPeter Wemm ** Returns: 345312ed1c7cSGregory Neil Shapiro ** true if this is probably transient. 345412ed1c7cSGregory Neil Shapiro ** false otherwise. 3455c2aa98e2SPeter Wemm */ 3456c2aa98e2SPeter Wemm 3457c2aa98e2SPeter Wemm bool 3458c2aa98e2SPeter Wemm transienterror(err) 3459c2aa98e2SPeter Wemm int err; 3460c2aa98e2SPeter Wemm { 3461c2aa98e2SPeter Wemm switch (err) 3462c2aa98e2SPeter Wemm { 3463c2aa98e2SPeter Wemm case EIO: /* I/O error */ 3464c2aa98e2SPeter Wemm case ENXIO: /* Device not configured */ 3465c2aa98e2SPeter Wemm case EAGAIN: /* Resource temporarily unavailable */ 3466c2aa98e2SPeter Wemm case ENOMEM: /* Cannot allocate memory */ 3467c2aa98e2SPeter Wemm case ENODEV: /* Operation not supported by device */ 3468c2aa98e2SPeter Wemm case ENFILE: /* Too many open files in system */ 3469c2aa98e2SPeter Wemm case EMFILE: /* Too many open files */ 3470c2aa98e2SPeter Wemm case ENOSPC: /* No space left on device */ 3471c2aa98e2SPeter Wemm case ETIMEDOUT: /* Connection timed out */ 3472c2aa98e2SPeter Wemm #ifdef ESTALE 3473c2aa98e2SPeter Wemm case ESTALE: /* Stale NFS file handle */ 34743299c2f1SGregory Neil Shapiro #endif /* ESTALE */ 3475c2aa98e2SPeter Wemm #ifdef ENETDOWN 3476c2aa98e2SPeter Wemm case ENETDOWN: /* Network is down */ 34773299c2f1SGregory Neil Shapiro #endif /* ENETDOWN */ 3478c2aa98e2SPeter Wemm #ifdef ENETUNREACH 3479c2aa98e2SPeter Wemm case ENETUNREACH: /* Network is unreachable */ 34803299c2f1SGregory Neil Shapiro #endif /* ENETUNREACH */ 3481c2aa98e2SPeter Wemm #ifdef ENETRESET 3482c2aa98e2SPeter Wemm case ENETRESET: /* Network dropped connection on reset */ 34833299c2f1SGregory Neil Shapiro #endif /* ENETRESET */ 3484c2aa98e2SPeter Wemm #ifdef ECONNABORTED 3485c2aa98e2SPeter Wemm case ECONNABORTED: /* Software caused connection abort */ 34863299c2f1SGregory Neil Shapiro #endif /* ECONNABORTED */ 3487c2aa98e2SPeter Wemm #ifdef ECONNRESET 3488c2aa98e2SPeter Wemm case ECONNRESET: /* Connection reset by peer */ 34893299c2f1SGregory Neil Shapiro #endif /* ECONNRESET */ 3490c2aa98e2SPeter Wemm #ifdef ENOBUFS 3491c2aa98e2SPeter Wemm case ENOBUFS: /* No buffer space available */ 34923299c2f1SGregory Neil Shapiro #endif /* ENOBUFS */ 3493c2aa98e2SPeter Wemm #ifdef ESHUTDOWN 3494c2aa98e2SPeter Wemm case ESHUTDOWN: /* Can't send after socket shutdown */ 34953299c2f1SGregory Neil Shapiro #endif /* ESHUTDOWN */ 3496c2aa98e2SPeter Wemm #ifdef ECONNREFUSED 3497c2aa98e2SPeter Wemm case ECONNREFUSED: /* Connection refused */ 34983299c2f1SGregory Neil Shapiro #endif /* ECONNREFUSED */ 3499c2aa98e2SPeter Wemm #ifdef EHOSTDOWN 3500c2aa98e2SPeter Wemm case EHOSTDOWN: /* Host is down */ 35013299c2f1SGregory Neil Shapiro #endif /* EHOSTDOWN */ 3502c2aa98e2SPeter Wemm #ifdef EHOSTUNREACH 3503c2aa98e2SPeter Wemm case EHOSTUNREACH: /* No route to host */ 35043299c2f1SGregory Neil Shapiro #endif /* EHOSTUNREACH */ 3505c2aa98e2SPeter Wemm #ifdef EDQUOT 3506c2aa98e2SPeter Wemm case EDQUOT: /* Disc quota exceeded */ 35073299c2f1SGregory Neil Shapiro #endif /* EDQUOT */ 3508c2aa98e2SPeter Wemm #ifdef EPROCLIM 3509c2aa98e2SPeter Wemm case EPROCLIM: /* Too many processes */ 35103299c2f1SGregory Neil Shapiro #endif /* EPROCLIM */ 3511c2aa98e2SPeter Wemm #ifdef EUSERS 3512c2aa98e2SPeter Wemm case EUSERS: /* Too many users */ 35133299c2f1SGregory Neil Shapiro #endif /* EUSERS */ 3514c2aa98e2SPeter Wemm #ifdef EDEADLK 3515c2aa98e2SPeter Wemm case EDEADLK: /* Resource deadlock avoided */ 35163299c2f1SGregory Neil Shapiro #endif /* EDEADLK */ 3517c2aa98e2SPeter Wemm #ifdef EISCONN 3518c2aa98e2SPeter Wemm case EISCONN: /* Socket already connected */ 35193299c2f1SGregory Neil Shapiro #endif /* EISCONN */ 3520c2aa98e2SPeter Wemm #ifdef EINPROGRESS 3521c2aa98e2SPeter Wemm case EINPROGRESS: /* Operation now in progress */ 35223299c2f1SGregory Neil Shapiro #endif /* EINPROGRESS */ 3523c2aa98e2SPeter Wemm #ifdef EALREADY 3524c2aa98e2SPeter Wemm case EALREADY: /* Operation already in progress */ 35253299c2f1SGregory Neil Shapiro #endif /* EALREADY */ 3526c2aa98e2SPeter Wemm #ifdef EADDRINUSE 3527c2aa98e2SPeter Wemm case EADDRINUSE: /* Address already in use */ 35283299c2f1SGregory Neil Shapiro #endif /* EADDRINUSE */ 3529c2aa98e2SPeter Wemm #ifdef EADDRNOTAVAIL 3530c2aa98e2SPeter Wemm case EADDRNOTAVAIL: /* Can't assign requested address */ 35313299c2f1SGregory Neil Shapiro #endif /* EADDRNOTAVAIL */ 3532c2aa98e2SPeter Wemm #ifdef ETXTBSY 3533c2aa98e2SPeter Wemm case ETXTBSY: /* (Apollo) file locked */ 35343299c2f1SGregory Neil Shapiro #endif /* ETXTBSY */ 3535c2aa98e2SPeter Wemm #if defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) 3536c2aa98e2SPeter Wemm case ENOSR: /* Out of streams resources */ 35373299c2f1SGregory Neil Shapiro #endif /* defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) */ 35383299c2f1SGregory Neil Shapiro #ifdef ENOLCK 35393299c2f1SGregory Neil Shapiro case ENOLCK: /* No locks available */ 35403299c2f1SGregory Neil Shapiro #endif /* ENOLCK */ 3541c2aa98e2SPeter Wemm case E_SM_OPENTIMEOUT: /* PSEUDO: open timed out */ 354212ed1c7cSGregory Neil Shapiro return true; 3543c2aa98e2SPeter Wemm } 3544c2aa98e2SPeter Wemm 3545c2aa98e2SPeter Wemm /* nope, must be permanent */ 354612ed1c7cSGregory Neil Shapiro return false; 3547c2aa98e2SPeter Wemm } 354812ed1c7cSGregory Neil Shapiro /* 3549c2aa98e2SPeter Wemm ** LOCKFILE -- lock a file using flock or (shudder) fcntl locking 3550c2aa98e2SPeter Wemm ** 3551c2aa98e2SPeter Wemm ** Parameters: 3552c2aa98e2SPeter Wemm ** fd -- the file descriptor of the file. 3553c2aa98e2SPeter Wemm ** filename -- the file name (for error messages). 3554c2aa98e2SPeter Wemm ** ext -- the filename extension. 3555c2aa98e2SPeter Wemm ** type -- type of the lock. Bits can be: 3556c2aa98e2SPeter Wemm ** LOCK_EX -- exclusive lock. 3557c2aa98e2SPeter Wemm ** LOCK_NB -- non-blocking. 3558c46d91b7SGregory Neil Shapiro ** LOCK_UN -- unlock. 3559c2aa98e2SPeter Wemm ** 3560c2aa98e2SPeter Wemm ** Returns: 356112ed1c7cSGregory Neil Shapiro ** true if the lock was acquired. 356212ed1c7cSGregory Neil Shapiro ** false otherwise. 3563c2aa98e2SPeter Wemm */ 3564c2aa98e2SPeter Wemm 3565c2aa98e2SPeter Wemm bool 3566c2aa98e2SPeter Wemm lockfile(fd, filename, ext, type) 3567c2aa98e2SPeter Wemm int fd; 3568c2aa98e2SPeter Wemm char *filename; 3569c2aa98e2SPeter Wemm char *ext; 3570c2aa98e2SPeter Wemm int type; 3571c2aa98e2SPeter Wemm { 3572c2aa98e2SPeter Wemm int i; 3573c2aa98e2SPeter Wemm int save_errno; 3574c2aa98e2SPeter Wemm # if !HASFLOCK 3575c2aa98e2SPeter Wemm int action; 3576c2aa98e2SPeter Wemm struct flock lfd; 3577c2aa98e2SPeter Wemm 3578c2aa98e2SPeter Wemm if (ext == NULL) 3579c2aa98e2SPeter Wemm ext = ""; 3580c2aa98e2SPeter Wemm 35813299c2f1SGregory Neil Shapiro memset(&lfd, '\0', sizeof lfd); 3582c2aa98e2SPeter Wemm if (bitset(LOCK_UN, type)) 3583c2aa98e2SPeter Wemm lfd.l_type = F_UNLCK; 3584c2aa98e2SPeter Wemm else if (bitset(LOCK_EX, type)) 3585c2aa98e2SPeter Wemm lfd.l_type = F_WRLCK; 3586c2aa98e2SPeter Wemm else 3587c2aa98e2SPeter Wemm lfd.l_type = F_RDLCK; 3588c2aa98e2SPeter Wemm 3589c2aa98e2SPeter Wemm if (bitset(LOCK_NB, type)) 3590c2aa98e2SPeter Wemm action = F_SETLK; 3591c2aa98e2SPeter Wemm else 3592c2aa98e2SPeter Wemm action = F_SETLKW; 3593c2aa98e2SPeter Wemm 3594c2aa98e2SPeter Wemm if (tTd(55, 60)) 359512ed1c7cSGregory Neil Shapiro sm_dprintf("lockfile(%s%s, action=%d, type=%d): ", 3596c2aa98e2SPeter Wemm filename, ext, action, lfd.l_type); 3597c2aa98e2SPeter Wemm 3598c2aa98e2SPeter Wemm while ((i = fcntl(fd, action, &lfd)) < 0 && errno == EINTR) 3599c2aa98e2SPeter Wemm continue; 3600c2aa98e2SPeter Wemm if (i >= 0) 3601c2aa98e2SPeter Wemm { 3602c2aa98e2SPeter Wemm if (tTd(55, 60)) 360312ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 360412ed1c7cSGregory Neil Shapiro return true; 3605c2aa98e2SPeter Wemm } 3606c2aa98e2SPeter Wemm save_errno = errno; 3607c2aa98e2SPeter Wemm 3608c2aa98e2SPeter Wemm if (tTd(55, 60)) 360912ed1c7cSGregory Neil Shapiro sm_dprintf("(%s) ", sm_errstring(save_errno)); 3610c2aa98e2SPeter Wemm 3611c2aa98e2SPeter Wemm /* 3612c2aa98e2SPeter Wemm ** On SunOS, if you are testing using -oQ/tmp/mqueue or 3613c2aa98e2SPeter Wemm ** -oA/tmp/aliases or anything like that, and /tmp is mounted 3614c2aa98e2SPeter Wemm ** as type "tmp" (that is, served from swap space), the 3615c2aa98e2SPeter Wemm ** previous fcntl will fail with "Invalid argument" errors. 3616c2aa98e2SPeter Wemm ** Since this is fairly common during testing, we will assume 3617c2aa98e2SPeter Wemm ** that this indicates that the lock is successfully grabbed. 3618c2aa98e2SPeter Wemm */ 3619c2aa98e2SPeter Wemm 3620c2aa98e2SPeter Wemm if (save_errno == EINVAL) 3621c2aa98e2SPeter Wemm { 3622c2aa98e2SPeter Wemm if (tTd(55, 60)) 362312ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 362412ed1c7cSGregory Neil Shapiro return true; 3625c2aa98e2SPeter Wemm } 3626c2aa98e2SPeter Wemm 36273299c2f1SGregory Neil Shapiro if (!bitset(LOCK_NB, type) || 36283299c2f1SGregory Neil Shapiro (save_errno != EACCES && save_errno != EAGAIN)) 3629c2aa98e2SPeter Wemm { 3630320f00e7SGregory Neil Shapiro int omode = fcntl(fd, F_GETFL, 0); 3631320f00e7SGregory Neil Shapiro uid_t euid = geteuid(); 3632320f00e7SGregory Neil Shapiro 3633c2aa98e2SPeter Wemm errno = save_errno; 3634c2aa98e2SPeter Wemm syserr("cannot lockf(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", 3635320f00e7SGregory Neil Shapiro filename, ext, fd, type, omode, euid); 363612ed1c7cSGregory Neil Shapiro dumpfd(fd, true, true); 3637c2aa98e2SPeter Wemm } 36383299c2f1SGregory Neil Shapiro # else /* !HASFLOCK */ 3639c2aa98e2SPeter Wemm if (ext == NULL) 3640c2aa98e2SPeter Wemm ext = ""; 3641c2aa98e2SPeter Wemm 3642c2aa98e2SPeter Wemm if (tTd(55, 60)) 364312ed1c7cSGregory Neil Shapiro sm_dprintf("lockfile(%s%s, type=%o): ", filename, ext, type); 3644c2aa98e2SPeter Wemm 3645c2aa98e2SPeter Wemm while ((i = flock(fd, type)) < 0 && errno == EINTR) 3646c2aa98e2SPeter Wemm continue; 3647c2aa98e2SPeter Wemm if (i >= 0) 3648c2aa98e2SPeter Wemm { 3649c2aa98e2SPeter Wemm if (tTd(55, 60)) 365012ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 365112ed1c7cSGregory Neil Shapiro return true; 3652c2aa98e2SPeter Wemm } 3653c2aa98e2SPeter Wemm save_errno = errno; 3654c2aa98e2SPeter Wemm 3655c2aa98e2SPeter Wemm if (tTd(55, 60)) 365612ed1c7cSGregory Neil Shapiro sm_dprintf("(%s) ", sm_errstring(save_errno)); 3657c2aa98e2SPeter Wemm 3658c2aa98e2SPeter Wemm if (!bitset(LOCK_NB, type) || save_errno != EWOULDBLOCK) 3659c2aa98e2SPeter Wemm { 3660320f00e7SGregory Neil Shapiro int omode = fcntl(fd, F_GETFL, 0); 3661320f00e7SGregory Neil Shapiro uid_t euid = geteuid(); 3662320f00e7SGregory Neil Shapiro 3663c2aa98e2SPeter Wemm errno = save_errno; 3664c2aa98e2SPeter Wemm syserr("cannot flock(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", 3665320f00e7SGregory Neil Shapiro filename, ext, fd, type, omode, euid); 366612ed1c7cSGregory Neil Shapiro dumpfd(fd, true, true); 3667c2aa98e2SPeter Wemm } 36683299c2f1SGregory Neil Shapiro # endif /* !HASFLOCK */ 3669c2aa98e2SPeter Wemm if (tTd(55, 60)) 367012ed1c7cSGregory Neil Shapiro sm_dprintf("FAIL\n"); 3671c2aa98e2SPeter Wemm errno = save_errno; 367212ed1c7cSGregory Neil Shapiro return false; 3673c2aa98e2SPeter Wemm } 367412ed1c7cSGregory Neil Shapiro /* 3675c2aa98e2SPeter Wemm ** CHOWNSAFE -- tell if chown is "safe" (executable only by root) 3676c2aa98e2SPeter Wemm ** 3677c2aa98e2SPeter Wemm ** Unfortunately, given that we can't predict other systems on which 3678c2aa98e2SPeter Wemm ** a remote mounted (NFS) filesystem will be mounted, the answer is 3679c2aa98e2SPeter Wemm ** almost always that this is unsafe. 3680c2aa98e2SPeter Wemm ** 3681c2aa98e2SPeter Wemm ** Note also that many operating systems have non-compliant 3682c2aa98e2SPeter Wemm ** implementations of the _POSIX_CHOWN_RESTRICTED variable and the 3683c2aa98e2SPeter Wemm ** fpathconf() routine. According to IEEE 1003.1-1990, if 3684c2aa98e2SPeter Wemm ** _POSIX_CHOWN_RESTRICTED is defined and not equal to -1, then 3685c2aa98e2SPeter Wemm ** no non-root process can give away the file. However, vendors 3686c2aa98e2SPeter Wemm ** don't take NFS into account, so a comfortable value of 3687c2aa98e2SPeter Wemm ** _POSIX_CHOWN_RESTRICTED tells us nothing. 3688c2aa98e2SPeter Wemm ** 3689c2aa98e2SPeter Wemm ** Also, some systems (e.g., IRIX 6.2) return 1 from fpathconf() 3690c2aa98e2SPeter Wemm ** even on files where chown is not restricted. Many systems get 3691c2aa98e2SPeter Wemm ** this wrong on NFS-based filesystems (that is, they say that chown 3692c2aa98e2SPeter Wemm ** is restricted [safe] on NFS filesystems where it may not be, since 3693c2aa98e2SPeter Wemm ** other systems can access the same filesystem and do file giveaway; 3694c2aa98e2SPeter Wemm ** only the NFS server knows for sure!) Hence, it is important to 3695c2aa98e2SPeter Wemm ** get the value of SAFENFSPATHCONF correct -- it should be defined 3696c2aa98e2SPeter Wemm ** _only_ after testing (see test/t_pathconf.c) a system on an unsafe 3697c2aa98e2SPeter Wemm ** NFS-based filesystem to ensure that you can get meaningful results. 3698c2aa98e2SPeter Wemm ** If in doubt, assume unsafe! 3699c2aa98e2SPeter Wemm ** 3700c2aa98e2SPeter Wemm ** You may also need to tweak IS_SAFE_CHOWN -- it should be a 3701c2aa98e2SPeter Wemm ** condition indicating whether the return from pathconf indicates 3702c2aa98e2SPeter Wemm ** that chown is safe (typically either > 0 or >= 0 -- there isn't 3703c2aa98e2SPeter Wemm ** even any agreement about whether a zero return means that a file 3704c2aa98e2SPeter Wemm ** is or is not safe). It defaults to "> 0". 3705c2aa98e2SPeter Wemm ** 3706c2aa98e2SPeter Wemm ** If the parent directory is safe (writable only by owner back 3707c2aa98e2SPeter Wemm ** to the root) then we can relax slightly and trust fpathconf 3708c2aa98e2SPeter Wemm ** in more circumstances. This is really a crock -- if this is an 3709c2aa98e2SPeter Wemm ** NFS mounted filesystem then we really know nothing about the 3710c2aa98e2SPeter Wemm ** underlying implementation. However, most systems pessimize and 3711c2aa98e2SPeter Wemm ** return an error (EINVAL or EOPNOTSUPP) on NFS filesystems, which 3712c2aa98e2SPeter Wemm ** we interpret as unsafe, as we should. Thus, this heuristic gets 3713c2aa98e2SPeter Wemm ** us into a possible problem only on systems that have a broken 3714c2aa98e2SPeter Wemm ** pathconf implementation and which are also poorly configured 3715c2aa98e2SPeter Wemm ** (have :include: files in group- or world-writable directories). 3716c2aa98e2SPeter Wemm ** 3717c2aa98e2SPeter Wemm ** Parameters: 3718c2aa98e2SPeter Wemm ** fd -- the file descriptor to check. 3719c2aa98e2SPeter Wemm ** safedir -- set if the parent directory is safe. 3720c2aa98e2SPeter Wemm ** 3721c2aa98e2SPeter Wemm ** Returns: 372212ed1c7cSGregory Neil Shapiro ** true -- if the chown(2) operation is "safe" -- that is, 3723c2aa98e2SPeter Wemm ** only root can chown the file to an arbitrary user. 372412ed1c7cSGregory Neil Shapiro ** false -- if an arbitrary user can give away a file. 3725c2aa98e2SPeter Wemm */ 3726c2aa98e2SPeter Wemm 3727c2aa98e2SPeter Wemm #ifndef IS_SAFE_CHOWN 3728c2aa98e2SPeter Wemm # define IS_SAFE_CHOWN > 0 37293299c2f1SGregory Neil Shapiro #endif /* ! IS_SAFE_CHOWN */ 3730c2aa98e2SPeter Wemm 3731c2aa98e2SPeter Wemm bool 3732c2aa98e2SPeter Wemm chownsafe(fd, safedir) 3733c2aa98e2SPeter Wemm int fd; 3734c2aa98e2SPeter Wemm bool safedir; 3735c2aa98e2SPeter Wemm { 3736c2aa98e2SPeter Wemm # if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \ 3737c2aa98e2SPeter Wemm (defined(_PC_CHOWN_RESTRICTED) || defined(_GNU_TYPES_H)) 3738c2aa98e2SPeter Wemm int rval; 3739c2aa98e2SPeter Wemm 3740c2aa98e2SPeter Wemm /* give the system administrator a chance to override */ 37413299c2f1SGregory Neil Shapiro if (bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail)) 374212ed1c7cSGregory Neil Shapiro return true; 3743c2aa98e2SPeter Wemm 3744c2aa98e2SPeter Wemm /* 3745c2aa98e2SPeter Wemm ** Some systems (e.g., SunOS) seem to have the call and the 3746c2aa98e2SPeter Wemm ** #define _PC_CHOWN_RESTRICTED, but don't actually implement 3747c2aa98e2SPeter Wemm ** the call. This heuristic checks for that. 3748c2aa98e2SPeter Wemm */ 3749c2aa98e2SPeter Wemm 3750c2aa98e2SPeter Wemm errno = 0; 3751c2aa98e2SPeter Wemm rval = fpathconf(fd, _PC_CHOWN_RESTRICTED); 3752c2aa98e2SPeter Wemm # if SAFENFSPATHCONF 3753c2aa98e2SPeter Wemm return errno == 0 && rval IS_SAFE_CHOWN; 37543299c2f1SGregory Neil Shapiro # else /* SAFENFSPATHCONF */ 3755c2aa98e2SPeter Wemm return safedir && errno == 0 && rval IS_SAFE_CHOWN; 37563299c2f1SGregory Neil Shapiro # endif /* SAFENFSPATHCONF */ 375712ed1c7cSGregory Neil Shapiro # else /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */ 37583299c2f1SGregory Neil Shapiro return bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail); 375912ed1c7cSGregory Neil Shapiro # endif /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */ 3760c2aa98e2SPeter Wemm } 376112ed1c7cSGregory Neil Shapiro /* 3762c2aa98e2SPeter Wemm ** RESETLIMITS -- reset system controlled resource limits 3763c2aa98e2SPeter Wemm ** 3764c2aa98e2SPeter Wemm ** This is to avoid denial-of-service attacks 3765c2aa98e2SPeter Wemm ** 3766c2aa98e2SPeter Wemm ** Parameters: 3767c2aa98e2SPeter Wemm ** none 3768c2aa98e2SPeter Wemm ** 3769c2aa98e2SPeter Wemm ** Returns: 3770c2aa98e2SPeter Wemm ** none 3771c2aa98e2SPeter Wemm */ 3772c2aa98e2SPeter Wemm 3773c2aa98e2SPeter Wemm #if HASSETRLIMIT 3774c2aa98e2SPeter Wemm # ifdef RLIMIT_NEEDS_SYS_TIME_H 3775567a2fc9SGregory Neil Shapiro # include <sm/time.h> 37763299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NEEDS_SYS_TIME_H */ 3777c2aa98e2SPeter Wemm # include <sys/resource.h> 37783299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 3779c2aa98e2SPeter Wemm 3780c2aa98e2SPeter Wemm void 3781c2aa98e2SPeter Wemm resetlimits() 3782c2aa98e2SPeter Wemm { 3783c2aa98e2SPeter Wemm #if HASSETRLIMIT 3784c2aa98e2SPeter Wemm struct rlimit lim; 3785c2aa98e2SPeter Wemm 3786c2aa98e2SPeter Wemm lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; 3787c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_CPU, &lim); 3788c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_FSIZE, &lim); 3789c2aa98e2SPeter Wemm # ifdef RLIMIT_NOFILE 3790c2aa98e2SPeter Wemm lim.rlim_cur = lim.rlim_max = FD_SETSIZE; 3791c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_NOFILE, &lim); 37923299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NOFILE */ 37933299c2f1SGregory Neil Shapiro #else /* HASSETRLIMIT */ 3794c2aa98e2SPeter Wemm # if HASULIMIT 3795c2aa98e2SPeter Wemm (void) ulimit(2, 0x3fffff); 3796c2aa98e2SPeter Wemm (void) ulimit(4, FD_SETSIZE); 37973299c2f1SGregory Neil Shapiro # endif /* HASULIMIT */ 37983299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 3799c2aa98e2SPeter Wemm errno = 0; 3800c2aa98e2SPeter Wemm } 380112ed1c7cSGregory Neil Shapiro /* 3802c2aa98e2SPeter Wemm ** SETVENDOR -- process vendor code from V configuration line 3803c2aa98e2SPeter Wemm ** 3804c2aa98e2SPeter Wemm ** Parameters: 3805c2aa98e2SPeter Wemm ** vendor -- string representation of vendor. 3806c2aa98e2SPeter Wemm ** 3807c2aa98e2SPeter Wemm ** Returns: 380812ed1c7cSGregory Neil Shapiro ** true -- if ok. 380912ed1c7cSGregory Neil Shapiro ** false -- if vendor code could not be processed. 3810c2aa98e2SPeter Wemm ** 3811c2aa98e2SPeter Wemm ** Side Effects: 3812c2aa98e2SPeter Wemm ** It is reasonable to set mode flags here to tweak 3813c2aa98e2SPeter Wemm ** processing in other parts of the code if necessary. 3814c2aa98e2SPeter Wemm ** For example, if you are a vendor that uses $%y to 3815c2aa98e2SPeter Wemm ** indicate YP lookups, you could enable that here. 3816c2aa98e2SPeter Wemm */ 3817c2aa98e2SPeter Wemm 3818c2aa98e2SPeter Wemm bool 3819c2aa98e2SPeter Wemm setvendor(vendor) 3820c2aa98e2SPeter Wemm char *vendor; 3821c2aa98e2SPeter Wemm { 382212ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, "Berkeley") == 0) 3823c2aa98e2SPeter Wemm { 3824c2aa98e2SPeter Wemm VendorCode = VENDOR_BERKELEY; 382512ed1c7cSGregory Neil Shapiro return true; 3826c2aa98e2SPeter Wemm } 3827c2aa98e2SPeter Wemm 3828c2aa98e2SPeter Wemm /* add vendor extensions here */ 3829c2aa98e2SPeter Wemm 3830c2aa98e2SPeter Wemm #ifdef SUN_EXTENSIONS 383112ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, "Sun") == 0) 3832c2aa98e2SPeter Wemm { 3833c2aa98e2SPeter Wemm VendorCode = VENDOR_SUN; 383412ed1c7cSGregory Neil Shapiro return true; 3835c2aa98e2SPeter Wemm } 38363299c2f1SGregory Neil Shapiro #endif /* SUN_EXTENSIONS */ 3837567a2fc9SGregory Neil Shapiro #ifdef DEC 3838567a2fc9SGregory Neil Shapiro if (sm_strcasecmp(vendor, "Digital") == 0) 3839567a2fc9SGregory Neil Shapiro { 3840567a2fc9SGregory Neil Shapiro VendorCode = VENDOR_DEC; 3841567a2fc9SGregory Neil Shapiro return true; 3842567a2fc9SGregory Neil Shapiro } 3843567a2fc9SGregory Neil Shapiro #endif /* DEC */ 3844c2aa98e2SPeter Wemm 384576b7bf71SPeter Wemm #if defined(VENDOR_NAME) && defined(VENDOR_CODE) 384612ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, VENDOR_NAME) == 0) 384776b7bf71SPeter Wemm { 384876b7bf71SPeter Wemm VendorCode = VENDOR_CODE; 384912ed1c7cSGregory Neil Shapiro return true; 385076b7bf71SPeter Wemm } 38513299c2f1SGregory Neil Shapiro #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */ 385276b7bf71SPeter Wemm 385312ed1c7cSGregory Neil Shapiro return false; 3854c2aa98e2SPeter Wemm } 385512ed1c7cSGregory Neil Shapiro /* 385676b7bf71SPeter Wemm ** GETVENDOR -- return vendor name based on vendor code 385776b7bf71SPeter Wemm ** 385876b7bf71SPeter Wemm ** Parameters: 385976b7bf71SPeter Wemm ** vendorcode -- numeric representation of vendor. 386076b7bf71SPeter Wemm ** 386176b7bf71SPeter Wemm ** Returns: 386276b7bf71SPeter Wemm ** string containing vendor name. 386376b7bf71SPeter Wemm */ 386476b7bf71SPeter Wemm 386576b7bf71SPeter Wemm char * 386676b7bf71SPeter Wemm getvendor(vendorcode) 386776b7bf71SPeter Wemm int vendorcode; 386876b7bf71SPeter Wemm { 386976b7bf71SPeter Wemm #if defined(VENDOR_NAME) && defined(VENDOR_CODE) 387076b7bf71SPeter Wemm /* 387176b7bf71SPeter Wemm ** Can't have the same switch case twice so need to 387276b7bf71SPeter Wemm ** handle VENDOR_CODE outside of switch. It might 387376b7bf71SPeter Wemm ** match one of the existing VENDOR_* codes. 387476b7bf71SPeter Wemm */ 387576b7bf71SPeter Wemm 387676b7bf71SPeter Wemm if (vendorcode == VENDOR_CODE) 387776b7bf71SPeter Wemm return VENDOR_NAME; 38783299c2f1SGregory Neil Shapiro #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */ 387976b7bf71SPeter Wemm 388076b7bf71SPeter Wemm switch (vendorcode) 388176b7bf71SPeter Wemm { 388276b7bf71SPeter Wemm case VENDOR_BERKELEY: 388376b7bf71SPeter Wemm return "Berkeley"; 388476b7bf71SPeter Wemm 388576b7bf71SPeter Wemm case VENDOR_SUN: 388676b7bf71SPeter Wemm return "Sun"; 388776b7bf71SPeter Wemm 388876b7bf71SPeter Wemm case VENDOR_HP: 388976b7bf71SPeter Wemm return "HP"; 389076b7bf71SPeter Wemm 389176b7bf71SPeter Wemm case VENDOR_IBM: 389276b7bf71SPeter Wemm return "IBM"; 389376b7bf71SPeter Wemm 389476b7bf71SPeter Wemm case VENDOR_SENDMAIL: 389576b7bf71SPeter Wemm return "Sendmail"; 389676b7bf71SPeter Wemm 389776b7bf71SPeter Wemm default: 389876b7bf71SPeter Wemm return "Unknown"; 389976b7bf71SPeter Wemm } 390076b7bf71SPeter Wemm } 390112ed1c7cSGregory Neil Shapiro /* 3902c2aa98e2SPeter Wemm ** VENDOR_PRE_DEFAULTS, VENDOR_POST_DEFAULTS -- set vendor-specific defaults 3903c2aa98e2SPeter Wemm ** 3904c2aa98e2SPeter Wemm ** Vendor_pre_defaults is called before reading the configuration 3905c2aa98e2SPeter Wemm ** file; vendor_post_defaults is called immediately after. 3906c2aa98e2SPeter Wemm ** 3907c2aa98e2SPeter Wemm ** Parameters: 3908c2aa98e2SPeter Wemm ** e -- the global environment to initialize. 3909c2aa98e2SPeter Wemm ** 3910c2aa98e2SPeter Wemm ** Returns: 3911c2aa98e2SPeter Wemm ** none. 3912c2aa98e2SPeter Wemm */ 3913c2aa98e2SPeter Wemm 3914c2aa98e2SPeter Wemm #if SHARE_V1 3915c2aa98e2SPeter Wemm int DefShareUid; /* default share uid to run as -- unused??? */ 39163299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 3917c2aa98e2SPeter Wemm 3918c2aa98e2SPeter Wemm void 3919c2aa98e2SPeter Wemm vendor_pre_defaults(e) 3920c2aa98e2SPeter Wemm ENVELOPE *e; 3921c2aa98e2SPeter Wemm { 3922c2aa98e2SPeter Wemm #if SHARE_V1 3923c2aa98e2SPeter Wemm /* OTHERUID is defined in shares.h, do not be alarmed */ 3924c2aa98e2SPeter Wemm DefShareUid = OTHERUID; 39253299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 3926c2aa98e2SPeter Wemm #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) 3927c2aa98e2SPeter Wemm sun_pre_defaults(e); 39283299c2f1SGregory Neil Shapiro #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */ 3929c2aa98e2SPeter Wemm #ifdef apollo 39303299c2f1SGregory Neil Shapiro /* 39313299c2f1SGregory Neil Shapiro ** stupid domain/os can't even open 39323299c2f1SGregory Neil Shapiro ** /etc/mail/sendmail.cf without this 39333299c2f1SGregory Neil Shapiro */ 39343299c2f1SGregory Neil Shapiro 3935567a2fc9SGregory Neil Shapiro sm_setuserenv("ISP", NULL); 3936567a2fc9SGregory Neil Shapiro sm_setuserenv("SYSTYPE", NULL); 39373299c2f1SGregory Neil Shapiro #endif /* apollo */ 3938c2aa98e2SPeter Wemm } 3939c2aa98e2SPeter Wemm 3940c2aa98e2SPeter Wemm 3941c2aa98e2SPeter Wemm void 3942c2aa98e2SPeter Wemm vendor_post_defaults(e) 3943c2aa98e2SPeter Wemm ENVELOPE *e; 3944c2aa98e2SPeter Wemm { 3945c2aa98e2SPeter Wemm #ifdef __QNX__ 3946c2aa98e2SPeter Wemm char *p; 3947c2aa98e2SPeter Wemm 3948c2aa98e2SPeter Wemm /* Makes sure the SOCK environment variable remains */ 3949c2aa98e2SPeter Wemm if (p = getextenv("SOCK")) 3950567a2fc9SGregory Neil Shapiro sm_setuserenv("SOCK", p); 39513299c2f1SGregory Neil Shapiro #endif /* __QNX__ */ 3952c2aa98e2SPeter Wemm #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) 3953c2aa98e2SPeter Wemm sun_post_defaults(e); 39543299c2f1SGregory Neil Shapiro #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */ 3955c2aa98e2SPeter Wemm } 395612ed1c7cSGregory Neil Shapiro /* 3957c2aa98e2SPeter Wemm ** VENDOR_DAEMON_SETUP -- special vendor setup needed for daemon mode 3958c2aa98e2SPeter Wemm */ 3959c2aa98e2SPeter Wemm 3960c2aa98e2SPeter Wemm void 3961c2aa98e2SPeter Wemm vendor_daemon_setup(e) 3962c2aa98e2SPeter Wemm ENVELOPE *e; 3963c2aa98e2SPeter Wemm { 39643299c2f1SGregory Neil Shapiro #if HASSETLOGIN 39653299c2f1SGregory Neil Shapiro (void) setlogin(RunAsUserName); 39663299c2f1SGregory Neil Shapiro #endif /* HASSETLOGIN */ 3967c2aa98e2SPeter Wemm #if SECUREWARE 3968c2aa98e2SPeter Wemm if (getluid() != -1) 3969c2aa98e2SPeter Wemm { 3970c2aa98e2SPeter Wemm usrerr("Daemon cannot have LUID"); 397112ed1c7cSGregory Neil Shapiro finis(false, true, EX_USAGE); 3972c2aa98e2SPeter Wemm } 3973c2aa98e2SPeter Wemm #endif /* SECUREWARE */ 3974c2aa98e2SPeter Wemm } 397512ed1c7cSGregory Neil Shapiro /* 3976c2aa98e2SPeter Wemm ** VENDOR_SET_UID -- do setup for setting a user id 3977c2aa98e2SPeter Wemm ** 3978c2aa98e2SPeter Wemm ** This is called when we are still root. 3979c2aa98e2SPeter Wemm ** 3980c2aa98e2SPeter Wemm ** Parameters: 3981c2aa98e2SPeter Wemm ** uid -- the uid we are about to become. 3982c2aa98e2SPeter Wemm ** 3983c2aa98e2SPeter Wemm ** Returns: 3984c2aa98e2SPeter Wemm ** none. 3985c2aa98e2SPeter Wemm */ 3986c2aa98e2SPeter Wemm 3987c2aa98e2SPeter Wemm void 3988c2aa98e2SPeter Wemm vendor_set_uid(uid) 3989c2aa98e2SPeter Wemm UID_T uid; 3990c2aa98e2SPeter Wemm { 3991c2aa98e2SPeter Wemm /* 3992c2aa98e2SPeter Wemm ** We need to setup the share groups (lnodes) 39933299c2f1SGregory Neil Shapiro ** and add auditing information (luid's) 3994c2aa98e2SPeter Wemm ** before we loose our ``root''ness. 3995c2aa98e2SPeter Wemm */ 3996c2aa98e2SPeter Wemm #if SHARE_V1 3997c2aa98e2SPeter Wemm if (setupshares(uid, syserr) != 0) 3998c2aa98e2SPeter Wemm syserr("Unable to set up shares"); 39993299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 4000c2aa98e2SPeter Wemm #if SECUREWARE 4001c2aa98e2SPeter Wemm (void) setup_secure(uid); 40023299c2f1SGregory Neil Shapiro #endif /* SECUREWARE */ 4003c2aa98e2SPeter Wemm } 400412ed1c7cSGregory Neil Shapiro /* 4005c2aa98e2SPeter Wemm ** VALIDATE_CONNECTION -- check connection for rationality 4006c2aa98e2SPeter Wemm ** 4007c2aa98e2SPeter Wemm ** If the connection is rejected, this routine should log an 4008c2aa98e2SPeter Wemm ** appropriate message -- but should never issue any SMTP protocol. 4009c2aa98e2SPeter Wemm ** 4010c2aa98e2SPeter Wemm ** Parameters: 4011c2aa98e2SPeter Wemm ** sap -- a pointer to a SOCKADDR naming the peer. 4012c2aa98e2SPeter Wemm ** hostname -- the name corresponding to sap. 4013c2aa98e2SPeter Wemm ** e -- the current envelope. 4014c2aa98e2SPeter Wemm ** 4015c2aa98e2SPeter Wemm ** Returns: 4016c2aa98e2SPeter Wemm ** error message from rejection. 4017c2aa98e2SPeter Wemm ** NULL if not rejected. 4018c2aa98e2SPeter Wemm */ 4019c2aa98e2SPeter Wemm 4020c2aa98e2SPeter Wemm #if TCPWRAPPERS 4021c2aa98e2SPeter Wemm # include <tcpd.h> 4022c2aa98e2SPeter Wemm 4023c2aa98e2SPeter Wemm /* tcpwrappers does no logging, but you still have to declare these -- ugh */ 4024c2aa98e2SPeter Wemm int allow_severity = LOG_INFO; 4025c2aa98e2SPeter Wemm int deny_severity = LOG_NOTICE; 40263299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 4027c2aa98e2SPeter Wemm 4028c2aa98e2SPeter Wemm char * 4029c2aa98e2SPeter Wemm validate_connection(sap, hostname, e) 4030c2aa98e2SPeter Wemm SOCKADDR *sap; 4031c2aa98e2SPeter Wemm char *hostname; 4032c2aa98e2SPeter Wemm ENVELOPE *e; 4033c2aa98e2SPeter Wemm { 4034c2aa98e2SPeter Wemm #if TCPWRAPPERS 4035c2aa98e2SPeter Wemm char *host; 403612ed1c7cSGregory Neil Shapiro char *addr; 403712ed1c7cSGregory Neil Shapiro extern int hosts_ctl(); 40383299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 4039c2aa98e2SPeter Wemm 4040c2aa98e2SPeter Wemm if (tTd(48, 3)) 404112ed1c7cSGregory Neil Shapiro sm_dprintf("validate_connection(%s, %s)\n", 4042c2aa98e2SPeter Wemm hostname, anynet_ntoa(sap)); 4043c2aa98e2SPeter Wemm 4044bfb62e91SGregory Neil Shapiro connection_rate_check(sap, e); 40453299c2f1SGregory Neil Shapiro if (rscheck("check_relay", hostname, anynet_ntoa(sap), 40469d8fddc1SGregory Neil Shapiro e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID) != EX_OK) 4047c2aa98e2SPeter Wemm { 4048c2aa98e2SPeter Wemm static char reject[BUFSIZ*2]; 4049c2aa98e2SPeter Wemm extern char MsgBuf[]; 4050c2aa98e2SPeter Wemm 4051c2aa98e2SPeter Wemm if (tTd(48, 4)) 405212ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: BAD (rscheck)\n"); 4053c2aa98e2SPeter Wemm 40543299c2f1SGregory Neil Shapiro if (strlen(MsgBuf) >= 3) 405512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(reject, MsgBuf, sizeof reject); 4056c2aa98e2SPeter Wemm else 405712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(reject, "Access denied", sizeof reject); 4058c2aa98e2SPeter Wemm 4059c2aa98e2SPeter Wemm return reject; 4060c2aa98e2SPeter Wemm } 4061c2aa98e2SPeter Wemm 4062c2aa98e2SPeter Wemm #if TCPWRAPPERS 4063c2aa98e2SPeter Wemm if (hostname[0] == '[' && hostname[strlen(hostname) - 1] == ']') 4064c2aa98e2SPeter Wemm host = "unknown"; 4065c2aa98e2SPeter Wemm else 4066c2aa98e2SPeter Wemm host = hostname; 406712ed1c7cSGregory Neil Shapiro addr = anynet_ntoa(sap); 406812ed1c7cSGregory Neil Shapiro 406912ed1c7cSGregory Neil Shapiro # if NETINET6 407012ed1c7cSGregory Neil Shapiro /* TCP/Wrappers don't want the IPv6: protocol label */ 407112ed1c7cSGregory Neil Shapiro if (addr != NULL && sm_strncasecmp(addr, "IPv6:", 5) == 0) 407212ed1c7cSGregory Neil Shapiro addr += 5; 407312ed1c7cSGregory Neil Shapiro # endif /* NETINET6 */ 407412ed1c7cSGregory Neil Shapiro 407512ed1c7cSGregory Neil Shapiro if (!hosts_ctl("sendmail", host, addr, STRING_UNKNOWN)) 4076c2aa98e2SPeter Wemm { 4077c2aa98e2SPeter Wemm if (tTd(48, 4)) 407812ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: BAD (tcpwrappers)\n"); 407912ed1c7cSGregory Neil Shapiro if (LogLevel > 3) 40803299c2f1SGregory Neil Shapiro sm_syslog(LOG_NOTICE, e->e_id, 4081c2aa98e2SPeter Wemm "tcpwrappers (%s, %s) rejection", 408212ed1c7cSGregory Neil Shapiro host, addr); 4083c2aa98e2SPeter Wemm return "Access denied"; 4084c2aa98e2SPeter Wemm } 40853299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 4086c2aa98e2SPeter Wemm if (tTd(48, 4)) 408712ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: OK\n"); 4088c2aa98e2SPeter Wemm return NULL; 4089c2aa98e2SPeter Wemm } 4090c2aa98e2SPeter Wemm 409112ed1c7cSGregory Neil Shapiro /* 4092c2aa98e2SPeter Wemm ** STRTOL -- convert string to long integer 4093c2aa98e2SPeter Wemm ** 4094c2aa98e2SPeter Wemm ** For systems that don't have it in the C library. 4095c2aa98e2SPeter Wemm ** 4096c2aa98e2SPeter Wemm ** This is taken verbatim from the 4.4-Lite C library. 4097c2aa98e2SPeter Wemm */ 4098c2aa98e2SPeter Wemm 40993299c2f1SGregory Neil Shapiro #if NEEDSTRTOL 4100c2aa98e2SPeter Wemm 4101c2aa98e2SPeter Wemm # if defined(LIBC_SCCS) && !defined(lint) 4102c2aa98e2SPeter Wemm static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; 41033299c2f1SGregory Neil Shapiro # endif /* defined(LIBC_SCCS) && !defined(lint) */ 4104c2aa98e2SPeter Wemm 4105c2aa98e2SPeter Wemm /* 410612ed1c7cSGregory Neil Shapiro ** Convert a string to a long integer. 410712ed1c7cSGregory Neil Shapiro ** 410812ed1c7cSGregory Neil Shapiro ** Ignores `locale' stuff. Assumes that the upper and lower case 410912ed1c7cSGregory Neil Shapiro ** alphabets and digits are each contiguous. 4110c2aa98e2SPeter Wemm */ 4111c2aa98e2SPeter Wemm 4112c2aa98e2SPeter Wemm long 4113c2aa98e2SPeter Wemm strtol(nptr, endptr, base) 4114c2aa98e2SPeter Wemm const char *nptr; 4115c2aa98e2SPeter Wemm char **endptr; 4116c2aa98e2SPeter Wemm register int base; 4117c2aa98e2SPeter Wemm { 4118c2aa98e2SPeter Wemm register const char *s = nptr; 4119c2aa98e2SPeter Wemm register unsigned long acc; 4120c2aa98e2SPeter Wemm register int c; 4121c2aa98e2SPeter Wemm register unsigned long cutoff; 4122c2aa98e2SPeter Wemm register int neg = 0, any, cutlim; 4123c2aa98e2SPeter Wemm 4124c2aa98e2SPeter Wemm /* 412512ed1c7cSGregory Neil Shapiro ** Skip white space and pick up leading +/- sign if any. 412612ed1c7cSGregory Neil Shapiro ** If base is 0, allow 0x for hex and 0 for octal, else 412712ed1c7cSGregory Neil Shapiro ** assume decimal; if base is already 16, allow 0x. 4128c2aa98e2SPeter Wemm */ 4129c2aa98e2SPeter Wemm do { 4130c2aa98e2SPeter Wemm c = *s++; 4131c2aa98e2SPeter Wemm } while (isspace(c)); 4132c2aa98e2SPeter Wemm if (c == '-') { 4133c2aa98e2SPeter Wemm neg = 1; 4134c2aa98e2SPeter Wemm c = *s++; 4135c2aa98e2SPeter Wemm } else if (c == '+') 4136c2aa98e2SPeter Wemm c = *s++; 4137c2aa98e2SPeter Wemm if ((base == 0 || base == 16) && 4138c2aa98e2SPeter Wemm c == '0' && (*s == 'x' || *s == 'X')) { 4139c2aa98e2SPeter Wemm c = s[1]; 4140c2aa98e2SPeter Wemm s += 2; 4141c2aa98e2SPeter Wemm base = 16; 4142c2aa98e2SPeter Wemm } 4143c2aa98e2SPeter Wemm if (base == 0) 4144c2aa98e2SPeter Wemm base = c == '0' ? 8 : 10; 4145c2aa98e2SPeter Wemm 4146c2aa98e2SPeter Wemm /* 414712ed1c7cSGregory Neil Shapiro ** Compute the cutoff value between legal numbers and illegal 414812ed1c7cSGregory Neil Shapiro ** numbers. That is the largest legal value, divided by the 414912ed1c7cSGregory Neil Shapiro ** base. An input number that is greater than this value, if 415012ed1c7cSGregory Neil Shapiro ** followed by a legal input character, is too big. One that 415112ed1c7cSGregory Neil Shapiro ** is equal to this value may be valid or not; the limit 415212ed1c7cSGregory Neil Shapiro ** between valid and invalid numbers is then based on the last 415312ed1c7cSGregory Neil Shapiro ** digit. For instance, if the range for longs is 415412ed1c7cSGregory Neil Shapiro ** [-2147483648..2147483647] and the input base is 10, 415512ed1c7cSGregory Neil Shapiro ** cutoff will be set to 214748364 and cutlim to either 415612ed1c7cSGregory Neil Shapiro ** 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated 415712ed1c7cSGregory Neil Shapiro ** a value > 214748364, or equal but the next digit is > 7 (or 8), 415812ed1c7cSGregory Neil Shapiro ** the number is too big, and we will return a range error. 415912ed1c7cSGregory Neil Shapiro ** 416012ed1c7cSGregory Neil Shapiro ** Set any if any `digits' consumed; make it negative to indicate 416112ed1c7cSGregory Neil Shapiro ** overflow. 4162c2aa98e2SPeter Wemm */ 4163c2aa98e2SPeter Wemm cutoff = neg ? -(unsigned long) LONG_MIN : LONG_MAX; 4164c2aa98e2SPeter Wemm cutlim = cutoff % (unsigned long) base; 4165c2aa98e2SPeter Wemm cutoff /= (unsigned long) base; 4166c2aa98e2SPeter Wemm for (acc = 0, any = 0;; c = *s++) { 4167c2aa98e2SPeter Wemm if (isdigit(c)) 4168c2aa98e2SPeter Wemm c -= '0'; 4169c2aa98e2SPeter Wemm else if (isalpha(c)) 4170c2aa98e2SPeter Wemm c -= isupper(c) ? 'A' - 10 : 'a' - 10; 4171c2aa98e2SPeter Wemm else 4172c2aa98e2SPeter Wemm break; 4173c2aa98e2SPeter Wemm if (c >= base) 4174c2aa98e2SPeter Wemm break; 4175c2aa98e2SPeter Wemm if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) 4176c2aa98e2SPeter Wemm any = -1; 4177c2aa98e2SPeter Wemm else { 4178c2aa98e2SPeter Wemm any = 1; 4179c2aa98e2SPeter Wemm acc *= base; 4180c2aa98e2SPeter Wemm acc += c; 4181c2aa98e2SPeter Wemm } 4182c2aa98e2SPeter Wemm } 4183c2aa98e2SPeter Wemm if (any < 0) { 4184c2aa98e2SPeter Wemm acc = neg ? LONG_MIN : LONG_MAX; 4185c2aa98e2SPeter Wemm errno = ERANGE; 4186c2aa98e2SPeter Wemm } else if (neg) 4187c2aa98e2SPeter Wemm acc = -acc; 4188c2aa98e2SPeter Wemm if (endptr != 0) 4189c2aa98e2SPeter Wemm *endptr = (char *)(any ? s - 1 : nptr); 41903299c2f1SGregory Neil Shapiro return acc; 4191c2aa98e2SPeter Wemm } 4192c2aa98e2SPeter Wemm 41933299c2f1SGregory Neil Shapiro #endif /* NEEDSTRTOL */ 419412ed1c7cSGregory Neil Shapiro /* 4195c2aa98e2SPeter Wemm ** STRSTR -- find first substring in string 4196c2aa98e2SPeter Wemm ** 4197c2aa98e2SPeter Wemm ** Parameters: 4198c2aa98e2SPeter Wemm ** big -- the big (full) string. 4199c2aa98e2SPeter Wemm ** little -- the little (sub) string. 4200c2aa98e2SPeter Wemm ** 4201c2aa98e2SPeter Wemm ** Returns: 4202c2aa98e2SPeter Wemm ** A pointer to the first instance of little in big. 4203c2aa98e2SPeter Wemm ** big if little is the null string. 4204c2aa98e2SPeter Wemm ** NULL if little is not contained in big. 4205c2aa98e2SPeter Wemm */ 4206c2aa98e2SPeter Wemm 42073299c2f1SGregory Neil Shapiro #if NEEDSTRSTR 4208c2aa98e2SPeter Wemm 4209c2aa98e2SPeter Wemm char * 4210c2aa98e2SPeter Wemm strstr(big, little) 4211c2aa98e2SPeter Wemm char *big; 4212c2aa98e2SPeter Wemm char *little; 4213c2aa98e2SPeter Wemm { 4214c2aa98e2SPeter Wemm register char *p = big; 4215c2aa98e2SPeter Wemm int l; 4216c2aa98e2SPeter Wemm 4217c2aa98e2SPeter Wemm if (*little == '\0') 4218c2aa98e2SPeter Wemm return big; 4219c2aa98e2SPeter Wemm l = strlen(little); 4220c2aa98e2SPeter Wemm 4221c2aa98e2SPeter Wemm while ((p = strchr(p, *little)) != NULL) 4222c2aa98e2SPeter Wemm { 4223c2aa98e2SPeter Wemm if (strncmp(p, little, l) == 0) 4224c2aa98e2SPeter Wemm return p; 4225c2aa98e2SPeter Wemm p++; 4226c2aa98e2SPeter Wemm } 4227c2aa98e2SPeter Wemm return NULL; 4228c2aa98e2SPeter Wemm } 4229c2aa98e2SPeter Wemm 42303299c2f1SGregory Neil Shapiro #endif /* NEEDSTRSTR */ 423112ed1c7cSGregory Neil Shapiro /* 4232c2aa98e2SPeter Wemm ** SM_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX 4233c2aa98e2SPeter Wemm ** 4234c2aa98e2SPeter Wemm ** Some operating systems have wierd problems with the gethostbyXXX 4235c2aa98e2SPeter Wemm ** routines. For example, Solaris versions at least through 2.3 4236c2aa98e2SPeter Wemm ** don't properly deliver a canonical h_name field. This tries to 4237c2aa98e2SPeter Wemm ** work around these problems. 42383299c2f1SGregory Neil Shapiro ** 42393299c2f1SGregory Neil Shapiro ** Support IPv6 as well as IPv4. 4240c2aa98e2SPeter Wemm */ 4241c2aa98e2SPeter Wemm 4242c0c4794dSGregory Neil Shapiro #if NETINET6 && NEEDSGETIPNODE 42433299c2f1SGregory Neil Shapiro 42443299c2f1SGregory Neil Shapiro # ifndef AI_DEFAULT 42453299c2f1SGregory Neil Shapiro # define AI_DEFAULT 0 /* dummy */ 42463299c2f1SGregory Neil Shapiro # endif /* ! AI_DEFAULT */ 42473299c2f1SGregory Neil Shapiro # ifndef AI_ADDRCONFIG 42483299c2f1SGregory Neil Shapiro # define AI_ADDRCONFIG 0 /* dummy */ 42493299c2f1SGregory Neil Shapiro # endif /* ! AI_ADDRCONFIG */ 42503299c2f1SGregory Neil Shapiro # ifndef AI_V4MAPPED 42513299c2f1SGregory Neil Shapiro # define AI_V4MAPPED 0 /* dummy */ 42523299c2f1SGregory Neil Shapiro # endif /* ! AI_V4MAPPED */ 42533299c2f1SGregory Neil Shapiro # ifndef AI_ALL 42543299c2f1SGregory Neil Shapiro # define AI_ALL 0 /* dummy */ 42553299c2f1SGregory Neil Shapiro # endif /* ! AI_ALL */ 42563299c2f1SGregory Neil Shapiro 42573299c2f1SGregory Neil Shapiro static struct hostent * 42583299c2f1SGregory Neil Shapiro getipnodebyname(name, family, flags, err) 4259c2aa98e2SPeter Wemm char *name; 42603299c2f1SGregory Neil Shapiro int family; 42613299c2f1SGregory Neil Shapiro int flags; 42623299c2f1SGregory Neil Shapiro int *err; 42633299c2f1SGregory Neil Shapiro { 426412ed1c7cSGregory Neil Shapiro bool resv6 = true; 42653299c2f1SGregory Neil Shapiro struct hostent *h; 42663299c2f1SGregory Neil Shapiro 42673299c2f1SGregory Neil Shapiro if (family == AF_INET6) 42683299c2f1SGregory Neil Shapiro { 42693299c2f1SGregory Neil Shapiro /* From RFC2133, section 6.1 */ 42703299c2f1SGregory Neil Shapiro resv6 = bitset(RES_USE_INET6, _res.options); 42713299c2f1SGregory Neil Shapiro _res.options |= RES_USE_INET6; 42723299c2f1SGregory Neil Shapiro } 4273b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(0); 42743299c2f1SGregory Neil Shapiro h = gethostbyname(name); 427512ed1c7cSGregory Neil Shapiro if (!resv6) 42763299c2f1SGregory Neil Shapiro _res.options &= ~RES_USE_INET6; 427712ed1c7cSGregory Neil Shapiro *err = h_errno; 42783299c2f1SGregory Neil Shapiro return h; 42793299c2f1SGregory Neil Shapiro } 42803299c2f1SGregory Neil Shapiro 42813299c2f1SGregory Neil Shapiro static struct hostent * 42823299c2f1SGregory Neil Shapiro getipnodebyaddr(addr, len, family, err) 42833299c2f1SGregory Neil Shapiro char *addr; 42843299c2f1SGregory Neil Shapiro int len; 42853299c2f1SGregory Neil Shapiro int family; 42863299c2f1SGregory Neil Shapiro int *err; 4287c2aa98e2SPeter Wemm { 4288c2aa98e2SPeter Wemm struct hostent *h; 42893299c2f1SGregory Neil Shapiro 4290b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(0); 42913299c2f1SGregory Neil Shapiro h = gethostbyaddr(addr, len, family); 42923299c2f1SGregory Neil Shapiro *err = h_errno; 42933299c2f1SGregory Neil Shapiro return h; 42943299c2f1SGregory Neil Shapiro } 4295c46d91b7SGregory Neil Shapiro 4296c46d91b7SGregory Neil Shapiro void 4297c46d91b7SGregory Neil Shapiro freehostent(h) 4298c46d91b7SGregory Neil Shapiro struct hostent *h; 4299c46d91b7SGregory Neil Shapiro { 4300c46d91b7SGregory Neil Shapiro /* 4301c46d91b7SGregory Neil Shapiro ** Stub routine -- if they don't have getipnodeby*(), 4302c46d91b7SGregory Neil Shapiro ** they probably don't have the free routine either. 4303c46d91b7SGregory Neil Shapiro */ 4304c46d91b7SGregory Neil Shapiro 4305c46d91b7SGregory Neil Shapiro return; 4306c46d91b7SGregory Neil Shapiro } 430712ed1c7cSGregory Neil Shapiro #endif /* NETINET6 && NEEDSGETIPNODE */ 43083299c2f1SGregory Neil Shapiro 43093299c2f1SGregory Neil Shapiro struct hostent * 43103299c2f1SGregory Neil Shapiro sm_gethostbyname(name, family) 43113299c2f1SGregory Neil Shapiro char *name; 43123299c2f1SGregory Neil Shapiro int family; 43133299c2f1SGregory Neil Shapiro { 4314b4662009SGregory Neil Shapiro int save_errno; 43153299c2f1SGregory Neil Shapiro struct hostent *h = NULL; 4316c2aa98e2SPeter Wemm #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) 4317c2aa98e2SPeter Wemm # if SOLARIS == 20300 || SOLARIS == 203 4318c2aa98e2SPeter Wemm static struct hostent hp; 4319c2aa98e2SPeter Wemm static char buf[1000]; 4320c2aa98e2SPeter Wemm extern struct hostent *_switch_gethostbyname_r(); 4321c2aa98e2SPeter Wemm 4322c2aa98e2SPeter Wemm if (tTd(61, 10)) 432312ed1c7cSGregory Neil Shapiro sm_dprintf("_switch_gethostbyname_r(%s)... ", name); 4324c2aa98e2SPeter Wemm h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); 4325b4662009SGregory Neil Shapiro save_errno = errno; 43263299c2f1SGregory Neil Shapiro # else /* SOLARIS == 20300 || SOLARIS == 203 */ 4327c2aa98e2SPeter Wemm extern struct hostent *__switch_gethostbyname(); 4328c2aa98e2SPeter Wemm 4329c2aa98e2SPeter Wemm if (tTd(61, 10)) 433012ed1c7cSGregory Neil Shapiro sm_dprintf("__switch_gethostbyname(%s)... ", name); 4331c2aa98e2SPeter Wemm h = __switch_gethostbyname(name); 4332b4662009SGregory Neil Shapiro save_errno = errno; 43333299c2f1SGregory Neil Shapiro # endif /* SOLARIS == 20300 || SOLARIS == 203 */ 43343299c2f1SGregory Neil Shapiro #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */ 4335c2aa98e2SPeter Wemm int nmaps; 43363299c2f1SGregory Neil Shapiro # if NETINET6 43373299c2f1SGregory Neil Shapiro int flags = AI_DEFAULT|AI_ALL; 43383299c2f1SGregory Neil Shapiro int err; 43393299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 4340c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 4341c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 4342c2aa98e2SPeter Wemm char hbuf[MAXNAME]; 4343c2aa98e2SPeter Wemm 4344c2aa98e2SPeter Wemm if (tTd(61, 10)) 434512ed1c7cSGregory Neil Shapiro sm_dprintf("sm_gethostbyname(%s, %d)... ", name, family); 43463299c2f1SGregory Neil Shapiro 43473299c2f1SGregory Neil Shapiro # if NETINET6 43483299c2f1SGregory Neil Shapiro # if ADDRCONFIG_IS_BROKEN 43493299c2f1SGregory Neil Shapiro flags &= ~AI_ADDRCONFIG; 43503299c2f1SGregory Neil Shapiro # endif /* ADDRCONFIG_IS_BROKEN */ 43513299c2f1SGregory Neil Shapiro h = getipnodebyname(name, family, flags, &err); 4352b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 43533299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 4354c2aa98e2SPeter Wemm h = gethostbyname(name); 43553299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 43563299c2f1SGregory Neil Shapiro 43573299c2f1SGregory Neil Shapiro save_errno = errno; 4358c2aa98e2SPeter Wemm if (h == NULL) 4359c2aa98e2SPeter Wemm { 4360c2aa98e2SPeter Wemm if (tTd(61, 10)) 436112ed1c7cSGregory Neil Shapiro sm_dprintf("failure\n"); 4362c2aa98e2SPeter Wemm 4363c2aa98e2SPeter Wemm nmaps = switch_map_find("hosts", maptype, mapreturn); 4364c2aa98e2SPeter Wemm while (--nmaps >= 0) 4365c46d91b7SGregory Neil Shapiro { 4366c2aa98e2SPeter Wemm if (strcmp(maptype[nmaps], "nis") == 0 || 4367c2aa98e2SPeter Wemm strcmp(maptype[nmaps], "files") == 0) 4368c2aa98e2SPeter Wemm break; 4369c46d91b7SGregory Neil Shapiro } 4370c46d91b7SGregory Neil Shapiro 4371c2aa98e2SPeter Wemm if (nmaps >= 0) 4372c2aa98e2SPeter Wemm { 4373c2aa98e2SPeter Wemm /* try short name */ 437412ed1c7cSGregory Neil Shapiro if (strlen(name) > sizeof hbuf - 1) 43753299c2f1SGregory Neil Shapiro { 43763299c2f1SGregory Neil Shapiro errno = save_errno; 4377c2aa98e2SPeter Wemm return NULL; 43783299c2f1SGregory Neil Shapiro } 437912ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(hbuf, name, sizeof hbuf); 4380b4662009SGregory Neil Shapiro (void) shorten_hostname(hbuf); 4381c2aa98e2SPeter Wemm 4382c2aa98e2SPeter Wemm /* if it hasn't been shortened, there's no point */ 4383c2aa98e2SPeter Wemm if (strcmp(hbuf, name) != 0) 4384c2aa98e2SPeter Wemm { 4385c2aa98e2SPeter Wemm if (tTd(61, 10)) 438612ed1c7cSGregory Neil Shapiro sm_dprintf("sm_gethostbyname(%s, %d)... ", 43873299c2f1SGregory Neil Shapiro hbuf, family); 43883299c2f1SGregory Neil Shapiro 43893299c2f1SGregory Neil Shapiro # if NETINET6 43906dbce3c3SGregory Neil Shapiro h = getipnodebyname(hbuf, family, flags, &err); 4391b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 43923299c2f1SGregory Neil Shapiro save_errno = errno; 43933299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 4394c2aa98e2SPeter Wemm h = gethostbyname(hbuf); 43953299c2f1SGregory Neil Shapiro save_errno = errno; 43963299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 4397c2aa98e2SPeter Wemm } 4398c2aa98e2SPeter Wemm } 4399c2aa98e2SPeter Wemm } 44003299c2f1SGregory Neil Shapiro #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */ 4401c2aa98e2SPeter Wemm if (tTd(61, 10)) 4402c2aa98e2SPeter Wemm { 4403c2aa98e2SPeter Wemm if (h == NULL) 440412ed1c7cSGregory Neil Shapiro sm_dprintf("failure\n"); 4405c2aa98e2SPeter Wemm else 44063299c2f1SGregory Neil Shapiro { 440712ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", h->h_name); 44083299c2f1SGregory Neil Shapiro if (tTd(61, 11)) 44093299c2f1SGregory Neil Shapiro { 44103299c2f1SGregory Neil Shapiro #if NETINET6 44113299c2f1SGregory Neil Shapiro struct in6_addr ia6; 44123299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 44133299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 44143299c2f1SGregory Neil Shapiro struct in_addr ia; 44153299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 441612ed1c7cSGregory Neil Shapiro size_t i; 44173299c2f1SGregory Neil Shapiro 44183299c2f1SGregory Neil Shapiro if (h->h_aliases != NULL) 44193299c2f1SGregory Neil Shapiro for (i = 0; h->h_aliases[i] != NULL; 44203299c2f1SGregory Neil Shapiro i++) 442112ed1c7cSGregory Neil Shapiro sm_dprintf("\talias: %s\n", 44223299c2f1SGregory Neil Shapiro h->h_aliases[i]); 44233299c2f1SGregory Neil Shapiro for (i = 0; h->h_addr_list[i] != NULL; i++) 44243299c2f1SGregory Neil Shapiro { 44253299c2f1SGregory Neil Shapiro char *addr; 44263299c2f1SGregory Neil Shapiro 44273299c2f1SGregory Neil Shapiro #if NETINET6 44283299c2f1SGregory Neil Shapiro memmove(&ia6, h->h_addr_list[i], 44293299c2f1SGregory Neil Shapiro IN6ADDRSZ); 44303299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, 44313299c2f1SGregory Neil Shapiro buf6, sizeof buf6); 44323299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 44333299c2f1SGregory Neil Shapiro memmove(&ia, h->h_addr_list[i], 44343299c2f1SGregory Neil Shapiro INADDRSZ); 44353299c2f1SGregory Neil Shapiro addr = (char *) inet_ntoa(ia); 44363299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 44373299c2f1SGregory Neil Shapiro if (addr != NULL) 443812ed1c7cSGregory Neil Shapiro sm_dprintf("\taddr: %s\n", addr); 4439c2aa98e2SPeter Wemm } 44403299c2f1SGregory Neil Shapiro } 44413299c2f1SGregory Neil Shapiro } 44423299c2f1SGregory Neil Shapiro } 44433299c2f1SGregory Neil Shapiro errno = save_errno; 4444c2aa98e2SPeter Wemm return h; 4445c2aa98e2SPeter Wemm } 4446c2aa98e2SPeter Wemm 4447c2aa98e2SPeter Wemm struct hostent * 4448c2aa98e2SPeter Wemm sm_gethostbyaddr(addr, len, type) 4449c2aa98e2SPeter Wemm char *addr; 4450c2aa98e2SPeter Wemm int len; 4451c2aa98e2SPeter Wemm int type; 4452c2aa98e2SPeter Wemm { 44533299c2f1SGregory Neil Shapiro struct hostent *hp; 4454b4662009SGregory Neil Shapiro 4455b4662009SGregory Neil Shapiro #if NETINET6 4456b4662009SGregory Neil Shapiro if (type == AF_INET6 && 4457b4662009SGregory Neil Shapiro IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *) addr)) 4458b4662009SGregory Neil Shapiro { 4459b4662009SGregory Neil Shapiro /* Avoid reverse lookup for IPv6 unspecified address */ 4460b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(HOST_NOT_FOUND); 4461b4662009SGregory Neil Shapiro return NULL; 4462b4662009SGregory Neil Shapiro } 4463b4662009SGregory Neil Shapiro #endif /* NETINET6 */ 4464b4662009SGregory Neil Shapiro 4465c2aa98e2SPeter Wemm #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) 4466c2aa98e2SPeter Wemm # if SOLARIS == 20300 || SOLARIS == 203 4467b4662009SGregory Neil Shapiro { 44683299c2f1SGregory Neil Shapiro static struct hostent he; 4469c2aa98e2SPeter Wemm static char buf[1000]; 4470c2aa98e2SPeter Wemm extern struct hostent *_switch_gethostbyaddr_r(); 4471c2aa98e2SPeter Wemm 4472b4662009SGregory Neil Shapiro hp = _switch_gethostbyaddr_r(addr, len, type, &he, 4473b4662009SGregory Neil Shapiro buf, sizeof(buf), &h_errno); 4474b4662009SGregory Neil Shapiro } 44753299c2f1SGregory Neil Shapiro # else /* SOLARIS == 20300 || SOLARIS == 203 */ 4476b4662009SGregory Neil Shapiro { 4477c2aa98e2SPeter Wemm extern struct hostent *__switch_gethostbyaddr(); 4478c2aa98e2SPeter Wemm 44793299c2f1SGregory Neil Shapiro hp = __switch_gethostbyaddr(addr, len, type); 4480b4662009SGregory Neil Shapiro } 44813299c2f1SGregory Neil Shapiro # endif /* SOLARIS == 20300 || SOLARIS == 203 */ 44823299c2f1SGregory Neil Shapiro #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */ 44833299c2f1SGregory Neil Shapiro # if NETINET6 4484b4662009SGregory Neil Shapiro { 44853299c2f1SGregory Neil Shapiro int err; 44863299c2f1SGregory Neil Shapiro 44873299c2f1SGregory Neil Shapiro hp = getipnodebyaddr(addr, len, type, &err); 4488b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 4489b4662009SGregory Neil Shapiro } 44903299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 44913299c2f1SGregory Neil Shapiro hp = gethostbyaddr(addr, len, type); 44923299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 44933299c2f1SGregory Neil Shapiro #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */ 4494c0c4794dSGregory Neil Shapiro return hp; 4495c2aa98e2SPeter Wemm } 449612ed1c7cSGregory Neil Shapiro /* 4497c2aa98e2SPeter Wemm ** SM_GETPW{NAM,UID} -- wrapper for getpwnam and getpwuid 4498c2aa98e2SPeter Wemm */ 4499c2aa98e2SPeter Wemm 4500c2aa98e2SPeter Wemm struct passwd * 4501c2aa98e2SPeter Wemm sm_getpwnam(user) 4502c2aa98e2SPeter Wemm char *user; 4503c2aa98e2SPeter Wemm { 4504c2aa98e2SPeter Wemm #ifdef _AIX4 4505c2aa98e2SPeter Wemm extern struct passwd *_getpwnam_shadow(const char *, const int); 4506c2aa98e2SPeter Wemm 4507c2aa98e2SPeter Wemm return _getpwnam_shadow(user, 0); 45083299c2f1SGregory Neil Shapiro #else /* _AIX4 */ 4509c2aa98e2SPeter Wemm return getpwnam(user); 45103299c2f1SGregory Neil Shapiro #endif /* _AIX4 */ 4511c2aa98e2SPeter Wemm } 4512c2aa98e2SPeter Wemm 4513c2aa98e2SPeter Wemm struct passwd * 4514c2aa98e2SPeter Wemm sm_getpwuid(uid) 4515c2aa98e2SPeter Wemm UID_T uid; 4516c2aa98e2SPeter Wemm { 4517c2aa98e2SPeter Wemm #if defined(_AIX4) && 0 4518c2aa98e2SPeter Wemm extern struct passwd *_getpwuid_shadow(const int, const int); 4519c2aa98e2SPeter Wemm 4520c2aa98e2SPeter Wemm return _getpwuid_shadow(uid,0); 45213299c2f1SGregory Neil Shapiro #else /* defined(_AIX4) && 0 */ 4522c2aa98e2SPeter Wemm return getpwuid(uid); 45233299c2f1SGregory Neil Shapiro #endif /* defined(_AIX4) && 0 */ 4524c2aa98e2SPeter Wemm } 452512ed1c7cSGregory Neil Shapiro /* 4526c2aa98e2SPeter Wemm ** SECUREWARE_SETUP_SECURE -- Convex SecureWare setup 4527c2aa98e2SPeter Wemm ** 4528c2aa98e2SPeter Wemm ** Set up the trusted computing environment for C2 level security 4529c2aa98e2SPeter Wemm ** under SecureWare. 4530c2aa98e2SPeter Wemm ** 4531c2aa98e2SPeter Wemm ** Parameters: 4532c2aa98e2SPeter Wemm ** uid -- uid of the user to initialize in the TCB 4533c2aa98e2SPeter Wemm ** 4534c2aa98e2SPeter Wemm ** Returns: 4535c2aa98e2SPeter Wemm ** none 4536c2aa98e2SPeter Wemm ** 4537c2aa98e2SPeter Wemm ** Side Effects: 4538c2aa98e2SPeter Wemm ** Initialized the user in the trusted computing base 4539c2aa98e2SPeter Wemm */ 4540c2aa98e2SPeter Wemm 4541c2aa98e2SPeter Wemm #if SECUREWARE 4542c2aa98e2SPeter Wemm 4543c2aa98e2SPeter Wemm # include <sys/security.h> 4544c2aa98e2SPeter Wemm # include <prot.h> 4545c2aa98e2SPeter Wemm 4546c2aa98e2SPeter Wemm void 4547c2aa98e2SPeter Wemm secureware_setup_secure(uid) 4548c2aa98e2SPeter Wemm UID_T uid; 4549c2aa98e2SPeter Wemm { 4550c2aa98e2SPeter Wemm int rc; 4551c2aa98e2SPeter Wemm 4552c2aa98e2SPeter Wemm if (getluid() != -1) 4553c2aa98e2SPeter Wemm return; 4554c2aa98e2SPeter Wemm 4555c2aa98e2SPeter Wemm if ((rc = set_secure_info(uid)) != SSI_GOOD_RETURN) 4556c2aa98e2SPeter Wemm { 4557c2aa98e2SPeter Wemm switch (rc) 4558c2aa98e2SPeter Wemm { 4559c2aa98e2SPeter Wemm case SSI_NO_PRPW_ENTRY: 456012ed1c7cSGregory Neil Shapiro syserr("No protected passwd entry, uid = %d", 456112ed1c7cSGregory Neil Shapiro (int) uid); 4562c2aa98e2SPeter Wemm break; 4563c2aa98e2SPeter Wemm 4564c2aa98e2SPeter Wemm case SSI_LOCKED: 456512ed1c7cSGregory Neil Shapiro syserr("Account has been disabled, uid = %d", 456612ed1c7cSGregory Neil Shapiro (int) uid); 4567c2aa98e2SPeter Wemm break; 4568c2aa98e2SPeter Wemm 4569c2aa98e2SPeter Wemm case SSI_RETIRED: 457012ed1c7cSGregory Neil Shapiro syserr("Account has been retired, uid = %d", 457112ed1c7cSGregory Neil Shapiro (int) uid); 4572c2aa98e2SPeter Wemm break; 4573c2aa98e2SPeter Wemm 4574c2aa98e2SPeter Wemm case SSI_BAD_SET_LUID: 457512ed1c7cSGregory Neil Shapiro syserr("Could not set LUID, uid = %d", (int) uid); 4576c2aa98e2SPeter Wemm break; 4577c2aa98e2SPeter Wemm 4578c2aa98e2SPeter Wemm case SSI_BAD_SET_PRIVS: 457912ed1c7cSGregory Neil Shapiro syserr("Could not set kernel privs, uid = %d", 458012ed1c7cSGregory Neil Shapiro (int) uid); 4581c2aa98e2SPeter Wemm 4582c2aa98e2SPeter Wemm default: 4583c2aa98e2SPeter Wemm syserr("Unknown return code (%d) from set_secure_info(%d)", 458412ed1c7cSGregory Neil Shapiro rc, (int) uid); 4585c2aa98e2SPeter Wemm break; 4586c2aa98e2SPeter Wemm } 458712ed1c7cSGregory Neil Shapiro finis(false, true, EX_NOPERM); 4588c2aa98e2SPeter Wemm } 4589c2aa98e2SPeter Wemm } 4590c2aa98e2SPeter Wemm #endif /* SECUREWARE */ 459112ed1c7cSGregory Neil Shapiro /* 45923299c2f1SGregory Neil Shapiro ** ADD_HOSTNAMES -- Add a hostname to class 'w' based on IP address 459376b7bf71SPeter Wemm ** 459476b7bf71SPeter Wemm ** Add hostnames to class 'w' based on the IP address read from 459576b7bf71SPeter Wemm ** the network interface. 459676b7bf71SPeter Wemm ** 459776b7bf71SPeter Wemm ** Parameters: 459876b7bf71SPeter Wemm ** sa -- a pointer to a SOCKADDR containing the address 459976b7bf71SPeter Wemm ** 460076b7bf71SPeter Wemm ** Returns: 460176b7bf71SPeter Wemm ** 0 if successful, -1 if host lookup fails. 460276b7bf71SPeter Wemm */ 460376b7bf71SPeter Wemm 46043299c2f1SGregory Neil Shapiro static int 460576b7bf71SPeter Wemm add_hostnames(sa) 460676b7bf71SPeter Wemm SOCKADDR *sa; 460776b7bf71SPeter Wemm { 460876b7bf71SPeter Wemm struct hostent *hp; 46093299c2f1SGregory Neil Shapiro char **ha; 46103299c2f1SGregory Neil Shapiro char hnb[MAXHOSTNAMELEN]; 461176b7bf71SPeter Wemm 461276b7bf71SPeter Wemm /* lookup name with IP address */ 461376b7bf71SPeter Wemm switch (sa->sa.sa_family) 461476b7bf71SPeter Wemm { 46153299c2f1SGregory Neil Shapiro #if NETINET 461676b7bf71SPeter Wemm case AF_INET: 461776b7bf71SPeter Wemm hp = sm_gethostbyaddr((char *) &sa->sin.sin_addr, 4618c46d91b7SGregory Neil Shapiro sizeof(sa->sin.sin_addr), 4619c46d91b7SGregory Neil Shapiro sa->sa.sa_family); 462076b7bf71SPeter Wemm break; 46213299c2f1SGregory Neil Shapiro #endif /* NETINET */ 46223299c2f1SGregory Neil Shapiro 46233299c2f1SGregory Neil Shapiro #if NETINET6 46243299c2f1SGregory Neil Shapiro case AF_INET6: 46253299c2f1SGregory Neil Shapiro hp = sm_gethostbyaddr((char *) &sa->sin6.sin6_addr, 4626c46d91b7SGregory Neil Shapiro sizeof(sa->sin6.sin6_addr), 4627c46d91b7SGregory Neil Shapiro sa->sa.sa_family); 46283299c2f1SGregory Neil Shapiro break; 46293299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 463076b7bf71SPeter Wemm 463176b7bf71SPeter Wemm default: 46323299c2f1SGregory Neil Shapiro /* Give warning about unsupported family */ 463376b7bf71SPeter Wemm if (LogLevel > 3) 463476b7bf71SPeter Wemm sm_syslog(LOG_WARNING, NOQID, 463576b7bf71SPeter Wemm "Unsupported address family %d: %.100s", 463676b7bf71SPeter Wemm sa->sa.sa_family, anynet_ntoa(sa)); 463776b7bf71SPeter Wemm return -1; 463876b7bf71SPeter Wemm } 463976b7bf71SPeter Wemm 464076b7bf71SPeter Wemm if (hp == NULL) 464176b7bf71SPeter Wemm { 464276b7bf71SPeter Wemm int save_errno = errno; 464376b7bf71SPeter Wemm 46443299c2f1SGregory Neil Shapiro if (LogLevel > 3 && 46453299c2f1SGregory Neil Shapiro #if NETINET6 46463299c2f1SGregory Neil Shapiro !(sa->sa.sa_family == AF_INET6 && 46473299c2f1SGregory Neil Shapiro IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr)) && 46483299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 464912ed1c7cSGregory Neil Shapiro true) 465076b7bf71SPeter Wemm sm_syslog(LOG_WARNING, NOQID, 465112ed1c7cSGregory Neil Shapiro "gethostbyaddr(%.100s) failed: %d", 465276b7bf71SPeter Wemm anynet_ntoa(sa), 465376b7bf71SPeter Wemm #if NAMED_BIND 465476b7bf71SPeter Wemm h_errno 46553299c2f1SGregory Neil Shapiro #else /* NAMED_BIND */ 465676b7bf71SPeter Wemm -1 46573299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 465876b7bf71SPeter Wemm ); 465976b7bf71SPeter Wemm errno = save_errno; 466076b7bf71SPeter Wemm return -1; 466176b7bf71SPeter Wemm } 466276b7bf71SPeter Wemm 466376b7bf71SPeter Wemm /* save its cname */ 466476b7bf71SPeter Wemm if (!wordinclass((char *) hp->h_name, 'w')) 466576b7bf71SPeter Wemm { 466676b7bf71SPeter Wemm setclass('w', (char *) hp->h_name); 466776b7bf71SPeter Wemm if (tTd(0, 4)) 466812ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", hp->h_name); 46693299c2f1SGregory Neil Shapiro 467012ed1c7cSGregory Neil Shapiro if (sm_snprintf(hnb, sizeof hnb, "[%s]", hp->h_name) < sizeof hnb 46713299c2f1SGregory Neil Shapiro && !wordinclass((char *) hnb, 'w')) 46723299c2f1SGregory Neil Shapiro setclass('w', hnb); 46733299c2f1SGregory Neil Shapiro } 46743299c2f1SGregory Neil Shapiro else 46753299c2f1SGregory Neil Shapiro { 46763299c2f1SGregory Neil Shapiro if (tTd(0, 43)) 467712ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s (already in $=w)\n", hp->h_name); 467876b7bf71SPeter Wemm } 467976b7bf71SPeter Wemm 468076b7bf71SPeter Wemm /* save all it aliases name */ 46813299c2f1SGregory Neil Shapiro for (ha = hp->h_aliases; ha != NULL && *ha != NULL; ha++) 468276b7bf71SPeter Wemm { 46833299c2f1SGregory Neil Shapiro if (!wordinclass(*ha, 'w')) 468476b7bf71SPeter Wemm { 46853299c2f1SGregory Neil Shapiro setclass('w', *ha); 468676b7bf71SPeter Wemm if (tTd(0, 4)) 468712ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", *ha); 468812ed1c7cSGregory Neil Shapiro if (sm_snprintf(hnb, sizeof hnb, 46893299c2f1SGregory Neil Shapiro "[%s]", *ha) < sizeof hnb && 46903299c2f1SGregory Neil Shapiro !wordinclass((char *) hnb, 'w')) 46913299c2f1SGregory Neil Shapiro setclass('w', hnb); 469276b7bf71SPeter Wemm } 46933299c2f1SGregory Neil Shapiro else 46943299c2f1SGregory Neil Shapiro { 46953299c2f1SGregory Neil Shapiro if (tTd(0, 43)) 469612ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s (already in $=w)\n", 46973299c2f1SGregory Neil Shapiro *ha); 46983299c2f1SGregory Neil Shapiro } 469976b7bf71SPeter Wemm } 470012ed1c7cSGregory Neil Shapiro #if NETINET6 4701c46d91b7SGregory Neil Shapiro freehostent(hp); 470212ed1c7cSGregory Neil Shapiro #endif /* NETINET6 */ 470376b7bf71SPeter Wemm return 0; 470476b7bf71SPeter Wemm } 470512ed1c7cSGregory Neil Shapiro /* 4706c2aa98e2SPeter Wemm ** LOAD_IF_NAMES -- load interface-specific names into $=w 4707c2aa98e2SPeter Wemm ** 4708c2aa98e2SPeter Wemm ** Parameters: 4709c2aa98e2SPeter Wemm ** none. 4710c2aa98e2SPeter Wemm ** 4711c2aa98e2SPeter Wemm ** Returns: 4712c2aa98e2SPeter Wemm ** none. 4713c2aa98e2SPeter Wemm ** 4714c2aa98e2SPeter Wemm ** Side Effects: 4715c2aa98e2SPeter Wemm ** Loads $=w with the names of all the interfaces. 4716c2aa98e2SPeter Wemm */ 4717c2aa98e2SPeter Wemm 47183299c2f1SGregory Neil Shapiro #if !NETINET 47193299c2f1SGregory Neil Shapiro # define SIOCGIFCONF_IS_BROKEN 1 /* XXX */ 47203299c2f1SGregory Neil Shapiro #endif /* !NETINET */ 47213299c2f1SGregory Neil Shapiro 4722c2aa98e2SPeter Wemm #if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN 4723c2aa98e2SPeter Wemm struct rtentry; 4724c2aa98e2SPeter Wemm struct mbuf; 4725c2aa98e2SPeter Wemm # ifndef SUNOS403 4726567a2fc9SGregory Neil Shapiro # include <sm/time.h> 47273299c2f1SGregory Neil Shapiro # endif /* ! SUNOS403 */ 47283299c2f1SGregory Neil Shapiro # if (_AIX4 >= 40300) && !defined(_NET_IF_H) 4729c2aa98e2SPeter Wemm # undef __P 47303299c2f1SGregory Neil Shapiro # endif /* (_AIX4 >= 40300) && !defined(_NET_IF_H) */ 4731c2aa98e2SPeter Wemm # include <net/if.h> 47323299c2f1SGregory Neil Shapiro #endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */ 4733c2aa98e2SPeter Wemm 4734c2aa98e2SPeter Wemm void 4735c2aa98e2SPeter Wemm load_if_names() 4736c2aa98e2SPeter Wemm { 47373299c2f1SGregory Neil Shapiro # if NETINET6 && defined(SIOCGLIFCONF) 473812ed1c7cSGregory Neil Shapiro # ifdef __hpux 473912ed1c7cSGregory Neil Shapiro 474012ed1c7cSGregory Neil Shapiro /* 474112ed1c7cSGregory Neil Shapiro ** Unfortunately, HP has changed all of the structures, 474212ed1c7cSGregory Neil Shapiro ** making life difficult for implementors. 474312ed1c7cSGregory Neil Shapiro */ 474412ed1c7cSGregory Neil Shapiro 474512ed1c7cSGregory Neil Shapiro # define lifconf if_laddrconf 474612ed1c7cSGregory Neil Shapiro # define lifc_len iflc_len 474712ed1c7cSGregory Neil Shapiro # define lifc_buf iflc_buf 474812ed1c7cSGregory Neil Shapiro # define lifreq if_laddrreq 474912ed1c7cSGregory Neil Shapiro # define lifr_addr iflr_addr 475012ed1c7cSGregory Neil Shapiro # define lifr_name iflr_name 475112ed1c7cSGregory Neil Shapiro # define lifr_flags iflr_flags 475212ed1c7cSGregory Neil Shapiro # define ss_family sa_family 475312ed1c7cSGregory Neil Shapiro # undef SIOCGLIFNUM 475412ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 475512ed1c7cSGregory Neil Shapiro 47563299c2f1SGregory Neil Shapiro int s; 47573299c2f1SGregory Neil Shapiro int i; 475812ed1c7cSGregory Neil Shapiro size_t len; 47593299c2f1SGregory Neil Shapiro int numifs; 476012ed1c7cSGregory Neil Shapiro char *buf; 476112ed1c7cSGregory Neil Shapiro struct lifconf lifc; 476212ed1c7cSGregory Neil Shapiro # ifdef SIOCGLIFNUM 476312ed1c7cSGregory Neil Shapiro struct lifnum lifn; 476412ed1c7cSGregory Neil Shapiro # endif /* SIOCGLIFNUM */ 47653299c2f1SGregory Neil Shapiro 47663299c2f1SGregory Neil Shapiro s = socket(InetMode, SOCK_DGRAM, 0); 47673299c2f1SGregory Neil Shapiro if (s == -1) 47683299c2f1SGregory Neil Shapiro return; 47693299c2f1SGregory Neil Shapiro 47703299c2f1SGregory Neil Shapiro /* get the list of known IP address from the kernel */ 477112ed1c7cSGregory Neil Shapiro # ifdef __hpux 477212ed1c7cSGregory Neil Shapiro i = ioctl(s, SIOCGIFNUM, (char *) &numifs); 477312ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 47743299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFNUM 47753299c2f1SGregory Neil Shapiro lifn.lifn_family = AF_UNSPEC; 47763299c2f1SGregory Neil Shapiro lifn.lifn_flags = 0; 477712ed1c7cSGregory Neil Shapiro i = ioctl(s, SIOCGLIFNUM, (char *)&lifn); 477812ed1c7cSGregory Neil Shapiro numifs = lifn.lifn_count; 477912ed1c7cSGregory Neil Shapiro # endif /* SIOCGLIFNUM */ 478012ed1c7cSGregory Neil Shapiro 478112ed1c7cSGregory Neil Shapiro # if defined(__hpux) || defined(SIOCGLIFNUM) 478212ed1c7cSGregory Neil Shapiro if (i < 0) 47833299c2f1SGregory Neil Shapiro { 47843299c2f1SGregory Neil Shapiro /* can't get number of interfaces -- fall back */ 47853299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 478612ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFNUM failed: %s\n", 478712ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 47883299c2f1SGregory Neil Shapiro numifs = -1; 47893299c2f1SGregory Neil Shapiro } 479012ed1c7cSGregory Neil Shapiro else if (tTd(0, 42)) 479112ed1c7cSGregory Neil Shapiro sm_dprintf("system has %d interfaces\n", numifs); 47923299c2f1SGregory Neil Shapiro if (numifs < 0) 479312ed1c7cSGregory Neil Shapiro # endif /* defined(__hpux) || defined(SIOCGLIFNUM) */ 47943299c2f1SGregory Neil Shapiro numifs = MAXINTERFACES; 47953299c2f1SGregory Neil Shapiro 47963299c2f1SGregory Neil Shapiro if (numifs <= 0) 47973299c2f1SGregory Neil Shapiro { 4798c46d91b7SGregory Neil Shapiro (void) close(s); 47993299c2f1SGregory Neil Shapiro return; 48003299c2f1SGregory Neil Shapiro } 480112ed1c7cSGregory Neil Shapiro 480212ed1c7cSGregory Neil Shapiro len = lifc.lifc_len = numifs * sizeof (struct lifreq); 480312ed1c7cSGregory Neil Shapiro buf = lifc.lifc_buf = xalloc(lifc.lifc_len); 480412ed1c7cSGregory Neil Shapiro # ifndef __hpux 48053299c2f1SGregory Neil Shapiro lifc.lifc_family = AF_UNSPEC; 48063299c2f1SGregory Neil Shapiro lifc.lifc_flags = 0; 48077660b554SGregory Neil Shapiro # endif /* ! __hpux */ 48083299c2f1SGregory Neil Shapiro if (ioctl(s, SIOCGLIFCONF, (char *)&lifc) < 0) 48093299c2f1SGregory Neil Shapiro { 48103299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 481112ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFCONF failed: %s\n", 481212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 4813c46d91b7SGregory Neil Shapiro (void) close(s); 481412ed1c7cSGregory Neil Shapiro sm_free(buf); 48153299c2f1SGregory Neil Shapiro return; 48163299c2f1SGregory Neil Shapiro } 48173299c2f1SGregory Neil Shapiro 48183299c2f1SGregory Neil Shapiro /* scan the list of IP address */ 48193299c2f1SGregory Neil Shapiro if (tTd(0, 40)) 482012ed1c7cSGregory Neil Shapiro sm_dprintf("scanning for interface specific names, lifc_len=%ld\n", 482112ed1c7cSGregory Neil Shapiro (long) len); 48223299c2f1SGregory Neil Shapiro 482312ed1c7cSGregory Neil Shapiro for (i = 0; i < len && i >= 0; ) 48243299c2f1SGregory Neil Shapiro { 482512ed1c7cSGregory Neil Shapiro int flags; 482612ed1c7cSGregory Neil Shapiro struct lifreq *ifr = (struct lifreq *)&buf[i]; 48273299c2f1SGregory Neil Shapiro SOCKADDR *sa = (SOCKADDR *) &ifr->lifr_addr; 482812ed1c7cSGregory Neil Shapiro int af = ifr->lifr_addr.ss_family; 48293299c2f1SGregory Neil Shapiro char *addr; 483012ed1c7cSGregory Neil Shapiro char *name; 48313299c2f1SGregory Neil Shapiro struct in6_addr ia6; 48323299c2f1SGregory Neil Shapiro struct in_addr ia; 48333299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 48343299c2f1SGregory Neil Shapiro struct lifreq ifrf; 48353299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 48363299c2f1SGregory Neil Shapiro char ip_addr[256]; 48373299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 48383299c2f1SGregory Neil Shapiro 48393299c2f1SGregory Neil Shapiro /* 48403299c2f1SGregory Neil Shapiro ** We must close and recreate the socket each time 48413299c2f1SGregory Neil Shapiro ** since we don't know what type of socket it is now 48423299c2f1SGregory Neil Shapiro ** (each status function may change it). 48433299c2f1SGregory Neil Shapiro */ 48443299c2f1SGregory Neil Shapiro 48453299c2f1SGregory Neil Shapiro (void) close(s); 48463299c2f1SGregory Neil Shapiro 48473299c2f1SGregory Neil Shapiro s = socket(af, SOCK_DGRAM, 0); 48483299c2f1SGregory Neil Shapiro if (s == -1) 4849c46d91b7SGregory Neil Shapiro { 485012ed1c7cSGregory Neil Shapiro sm_free(buf); /* XXX */ 48513299c2f1SGregory Neil Shapiro return; 4852c46d91b7SGregory Neil Shapiro } 48533299c2f1SGregory Neil Shapiro 48543299c2f1SGregory Neil Shapiro /* 48553299c2f1SGregory Neil Shapiro ** If we don't have a complete ifr structure, 48563299c2f1SGregory Neil Shapiro ** don't try to use it. 48573299c2f1SGregory Neil Shapiro */ 48583299c2f1SGregory Neil Shapiro 485912ed1c7cSGregory Neil Shapiro if ((len - i) < sizeof *ifr) 48603299c2f1SGregory Neil Shapiro break; 48613299c2f1SGregory Neil Shapiro 48623299c2f1SGregory Neil Shapiro # ifdef BSD4_4_SOCKADDR 48633299c2f1SGregory Neil Shapiro if (sa->sa.sa_len > sizeof ifr->lifr_addr) 48643299c2f1SGregory Neil Shapiro i += sizeof ifr->lifr_name + sa->sa.sa_len; 48653299c2f1SGregory Neil Shapiro else 48663299c2f1SGregory Neil Shapiro # endif /* BSD4_4_SOCKADDR */ 4867567a2fc9SGregory Neil Shapiro # ifdef DEC 4868567a2fc9SGregory Neil Shapiro /* fix for IPv6 size differences */ 4869567a2fc9SGregory Neil Shapiro i += sizeof ifr->ifr_name + 4870567a2fc9SGregory Neil Shapiro max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); 4871567a2fc9SGregory Neil Shapiro # else /* DEC */ 48723299c2f1SGregory Neil Shapiro i += sizeof *ifr; 4873567a2fc9SGregory Neil Shapiro # endif /* DEC */ 48743299c2f1SGregory Neil Shapiro 48753299c2f1SGregory Neil Shapiro if (tTd(0, 20)) 487612ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", anynet_ntoa(sa)); 48773299c2f1SGregory Neil Shapiro 48783299c2f1SGregory Neil Shapiro if (af != AF_INET && af != AF_INET6) 48793299c2f1SGregory Neil Shapiro continue; 48803299c2f1SGregory Neil Shapiro 48813299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 48823299c2f1SGregory Neil Shapiro memset(&ifrf, '\0', sizeof(struct lifreq)); 488312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(ifrf.lifr_name, ifr->lifr_name, 48843299c2f1SGregory Neil Shapiro sizeof(ifrf.lifr_name)); 48853299c2f1SGregory Neil Shapiro if (ioctl(s, SIOCGLIFFLAGS, (char *) &ifrf) < 0) 48863299c2f1SGregory Neil Shapiro { 48873299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 488812ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFFLAGS failed: %s\n", 488912ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 48903299c2f1SGregory Neil Shapiro continue; 48913299c2f1SGregory Neil Shapiro } 48923299c2f1SGregory Neil Shapiro 489312ed1c7cSGregory Neil Shapiro name = ifr->lifr_name; 489412ed1c7cSGregory Neil Shapiro flags = ifrf.lifr_flags; 489512ed1c7cSGregory Neil Shapiro 489612ed1c7cSGregory Neil Shapiro if (tTd(0, 41)) 489712ed1c7cSGregory Neil Shapiro sm_dprintf("\tflags: %lx\n", (unsigned long) flags); 489812ed1c7cSGregory Neil Shapiro 489912ed1c7cSGregory Neil Shapiro if (!bitset(IFF_UP, flags)) 49003299c2f1SGregory Neil Shapiro continue; 49013299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 49023299c2f1SGregory Neil Shapiro 49033299c2f1SGregory Neil Shapiro ip_addr[0] = '\0'; 49043299c2f1SGregory Neil Shapiro 49053299c2f1SGregory Neil Shapiro /* extract IP address from the list*/ 49063299c2f1SGregory Neil Shapiro switch (af) 49073299c2f1SGregory Neil Shapiro { 49083299c2f1SGregory Neil Shapiro case AF_INET6: 4909c46d91b7SGregory Neil Shapiro # ifdef __KAME__ 4910b4662009SGregory Neil Shapiro /* convert into proper scoped address */ 4911b4662009SGregory Neil Shapiro if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || 4912b4662009SGregory Neil Shapiro IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && 4913c46d91b7SGregory Neil Shapiro sa->sin6.sin6_scope_id == 0) 4914c46d91b7SGregory Neil Shapiro { 4915b4662009SGregory Neil Shapiro struct in6_addr *ia6p; 4916b4662009SGregory Neil Shapiro 4917b4662009SGregory Neil Shapiro ia6p = &sa->sin6.sin6_addr; 4918b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | 4919b4662009SGregory Neil Shapiro ((unsigned int)ia6p->s6_addr[2] << 8)); 4920b4662009SGregory Neil Shapiro ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; 4921c46d91b7SGregory Neil Shapiro } 4922c46d91b7SGregory Neil Shapiro # endif /* __KAME__ */ 4923b4662009SGregory Neil Shapiro ia6 = sa->sin6.sin6_addr; 4924c46d91b7SGregory Neil Shapiro if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) 49253299c2f1SGregory Neil Shapiro { 49263299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 49273299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 492812ed1c7cSGregory Neil Shapiro name, addr == NULL ? "(NULL)" : addr); 49293299c2f1SGregory Neil Shapiro continue; 49303299c2f1SGregory Neil Shapiro } 49313299c2f1SGregory Neil Shapiro 49323299c2f1SGregory Neil Shapiro /* save IP address in text from */ 49333299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 49343299c2f1SGregory Neil Shapiro if (addr != NULL) 493512ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, 49363299c2f1SGregory Neil Shapiro "[%.*s]", 493712ed1c7cSGregory Neil Shapiro (int) sizeof ip_addr - 3, 493812ed1c7cSGregory Neil Shapiro addr); 49393299c2f1SGregory Neil Shapiro break; 49403299c2f1SGregory Neil Shapiro 49413299c2f1SGregory Neil Shapiro case AF_INET: 49423299c2f1SGregory Neil Shapiro ia = sa->sin.sin_addr; 49433299c2f1SGregory Neil Shapiro if (ia.s_addr == INADDR_ANY || 49443299c2f1SGregory Neil Shapiro ia.s_addr == INADDR_NONE) 49453299c2f1SGregory Neil Shapiro { 49463299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 494712ed1c7cSGregory Neil Shapiro name, inet_ntoa(ia)); 49483299c2f1SGregory Neil Shapiro continue; 49493299c2f1SGregory Neil Shapiro } 49503299c2f1SGregory Neil Shapiro 49513299c2f1SGregory Neil Shapiro /* save IP address in text from */ 495212ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", 4953d995d2baSGregory Neil Shapiro (int) sizeof ip_addr - 3, inet_ntoa(ia)); 49543299c2f1SGregory Neil Shapiro break; 49553299c2f1SGregory Neil Shapiro } 49563299c2f1SGregory Neil Shapiro 49573299c2f1SGregory Neil Shapiro if (*ip_addr == '\0') 49583299c2f1SGregory Neil Shapiro continue; 49593299c2f1SGregory Neil Shapiro 49603299c2f1SGregory Neil Shapiro if (!wordinclass(ip_addr, 'w')) 49613299c2f1SGregory Neil Shapiro { 49623299c2f1SGregory Neil Shapiro setclass('w', ip_addr); 49633299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 496412ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", ip_addr); 49653299c2f1SGregory Neil Shapiro } 49663299c2f1SGregory Neil Shapiro 49673299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 49683299c2f1SGregory Neil Shapiro /* skip "loopback" interface "lo" */ 496912ed1c7cSGregory Neil Shapiro if (DontProbeInterfaces == DPI_SKIPLOOPBACK && 497012ed1c7cSGregory Neil Shapiro bitset(IFF_LOOPBACK, flags)) 49713299c2f1SGregory Neil Shapiro continue; 49723299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 49733299c2f1SGregory Neil Shapiro (void) add_hostnames(sa); 49743299c2f1SGregory Neil Shapiro } 497512ed1c7cSGregory Neil Shapiro sm_free(buf); /* XXX */ 4976c46d91b7SGregory Neil Shapiro (void) close(s); 49773299c2f1SGregory Neil Shapiro # else /* NETINET6 && defined(SIOCGLIFCONF) */ 4978c2aa98e2SPeter Wemm # if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN 4979c2aa98e2SPeter Wemm int s; 4980c2aa98e2SPeter Wemm int i; 4981c2aa98e2SPeter Wemm struct ifconf ifc; 4982c2aa98e2SPeter Wemm int numifs; 4983c2aa98e2SPeter Wemm 4984c2aa98e2SPeter Wemm s = socket(AF_INET, SOCK_DGRAM, 0); 4985c2aa98e2SPeter Wemm if (s == -1) 4986c2aa98e2SPeter Wemm return; 4987c2aa98e2SPeter Wemm 4988c2aa98e2SPeter Wemm /* get the list of known IP address from the kernel */ 4989c2aa98e2SPeter Wemm # if defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN 4990c2aa98e2SPeter Wemm if (ioctl(s, SIOCGIFNUM, (char *) &numifs) < 0) 4991c2aa98e2SPeter Wemm { 4992c2aa98e2SPeter Wemm /* can't get number of interfaces -- fall back */ 4993c2aa98e2SPeter Wemm if (tTd(0, 4)) 499412ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGIFNUM failed: %s\n", 499512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 4996c2aa98e2SPeter Wemm numifs = -1; 4997c2aa98e2SPeter Wemm } 4998c2aa98e2SPeter Wemm else if (tTd(0, 42)) 499912ed1c7cSGregory Neil Shapiro sm_dprintf("system has %d interfaces\n", numifs); 5000c2aa98e2SPeter Wemm if (numifs < 0) 50013299c2f1SGregory Neil Shapiro # endif /* defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN */ 50023299c2f1SGregory Neil Shapiro numifs = MAXINTERFACES; 5003c2aa98e2SPeter Wemm 5004c2aa98e2SPeter Wemm if (numifs <= 0) 5005c2aa98e2SPeter Wemm { 50063299c2f1SGregory Neil Shapiro (void) close(s); 5007c2aa98e2SPeter Wemm return; 5008c2aa98e2SPeter Wemm } 5009c2aa98e2SPeter Wemm ifc.ifc_len = numifs * sizeof (struct ifreq); 5010c2aa98e2SPeter Wemm ifc.ifc_buf = xalloc(ifc.ifc_len); 5011c2aa98e2SPeter Wemm if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) 5012c2aa98e2SPeter Wemm { 5013c2aa98e2SPeter Wemm if (tTd(0, 4)) 501412ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGIFCONF failed: %s\n", 501512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 50163299c2f1SGregory Neil Shapiro (void) close(s); 5017c2aa98e2SPeter Wemm return; 5018c2aa98e2SPeter Wemm } 5019c2aa98e2SPeter Wemm 5020c2aa98e2SPeter Wemm /* scan the list of IP address */ 5021c2aa98e2SPeter Wemm if (tTd(0, 40)) 502212ed1c7cSGregory Neil Shapiro sm_dprintf("scanning for interface specific names, ifc_len=%d\n", 5023c2aa98e2SPeter Wemm ifc.ifc_len); 5024c2aa98e2SPeter Wemm 502512ed1c7cSGregory Neil Shapiro for (i = 0; i < ifc.ifc_len && i >= 0; ) 5026c2aa98e2SPeter Wemm { 50273299c2f1SGregory Neil Shapiro int af; 5028c2aa98e2SPeter Wemm struct ifreq *ifr = (struct ifreq *) &ifc.ifc_buf[i]; 502976b7bf71SPeter Wemm SOCKADDR *sa = (SOCKADDR *) &ifr->ifr_addr; 50303299c2f1SGregory Neil Shapiro # if NETINET6 50313299c2f1SGregory Neil Shapiro char *addr; 50323299c2f1SGregory Neil Shapiro struct in6_addr ia6; 50333299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 5034c2aa98e2SPeter Wemm struct in_addr ia; 5035c2aa98e2SPeter Wemm # ifdef SIOCGIFFLAGS 5036c2aa98e2SPeter Wemm struct ifreq ifrf; 50373299c2f1SGregory Neil Shapiro # endif /* SIOCGIFFLAGS */ 5038c2aa98e2SPeter Wemm char ip_addr[256]; 50393299c2f1SGregory Neil Shapiro # if NETINET6 50403299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 50413299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 50423299c2f1SGregory Neil Shapiro 50433299c2f1SGregory Neil Shapiro /* 50443299c2f1SGregory Neil Shapiro ** If we don't have a complete ifr structure, 50453299c2f1SGregory Neil Shapiro ** don't try to use it. 50463299c2f1SGregory Neil Shapiro */ 50473299c2f1SGregory Neil Shapiro 50483299c2f1SGregory Neil Shapiro if ((ifc.ifc_len - i) < sizeof *ifr) 50493299c2f1SGregory Neil Shapiro break; 5050c2aa98e2SPeter Wemm 5051c2aa98e2SPeter Wemm # ifdef BSD4_4_SOCKADDR 505276b7bf71SPeter Wemm if (sa->sa.sa_len > sizeof ifr->ifr_addr) 505376b7bf71SPeter Wemm i += sizeof ifr->ifr_name + sa->sa.sa_len; 5054c2aa98e2SPeter Wemm else 50553299c2f1SGregory Neil Shapiro # endif /* BSD4_4_SOCKADDR */ 5056c2aa98e2SPeter Wemm i += sizeof *ifr; 5057c2aa98e2SPeter Wemm 5058c2aa98e2SPeter Wemm if (tTd(0, 20)) 505912ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", anynet_ntoa(sa)); 5060c2aa98e2SPeter Wemm 50613299c2f1SGregory Neil Shapiro af = ifr->ifr_addr.sa_family; 50623299c2f1SGregory Neil Shapiro if (af != AF_INET 50633299c2f1SGregory Neil Shapiro # if NETINET6 50643299c2f1SGregory Neil Shapiro && af != AF_INET6 50653299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 50663299c2f1SGregory Neil Shapiro ) 5067c2aa98e2SPeter Wemm continue; 5068c2aa98e2SPeter Wemm 5069c2aa98e2SPeter Wemm # ifdef SIOCGIFFLAGS 50703299c2f1SGregory Neil Shapiro memset(&ifrf, '\0', sizeof(struct ifreq)); 507112ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(ifrf.ifr_name, ifr->ifr_name, 50723299c2f1SGregory Neil Shapiro sizeof(ifrf.ifr_name)); 50733299c2f1SGregory Neil Shapiro (void) ioctl(s, SIOCGIFFLAGS, (char *) &ifrf); 5074c2aa98e2SPeter Wemm if (tTd(0, 41)) 507512ed1c7cSGregory Neil Shapiro sm_dprintf("\tflags: %lx\n", 50763299c2f1SGregory Neil Shapiro (unsigned long) ifrf.ifr_flags); 5077c2aa98e2SPeter Wemm # define IFRFREF ifrf 50783299c2f1SGregory Neil Shapiro # else /* SIOCGIFFLAGS */ 5079c2aa98e2SPeter Wemm # define IFRFREF (*ifr) 50803299c2f1SGregory Neil Shapiro # endif /* SIOCGIFFLAGS */ 50813299c2f1SGregory Neil Shapiro 5082c2aa98e2SPeter Wemm if (!bitset(IFF_UP, IFRFREF.ifr_flags)) 5083c2aa98e2SPeter Wemm continue; 5084c2aa98e2SPeter Wemm 50853299c2f1SGregory Neil Shapiro ip_addr[0] = '\0'; 50863299c2f1SGregory Neil Shapiro 5087c2aa98e2SPeter Wemm /* extract IP address from the list*/ 50883299c2f1SGregory Neil Shapiro switch (af) 50893299c2f1SGregory Neil Shapiro { 50903299c2f1SGregory Neil Shapiro case AF_INET: 509176b7bf71SPeter Wemm ia = sa->sin.sin_addr; 50923299c2f1SGregory Neil Shapiro if (ia.s_addr == INADDR_ANY || 50933299c2f1SGregory Neil Shapiro ia.s_addr == INADDR_NONE) 5094c2aa98e2SPeter Wemm { 5095c2aa98e2SPeter Wemm message("WARNING: interface %s is UP with %s address", 5096c2aa98e2SPeter Wemm ifr->ifr_name, inet_ntoa(ia)); 5097c2aa98e2SPeter Wemm continue; 5098c2aa98e2SPeter Wemm } 5099c2aa98e2SPeter Wemm 5100c2aa98e2SPeter Wemm /* save IP address in text from */ 510112ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", 51021ec86adfSBruce Evans (int) sizeof ip_addr - 3, 5103c2aa98e2SPeter Wemm inet_ntoa(ia)); 51043299c2f1SGregory Neil Shapiro break; 51053299c2f1SGregory Neil Shapiro 51063299c2f1SGregory Neil Shapiro # if NETINET6 51073299c2f1SGregory Neil Shapiro case AF_INET6: 5108b4662009SGregory Neil Shapiro # ifdef __KAME__ 5109b4662009SGregory Neil Shapiro /* convert into proper scoped address */ 5110b4662009SGregory Neil Shapiro if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || 5111b4662009SGregory Neil Shapiro IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && 5112b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id == 0) 5113b4662009SGregory Neil Shapiro { 5114b4662009SGregory Neil Shapiro struct in6_addr *ia6p; 5115b4662009SGregory Neil Shapiro 5116b4662009SGregory Neil Shapiro ia6p = &sa->sin6.sin6_addr; 5117b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | 5118b4662009SGregory Neil Shapiro ((unsigned int)ia6p->s6_addr[2] << 8)); 5119b4662009SGregory Neil Shapiro ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; 5120b4662009SGregory Neil Shapiro } 5121b4662009SGregory Neil Shapiro # endif /* __KAME__ */ 51223299c2f1SGregory Neil Shapiro ia6 = sa->sin6.sin6_addr; 5123c46d91b7SGregory Neil Shapiro if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) 51243299c2f1SGregory Neil Shapiro { 51253299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 51263299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 51273299c2f1SGregory Neil Shapiro ifr->ifr_name, 51283299c2f1SGregory Neil Shapiro addr == NULL ? "(NULL)" : addr); 51293299c2f1SGregory Neil Shapiro continue; 51303299c2f1SGregory Neil Shapiro } 51313299c2f1SGregory Neil Shapiro 51323299c2f1SGregory Neil Shapiro /* save IP address in text from */ 51333299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 51343299c2f1SGregory Neil Shapiro if (addr != NULL) 513512ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, 51363299c2f1SGregory Neil Shapiro "[%.*s]", 513712ed1c7cSGregory Neil Shapiro (int) sizeof ip_addr - 3, 513812ed1c7cSGregory Neil Shapiro addr); 51393299c2f1SGregory Neil Shapiro break; 51403299c2f1SGregory Neil Shapiro 51413299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 51423299c2f1SGregory Neil Shapiro } 51433299c2f1SGregory Neil Shapiro 51443299c2f1SGregory Neil Shapiro if (ip_addr[0] == '\0') 51453299c2f1SGregory Neil Shapiro continue; 51463299c2f1SGregory Neil Shapiro 5147c2aa98e2SPeter Wemm if (!wordinclass(ip_addr, 'w')) 5148c2aa98e2SPeter Wemm { 5149c2aa98e2SPeter Wemm setclass('w', ip_addr); 5150c2aa98e2SPeter Wemm if (tTd(0, 4)) 515112ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", ip_addr); 5152c2aa98e2SPeter Wemm } 5153c2aa98e2SPeter Wemm 5154c2aa98e2SPeter Wemm /* skip "loopback" interface "lo" */ 515512ed1c7cSGregory Neil Shapiro if (DontProbeInterfaces == DPI_SKIPLOOPBACK && 515612ed1c7cSGregory Neil Shapiro bitset(IFF_LOOPBACK, IFRFREF.ifr_flags)) 5157c2aa98e2SPeter Wemm continue; 5158c2aa98e2SPeter Wemm 515976b7bf71SPeter Wemm (void) add_hostnames(sa); 5160c2aa98e2SPeter Wemm } 516112ed1c7cSGregory Neil Shapiro sm_free(ifc.ifc_buf); /* XXX */ 51623299c2f1SGregory Neil Shapiro (void) close(s); 5163c2aa98e2SPeter Wemm # undef IFRFREF 51643299c2f1SGregory Neil Shapiro # endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */ 51653299c2f1SGregory Neil Shapiro # endif /* NETINET6 && defined(SIOCGLIFCONF) */ 51663299c2f1SGregory Neil Shapiro } 516712ed1c7cSGregory Neil Shapiro /* 51683299c2f1SGregory Neil Shapiro ** ISLOOPBACK -- is socket address in the loopback net? 51693299c2f1SGregory Neil Shapiro ** 51703299c2f1SGregory Neil Shapiro ** Parameters: 51713299c2f1SGregory Neil Shapiro ** sa -- socket address. 51723299c2f1SGregory Neil Shapiro ** 51733299c2f1SGregory Neil Shapiro ** Returns: 517412ed1c7cSGregory Neil Shapiro ** true -- is socket address in the loopback net? 517512ed1c7cSGregory Neil Shapiro ** false -- otherwise 51763299c2f1SGregory Neil Shapiro ** 51773299c2f1SGregory Neil Shapiro */ 51783299c2f1SGregory Neil Shapiro 51793299c2f1SGregory Neil Shapiro bool 51803299c2f1SGregory Neil Shapiro isloopback(sa) 51813299c2f1SGregory Neil Shapiro SOCKADDR sa; 51823299c2f1SGregory Neil Shapiro { 51833299c2f1SGregory Neil Shapiro #if NETINET6 51843299c2f1SGregory Neil Shapiro if (IN6_IS_ADDR_LOOPBACK(&sa.sin6.sin6_addr)) 518512ed1c7cSGregory Neil Shapiro return true; 51863299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 51873299c2f1SGregory Neil Shapiro /* XXX how to correctly extract IN_LOOPBACKNET part? */ 51883299c2f1SGregory Neil Shapiro if (((ntohl(sa.sin.sin_addr.s_addr) & IN_CLASSA_NET) 51893299c2f1SGregory Neil Shapiro >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) 519012ed1c7cSGregory Neil Shapiro return true; 51913299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 519212ed1c7cSGregory Neil Shapiro return false; 5193c2aa98e2SPeter Wemm } 519412ed1c7cSGregory Neil Shapiro /* 5195c2aa98e2SPeter Wemm ** GET_NUM_PROCS_ONLINE -- return the number of processors currently online 5196c2aa98e2SPeter Wemm ** 5197c2aa98e2SPeter Wemm ** Parameters: 5198c2aa98e2SPeter Wemm ** none. 5199c2aa98e2SPeter Wemm ** 5200c2aa98e2SPeter Wemm ** Returns: 5201c2aa98e2SPeter Wemm ** The number of processors online. 5202c2aa98e2SPeter Wemm */ 5203c2aa98e2SPeter Wemm 52043299c2f1SGregory Neil Shapiro static int 5205c2aa98e2SPeter Wemm get_num_procs_online() 5206c2aa98e2SPeter Wemm { 5207c2aa98e2SPeter Wemm int nproc = 0; 5208c2aa98e2SPeter Wemm 52093299c2f1SGregory Neil Shapiro #ifdef USESYSCTL 52103299c2f1SGregory Neil Shapiro # if defined(CTL_HW) && defined(HW_NCPU) 52113299c2f1SGregory Neil Shapiro size_t sz; 52123299c2f1SGregory Neil Shapiro int mib[2]; 52133299c2f1SGregory Neil Shapiro 52143299c2f1SGregory Neil Shapiro mib[0] = CTL_HW; 52153299c2f1SGregory Neil Shapiro mib[1] = HW_NCPU; 52163299c2f1SGregory Neil Shapiro sz = (size_t) sizeof nproc; 52173299c2f1SGregory Neil Shapiro (void) sysctl(mib, 2, &nproc, &sz, NULL, 0); 521812ed1c7cSGregory Neil Shapiro # endif /* defined(CTL_HW) && defined(HW_NCPU) */ 52193299c2f1SGregory Neil Shapiro #else /* USESYSCTL */ 5220c2aa98e2SPeter Wemm # ifdef _SC_NPROCESSORS_ONLN 5221c2aa98e2SPeter Wemm nproc = (int) sysconf(_SC_NPROCESSORS_ONLN); 52223299c2f1SGregory Neil Shapiro # else /* _SC_NPROCESSORS_ONLN */ 52233299c2f1SGregory Neil Shapiro # ifdef __hpux 52243299c2f1SGregory Neil Shapiro # include <sys/pstat.h> 52253299c2f1SGregory Neil Shapiro struct pst_dynamic psd; 52263299c2f1SGregory Neil Shapiro 52273299c2f1SGregory Neil Shapiro if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1) 52283299c2f1SGregory Neil Shapiro nproc = psd.psd_proc_cnt; 52293299c2f1SGregory Neil Shapiro # endif /* __hpux */ 52303299c2f1SGregory Neil Shapiro # endif /* _SC_NPROCESSORS_ONLN */ 52313299c2f1SGregory Neil Shapiro #endif /* USESYSCTL */ 52323299c2f1SGregory Neil Shapiro 5233c2aa98e2SPeter Wemm if (nproc <= 0) 5234c2aa98e2SPeter Wemm nproc = 1; 5235c2aa98e2SPeter Wemm return nproc; 5236c2aa98e2SPeter Wemm } 523712ed1c7cSGregory Neil Shapiro /* 5238bfb62e91SGregory Neil Shapiro ** SM_CLOSEFROM -- close file descriptors 5239bfb62e91SGregory Neil Shapiro ** 5240bfb62e91SGregory Neil Shapiro ** Parameters: 5241bfb62e91SGregory Neil Shapiro ** lowest -- first fd to close 5242bfb62e91SGregory Neil Shapiro ** highest -- last fd + 1 to close 5243bfb62e91SGregory Neil Shapiro ** 5244bfb62e91SGregory Neil Shapiro ** Returns: 5245bfb62e91SGregory Neil Shapiro ** none 5246bfb62e91SGregory Neil Shapiro */ 5247bfb62e91SGregory Neil Shapiro 5248bfb62e91SGregory Neil Shapiro void 5249bfb62e91SGregory Neil Shapiro sm_closefrom(lowest, highest) 5250bfb62e91SGregory Neil Shapiro int lowest, highest; 5251bfb62e91SGregory Neil Shapiro { 5252bfb62e91SGregory Neil Shapiro #if HASCLOSEFROM 5253bfb62e91SGregory Neil Shapiro closefrom(lowest); 5254bfb62e91SGregory Neil Shapiro #else /* HASCLOSEFROM */ 5255bfb62e91SGregory Neil Shapiro int i; 5256bfb62e91SGregory Neil Shapiro 5257bfb62e91SGregory Neil Shapiro for (i = lowest; i < highest; i++) 5258bfb62e91SGregory Neil Shapiro (void) close(i); 5259bfb62e91SGregory Neil Shapiro #endif /* HASCLOSEFROM */ 5260bfb62e91SGregory Neil Shapiro } 5261bfb62e91SGregory Neil Shapiro #if HASFDWALK 5262bfb62e91SGregory Neil Shapiro /* 5263bfb62e91SGregory Neil Shapiro ** CLOSEFD_WALK -- walk fd's arranging to close them 5264bfb62e91SGregory Neil Shapiro ** Callback for fdwalk() 5265bfb62e91SGregory Neil Shapiro ** 5266bfb62e91SGregory Neil Shapiro ** Parameters: 5267bfb62e91SGregory Neil Shapiro ** lowest -- first fd to arrange to be closed 5268bfb62e91SGregory Neil Shapiro ** fd -- fd to arrange to be closed 5269bfb62e91SGregory Neil Shapiro ** 5270bfb62e91SGregory Neil Shapiro ** Returns: 5271bfb62e91SGregory Neil Shapiro ** zero 5272bfb62e91SGregory Neil Shapiro */ 5273bfb62e91SGregory Neil Shapiro 5274bfb62e91SGregory Neil Shapiro static int 5275bfb62e91SGregory Neil Shapiro closefd_walk(lowest, fd) 5276bfb62e91SGregory Neil Shapiro void *lowest; 5277bfb62e91SGregory Neil Shapiro int fd; 5278bfb62e91SGregory Neil Shapiro { 5279bfb62e91SGregory Neil Shapiro if (fd >= *(int *)lowest) 5280bfb62e91SGregory Neil Shapiro (void) fcntl(fd, F_SETFD, FD_CLOEXEC); 5281bfb62e91SGregory Neil Shapiro return 0; 5282bfb62e91SGregory Neil Shapiro } 5283bfb62e91SGregory Neil Shapiro #endif /* HASFDWALK */ 5284bfb62e91SGregory Neil Shapiro /* 5285bfb62e91SGregory Neil Shapiro ** SM_CLOSE_ON_EXEC -- arrange for file descriptors to be closed 5286bfb62e91SGregory Neil Shapiro ** 5287bfb62e91SGregory Neil Shapiro ** Parameters: 5288bfb62e91SGregory Neil Shapiro ** lowest -- first fd to arrange to be closed 5289bfb62e91SGregory Neil Shapiro ** highest -- last fd + 1 to arrange to be closed 5290bfb62e91SGregory Neil Shapiro ** 5291bfb62e91SGregory Neil Shapiro ** Returns: 5292bfb62e91SGregory Neil Shapiro ** none 5293bfb62e91SGregory Neil Shapiro */ 5294bfb62e91SGregory Neil Shapiro 5295bfb62e91SGregory Neil Shapiro void 5296bfb62e91SGregory Neil Shapiro sm_close_on_exec(highest, lowest) 5297bfb62e91SGregory Neil Shapiro int highest, lowest; 5298bfb62e91SGregory Neil Shapiro { 5299bfb62e91SGregory Neil Shapiro #if HASFDWALK 5300bfb62e91SGregory Neil Shapiro (void) fdwalk(closefd_walk, &lowest); 5301bfb62e91SGregory Neil Shapiro #else /* HASFDWALK */ 5302bfb62e91SGregory Neil Shapiro int i, j; 5303bfb62e91SGregory Neil Shapiro 5304bfb62e91SGregory Neil Shapiro for (i = lowest; i < highest; i++) 5305bfb62e91SGregory Neil Shapiro { 5306bfb62e91SGregory Neil Shapiro if ((j = fcntl(i, F_GETFD, 0)) != -1) 5307bfb62e91SGregory Neil Shapiro (void) fcntl(i, F_SETFD, j | FD_CLOEXEC); 5308bfb62e91SGregory Neil Shapiro } 5309bfb62e91SGregory Neil Shapiro #endif /* HASFDWALK */ 5310bfb62e91SGregory Neil Shapiro } 5311bfb62e91SGregory Neil Shapiro /* 53123299c2f1SGregory Neil Shapiro ** SEED_RANDOM -- seed the random number generator 53133299c2f1SGregory Neil Shapiro ** 53143299c2f1SGregory Neil Shapiro ** Parameters: 53153299c2f1SGregory Neil Shapiro ** none 53163299c2f1SGregory Neil Shapiro ** 53173299c2f1SGregory Neil Shapiro ** Returns: 53183299c2f1SGregory Neil Shapiro ** none 53193299c2f1SGregory Neil Shapiro */ 53203299c2f1SGregory Neil Shapiro 53213299c2f1SGregory Neil Shapiro void 53223299c2f1SGregory Neil Shapiro seed_random() 53233299c2f1SGregory Neil Shapiro { 53243299c2f1SGregory Neil Shapiro #if HASSRANDOMDEV 53253299c2f1SGregory Neil Shapiro srandomdev(); 53263299c2f1SGregory Neil Shapiro #else /* HASSRANDOMDEV */ 53273299c2f1SGregory Neil Shapiro long seed; 53283299c2f1SGregory Neil Shapiro struct timeval t; 53293299c2f1SGregory Neil Shapiro 533012ed1c7cSGregory Neil Shapiro seed = (long) CurrentPid; 53313299c2f1SGregory Neil Shapiro if (gettimeofday(&t, NULL) >= 0) 53323299c2f1SGregory Neil Shapiro seed += t.tv_sec + t.tv_usec; 53333299c2f1SGregory Neil Shapiro 53343299c2f1SGregory Neil Shapiro # if HASRANDOM 53353299c2f1SGregory Neil Shapiro (void) srandom(seed); 53363299c2f1SGregory Neil Shapiro # else /* HASRANDOM */ 53373299c2f1SGregory Neil Shapiro (void) srand((unsigned int) seed); 53383299c2f1SGregory Neil Shapiro # endif /* HASRANDOM */ 53393299c2f1SGregory Neil Shapiro #endif /* HASSRANDOMDEV */ 53403299c2f1SGregory Neil Shapiro } 534112ed1c7cSGregory Neil Shapiro /* 5342c2aa98e2SPeter Wemm ** SM_SYSLOG -- syslog wrapper to keep messages under SYSLOG_BUFSIZE 5343c2aa98e2SPeter Wemm ** 5344c2aa98e2SPeter Wemm ** Parameters: 5345c2aa98e2SPeter Wemm ** level -- syslog level 5346c2aa98e2SPeter Wemm ** id -- envelope ID or NULL (NOQUEUE) 5347c2aa98e2SPeter Wemm ** fmt -- format string 5348c2aa98e2SPeter Wemm ** arg... -- arguments as implied by fmt. 5349c2aa98e2SPeter Wemm ** 5350c2aa98e2SPeter Wemm ** Returns: 5351c2aa98e2SPeter Wemm ** none 5352c2aa98e2SPeter Wemm */ 5353c2aa98e2SPeter Wemm 5354c2aa98e2SPeter Wemm /* VARARGS3 */ 5355c2aa98e2SPeter Wemm void 5356c2aa98e2SPeter Wemm #ifdef __STDC__ 5357c2aa98e2SPeter Wemm sm_syslog(int level, const char *id, const char *fmt, ...) 53583299c2f1SGregory Neil Shapiro #else /* __STDC__ */ 5359c2aa98e2SPeter Wemm sm_syslog(level, id, fmt, va_alist) 5360c2aa98e2SPeter Wemm int level; 5361c2aa98e2SPeter Wemm const char *id; 5362c2aa98e2SPeter Wemm const char *fmt; 5363c2aa98e2SPeter Wemm va_dcl 53643299c2f1SGregory Neil Shapiro #endif /* __STDC__ */ 5365c2aa98e2SPeter Wemm { 5366567a2fc9SGregory Neil Shapiro char *buf; 5367567a2fc9SGregory Neil Shapiro size_t bufsize; 5368c2aa98e2SPeter Wemm char *begin, *end; 53693299c2f1SGregory Neil Shapiro int save_errno; 5370c2aa98e2SPeter Wemm int seq = 1; 5371c2aa98e2SPeter Wemm int idlen; 53723299c2f1SGregory Neil Shapiro char buf0[MAXLINE]; 537312ed1c7cSGregory Neil Shapiro char *newstring; 537412ed1c7cSGregory Neil Shapiro extern int SyslogPrefixLen; 537512ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 5376c2aa98e2SPeter Wemm 537712ed1c7cSGregory Neil Shapiro save_errno = errno; 5378c2aa98e2SPeter Wemm if (id == NULL) 537912ed1c7cSGregory Neil Shapiro { 5380c2aa98e2SPeter Wemm id = "NOQUEUE"; 538112ed1c7cSGregory Neil Shapiro idlen = strlen(id) + SyslogPrefixLen; 538212ed1c7cSGregory Neil Shapiro } 5383c2aa98e2SPeter Wemm else if (strcmp(id, NOQID) == 0) 538412ed1c7cSGregory Neil Shapiro { 5385c2aa98e2SPeter Wemm id = ""; 538612ed1c7cSGregory Neil Shapiro idlen = SyslogPrefixLen; 538712ed1c7cSGregory Neil Shapiro } 538812ed1c7cSGregory Neil Shapiro else 538912ed1c7cSGregory Neil Shapiro idlen = strlen(id) + SyslogPrefixLen; 5390c2aa98e2SPeter Wemm 53913299c2f1SGregory Neil Shapiro buf = buf0; 53923299c2f1SGregory Neil Shapiro bufsize = sizeof buf0; 53933299c2f1SGregory Neil Shapiro 53943299c2f1SGregory Neil Shapiro for (;;) 53953299c2f1SGregory Neil Shapiro { 539612ed1c7cSGregory Neil Shapiro int n; 5397c2aa98e2SPeter Wemm 539812ed1c7cSGregory Neil Shapiro /* print log message into buf */ 539912ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 540012ed1c7cSGregory Neil Shapiro n = sm_vsnprintf(buf, bufsize, fmt, ap); 540112ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 540212ed1c7cSGregory Neil Shapiro SM_ASSERT(n > 0); 540312ed1c7cSGregory Neil Shapiro if (n < bufsize) 54043299c2f1SGregory Neil Shapiro break; 54053299c2f1SGregory Neil Shapiro 5406c2aa98e2SPeter Wemm /* String too small, redo with correct size */ 540712ed1c7cSGregory Neil Shapiro bufsize = n + 1; 54083299c2f1SGregory Neil Shapiro if (buf != buf0) 540912ed1c7cSGregory Neil Shapiro { 5410c0c4794dSGregory Neil Shapiro sm_free(buf); 541112ed1c7cSGregory Neil Shapiro buf = NULL; 5412c2aa98e2SPeter Wemm } 541312ed1c7cSGregory Neil Shapiro buf = sm_malloc_x(bufsize); 541412ed1c7cSGregory Neil Shapiro } 541512ed1c7cSGregory Neil Shapiro 541612ed1c7cSGregory Neil Shapiro /* clean up buf after it has been expanded with args */ 541712ed1c7cSGregory Neil Shapiro newstring = str2prt(buf); 541812ed1c7cSGregory Neil Shapiro if ((strlen(newstring) + idlen + 1) < SYSLOG_BUFSIZE) 5419c2aa98e2SPeter Wemm { 5420c2aa98e2SPeter Wemm #if LOG 5421c2aa98e2SPeter Wemm if (*id == '\0') 542212ed1c7cSGregory Neil Shapiro syslog(level, "%s", newstring); 5423c2aa98e2SPeter Wemm else 542412ed1c7cSGregory Neil Shapiro syslog(level, "%s: %s", id, newstring); 54253299c2f1SGregory Neil Shapiro #else /* LOG */ 5426c2aa98e2SPeter Wemm /*XXX should do something more sensible */ 5427c2aa98e2SPeter Wemm if (*id == '\0') 542812ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s\n", 542912ed1c7cSGregory Neil Shapiro newstring); 5430c2aa98e2SPeter Wemm else 543112ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 543212ed1c7cSGregory Neil Shapiro "%s: %s\n", id, newstring); 54333299c2f1SGregory Neil Shapiro #endif /* LOG */ 5434567a2fc9SGregory Neil Shapiro if (buf != buf0) 5435567a2fc9SGregory Neil Shapiro sm_free(buf); 54363299c2f1SGregory Neil Shapiro errno = save_errno; 5437c2aa98e2SPeter Wemm return; 5438c2aa98e2SPeter Wemm } 5439c2aa98e2SPeter Wemm 544012ed1c7cSGregory Neil Shapiro /* 544112ed1c7cSGregory Neil Shapiro ** additional length for splitting: " ..." + 3, where 3 is magic to 544212ed1c7cSGregory Neil Shapiro ** have some data for the next entry. 544312ed1c7cSGregory Neil Shapiro */ 544412ed1c7cSGregory Neil Shapiro 544512ed1c7cSGregory Neil Shapiro #define SL_SPLIT 7 544612ed1c7cSGregory Neil Shapiro 544712ed1c7cSGregory Neil Shapiro begin = newstring; 544812ed1c7cSGregory Neil Shapiro idlen += 5; /* strlen("[999]"), see below */ 5449c2aa98e2SPeter Wemm while (*begin != '\0' && 545012ed1c7cSGregory Neil Shapiro (strlen(begin) + idlen) > SYSLOG_BUFSIZE) 5451c2aa98e2SPeter Wemm { 5452c2aa98e2SPeter Wemm char save; 5453c2aa98e2SPeter Wemm 545412ed1c7cSGregory Neil Shapiro if (seq >= 999) 5455c2aa98e2SPeter Wemm { 5456c2aa98e2SPeter Wemm /* Too many messages */ 5457c2aa98e2SPeter Wemm break; 5458c2aa98e2SPeter Wemm } 545912ed1c7cSGregory Neil Shapiro end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT; 5460c2aa98e2SPeter Wemm while (end > begin) 5461c2aa98e2SPeter Wemm { 5462c2aa98e2SPeter Wemm /* Break on comma or space */ 5463c2aa98e2SPeter Wemm if (*end == ',' || *end == ' ') 5464c2aa98e2SPeter Wemm { 5465c2aa98e2SPeter Wemm end++; /* Include separator */ 5466c2aa98e2SPeter Wemm break; 5467c2aa98e2SPeter Wemm } 5468c2aa98e2SPeter Wemm end--; 5469c2aa98e2SPeter Wemm } 5470c2aa98e2SPeter Wemm /* No separator, break midstring... */ 5471c2aa98e2SPeter Wemm if (end == begin) 547212ed1c7cSGregory Neil Shapiro end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT; 5473c2aa98e2SPeter Wemm save = *end; 5474c2aa98e2SPeter Wemm *end = 0; 5475c2aa98e2SPeter Wemm #if LOG 5476c2aa98e2SPeter Wemm syslog(level, "%s[%d]: %s ...", id, seq++, begin); 54773299c2f1SGregory Neil Shapiro #else /* LOG */ 547812ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 547912ed1c7cSGregory Neil Shapiro "%s[%d]: %s ...\n", id, seq++, begin); 54803299c2f1SGregory Neil Shapiro #endif /* LOG */ 5481c2aa98e2SPeter Wemm *end = save; 5482c2aa98e2SPeter Wemm begin = end; 5483c2aa98e2SPeter Wemm } 548412ed1c7cSGregory Neil Shapiro if (seq >= 999) 5485c2aa98e2SPeter Wemm #if LOG 54863299c2f1SGregory Neil Shapiro syslog(level, "%s[%d]: log terminated, too many parts", 54873299c2f1SGregory Neil Shapiro id, seq); 54883299c2f1SGregory Neil Shapiro #else /* LOG */ 548912ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 549012ed1c7cSGregory Neil Shapiro "%s[%d]: log terminated, too many parts\n", id, seq); 54913299c2f1SGregory Neil Shapiro #endif /* LOG */ 5492c2aa98e2SPeter Wemm else if (*begin != '\0') 5493c2aa98e2SPeter Wemm #if LOG 5494c2aa98e2SPeter Wemm syslog(level, "%s[%d]: %s", id, seq, begin); 54953299c2f1SGregory Neil Shapiro #else /* LOG */ 549612ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 549712ed1c7cSGregory Neil Shapiro "%s[%d]: %s\n", id, seq, begin); 54983299c2f1SGregory Neil Shapiro #endif /* LOG */ 5499567a2fc9SGregory Neil Shapiro if (buf != buf0) 5500567a2fc9SGregory Neil Shapiro sm_free(buf); 55013299c2f1SGregory Neil Shapiro errno = save_errno; 5502c2aa98e2SPeter Wemm } 550312ed1c7cSGregory Neil Shapiro /* 5504c2aa98e2SPeter Wemm ** HARD_SYSLOG -- call syslog repeatedly until it works 5505c2aa98e2SPeter Wemm ** 5506c2aa98e2SPeter Wemm ** Needed on HP-UX, which apparently doesn't guarantee that 5507c2aa98e2SPeter Wemm ** syslog succeeds during interrupt handlers. 5508c2aa98e2SPeter Wemm */ 5509c2aa98e2SPeter Wemm 5510c2aa98e2SPeter Wemm #if defined(__hpux) && !defined(HPUX11) 5511c2aa98e2SPeter Wemm 5512c2aa98e2SPeter Wemm # define MAXSYSLOGTRIES 100 5513c2aa98e2SPeter Wemm # undef syslog 5514c2aa98e2SPeter Wemm # ifdef V4FS 5515c2aa98e2SPeter Wemm # define XCNST const 5516c2aa98e2SPeter Wemm # define CAST (const char *) 55173299c2f1SGregory Neil Shapiro # else /* V4FS */ 5518c2aa98e2SPeter Wemm # define XCNST 5519c2aa98e2SPeter Wemm # define CAST 55203299c2f1SGregory Neil Shapiro # endif /* V4FS */ 5521c2aa98e2SPeter Wemm 5522c2aa98e2SPeter Wemm void 5523c2aa98e2SPeter Wemm # ifdef __STDC__ 5524c2aa98e2SPeter Wemm hard_syslog(int pri, XCNST char *msg, ...) 55253299c2f1SGregory Neil Shapiro # else /* __STDC__ */ 5526c2aa98e2SPeter Wemm hard_syslog(pri, msg, va_alist) 5527c2aa98e2SPeter Wemm int pri; 5528c2aa98e2SPeter Wemm XCNST char *msg; 5529c2aa98e2SPeter Wemm va_dcl 55303299c2f1SGregory Neil Shapiro # endif /* __STDC__ */ 5531c2aa98e2SPeter Wemm { 5532c2aa98e2SPeter Wemm int i; 5533c2aa98e2SPeter Wemm char buf[SYSLOG_BUFSIZE]; 553412ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 5535c2aa98e2SPeter Wemm 553612ed1c7cSGregory Neil Shapiro SM_VA_START(ap, msg); 553712ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(buf, sizeof buf, msg, ap); 553812ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 5539c2aa98e2SPeter Wemm 5540c2aa98e2SPeter Wemm for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; ) 5541c2aa98e2SPeter Wemm continue; 5542c2aa98e2SPeter Wemm } 5543c2aa98e2SPeter Wemm 5544c2aa98e2SPeter Wemm # undef CAST 55453299c2f1SGregory Neil Shapiro #endif /* defined(__hpux) && !defined(HPUX11) */ 55463299c2f1SGregory Neil Shapiro #if NEEDLOCAL_HOSTNAME_LENGTH 554712ed1c7cSGregory Neil Shapiro /* 5548c2aa98e2SPeter Wemm ** LOCAL_HOSTNAME_LENGTH 5549c2aa98e2SPeter Wemm ** 5550c2aa98e2SPeter Wemm ** This is required to get sendmail to compile against BIND 4.9.x 5551c2aa98e2SPeter Wemm ** on Ultrix. 55523299c2f1SGregory Neil Shapiro ** 55533299c2f1SGregory Neil Shapiro ** Unfortunately, a Compaq Y2K patch kit provides it without 55543299c2f1SGregory Neil Shapiro ** bumping __RES in /usr/include/resolv.h so we can't automatically 55553299c2f1SGregory Neil Shapiro ** figure out whether it is needed. 5556c2aa98e2SPeter Wemm */ 5557c2aa98e2SPeter Wemm 5558c2aa98e2SPeter Wemm int 5559c2aa98e2SPeter Wemm local_hostname_length(hostname) 5560c2aa98e2SPeter Wemm char *hostname; 5561c2aa98e2SPeter Wemm { 556212ed1c7cSGregory Neil Shapiro size_t len_host, len_domain; 5563c2aa98e2SPeter Wemm 5564c2aa98e2SPeter Wemm if (!*_res.defdname) 5565c2aa98e2SPeter Wemm res_init(); 5566c2aa98e2SPeter Wemm len_host = strlen(hostname); 5567c2aa98e2SPeter Wemm len_domain = strlen(_res.defdname); 5568c2aa98e2SPeter Wemm if (len_host > len_domain && 556912ed1c7cSGregory Neil Shapiro (sm_strcasecmp(hostname + len_host - len_domain, 55703299c2f1SGregory Neil Shapiro _res.defdname) == 0) && 5571c2aa98e2SPeter Wemm hostname[len_host - len_domain - 1] == '.') 5572c2aa98e2SPeter Wemm return len_host - len_domain - 1; 5573c2aa98e2SPeter Wemm else 5574c2aa98e2SPeter Wemm return 0; 5575c2aa98e2SPeter Wemm } 55763299c2f1SGregory Neil Shapiro #endif /* NEEDLOCAL_HOSTNAME_LENGTH */ 5577c2aa98e2SPeter Wemm 557812ed1c7cSGregory Neil Shapiro #if NEEDLINK 557912ed1c7cSGregory Neil Shapiro /* 558012ed1c7cSGregory Neil Shapiro ** LINK -- clone a file 558112ed1c7cSGregory Neil Shapiro ** 558212ed1c7cSGregory Neil Shapiro ** Some OS's lacks link() and hard links. Since sendmail is using 558312ed1c7cSGregory Neil Shapiro ** link() as an efficient way to clone files, this implementation 558412ed1c7cSGregory Neil Shapiro ** will simply do a file copy. 558512ed1c7cSGregory Neil Shapiro ** 558612ed1c7cSGregory Neil Shapiro ** NOTE: This link() replacement is not a generic replacement as it 558712ed1c7cSGregory Neil Shapiro ** does not handle all of the semantics of the real link(2). 558812ed1c7cSGregory Neil Shapiro ** 558912ed1c7cSGregory Neil Shapiro ** Parameters: 559012ed1c7cSGregory Neil Shapiro ** source -- pathname of existing file. 559112ed1c7cSGregory Neil Shapiro ** target -- pathname of link (clone) to be created. 559212ed1c7cSGregory Neil Shapiro ** 559312ed1c7cSGregory Neil Shapiro ** Returns: 559412ed1c7cSGregory Neil Shapiro ** 0 -- success. 559512ed1c7cSGregory Neil Shapiro ** -1 -- failure, see errno for details. 559612ed1c7cSGregory Neil Shapiro */ 559712ed1c7cSGregory Neil Shapiro 559812ed1c7cSGregory Neil Shapiro int 559912ed1c7cSGregory Neil Shapiro link(source, target) 560012ed1c7cSGregory Neil Shapiro const char *source; 560112ed1c7cSGregory Neil Shapiro const char *target; 560212ed1c7cSGregory Neil Shapiro { 560312ed1c7cSGregory Neil Shapiro int save_errno; 560412ed1c7cSGregory Neil Shapiro int sff; 560512ed1c7cSGregory Neil Shapiro int src = -1, dst = -1; 560612ed1c7cSGregory Neil Shapiro ssize_t readlen; 560712ed1c7cSGregory Neil Shapiro ssize_t writelen; 560812ed1c7cSGregory Neil Shapiro char buf[BUFSIZ]; 560912ed1c7cSGregory Neil Shapiro struct stat st; 561012ed1c7cSGregory Neil Shapiro 561112ed1c7cSGregory Neil Shapiro sff = SFF_REGONLY|SFF_OPENASROOT; 561212ed1c7cSGregory Neil Shapiro if (DontLockReadFiles) 561312ed1c7cSGregory Neil Shapiro sff |= SFF_NOLOCK; 561412ed1c7cSGregory Neil Shapiro 561512ed1c7cSGregory Neil Shapiro /* Open the original file */ 561612ed1c7cSGregory Neil Shapiro src = safeopen((char *)source, O_RDONLY, 0, sff); 561712ed1c7cSGregory Neil Shapiro if (src < 0) 561812ed1c7cSGregory Neil Shapiro goto fail; 561912ed1c7cSGregory Neil Shapiro 562012ed1c7cSGregory Neil Shapiro /* Obtain the size and the mode */ 562112ed1c7cSGregory Neil Shapiro if (fstat(src, &st) < 0) 562212ed1c7cSGregory Neil Shapiro goto fail; 562312ed1c7cSGregory Neil Shapiro 562412ed1c7cSGregory Neil Shapiro /* Create the duplicate copy */ 562512ed1c7cSGregory Neil Shapiro sff &= ~SFF_NOLOCK; 562612ed1c7cSGregory Neil Shapiro sff |= SFF_CREAT; 562712ed1c7cSGregory Neil Shapiro dst = safeopen((char *)target, O_CREAT|O_EXCL|O_WRONLY, 562812ed1c7cSGregory Neil Shapiro st.st_mode, sff); 562912ed1c7cSGregory Neil Shapiro if (dst < 0) 563012ed1c7cSGregory Neil Shapiro goto fail; 563112ed1c7cSGregory Neil Shapiro 563212ed1c7cSGregory Neil Shapiro /* Copy all of the bytes one buffer at a time */ 563312ed1c7cSGregory Neil Shapiro while ((readlen = read(src, &buf, sizeof(buf))) > 0) 563412ed1c7cSGregory Neil Shapiro { 563512ed1c7cSGregory Neil Shapiro ssize_t left = readlen; 563612ed1c7cSGregory Neil Shapiro char *p = buf; 563712ed1c7cSGregory Neil Shapiro 563812ed1c7cSGregory Neil Shapiro while (left > 0 && 563912ed1c7cSGregory Neil Shapiro (writelen = write(dst, p, (size_t) left)) >= 0) 564012ed1c7cSGregory Neil Shapiro { 564112ed1c7cSGregory Neil Shapiro left -= writelen; 564212ed1c7cSGregory Neil Shapiro p += writelen; 564312ed1c7cSGregory Neil Shapiro } 5644320f00e7SGregory Neil Shapiro if (writelen < 0) 564512ed1c7cSGregory Neil Shapiro break; 564612ed1c7cSGregory Neil Shapiro } 564712ed1c7cSGregory Neil Shapiro 564812ed1c7cSGregory Neil Shapiro /* Any trouble reading? */ 564912ed1c7cSGregory Neil Shapiro if (readlen < 0 || writelen < 0) 565012ed1c7cSGregory Neil Shapiro goto fail; 565112ed1c7cSGregory Neil Shapiro 565212ed1c7cSGregory Neil Shapiro /* Close the input file */ 565312ed1c7cSGregory Neil Shapiro if (close(src) < 0) 565412ed1c7cSGregory Neil Shapiro { 565512ed1c7cSGregory Neil Shapiro src = -1; 565612ed1c7cSGregory Neil Shapiro goto fail; 565712ed1c7cSGregory Neil Shapiro } 565812ed1c7cSGregory Neil Shapiro src = -1; 565912ed1c7cSGregory Neil Shapiro 566012ed1c7cSGregory Neil Shapiro /* Close the output file */ 566112ed1c7cSGregory Neil Shapiro if (close(dst) < 0) 566212ed1c7cSGregory Neil Shapiro { 566312ed1c7cSGregory Neil Shapiro /* don't set dst = -1 here so we unlink the file */ 566412ed1c7cSGregory Neil Shapiro goto fail; 566512ed1c7cSGregory Neil Shapiro } 566612ed1c7cSGregory Neil Shapiro 566712ed1c7cSGregory Neil Shapiro /* Success */ 566812ed1c7cSGregory Neil Shapiro return 0; 566912ed1c7cSGregory Neil Shapiro 567012ed1c7cSGregory Neil Shapiro fail: 567112ed1c7cSGregory Neil Shapiro save_errno = errno; 567212ed1c7cSGregory Neil Shapiro if (src >= 0) 567312ed1c7cSGregory Neil Shapiro (void) close(src); 567412ed1c7cSGregory Neil Shapiro if (dst >= 0) 567512ed1c7cSGregory Neil Shapiro { 567612ed1c7cSGregory Neil Shapiro (void) unlink(target); 567712ed1c7cSGregory Neil Shapiro (void) close(dst); 567812ed1c7cSGregory Neil Shapiro } 567912ed1c7cSGregory Neil Shapiro errno = save_errno; 568012ed1c7cSGregory Neil Shapiro return -1; 568112ed1c7cSGregory Neil Shapiro } 568212ed1c7cSGregory Neil Shapiro #endif /* NEEDLINK */ 568312ed1c7cSGregory Neil Shapiro 568412ed1c7cSGregory Neil Shapiro /* 5685c2aa98e2SPeter Wemm ** Compile-Time options 5686c2aa98e2SPeter Wemm */ 5687c2aa98e2SPeter Wemm 5688c2aa98e2SPeter Wemm char *CompileOptions[] = 5689c2aa98e2SPeter Wemm { 5690bfb62e91SGregory Neil Shapiro #if ALLOW_255 5691bfb62e91SGregory Neil Shapiro "ALLOW_255", 5692bfb62e91SGregory Neil Shapiro #endif /* ALLOW_255 */ 569312ed1c7cSGregory Neil Shapiro #if NAMED_BIND 569412ed1c7cSGregory Neil Shapiro # if DNSMAP 569512ed1c7cSGregory Neil Shapiro "DNSMAP", 569612ed1c7cSGregory Neil Shapiro # endif /* DNSMAP */ 569712ed1c7cSGregory Neil Shapiro #endif /* NAMED_BIND */ 5698c0c4794dSGregory Neil Shapiro #if EGD 5699c0c4794dSGregory Neil Shapiro "EGD", 5700c0c4794dSGregory Neil Shapiro #endif /* EGD */ 570112ed1c7cSGregory Neil Shapiro #if HESIOD 5702c2aa98e2SPeter Wemm "HESIOD", 57033299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 5704c2aa98e2SPeter Wemm #if HES_GETMAILHOST 5705c2aa98e2SPeter Wemm "HES_GETMAILHOST", 57063299c2f1SGregory Neil Shapiro #endif /* HES_GETMAILHOST */ 570712ed1c7cSGregory Neil Shapiro #if LDAPMAP 5708c2aa98e2SPeter Wemm "LDAPMAP", 57093299c2f1SGregory Neil Shapiro #endif /* LDAPMAP */ 5710567a2fc9SGregory Neil Shapiro #if LDAP_REFERRALS 5711567a2fc9SGregory Neil Shapiro "LDAP_REFERRALS", 5712567a2fc9SGregory Neil Shapiro #endif /* LDAP_REFERRALS */ 5713c2aa98e2SPeter Wemm #if LOG 5714c2aa98e2SPeter Wemm "LOG", 57153299c2f1SGregory Neil Shapiro #endif /* LOG */ 571612ed1c7cSGregory Neil Shapiro #if MAP_NSD 571712ed1c7cSGregory Neil Shapiro "MAP_NSD", 571812ed1c7cSGregory Neil Shapiro #endif /* MAP_NSD */ 571912ed1c7cSGregory Neil Shapiro #if MAP_REGEX 572012ed1c7cSGregory Neil Shapiro "MAP_REGEX", 572112ed1c7cSGregory Neil Shapiro #endif /* MAP_REGEX */ 5722c2aa98e2SPeter Wemm #if MATCHGECOS 5723c2aa98e2SPeter Wemm "MATCHGECOS", 57243299c2f1SGregory Neil Shapiro #endif /* MATCHGECOS */ 572512ed1c7cSGregory Neil Shapiro #if MILTER 572612ed1c7cSGregory Neil Shapiro "MILTER", 572712ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 5728c2aa98e2SPeter Wemm #if MIME7TO8 5729c2aa98e2SPeter Wemm "MIME7TO8", 57303299c2f1SGregory Neil Shapiro #endif /* MIME7TO8 */ 57311ae5b8d4SGregory Neil Shapiro #if MIME7TO8_OLD 57321ae5b8d4SGregory Neil Shapiro "MIME7TO8_OLD", 57331ae5b8d4SGregory Neil Shapiro #endif /* MIME7TO8_OLD */ 5734c2aa98e2SPeter Wemm #if MIME8TO7 5735c2aa98e2SPeter Wemm "MIME8TO7", 57363299c2f1SGregory Neil Shapiro #endif /* MIME8TO7 */ 5737c2aa98e2SPeter Wemm #if NAMED_BIND 5738c2aa98e2SPeter Wemm "NAMED_BIND", 57393299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 574012ed1c7cSGregory Neil Shapiro #if NDBM 5741c2aa98e2SPeter Wemm "NDBM", 57423299c2f1SGregory Neil Shapiro #endif /* NDBM */ 5743c2aa98e2SPeter Wemm #if NETINET 5744c2aa98e2SPeter Wemm "NETINET", 57453299c2f1SGregory Neil Shapiro #endif /* NETINET */ 57463299c2f1SGregory Neil Shapiro #if NETINET6 57473299c2f1SGregory Neil Shapiro "NETINET6", 57483299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 5749c2aa98e2SPeter Wemm #if NETINFO 5750c2aa98e2SPeter Wemm "NETINFO", 57513299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 5752c2aa98e2SPeter Wemm #if NETISO 5753c2aa98e2SPeter Wemm "NETISO", 57543299c2f1SGregory Neil Shapiro #endif /* NETISO */ 5755c2aa98e2SPeter Wemm #if NETNS 5756c2aa98e2SPeter Wemm "NETNS", 57573299c2f1SGregory Neil Shapiro #endif /* NETNS */ 5758c2aa98e2SPeter Wemm #if NETUNIX 5759c2aa98e2SPeter Wemm "NETUNIX", 57603299c2f1SGregory Neil Shapiro #endif /* NETUNIX */ 5761c2aa98e2SPeter Wemm #if NETX25 5762c2aa98e2SPeter Wemm "NETX25", 57633299c2f1SGregory Neil Shapiro #endif /* NETX25 */ 576412ed1c7cSGregory Neil Shapiro #if NEWDB 5765c2aa98e2SPeter Wemm "NEWDB", 57663299c2f1SGregory Neil Shapiro #endif /* NEWDB */ 576712ed1c7cSGregory Neil Shapiro #if NIS 5768c2aa98e2SPeter Wemm "NIS", 57693299c2f1SGregory Neil Shapiro #endif /* NIS */ 577012ed1c7cSGregory Neil Shapiro #if NISPLUS 5771c2aa98e2SPeter Wemm "NISPLUS", 57723299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 577312ed1c7cSGregory Neil Shapiro #if NO_DH 577412ed1c7cSGregory Neil Shapiro "NO_DH", 577512ed1c7cSGregory Neil Shapiro #endif /* NO_DH */ 577612ed1c7cSGregory Neil Shapiro #if PH_MAP 57773299c2f1SGregory Neil Shapiro "PH_MAP", 57783299c2f1SGregory Neil Shapiro #endif /* PH_MAP */ 577912ed1c7cSGregory Neil Shapiro #ifdef PICKY_HELO_CHECK 578012ed1c7cSGregory Neil Shapiro "PICKY_HELO_CHECK", 578112ed1c7cSGregory Neil Shapiro #endif /* PICKY_HELO_CHECK */ 578212ed1c7cSGregory Neil Shapiro #if PIPELINING 578312ed1c7cSGregory Neil Shapiro "PIPELINING", 578412ed1c7cSGregory Neil Shapiro #endif /* PIPELINING */ 57853299c2f1SGregory Neil Shapiro #if SASL 578688ad41d4SGregory Neil Shapiro # if SASL >= 20000 578788ad41d4SGregory Neil Shapiro "SASLv2", 578888ad41d4SGregory Neil Shapiro # else /* SASL >= 20000 */ 57893299c2f1SGregory Neil Shapiro "SASL", 579088ad41d4SGregory Neil Shapiro # endif /* SASL >= 20000 */ 57913299c2f1SGregory Neil Shapiro #endif /* SASL */ 5792c2aa98e2SPeter Wemm #if SCANF 5793c2aa98e2SPeter Wemm "SCANF", 57943299c2f1SGregory Neil Shapiro #endif /* SCANF */ 5795c2aa98e2SPeter Wemm #if SMTPDEBUG 5796c2aa98e2SPeter Wemm "SMTPDEBUG", 57973299c2f1SGregory Neil Shapiro #endif /* SMTPDEBUG */ 5798bfb62e91SGregory Neil Shapiro #if SOCKETMAP 5799bfb62e91SGregory Neil Shapiro "SOCKETMAP", 5800bfb62e91SGregory Neil Shapiro #endif /* SOCKETMAP */ 58013299c2f1SGregory Neil Shapiro #if STARTTLS 58023299c2f1SGregory Neil Shapiro "STARTTLS", 58033299c2f1SGregory Neil Shapiro #endif /* STARTTLS */ 580412ed1c7cSGregory Neil Shapiro #if SUID_ROOT_FILES_OK 5805c2aa98e2SPeter Wemm "SUID_ROOT_FILES_OK", 58063299c2f1SGregory Neil Shapiro #endif /* SUID_ROOT_FILES_OK */ 5807c2aa98e2SPeter Wemm #if TCPWRAPPERS 5808c2aa98e2SPeter Wemm "TCPWRAPPERS", 58093299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 581012ed1c7cSGregory Neil Shapiro #if TLS_NO_RSA 581112ed1c7cSGregory Neil Shapiro "TLS_NO_RSA", 581212ed1c7cSGregory Neil Shapiro #endif /* TLS_NO_RSA */ 581312ed1c7cSGregory Neil Shapiro #if TLS_VRFY_PER_CTX 581412ed1c7cSGregory Neil Shapiro "TLS_VRFY_PER_CTX", 581512ed1c7cSGregory Neil Shapiro #endif /* TLS_VRFY_PER_CTX */ 5816c2aa98e2SPeter Wemm #if USERDB 5817c2aa98e2SPeter Wemm "USERDB", 58183299c2f1SGregory Neil Shapiro #endif /* USERDB */ 5819320f00e7SGregory Neil Shapiro #if USE_LDAP_INIT 5820320f00e7SGregory Neil Shapiro "USE_LDAP_INIT", 5821320f00e7SGregory Neil Shapiro #endif /* USE_LDAP_INIT */ 5822bfb62e91SGregory Neil Shapiro #if USE_TTYPATH 5823bfb62e91SGregory Neil Shapiro "USE_TTYPATH", 5824bfb62e91SGregory Neil Shapiro #endif /* USE_TTYPATH */ 5825c2aa98e2SPeter Wemm #if XDEBUG 5826c2aa98e2SPeter Wemm "XDEBUG", 58273299c2f1SGregory Neil Shapiro #endif /* XDEBUG */ 582812ed1c7cSGregory Neil Shapiro #if XLA 5829c2aa98e2SPeter Wemm "XLA", 58303299c2f1SGregory Neil Shapiro #endif /* XLA */ 5831c2aa98e2SPeter Wemm NULL 5832c2aa98e2SPeter Wemm }; 5833c2aa98e2SPeter Wemm 5834c2aa98e2SPeter Wemm 5835c2aa98e2SPeter Wemm /* 5836c2aa98e2SPeter Wemm ** OS compile options. 5837c2aa98e2SPeter Wemm */ 5838c2aa98e2SPeter Wemm 5839c2aa98e2SPeter Wemm char *OsCompileOptions[] = 5840c2aa98e2SPeter Wemm { 584112ed1c7cSGregory Neil Shapiro #if ADDRCONFIG_IS_BROKEN 584212ed1c7cSGregory Neil Shapiro "ADDRCONFIG_IS_BROKEN", 584312ed1c7cSGregory Neil Shapiro #endif /* ADDRCONFIG_IS_BROKEN */ 584412ed1c7cSGregory Neil Shapiro #ifdef AUTO_NETINFO_HOSTS 584512ed1c7cSGregory Neil Shapiro "AUTO_NETINFO_HOSTS", 584612ed1c7cSGregory Neil Shapiro #endif /* AUTO_NETINFO_HOSTS */ 584712ed1c7cSGregory Neil Shapiro #ifdef AUTO_NIS_ALIASES 584812ed1c7cSGregory Neil Shapiro "AUTO_NIS_ALIASES", 584912ed1c7cSGregory Neil Shapiro #endif /* AUTO_NIS_ALIASES */ 585012ed1c7cSGregory Neil Shapiro #if BROKEN_RES_SEARCH 585112ed1c7cSGregory Neil Shapiro "BROKEN_RES_SEARCH", 585212ed1c7cSGregory Neil Shapiro #endif /* BROKEN_RES_SEARCH */ 585312ed1c7cSGregory Neil Shapiro #ifdef BSD4_4_SOCKADDR 585412ed1c7cSGregory Neil Shapiro "BSD4_4_SOCKADDR", 585512ed1c7cSGregory Neil Shapiro #endif /* BSD4_4_SOCKADDR */ 5856c2aa98e2SPeter Wemm #if BOGUS_O_EXCL 5857c2aa98e2SPeter Wemm "BOGUS_O_EXCL", 58583299c2f1SGregory Neil Shapiro #endif /* BOGUS_O_EXCL */ 585912ed1c7cSGregory Neil Shapiro #if DEC_OSF_BROKEN_GETPWENT 586012ed1c7cSGregory Neil Shapiro "DEC_OSF_BROKEN_GETPWENT", 586112ed1c7cSGregory Neil Shapiro #endif /* DEC_OSF_BROKEN_GETPWENT */ 58623299c2f1SGregory Neil Shapiro #if FAST_PID_RECYCLE 58633299c2f1SGregory Neil Shapiro "FAST_PID_RECYCLE", 58643299c2f1SGregory Neil Shapiro #endif /* FAST_PID_RECYCLE */ 5865bfb62e91SGregory Neil Shapiro #if HASCLOSEFROM 5866bfb62e91SGregory Neil Shapiro "HASCLOSEFROM", 5867bfb62e91SGregory Neil Shapiro #endif /* HASCLOSEFROM */ 58683299c2f1SGregory Neil Shapiro #if HASFCHOWN 58693299c2f1SGregory Neil Shapiro "HASFCHOWN", 58703299c2f1SGregory Neil Shapiro #endif /* HASFCHOWN */ 5871c2aa98e2SPeter Wemm #if HASFCHMOD 5872c2aa98e2SPeter Wemm "HASFCHMOD", 58733299c2f1SGregory Neil Shapiro #endif /* HASFCHMOD */ 5874bfb62e91SGregory Neil Shapiro #if HASFDWALK 5875bfb62e91SGregory Neil Shapiro "HASFDWALK", 5876bfb62e91SGregory Neil Shapiro #endif /* HASFDWALK */ 5877c2aa98e2SPeter Wemm #if HASFLOCK 5878c2aa98e2SPeter Wemm "HASFLOCK", 58793299c2f1SGregory Neil Shapiro #endif /* HASFLOCK */ 5880c2aa98e2SPeter Wemm #if HASGETDTABLESIZE 5881c2aa98e2SPeter Wemm "HASGETDTABLESIZE", 58823299c2f1SGregory Neil Shapiro #endif /* HASGETDTABLESIZE */ 5883c2aa98e2SPeter Wemm #if HASGETUSERSHELL 5884c2aa98e2SPeter Wemm "HASGETUSERSHELL", 58853299c2f1SGregory Neil Shapiro #endif /* HASGETUSERSHELL */ 5886c2aa98e2SPeter Wemm #if HASINITGROUPS 5887c2aa98e2SPeter Wemm "HASINITGROUPS", 58883299c2f1SGregory Neil Shapiro #endif /* HASINITGROUPS */ 5889c2aa98e2SPeter Wemm #if HASLSTAT 5890c2aa98e2SPeter Wemm "HASLSTAT", 58913299c2f1SGregory Neil Shapiro #endif /* HASLSTAT */ 589212ed1c7cSGregory Neil Shapiro #if HASNICE 589312ed1c7cSGregory Neil Shapiro "HASNICE", 589412ed1c7cSGregory Neil Shapiro #endif /* HASNICE */ 58953299c2f1SGregory Neil Shapiro #if HASRANDOM 58963299c2f1SGregory Neil Shapiro "HASRANDOM", 58973299c2f1SGregory Neil Shapiro #endif /* HASRANDOM */ 589812ed1c7cSGregory Neil Shapiro #if HASRRESVPORT 589912ed1c7cSGregory Neil Shapiro "HASRRESVPORT", 590012ed1c7cSGregory Neil Shapiro #endif /* HASRRESVPORT */ 590112ed1c7cSGregory Neil Shapiro #if HASSETEGID 590212ed1c7cSGregory Neil Shapiro "HASSETEGID", 590312ed1c7cSGregory Neil Shapiro #endif /* HASSETEGID */ 59043299c2f1SGregory Neil Shapiro #if HASSETLOGIN 59053299c2f1SGregory Neil Shapiro "HASSETLOGIN", 59063299c2f1SGregory Neil Shapiro #endif /* HASSETLOGIN */ 590712ed1c7cSGregory Neil Shapiro #if HASSETREGID 590812ed1c7cSGregory Neil Shapiro "HASSETREGID", 590912ed1c7cSGregory Neil Shapiro #endif /* HASSETREGID */ 591012ed1c7cSGregory Neil Shapiro #if HASSETRESGID 591112ed1c7cSGregory Neil Shapiro "HASSETRESGID", 591212ed1c7cSGregory Neil Shapiro #endif /* HASSETRESGID */ 5913c2aa98e2SPeter Wemm #if HASSETREUID 5914c2aa98e2SPeter Wemm "HASSETREUID", 59153299c2f1SGregory Neil Shapiro #endif /* HASSETREUID */ 5916c2aa98e2SPeter Wemm #if HASSETRLIMIT 5917c2aa98e2SPeter Wemm "HASSETRLIMIT", 59183299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 5919c2aa98e2SPeter Wemm #if HASSETSID 5920c2aa98e2SPeter Wemm "HASSETSID", 59213299c2f1SGregory Neil Shapiro #endif /* HASSETSID */ 5922c2aa98e2SPeter Wemm #if HASSETUSERCONTEXT 5923c2aa98e2SPeter Wemm "HASSETUSERCONTEXT", 59243299c2f1SGregory Neil Shapiro #endif /* HASSETUSERCONTEXT */ 5925c2aa98e2SPeter Wemm #if HASSETVBUF 5926c2aa98e2SPeter Wemm "HASSETVBUF", 59273299c2f1SGregory Neil Shapiro #endif /* HASSETVBUF */ 5928c2aa98e2SPeter Wemm #if HAS_ST_GEN 5929c2aa98e2SPeter Wemm "HAS_ST_GEN", 59303299c2f1SGregory Neil Shapiro #endif /* HAS_ST_GEN */ 59313299c2f1SGregory Neil Shapiro #if HASSRANDOMDEV 59323299c2f1SGregory Neil Shapiro "HASSRANDOMDEV", 59333299c2f1SGregory Neil Shapiro #endif /* HASSRANDOMDEV */ 59343299c2f1SGregory Neil Shapiro #if HASURANDOMDEV 59353299c2f1SGregory Neil Shapiro "HASURANDOMDEV", 59363299c2f1SGregory Neil Shapiro #endif /* HASURANDOMDEV */ 5937c2aa98e2SPeter Wemm #if HASSTRERROR 5938c2aa98e2SPeter Wemm "HASSTRERROR", 59393299c2f1SGregory Neil Shapiro #endif /* HASSTRERROR */ 5940c2aa98e2SPeter Wemm #if HASULIMIT 5941c2aa98e2SPeter Wemm "HASULIMIT", 59423299c2f1SGregory Neil Shapiro #endif /* HASULIMIT */ 5943c2aa98e2SPeter Wemm #if HASUNAME 5944c2aa98e2SPeter Wemm "HASUNAME", 59453299c2f1SGregory Neil Shapiro #endif /* HASUNAME */ 5946c2aa98e2SPeter Wemm #if HASUNSETENV 5947c2aa98e2SPeter Wemm "HASUNSETENV", 59483299c2f1SGregory Neil Shapiro #endif /* HASUNSETENV */ 5949c2aa98e2SPeter Wemm #if HASWAITPID 5950c2aa98e2SPeter Wemm "HASWAITPID", 59513299c2f1SGregory Neil Shapiro #endif /* HASWAITPID */ 5952c2aa98e2SPeter Wemm #if IDENTPROTO 5953c2aa98e2SPeter Wemm "IDENTPROTO", 59543299c2f1SGregory Neil Shapiro #endif /* IDENTPROTO */ 5955c2aa98e2SPeter Wemm #if IP_SRCROUTE 5956c2aa98e2SPeter Wemm "IP_SRCROUTE", 59573299c2f1SGregory Neil Shapiro #endif /* IP_SRCROUTE */ 5958c2aa98e2SPeter Wemm #if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL 5959c2aa98e2SPeter Wemm "LOCK_ON_OPEN", 59603299c2f1SGregory Neil Shapiro #endif /* O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL */ 5961c2aa98e2SPeter Wemm #if NEEDFSYNC 5962c2aa98e2SPeter Wemm "NEEDFSYNC", 59633299c2f1SGregory Neil Shapiro #endif /* NEEDFSYNC */ 596412ed1c7cSGregory Neil Shapiro #if NEEDLINK 596512ed1c7cSGregory Neil Shapiro "NEEDLINK", 596612ed1c7cSGregory Neil Shapiro #endif /* NEEDLINK */ 596712ed1c7cSGregory Neil Shapiro #if NEEDLOCAL_HOSTNAME_LENGTH 596812ed1c7cSGregory Neil Shapiro "NEEDLOCAL_HOSTNAME_LENGTH", 596912ed1c7cSGregory Neil Shapiro #endif /* NEEDLOCAL_HOSTNAME_LENGTH */ 597012ed1c7cSGregory Neil Shapiro #if NEEDSGETIPNODE 597112ed1c7cSGregory Neil Shapiro "NEEDSGETIPNODE", 597212ed1c7cSGregory Neil Shapiro #endif /* NEEDSGETIPNODE */ 597312ed1c7cSGregory Neil Shapiro #if NEEDSTRSTR 597412ed1c7cSGregory Neil Shapiro "NEEDSTRSTR", 597512ed1c7cSGregory Neil Shapiro #endif /* NEEDSTRSTR */ 597612ed1c7cSGregory Neil Shapiro #if NEEDSTRTOL 597712ed1c7cSGregory Neil Shapiro "NEEDSTRTOL", 597812ed1c7cSGregory Neil Shapiro #endif /* NEEDSTRTOL */ 597912ed1c7cSGregory Neil Shapiro #ifdef NO_GETSERVBYNAME 598012ed1c7cSGregory Neil Shapiro "NO_GETSERVBYNAME", 598112ed1c7cSGregory Neil Shapiro #endif /* NO_GETSERVBYNAME */ 5982c2aa98e2SPeter Wemm #if NOFTRUNCATE 5983c2aa98e2SPeter Wemm "NOFTRUNCATE", 59843299c2f1SGregory Neil Shapiro #endif /* NOFTRUNCATE */ 598512ed1c7cSGregory Neil Shapiro #if REQUIRES_DIR_FSYNC 598612ed1c7cSGregory Neil Shapiro "REQUIRES_DIR_FSYNC", 598712ed1c7cSGregory Neil Shapiro #endif /* REQUIRES_DIR_FSYNC */ 5988c2aa98e2SPeter Wemm #if RLIMIT_NEEDS_SYS_TIME_H 5989c2aa98e2SPeter Wemm "RLIMIT_NEEDS_SYS_TIME_H", 59903299c2f1SGregory Neil Shapiro #endif /* RLIMIT_NEEDS_SYS_TIME_H */ 5991c2aa98e2SPeter Wemm #if SAFENFSPATHCONF 5992c2aa98e2SPeter Wemm "SAFENFSPATHCONF", 59933299c2f1SGregory Neil Shapiro #endif /* SAFENFSPATHCONF */ 5994c2aa98e2SPeter Wemm #if SECUREWARE 5995c2aa98e2SPeter Wemm "SECUREWARE", 59963299c2f1SGregory Neil Shapiro #endif /* SECUREWARE */ 5997c2aa98e2SPeter Wemm #if SHARE_V1 5998c2aa98e2SPeter Wemm "SHARE_V1", 59993299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 6000c2aa98e2SPeter Wemm #if SIOCGIFCONF_IS_BROKEN 6001c2aa98e2SPeter Wemm "SIOCGIFCONF_IS_BROKEN", 60023299c2f1SGregory Neil Shapiro #endif /* SIOCGIFCONF_IS_BROKEN */ 6003c2aa98e2SPeter Wemm #if SIOCGIFNUM_IS_BROKEN 6004c2aa98e2SPeter Wemm "SIOCGIFNUM_IS_BROKEN", 60053299c2f1SGregory Neil Shapiro #endif /* SIOCGIFNUM_IS_BROKEN */ 60063299c2f1SGregory Neil Shapiro #if SNPRINTF_IS_BROKEN 60073299c2f1SGregory Neil Shapiro "SNPRINTF_IS_BROKEN", 60083299c2f1SGregory Neil Shapiro #endif /* SNPRINTF_IS_BROKEN */ 60093299c2f1SGregory Neil Shapiro #if SO_REUSEADDR_IS_BROKEN 60103299c2f1SGregory Neil Shapiro "SO_REUSEADDR_IS_BROKEN", 60113299c2f1SGregory Neil Shapiro #endif /* SO_REUSEADDR_IS_BROKEN */ 6012c2aa98e2SPeter Wemm #if SYS5SETPGRP 6013c2aa98e2SPeter Wemm "SYS5SETPGRP", 60143299c2f1SGregory Neil Shapiro #endif /* SYS5SETPGRP */ 6015c2aa98e2SPeter Wemm #if SYSTEM5 6016c2aa98e2SPeter Wemm "SYSTEM5", 60173299c2f1SGregory Neil Shapiro #endif /* SYSTEM5 */ 601812ed1c7cSGregory Neil Shapiro #if USE_DOUBLE_FORK 601912ed1c7cSGregory Neil Shapiro "USE_DOUBLE_FORK", 602012ed1c7cSGregory Neil Shapiro #endif /* USE_DOUBLE_FORK */ 602112ed1c7cSGregory Neil Shapiro #if USE_ENVIRON 602212ed1c7cSGregory Neil Shapiro "USE_ENVIRON", 602312ed1c7cSGregory Neil Shapiro #endif /* USE_ENVIRON */ 6024c2aa98e2SPeter Wemm #if USE_SA_SIGACTION 6025c2aa98e2SPeter Wemm "USE_SA_SIGACTION", 60263299c2f1SGregory Neil Shapiro #endif /* USE_SA_SIGACTION */ 6027c2aa98e2SPeter Wemm #if USE_SIGLONGJMP 6028c2aa98e2SPeter Wemm "USE_SIGLONGJMP", 60293299c2f1SGregory Neil Shapiro #endif /* USE_SIGLONGJMP */ 603012ed1c7cSGregory Neil Shapiro #if USEGETCONFATTR 603112ed1c7cSGregory Neil Shapiro "USEGETCONFATTR", 603212ed1c7cSGregory Neil Shapiro #endif /* USEGETCONFATTR */ 6033c2aa98e2SPeter Wemm #if USESETEUID 6034c2aa98e2SPeter Wemm "USESETEUID", 60353299c2f1SGregory Neil Shapiro #endif /* USESETEUID */ 603612ed1c7cSGregory Neil Shapiro #ifdef USESYSCTL 603712ed1c7cSGregory Neil Shapiro "USESYSCTL", 603812ed1c7cSGregory Neil Shapiro #endif /* USESYSCTL */ 603912ed1c7cSGregory Neil Shapiro #if USING_NETSCAPE_LDAP 604012ed1c7cSGregory Neil Shapiro "USING_NETSCAPE_LDAP", 604112ed1c7cSGregory Neil Shapiro #endif /* USING_NETSCAPE_LDAP */ 604212ed1c7cSGregory Neil Shapiro #ifdef WAITUNION 604312ed1c7cSGregory Neil Shapiro "WAITUNION", 604412ed1c7cSGregory Neil Shapiro #endif /* WAITUNION */ 604512ed1c7cSGregory Neil Shapiro NULL 604612ed1c7cSGregory Neil Shapiro }; 604712ed1c7cSGregory Neil Shapiro 604812ed1c7cSGregory Neil Shapiro /* 604912ed1c7cSGregory Neil Shapiro ** FFR compile options. 605012ed1c7cSGregory Neil Shapiro */ 605112ed1c7cSGregory Neil Shapiro 605212ed1c7cSGregory Neil Shapiro char *FFRCompileOptions[] = 605312ed1c7cSGregory Neil Shapiro { 605412ed1c7cSGregory Neil Shapiro #if _FFR_ALLOW_SASLINFO 605572936242SGregory Neil Shapiro /* DefaultAuthInfo can be specified by user. */ 6056bfb62e91SGregory Neil Shapiro /* DefaultAuthInfo doesn't really work in 8.13 anymore. */ 605712ed1c7cSGregory Neil Shapiro "_FFR_ALLOW_SASLINFO", 605812ed1c7cSGregory Neil Shapiro #endif /* _FFR_ALLOW_SASLINFO */ 605912ed1c7cSGregory Neil Shapiro #if _FFR_BESTMX_BETTER_TRUNCATION 606072936242SGregory Neil Shapiro /* Better truncation of list of MX records for dns map. */ 606112ed1c7cSGregory Neil Shapiro "_FFR_BESTMX_BETTER_TRUNCATION", 606212ed1c7cSGregory Neil Shapiro #endif /* _FFR_BESTMX_BETTER_TRUNCATION */ 606372936242SGregory Neil Shapiro #if _FFR_BLOCK_PROXIES 606472936242SGregory Neil Shapiro /* 606572936242SGregory Neil Shapiro ** Try to deal with open HTTP proxies that are used to send spam 606672936242SGregory Neil Shapiro ** by recognizing some commands from them. 606772936242SGregory Neil Shapiro */ 606872936242SGregory Neil Shapiro 606972936242SGregory Neil Shapiro "_FFR_BLOCK_PROXIES", 607072936242SGregory Neil Shapiro #endif /* _FFR_BLOCK_PROXIES */ 607112ed1c7cSGregory Neil Shapiro #if _FFR_CATCH_BROKEN_MTAS 607272936242SGregory Neil Shapiro /* Deal with MTAs that send a reply during the DATA phase. */ 607312ed1c7cSGregory Neil Shapiro "_FFR_CATCH_BROKEN_MTAS", 607412ed1c7cSGregory Neil Shapiro #endif /* _FFR_CATCH_BROKEN_MTAS */ 607512ed1c7cSGregory Neil Shapiro #if _FFR_CHECK_EOM 607672936242SGregory Neil Shapiro /* Enable check_eom ruleset */ 607712ed1c7cSGregory Neil Shapiro "_FFR_CHECK_EOM", 607812ed1c7cSGregory Neil Shapiro #endif /* _FFR_CHECK_EOM */ 607988ad41d4SGregory Neil Shapiro #if _FFR_CHK_QUEUE 608072936242SGregory Neil Shapiro /* Stricter checks about queue directory permissions. */ 608188ad41d4SGregory Neil Shapiro "_FFR_CHK_QUEUE", 608288ad41d4SGregory Neil Shapiro #endif /* _FFR_CHK_QUEUE */ 60837660b554SGregory Neil Shapiro #if _FFR_CLIENT_SIZE 60847660b554SGregory Neil Shapiro /* Don't try to send mail if its size exceeds SIZE= of server. */ 60857660b554SGregory Neil Shapiro "_FFR_CLIENT_SIZE", 60867660b554SGregory Neil Shapiro #endif /* _FFR_CLIENT_SIZE */ 608712ed1c7cSGregory Neil Shapiro #if _FFR_CONTROL_MSTAT 608872936242SGregory Neil Shapiro /* Extended daemon status. */ 608912ed1c7cSGregory Neil Shapiro "_FFR_CONTROL_MSTAT", 609012ed1c7cSGregory Neil Shapiro #endif /* _FFR_CONTROL_MSTAT */ 6091bfb62e91SGregory Neil Shapiro #if _FFR_CRLPATH 6092bfb62e91SGregory Neil Shapiro /* CRLPath; needs documentation; Al Smith */ 6093bfb62e91SGregory Neil Shapiro "_FFR_CRLPATH", 6094bfb62e91SGregory Neil Shapiro #endif /* _FFR_CRLPATH */ 609512ed1c7cSGregory Neil Shapiro #if _FFR_DAEMON_NETUNIX 609672936242SGregory Neil Shapiro /* Allow local (not just TCP) socket connection to server. */ 609712ed1c7cSGregory Neil Shapiro "_FFR_DAEMON_NETUNIX", 609812ed1c7cSGregory Neil Shapiro #endif /* _FFR_DAEMON_NETUNIX */ 609912ed1c7cSGregory Neil Shapiro #if _FFR_DEPRECATE_MAILER_FLAG_I 610072936242SGregory Neil Shapiro /* What it says :-) */ 610112ed1c7cSGregory Neil Shapiro "_FFR_DEPRECATE_MAILER_FLAG_I", 610212ed1c7cSGregory Neil Shapiro #endif /* _FFR_DEPRECATE_MAILER_FLAG_I */ 6103567a2fc9SGregory Neil Shapiro #if _FFR_DM_ONE 6104567a2fc9SGregory Neil Shapiro /* deliver first TA in background, then queue */ 6105567a2fc9SGregory Neil Shapiro "_FFR_DM_ONE", 6106567a2fc9SGregory Neil Shapiro #endif /* _FFR_DM_ONE */ 6107320f00e7SGregory Neil Shapiro #if _FFR_DIGUNIX_SAFECHOWN 610872936242SGregory Neil Shapiro /* Properly set SAFECHOWN (include/sm/conf.h) for Digital UNIX */ 6109320f00e7SGregory Neil Shapiro /* Problem noted by Anne Bennett of Concordia University */ 6110320f00e7SGregory Neil Shapiro "_FFR_DIGUNIX_SAFECHOWN", 6111320f00e7SGregory Neil Shapiro #endif /* _FFR_DIGUNIX_SAFECHOWN */ 6112188b7d28SGregory Neil Shapiro #if _FFR_DM_PER_DAEMON 6113188b7d28SGregory Neil Shapiro /* DeliveryMode per DaemonPortOptions: 'D' */ 6114188b7d28SGregory Neil Shapiro "_FFR_DM_PER_DAEMON", 6115188b7d28SGregory Neil Shapiro #endif /* _FFR_DM_PER_DAEMON */ 6116320f00e7SGregory Neil Shapiro #if _FFR_DNSMAP_ALIASABLE 611772936242SGregory Neil Shapiro /* Allow dns map type to be used for aliases. */ 6118320f00e7SGregory Neil Shapiro /* Don Lewis of TDK */ 6119320f00e7SGregory Neil Shapiro "_FFR_DNSMAP_ALIASABLE", 6120320f00e7SGregory Neil Shapiro #endif /* _FFR_DNSMAP_ALIASABLE */ 612112ed1c7cSGregory Neil Shapiro #if _FFR_DNSMAP_BASE 612272936242SGregory Neil Shapiro /* Specify a "base" domain for DNS lookups. */ 612312ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_BASE", 612412ed1c7cSGregory Neil Shapiro #endif /* _FFR_DNSMAP_BASE */ 612512ed1c7cSGregory Neil Shapiro #if _FFR_DNSMAP_MULTI 612672936242SGregory Neil Shapiro /* Allow multiple return values for DNS map. */ 612712ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_MULTI", 612812ed1c7cSGregory Neil Shapiro # if _FFR_DNSMAP_MULTILIMIT 612972936242SGregory Neil Shapiro /* Limit number of return values for DNS map. */ 613012ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_MULTILIMIT", 613112ed1c7cSGregory Neil Shapiro # endif /* _FFR_DNSMAP_MULTILIMIT */ 613212ed1c7cSGregory Neil Shapiro #endif /* _FFR_DNSMAP_MULTI */ 613312ed1c7cSGregory Neil Shapiro #if _FFR_DONTLOCKFILESFORREAD_OPTION 613472936242SGregory Neil Shapiro /* Enable DontLockFilesForRead option. */ 613512ed1c7cSGregory Neil Shapiro "_FFR_DONTLOCKFILESFORREAD_OPTION", 613612ed1c7cSGregory Neil Shapiro #endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */ 613712ed1c7cSGregory Neil Shapiro #if _FFR_DOTTED_USERNAMES 613872936242SGregory Neil Shapiro /* Allow usernames with '.' */ 613912ed1c7cSGregory Neil Shapiro "_FFR_DOTTED_USERNAMES", 614012ed1c7cSGregory Neil Shapiro #endif /* _FFR_DOTTED_USERNAMES */ 614112ed1c7cSGregory Neil Shapiro #if _FFR_DROP_TRUSTUSER_WARNING 614272936242SGregory Neil Shapiro /* 614372936242SGregory Neil Shapiro ** Don't issue this warning: 614472936242SGregory Neil Shapiro ** "readcf: option TrustedUser may cause problems on systems 614572936242SGregory Neil Shapiro ** which do not support fchown() if UseMSP is not set. 614672936242SGregory Neil Shapiro */ 614772936242SGregory Neil Shapiro 614812ed1c7cSGregory Neil Shapiro "_FFR_DROP_TRUSTUSER_WARNING", 614912ed1c7cSGregory Neil Shapiro #endif /* _FFR_DROP_TRUSTUSER_WARNING */ 61507660b554SGregory Neil Shapiro #if _FFR_EXTRA_MAP_CHECK 61517660b554SGregory Neil Shapiro /* perform extra checks on $( $) in R lines */ 61527660b554SGregory Neil Shapiro "_FFR_EXTRA_MAP_CHECK", 61537660b554SGregory Neil Shapiro #endif /* _FFR_EXTRA_MAP_CHECK */ 615412ed1c7cSGregory Neil Shapiro #if _FFR_FIX_DASHT 615572936242SGregory Neil Shapiro /* 615672936242SGregory Neil Shapiro ** If using -t, force not sending to argv recipients, even 615772936242SGregory Neil Shapiro ** if they are mentioned in the headers. 615872936242SGregory Neil Shapiro */ 615972936242SGregory Neil Shapiro 616012ed1c7cSGregory Neil Shapiro "_FFR_FIX_DASHT", 616112ed1c7cSGregory Neil Shapiro #endif /* _FFR_FIX_DASHT */ 616212ed1c7cSGregory Neil Shapiro #if _FFR_FORWARD_SYSERR 616372936242SGregory Neil Shapiro /* Cause a "syserr" if forward file isn't "safe". */ 616412ed1c7cSGregory Neil Shapiro "_FFR_FORWARD_SYSERR", 616512ed1c7cSGregory Neil Shapiro #endif /* _FFR_FORWARD_SYSERR */ 616612ed1c7cSGregory Neil Shapiro #if _FFR_GEN_ORCPT 616772936242SGregory Neil Shapiro /* Generate a ORCPT DSN arg if not already provided */ 616812ed1c7cSGregory Neil Shapiro "_FFR_GEN_ORCPT", 616912ed1c7cSGregory Neil Shapiro #endif /* _FFR_GEN_ORCPT */ 6170567a2fc9SGregory Neil Shapiro #if _FFR_LOG_GREET_PAUSE 6171567a2fc9SGregory Neil Shapiro /* log time for greet_pause delay; from Nik Clayton */ 6172567a2fc9SGregory Neil Shapiro "_FFR_LOG_GREET_PAUSE", 6173567a2fc9SGregory Neil Shapiro #endif /* _FFR_LOG_GREET_PAUSE */ 617412ed1c7cSGregory Neil Shapiro #if _FFR_GROUPREADABLEAUTHINFOFILE 617572936242SGregory Neil Shapiro /* Allow group readable DefaultAuthInfo file. */ 617612ed1c7cSGregory Neil Shapiro "_FFR_GROUPREADABLEAUTHINFOFILE", 617712ed1c7cSGregory Neil Shapiro #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */ 6178320f00e7SGregory Neil Shapiro #if _FFR_HANDLE_ISO8859_GECOS 617972936242SGregory Neil Shapiro /* 618072936242SGregory Neil Shapiro ** Allow ISO 8859 characters in GECOS field: replace them 618172936242SGregory Neil Shapiro ** ith ASCII "equivalent". 618272936242SGregory Neil Shapiro */ 618372936242SGregory Neil Shapiro 6184320f00e7SGregory Neil Shapiro /* Peter Eriksson of Linkopings universitet */ 6185320f00e7SGregory Neil Shapiro "_FFR_HANDLE_ISO8859_GECOS", 6186320f00e7SGregory Neil Shapiro #endif /* _FFR_HANDLE_ISO8859_GECOS */ 618712ed1c7cSGregory Neil Shapiro #if _FFR_HDR_TYPE 618872936242SGregory Neil Shapiro /* Set 'h' in {addr_type} for headers. */ 618912ed1c7cSGregory Neil Shapiro "_FFR_HDR_TYPE", 619012ed1c7cSGregory Neil Shapiro #endif /* _FFR_HDR_TYPE */ 6191bfb62e91SGregory Neil Shapiro #if _FFR_HELONAME 6192bfb62e91SGregory Neil Shapiro /* option to set heloname; Nik Clayton of FreeBSD */ 6193bfb62e91SGregory Neil Shapiro "_FFR_HELONAME", 6194bfb62e91SGregory Neil Shapiro #endif /* _FFR_HELONAME */ 619512ed1c7cSGregory Neil Shapiro #if _FFR_HPUX_NSSWITCH 619672936242SGregory Neil Shapiro /* Use nsswitch on HP-UX */ 619712ed1c7cSGregory Neil Shapiro "_FFR_HPUX_NSSWITCH", 619812ed1c7cSGregory Neil Shapiro #endif /* _FFR_HPUX_NSSWITCH */ 61997660b554SGregory Neil Shapiro #if _FFR_IGNORE_BOGUS_ADDR 62007660b554SGregory Neil Shapiro /* Ignore addresses for which prescan() failed */ 62017660b554SGregory Neil Shapiro "_FFR_IGNORE_BOGUS_ADDR", 62027660b554SGregory Neil Shapiro #endif /* _FFR_IGNORE_BOGUS_ADDR */ 620312ed1c7cSGregory Neil Shapiro #if _FFR_IGNORE_EXT_ON_HELO 620472936242SGregory Neil Shapiro /* Ignore extensions offered in response to HELO */ 620512ed1c7cSGregory Neil Shapiro "_FFR_IGNORE_EXT_ON_HELO", 620612ed1c7cSGregory Neil Shapiro #endif /* _FFR_IGNORE_EXT_ON_HELO */ 6207bfb62e91SGregory Neil Shapiro #if _FFR_MAXDATASIZE 6208bfb62e91SGregory Neil Shapiro /* 6209bfb62e91SGregory Neil Shapiro ** It is possible that a header is larger than MILTER_CHUNK_SIZE, 6210bfb62e91SGregory Neil Shapiro ** hence this shouldn't be used as limit for milter communication. 6211bfb62e91SGregory Neil Shapiro ** see also libmilter/comm.c 6212bfb62e91SGregory Neil Shapiro ** Gurusamy Sarathy of ActiveState 6213bfb62e91SGregory Neil Shapiro */ 6214bfb62e91SGregory Neil Shapiro 6215684b2a5fSGregory Neil Shapiro "_FFR_MAXDATASIZE", 6216bfb62e91SGregory Neil Shapiro #endif /* _FFR_MAXDATASIZE */ 621712ed1c7cSGregory Neil Shapiro #if _FFR_MAX_FORWARD_ENTRIES 621872936242SGregory Neil Shapiro /* Try to limit number of .forward entries */ 621972936242SGregory Neil Shapiro /* (doesn't work) */ 622012ed1c7cSGregory Neil Shapiro /* Randall S. Winchester of the University of Maryland */ 622112ed1c7cSGregory Neil Shapiro "_FFR_MAX_FORWARD_ENTRIES", 622212ed1c7cSGregory Neil Shapiro #endif /* _FFR_MAX_FORWARD_ENTRIES */ 6223567a2fc9SGregory Neil Shapiro #if _FFR_MAXKEY 6224567a2fc9SGregory Neil Shapiro /* increase key size for LDAP lookups, see conf.h */ 6225567a2fc9SGregory Neil Shapiro "_FFR_MAXKEY", 6226567a2fc9SGregory Neil Shapiro #endif /* _FFR_MAXKEY */ 6227567a2fc9SGregory Neil Shapiro #if _FFR_MAXNOOPCOMMANDS 6228567a2fc9SGregory Neil Shapiro /* runtime option for "MaxNOOPCommands" */ 6229567a2fc9SGregory Neil Shapiro "_FFR_MAXNOOPCOMMANDS", 6230567a2fc9SGregory Neil Shapiro #endif /* _FFR_MAXNOOPCOMMANDS */ 62317660b554SGregory Neil Shapiro #if _FFR_MAX_SLEEP_TIME 62327660b554SGregory Neil Shapiro /* Limit sleep(2) time in libsm/clock.c */ 62337660b554SGregory Neil Shapiro "_FFR_MAX_SLEEP_TIME", 62347660b554SGregory Neil Shapiro #endif /* _FFR_MAX_SLEEP_TIME */ 6235567a2fc9SGregory Neil Shapiro #if _FFR_MEMSTAT 6236567a2fc9SGregory Neil Shapiro /* Check free memory */ 6237567a2fc9SGregory Neil Shapiro "_FFR_MEMSTAT", 6238567a2fc9SGregory Neil Shapiro #endif /* _FFR_MEMSTAT */ 6239bfb62e91SGregory Neil Shapiro #if _FFR_MILTER_NAGLE 6240bfb62e91SGregory Neil Shapiro /* milter: turn off Nagle ("cork" on Linux) */ 6241bfb62e91SGregory Neil Shapiro /* John Gardiner Myers of Proofpoint */ 6242bfb62e91SGregory Neil Shapiro "_FFR_MILTER_NAGLE ", 6243bfb62e91SGregory Neil Shapiro #endif /* _FFR_MILTER_NAGLE */ 6244bfb62e91SGregory Neil Shapiro #if _FFR_MILTER_NOHDR_RESP 6245bfb62e91SGregory Neil Shapiro /* milter: no response expected when sending headers */ 6246bfb62e91SGregory Neil Shapiro /* John Gardiner Myers of Proofpoint */ 6247bfb62e91SGregory Neil Shapiro "_FFR_MILTER_NOHDR_RESP", 6248bfb62e91SGregory Neil Shapiro #endif /* _FFR_MILTER_NOHDR_RESP */ 6249bfb62e91SGregory Neil Shapiro #if _FFR_MIME7TO8_OLD 6250bfb62e91SGregory Neil Shapiro /* Old mime7to8 code, the new is broken for at least one example. */ 6251bfb62e91SGregory Neil Shapiro "_FFR_MIME7TO8_OLD", 6252bfb62e91SGregory Neil Shapiro #endif /* _FFR_MAX_SLEEP_TIME */ 6253567a2fc9SGregory Neil Shapiro #if _FFR_MSG_ACCEPT 6254567a2fc9SGregory Neil Shapiro /* allow to override "Message accepted for delivery" */ 6255567a2fc9SGregory Neil Shapiro "_FFR_MSG_ACCEPT", 6256567a2fc9SGregory Neil Shapiro #endif /* _FFR_MSG_ACCEPT */ 625712ed1c7cSGregory Neil Shapiro #if _FFR_NODELAYDSN_ON_HOLD 625872936242SGregory Neil Shapiro /* Do not issue a DELAY DSN for mailers that use the hold flag. */ 625912ed1c7cSGregory Neil Shapiro /* Steven Pitzl */ 626012ed1c7cSGregory Neil Shapiro "_FFR_NODELAYDSN_ON_HOLD", 626112ed1c7cSGregory Neil Shapiro #endif /* _FFR_NODELAYDSN_ON_HOLD */ 626212ed1c7cSGregory Neil Shapiro #if _FFR_NO_PIPE 626372936242SGregory Neil Shapiro /* Disable PIPELINING, delay client if used. */ 626412ed1c7cSGregory Neil Shapiro "_FFR_NO_PIPE", 626512ed1c7cSGregory Neil Shapiro #endif /* _FFR_NO_PIPE */ 6266188b7d28SGregory Neil Shapiro #if _FFR_LOG_NTRIES 6267188b7d28SGregory Neil Shapiro /* log ntries=, from Nik Clayton of FreeBSD */ 6268188b7d28SGregory Neil Shapiro "_FFR_LOG_NTRIES", 6269188b7d28SGregory Neil Shapiro #endif /* _FFR_LOG_NTRIES */ 6270684b2a5fSGregory Neil Shapiro #if _FFR_PRIV_NOACTUALRECIPIENT 6271684b2a5fSGregory Neil Shapiro /* 6272684b2a5fSGregory Neil Shapiro ** PrivacyOptions=noactualrecipient stops sendmail from putting 6273684b2a5fSGregory Neil Shapiro ** X-Actual-Recipient lines in DSNs revealing the actual 6274684b2a5fSGregory Neil Shapiro ** account that addresses map to. Patch from Dan Harkless. 6275684b2a5fSGregory Neil Shapiro */ 6276684b2a5fSGregory Neil Shapiro 6277188b7d28SGregory Neil Shapiro "_FFR_PRIV_NOACTUALRECIPIENT", 6278684b2a5fSGregory Neil Shapiro #endif /* _FFR_PRIV_NOACTUALRECIPIENT */ 627912ed1c7cSGregory Neil Shapiro #if _FFR_QUEUEDELAY 628072936242SGregory Neil Shapiro /* Exponential queue delay; disabled in 8.13 since it isn't used. */ 628112ed1c7cSGregory Neil Shapiro "_FFR_QUEUEDELAY", 628212ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUEDELAY */ 6283320f00e7SGregory Neil Shapiro #if _FFR_QUEUE_GROUP_SORTORDER 628472936242SGregory Neil Shapiro /* Allow QueueSortOrder per queue group. */ 6285320f00e7SGregory Neil Shapiro /* XXX: Still need to actually use qgrp->qg_sortorder */ 6286320f00e7SGregory Neil Shapiro "_FFR_QUEUE_GROUP_SORTORDER", 6287320f00e7SGregory Neil Shapiro #endif /* _FFR_QUEUE_GROUP_SORTORDER */ 628812ed1c7cSGregory Neil Shapiro #if _FFR_QUEUE_MACRO 628972936242SGregory Neil Shapiro /* Define {queue} macro. */ 629012ed1c7cSGregory Neil Shapiro "_FFR_QUEUE_MACRO", 629112ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUE_MACRO */ 6292320f00e7SGregory Neil Shapiro #if _FFR_QUEUE_RUN_PARANOIA 6293567a2fc9SGregory Neil Shapiro /* Additional checks when doing queue runs; interval of checks */ 6294320f00e7SGregory Neil Shapiro "_FFR_QUEUE_RUN_PARANOIA", 6295320f00e7SGregory Neil Shapiro #endif /* _FFR_QUEUE_RUN_PARANOIA */ 629612ed1c7cSGregory Neil Shapiro #if _FFR_QUEUE_SCHED_DBG 629772936242SGregory Neil Shapiro /* Debug output for the queue scheduler. */ 629812ed1c7cSGregory Neil Shapiro "_FFR_QUEUE_SCHED_DBG", 629912ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUE_SCHED_DBG */ 630012ed1c7cSGregory Neil Shapiro #if _FFR_REDIRECTEMPTY 630172936242SGregory Neil Shapiro /* 630272936242SGregory Neil Shapiro ** envelope <> can't be sent to mailing lists, only owner- 630372936242SGregory Neil Shapiro ** send spam of this type to owner- of the list 630472936242SGregory Neil Shapiro ** ---- to stop spam from going to mailing lists. 630572936242SGregory Neil Shapiro */ 630672936242SGregory Neil Shapiro 630712ed1c7cSGregory Neil Shapiro "_FFR_REDIRECTEMPTY", 630812ed1c7cSGregory Neil Shapiro #endif /* _FFR_REDIRECTEMPTY */ 630912ed1c7cSGregory Neil Shapiro #if _FFR_RESET_MACRO_GLOBALS 631072936242SGregory Neil Shapiro /* Allow macro 'j' to be set dynamically via rulesets. */ 631112ed1c7cSGregory Neil Shapiro "_FFR_RESET_MACRO_GLOBALS", 631212ed1c7cSGregory Neil Shapiro #endif /* _FFR_RESET_MACRO_GLOBALS */ 631312ed1c7cSGregory Neil Shapiro #if _FFR_RHS 631472936242SGregory Neil Shapiro /* Random shuffle for queue sorting. */ 631512ed1c7cSGregory Neil Shapiro "_FFR_RHS", 631612ed1c7cSGregory Neil Shapiro #endif /* _FFR_RHS */ 6317320f00e7SGregory Neil Shapiro #if _FFR_SELECT_SHM 631872936242SGregory Neil Shapiro /* Auto-select of shared memory key */ 6319320f00e7SGregory Neil Shapiro "_FFR_SELECT_SHM", 6320320f00e7SGregory Neil Shapiro #endif /* _FFR_SELECT_SHM */ 632112ed1c7cSGregory Neil Shapiro #if _FFR_SHM_STATUS 632272936242SGregory Neil Shapiro /* Donated code (unused). */ 632312ed1c7cSGregory Neil Shapiro "_FFR_SHM_STATUS", 632412ed1c7cSGregory Neil Shapiro #endif /* _FFR_SHM_STATUS */ 6325567a2fc9SGregory Neil Shapiro #if _FFR_LDAP_SINGLEDN 6326567a2fc9SGregory Neil Shapiro /* 6327567a2fc9SGregory Neil Shapiro ** The LDAP database map code in Sendmail 8.12.10, when 6328567a2fc9SGregory Neil Shapiro ** given the -1 switch, would match only a single DN, 6329567a2fc9SGregory Neil Shapiro ** but was able to return multiple attributes for that 6330567a2fc9SGregory Neil Shapiro ** DN. In Sendmail 8.13 this "bug" was corrected to 6331567a2fc9SGregory Neil Shapiro ** only return if exactly one attribute matched. 6332567a2fc9SGregory Neil Shapiro ** 6333567a2fc9SGregory Neil Shapiro ** Unfortunately, our configuration uses the former 6334567a2fc9SGregory Neil Shapiro ** behaviour. Attached is a relatively simple patch 6335567a2fc9SGregory Neil Shapiro ** to 8.13.4 which adds a -2 switch (for lack of a 6336567a2fc9SGregory Neil Shapiro ** better option) which returns the single dn/multiple 6337567a2fc9SGregory Neil Shapiro ** attributes. 6338567a2fc9SGregory Neil Shapiro ** 6339567a2fc9SGregory Neil Shapiro ** Jeffrey T. Eaton, Carnegie-Mellon University 6340567a2fc9SGregory Neil Shapiro */ 6341567a2fc9SGregory Neil Shapiro 6342567a2fc9SGregory Neil Shapiro "_FFR_LDAP_SINGLEDN", 6343567a2fc9SGregory Neil Shapiro #endif /* _FFR_LDAP_SINGLEDN */ 6344bfb62e91SGregory Neil Shapiro #if _FFR_SKIP_DOMAINS 6345bfb62e91SGregory Neil Shapiro /* process every N'th domain instead of every N'th message */ 6346684b2a5fSGregory Neil Shapiro "_FFR_SKIP_DOMAINS", 6347bfb62e91SGregory Neil Shapiro #endif /* _FFR_SKIP_DOMAINS */ 63487660b554SGregory Neil Shapiro #if _FFR_SLEEP_USE_SELECT 63497660b554SGregory Neil Shapiro /* Use select(2) in libsm/clock.c to emulate sleep(2) */ 63507660b554SGregory Neil Shapiro "_FFR_SLEEP_USE_SELECT ", 63517660b554SGregory Neil Shapiro #endif /* _FFR_SLEEP_USE_SELECT */ 635212ed1c7cSGregory Neil Shapiro #if _FFR_SOFT_BOUNCE 635372936242SGregory Neil Shapiro /* Turn all errors into temporary errors. */ 635412ed1c7cSGregory Neil Shapiro "_FFR_SOFT_BOUNCE", 635512ed1c7cSGregory Neil Shapiro #endif /* _FFR_SOFT_BOUNCE */ 635688ad41d4SGregory Neil Shapiro #if _FFR_SPT_ALIGN 635772936242SGregory Neil Shapiro /* 635872936242SGregory Neil Shapiro ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 64 635972936242SGregory Neil Shapiro ** bit alignment, so unless each piece of argv and envp is a multiple 636072936242SGregory Neil Shapiro ** of 8 bytes (including terminating NULL), initsetproctitle() won't 636172936242SGregory Neil Shapiro ** use any of the space beyond argv[0]. Be sure to set SPT_ALIGN_SIZE 636272936242SGregory Neil Shapiro ** if you use this FFR. 636372936242SGregory Neil Shapiro */ 636472936242SGregory Neil Shapiro 636588ad41d4SGregory Neil Shapiro /* Chris Adams of HiWAAY Informations Services */ 636688ad41d4SGregory Neil Shapiro "_FFR_SPT_ALIGN", 636788ad41d4SGregory Neil Shapiro #endif /* _FFR_SPT_ALIGN */ 6368188b7d28SGregory Neil Shapiro #if _FFR_SS_PER_DAEMON 6369188b7d28SGregory Neil Shapiro /* SuperSafe per DaemonPortOptions: 'T' (better letter?) */ 6370188b7d28SGregory Neil Shapiro "_FFR_SS_PER_DAEMON", 6371188b7d28SGregory Neil Shapiro #endif /* _FFR_SS_PER_DAEMON */ 637212ed1c7cSGregory Neil Shapiro #if _FFR_TIMERS 637372936242SGregory Neil Shapiro /* Donated code (unused). */ 637412ed1c7cSGregory Neil Shapiro "_FFR_TIMERS", 637512ed1c7cSGregory Neil Shapiro #endif /* _FFR_TIMERS */ 637612ed1c7cSGregory Neil Shapiro #if _FFR_TLS_1 637772936242SGregory Neil Shapiro /* More STARTTLS options, e.g., secondary certs. */ 637812ed1c7cSGregory Neil Shapiro "_FFR_TLS_1", 637912ed1c7cSGregory Neil Shapiro #endif /* _FFR_TLS_1 */ 638012ed1c7cSGregory Neil Shapiro #if _FFR_TRUSTED_QF 638172936242SGregory Neil Shapiro /* 638272936242SGregory Neil Shapiro ** If we don't own the file mark it as unsafe. 638372936242SGregory Neil Shapiro ** However, allow TrustedUser to own it as well 638472936242SGregory Neil Shapiro ** in case TrustedUser manipulates the queue. 638572936242SGregory Neil Shapiro */ 638672936242SGregory Neil Shapiro 638712ed1c7cSGregory Neil Shapiro "_FFR_TRUSTED_QF", 638812ed1c7cSGregory Neil Shapiro #endif /* _FFR_TRUSTED_QF */ 6389188b7d28SGregory Neil Shapiro #if _FFR_USE_SEM_LOCKING 6390188b7d28SGregory Neil Shapiro "_FFR_USE_SEM_LOCKING", 6391188b7d28SGregory Neil Shapiro #endif /* _FFR_USE_SEM_LOCKING */ 6392320f00e7SGregory Neil Shapiro #if _FFR_USE_SETLOGIN 639372936242SGregory Neil Shapiro /* Use setlogin() */ 6394320f00e7SGregory Neil Shapiro /* Peter Philipp */ 6395320f00e7SGregory Neil Shapiro "_FFR_USE_SETLOGIN", 6396320f00e7SGregory Neil Shapiro #endif /* _FFR_USE_SETLOGIN */ 6397c2aa98e2SPeter Wemm NULL 6398c2aa98e2SPeter Wemm }; 63993299c2f1SGregory Neil Shapiro 6400